今天来模拟一个非归档模式下恢复OFFLINE数据文件的场景,主要有2种情况:
一种是在线日志没有被覆盖,另一种是在线日志被覆盖。
第一种情况比较简单,数据库自身就能处理,而第二种情况稍显复杂,但也并不难,下面开始整个实验过程:
一、在线日志没有被覆盖的场景
--切换数据库到非归档模式
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 6
Next log sequence to archive 8
Current log sequence 8
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 125830736 bytes
Database Buffers 155189248 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database noarchivelog;
Database altered.
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 6
Current log sequence 8
SQL>
--创建测试环境(创建表空间,创建用户,创建测试表,插入数据)
SQL> create tablespace zlm_test datafile '/u01/app/oracle/oradata/ora10g/zlm_test01.dbf' size 50M;
Tablespace created.
SQL> create user zlm1 identified by oracle;
User created.
SQL> grant connect,resource to zlm1;
Grant succeeded.
SQL> alter user zlm1 default tablespace zlm_test;
User altered.
SQL> conn zlm1/oracle
Connected.
SQL> create table offline_test(id int,name varchar2(10));
Table created.
SQL> insert into offline_test values(1,'aaron8219');
1 row created.
SQL> commit;
Commit complete.
--查看数据文件检查点SCN
SQL> set line 130
SQL> col name for a45
SQL> select file#,name,status,checkpoint_change# from v$datafile order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE#
---------- --------------------------------------------- ------- ------------------
1 /u01/app/oracle/oradata/ora10g/system01.dbfSYSTEM 551520
2 /u01/app/oracle/oradata/ora10g/undotbs01.dbf ONLINE 551520
3 /u01/app/oracle/oradata/ora10g/sysaux01.dbfONLINE 551520
4 /u01/app/oracle/oradata/ora10g/users01.dbfONLINE 551520
5 /u01/app/oracle/oradata/ora10g/example01.dbf ONLINE 551520
6 /u01/app/oracle/oradata/ora10g/zlm01.dbfONLINE 551520
7 /u01/app/oracle/oradata/ora10g/zlm02.dbfONLINE 551520
8 /u01/app/oracle/oradata/ora10g/zlm_test01.dbfONLINE 551753
?
此时8号数据文件的checkpoint SCN是551753,比其他文件都biger,或者说newer
尽管刚才插入一行数据后已经commit过了,但db buffer cache并不一定会立即刷到磁盘文件,需要手动执行检查点
SQL> alter system checkpoint;
System altered.
SQL> select file#,name,status,checkpoint_change# from v$datafile order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE#
---------- --------------------------------------------- ------- ------------------
1 /u01/app/oracle/oradata/ora10g/system01.dbfSYSTEM 552134
2 /u01/app/oracle/oradata/ora10g/undotbs01.dbf ONLINE 552134
3 /u01/app/oracle/oradata/ora10g/sysaux01.dbfONLINE 552134
4 /u01/app/oracle/oradata/ora10g/users01.dbfONLINE 552134
5 /u01/app/oracle/oradata/ora10g/example01.dbf ONLINE 552134
6 /u01/app/oracle/oradata/ora10g/zlm01.dbfONLINE 552134
7 /u01/app/oracle/oradata/ora10g/zlm02.dbfONLINE 552134
8 /u01/app/oracle/oradata/ora10g/zlm_test01.dbf ONLINE 552134
--查看数据文件头的检查点SCN
SQL> select file#,name,status,checkpoint_change# from v$datafile_header order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE#
---------- --------------------------------------------- ------- ------------------
1 /u01/app/oracle/oradata/ora10g/system01.dbfONLINE 5521