小e随笔:今天又是一个不错的天气,在辽宁这个时节不冷不热,天气凉爽是我最喜欢的,今天得多整理些笔记(这么好的天(*^__^*) )因为明天有一个高中同学的婚礼,时间过的真快,人家都结婚了。还有在家这几天看到了儿时的伙伴,都有孩子了,孩子都能满地跑了,另我感慨万千啊!
3 部分脱机备份
说明:部分脱机备份实质就是使部分表空间offline,然后备份,但需要注意的是system和undo表空间不能offline,当然临时表空间也不能,但它也无必须备份,丢了可以重建,甚至不重新建立重新启动数据库后会自动创建(经测试),这是考OCP的一道题,印象很深刻。
案例1:归档模式下部分脱机备份(tablespace offline)
备份方案:OS备份
表空间备份基础概念:
说是备份表空间实质是备份表空间物理层也就是数据文件,算了,咱还是专业点,以下概念引自Oracle10g cencepts文档:
表空间备份是构成表空间的数据文件的备份。表空间备份可以是联机的或脱机的,但数据库必须运行在归档模式下表空间备份才是有效的。因为在使用表空间备份还原一个表空间后,必须应用应用重做日志才能使其与其他表空间保持一致性。
l 模拟一个表空间
说明尽量别拿默认表空间做实验,这是我之前血的教训,尽管实验环境没什么大不了坏了数据库重安被,但11g我真是无语安装很费时。
SQL> create tablespace test datafile '/u01/oracle/oradata/elvis/test01.dbf' size 50M;
Tablespace created.
SQL> create table test(id int,scn int) tablespace test;
Table created.
SQL> select * from test;
no rows selected
l 表空间offline&备份表空间
SQL> alter tablespace test offline;
Tablespace altered.
SQL> select tablespace_name,status,logging from dba_tablespaces;
TABLESPACE STATUS LOGGING
---------- --------- ---------
SYSTEM ONLINE LOGGING
SYSAUX ONLINE LOGGING
UNDOTBS1 ONLINE LOGGING
TEMP ONLINE NOLOGGING
USERS ONLINE LOGGING
TEST OFFLINE LOGGING
6 rows selected.
[oracle@elvis elvis]$ pwd --备份表空间
/u01/oracle/oradata/elvis
[oracle@elvis elvis]$ mkdir bak
[oracle@elvis elvis]$ cp test01.dbf bak/
l 模拟数据
SQL> insert into test values(1,dbms_flashback.get_system_change_number);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
反复插入,最终表中数据如下:
SQL> select * from test;
ID SCN
---------- ----------
1 512053
2 512066
3 512073
4 512080
5 512108 --没有commit
l 模拟数据损坏
[oracle@elvis elvis]$ rm -f test01.dbf
[oracle@elvis elvis]$ ll
total 1747280
drwxr-xr-x 2 oracle oinstall 4096 Oct 6 18:44 bak
-rw-r----- 1 oracle oinstall 9748480 Oct 6 18:56 control01.ctl
-rw-r----- 1 oracle oinstall 52429312 Oct 6 18:50 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Oct 6 18:50 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Oct 6 18:56 redo03.log
-rw-r----- 1 oracle oinstall 629153792 Oct 6 18:55 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Oct 6 18:55 system01.dbf
-rw-r----- 1 oracle oinstall 71311360 Oct 6 17:04 temp01.dbf
-rw-r----- 1 oracle oinstall 235937792 Oct 6 18:55 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Oct 6 18:55 users01.dbf
现在数据文件损坏,在往表里插入数据
SQL> insert into test values(6,dbms_flashback.get_system_change_number);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> select * from test;
ID SCN
---------- ----------
1 512053
2 512066
3 512073
4 512080
5 512108
6 512488
6 rows selected.
对于这个为什么数据文件损坏了,还是会插入数据,这个 。。。据说是因为磁盘空间没有被释放,是linux操作系统的机制,也就是说文件被标记了删除但实质上还是存在的,只是我们看不到了而已,所以还可以往磁盘里去写。
现在重启数据库
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 598437888 bytes
Fixed Size 1338140 bytes
Variable Size 394265828 bytes
Database Buffers 197132288 bytes
Redo Buffers 5701632 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/u01/oracle/oradata/elvis/test01.dbf'
l 数据库恢复
[oracle@elvis bak]$ cp test01.dbf ..
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 513193
2 513193
3 513193
4 513193
5 513193
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 513193
2 513193
3 513193
4 513193
5 511743
SQL> recover database;
ORA-00279: change 512018 generated at 10/06/2012 18:49:07 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_06/o1_mf_1_50_870370r3_
.arc
ORA-00280: change 512018 for thread 1 is in sequence #50
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 512064 generated at 10/06/2012 18:50:08 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_06/o1_mf_1_51_87037h5v_
.arc
ORA-00280: change 512064 for thread 1 is in sequence #51
ORA-00279: change 512072 generated at 10/06/2012 18:50:23 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_06/o1_mf_1_52_87037wmo_
.arc
ORA-00280: change 512072 for thread 1 is in sequence #52
Log applied.
Media recovery complete.
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 535324
2 535324
3 535324
4 535324
5 535324
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 535324
2 535324
3 535324
4 535324
5 535324
SQL> alter database open;
Database altered.
SQL> select * from test;
ID SCN
---------- ----------
1 512053
2 512066
3 512073
4 512080
5 512108
6 512488
6 rows selected.
数据都恢复过来了
总结:这个实验在复习了这个方法备份方法的同时,又了解到了Linux操作系统的一个机制,就像前面讨论的一样,为什么数据文件没了,还可以插入数据,这就不在重复了,了解即可。还有数据都从redo和归档文件中恢复过来的。
elvis