1. 介绍
归档模式下一个或多个数据文件损坏,数据库恢复操作。
关闭数据库,冷备份数据库文件sys* undo* user*文件,启动数据库,创建itpux001 表,插入数据,提交,插入4条数据,插入一次switch logfile,使每个归档文件都有。插入第五条数据,没有提交,在第二窗口上面删除数据库文件sys* undo* user*文件,启动数据库,报错。这时候通过在线重做日志文件和归档日志文件恢复数据。
2. 操作
关闭数据库
SYS@hfzcdb> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
冷备数据库
[oracle@hfzcdb91:/oradata/hfzcdb]$cp sys* undo* user* /backup/hfzcdbhot/
打开数据库
SYS@hfzcdb> startup
ORACLE instance started.
Total System Global Area 2466249672 bytes
Fixed Size 8899528 bytes
Variable Size 671088640 bytes
Database Buffers 1778384896 bytes
Redo Buffers 7876608 bytes
Database mounted.
Database opened.
创建表,插入数据
SYS@hfzcdb> conn hfedu/hfedu123
Connected.
hfedu@hfzcdb> create table itpux001(id int,scn int) tablespace users;
Table created.
hfedu@hfzcdb> insert into itpux001 values (1,dbms_flashback.get_system_change_number);
1 row created.
hfedu@hfzcdb> commit;
Commit complete.
查询重做日志情况
hfedu@hfzcdb> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ ------------------- ----------
1 1 1 209715200 512 1 NO CURRENT 2182326 2023-03-29 16:22:20 1.8447E+19 0
2 1 0 209715200 512 1 YES UNUSED 0 0 0
3 1 0 209715200 512 1 YES UNUSED 0 0 0
切换日志
hfedu@hfzcdb> alter system switch logfile;
System altered.
查询重做日志情况
hfedu@hfzcdb> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ ------------------- ----------
1 1 1 209715200 512 1 YES ACTIVE 2182326 2023-03-29 16:22:20 2190614 2023-03-29 18:46:04 0
2 1 2 209715200 512 1 NO CURRENT 2190614 2023-03-29 18:46:04 1.8447E+19 0
3 1 0 209715200 512 1 YES UNUSED 0 0 0
再插入一条数据
hfedu@hfzcdb> insert into itpux001 values (2,dbms_flashback.get_system_change_number);
1 row created.
hfedu@hfzcdb> alter system switch logfile;
System altered.
hfedu@hfzcdb> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ ------------------- ----------
1 1 1 209715200 512 1 YES ACTIVE 2182326 2023-03-29 16:22:20 2190614 2023-03-29 18:46:04 0
2 1 2 209715200 512 1 YES ACTIVE 2190614 2023-03-29 18:46:04 2190629 2023-03-29 18:46:23 0
3 1 3 209715200 512 1 NO CURRENT 2190629 2023-03-29 18:46:23 1.8447E+19 0
hfedu@hfzcdb> insert into itpux001 values (3,dbms_flashback.get_system_change_number);
1 row created.
hfedu@hfzcdb> alter system switch logfile;
System altered.
hfedu@hfzcdb> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ ------------------- ----------
1 1 4 209715200 512 1 NO CURRENT 2190643 2023-03-29 18:46:47 1.8447E+19 0
2 1 2 209715200 512 1 YES INACTIVE 2190614 2023-03-29 18:46:04 2190629 2023-03-29 18:46:23 0
3 1 3 209715200 512 1 YES INACTIVE 2190629 2023-03-29 18:46:23 2190643 2023-03-29 18:46:47 0
hfedu@hfzcdb> insert into itpux001 values (4,dbms_flashback.get_system_change_number);
1 row created.
hfedu@hfzcdb> alter system switch logfile;
System altered.
hfedu@hfzcdb> commit
2 ;
Commit complete.
hfedu@hfzcdb> select * from itpux001;
ID SCN
---------- ----------
1 2190591
2 2190624
3 2190633
4 2190650
插入第五条数据没有提交
hfedu@hfzcdb> insert into itpux001 values (5,dbms_flashback.get_system_change_number);
1 row created.
hfedu@hfzcdb> select * from itpux001;
ID SCN
---------- ----------
1 2190591
2 2190624
3 2190633
4 2190650
5 2190696
另外一个窗口上面删除数据库文件
[oracle@hfzcdb91:/oradata/hfzcdb]$rm sys* undo* user*
打开数据库,报文件丢失
[oracle@hfzcdb91:/oradata/hfzcdb]$
hfedu@hfzcdb> conn / as sysdba
Connected.
SYS@hfzcdb> shutdown abort
ORACLE instance shut down.
SYS@hfzcdb> startup
ORACLE instance started.
Total System Global Area 2466249672 bytes
Fixed Size 8899528 bytes
Variable Size 671088640 bytes
Database Buffers 1778384896 bytes
Redo Buffers 7876608 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/oradata/hfzcdb/system01.dbf'
控制文件的CHECKPOINT_CHANGE一致的,没有问题:
SYS@hfzcdb> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 2190643
2 2190643
3 2190643
4 2190643
5 2190643
6 2190643
6 rows selected.
数据文件的CHECKPOINT_CHANGE不一致,丢失
SYS@hfzcdb> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 0
2 0
3 0
4 0
5 2190643
6 2190643
6 rows selected.
把插入数据之前冷备份的文件拷贝回来恢复
[oracle@hfzcdb91:/oradata/hfzcdb]$cp /backup/hfzcdbhot/ sys* undo* user* /oradata/hfzcdb/
cp: omitting directory ‘/backup/hfzcdbhot/’
cp: cannot stat ‘sys*’: No such file or directory
cp: cannot stat ‘undo*’: No such file or directory
cp: cannot stat ‘user*’: No such file or directory
[oracle@hfzcdb91:/oradata/hfzcdb]$cp /backup/hfzcdbhot/sys* undo* user* /oradata/hfzcdb/
cp: cannot stat ‘undo*’: No such file or directory
cp: cannot stat ‘user*’: No such file or directory
[oracle@hfzcdb91:/oradata/hfzcdb]$cp /backup/hfzcdbhot/undo* user* /oradata/hfzcdb/
cp: cannot stat ‘user*’: No such file or directory
[oracle@hfzcdb91:/oradata/hfzcdb]$cp /backup/hfzcdbhot/user* /oradata/hfzcdb/
此时再查询, CHECKPOINT_CHANGE号回来了,但是不一致
SYS@hfzcdb> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 2189312
2 2189312
3 2189312
4 2189312
5 2190643
6 2190643
6 rows selected.
查询需要恢复的文件有哪些
SYS@hfzcdb> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME CON_ID
---------- ------- ------- ----------------------------------------------------------------- ---------- ------------------- ----------
1 ONLINE ONLINE 2189312 2023-03-29 18:41:10 0
2 ONLINE ONLINE 2189312 2023-03-29 18:41:10 0
3 ONLINE ONLINE 2189312 2023-03-29 18:41:10 0
4 ONLINE ONLINE 2189312 2023-03-29 18:41:10 0
查询需要恢复文件需要的日志文件有哪些
SYS@hfzcdb> select * from v$recovery_log;
THREAD# SEQUENCE# TIME
---------- ---------- -------------------
ARCHIVE_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CON_ID
----------
1 1 2023-03-29 16:22:20
/archive/HFZCDB/archivelog/2023_03_29/o1_mf_1_1_l285qdc4_.arc
0
1 2 2023-03-29 18:46:04
/archive/HFZCDB/archivelog/2023_03_29/o1_mf_1_2_l285qzrv_.arc
0
也可以通过change来查询
SYS@hfzcdb> select * from v$archived_log where first_change#<=2190643 and next_change#>=2189312;
RECID STAMP NAME DEST_ID THREAD# SEQUENCE# RESETLOGS_CHANGE# RESETLOGS_TIME RESETLOGS_ID FIRST_CHANGE# FIRST_TIME NEXT_CHANGE#
---------- ---------- ---------------------------------------- ---------- ---------- ---------- ----------------- ------------------- ------------ ------------- ------------------- ------------
NEXT_TIME BLOCKS BLOCK_SIZE CREATOR REGISTR STA ARC APPLIED DEL S COMPLETION_TIME DIC DIC END BACKUP_COUNT ARCHIVAL_THREAD# ACTIVATION# IS_ COM FAL END_OF_RED BAC CON_ID
------------------- ---------- ---------- ------- ------- --- --- --------- --- - ------------------- --- --- --- ------------ ---------------- ----------- --- --- --- ---------- --- ----------
23 1132771564 /archive/HFZCDB/archivelog/2023_03_29/o1 1 1 1 2182326 2023-03-29 16:22:20 1132762940 2182326 2023-03-29 16:22:20 2190614
_mf_1_1_l285qdc4_.arc
2023-03-29 18:46:04 15561 512 ARCH ARCH NO YES NO NO A 2023-03-29 18:46:04 NO NO NO 0 1 799822903 YES NO NO NO 0
24 1132771583 /archive/HFZCDB/archivelog/2023_03_29/o1 1 1 2 2182326 2023-03-29 16:22:20 1132762940 2190614 2023-03-29 18:46:04 2190629
_mf_1_2_l285qzrv_.arc
2023-03-29 18:46:23 7 512 ARCH ARCH NO YES NO NO A 2023-03-29 18:46:23 NO NO NO 0 1 799822903 YES NO NO NO 0
25 1132771607 /archive/HFZCDB/archivelog/2023_03_29/o1 1 1 3 2182326 2023-03-29 16:22:20 1132762940 2190629 2023-03-29 18:46:23 2190643
_mf_1_3_l285rqvn_.arc
2023-03-29 18:46:47 10 512 ARCH ARCH NO YES NO NO A 2023-03-29 18:46:47 NO NO NO 0 1 799822903 YES NO NO NO 0
26 1132771632 /archive/HFZCDB/archivelog/2023_03_29/o1 1 1 4 2182326 2023-03-29 16:22:20 1132762940 2190643 2023-03-29 18:46:47 2190654
_mf_1_4_l285sjy1_.arc
2023-03-29 18:47:12 5 512 ARCH ARCH NO YES NO NO A 2023-03-29 18:47:12 NO NO NO 0 1 799822903 YES NO NO NO 0
recover 数据库
SYS@hfzcdb> recover database; -- 也可以用 recover datafile 1,2 ,3 ,4
ORA-00279: change 2189312 generated at 03/29/2023 18:41:10 needed for thread 1
ORA-00289: suggestion : /archive/HFZCDB/archivelog/2023_03_29/o1_mf_1_1_l285qdc4_.arc
ORA-00280: change 2189312 for thread 1 is in sequence #1
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 2190614 generated at 03/29/2023 18:46:04 needed for thread 1
ORA-00289: suggestion : /archive/HFZCDB/archivelog/2023_03_29/o1_mf_1_2_l285qzrv_.arc
ORA-00280: change 2190614 for thread 1 is in sequence #2
Log applied.
Media recovery complete.
查询datafile 中 scn 一致:
SYS@hfzcdb> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 2290739
2 2290739
3 2290739
4 2290739
5 2290739
6 2290739
6 rows selected.
查询数据文件头 scn 一致:
SYS@hfzcdb> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 2290739
2 2290739
3 2290739
4 2290739
5 2290739
6 2290739
6 rows selected.
查询需要恢复的日志:
SYS@hfzcdb> select * from v$recovery_log;
no rows selected
SYS@hfzcdb> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ ------------------- ----------
1 1 4 209715200 512 1 YES ACTIVE 2190643 2023-03-29 18:46:47 2190654 2023-03-29 18:47:12 0
3 1 3 209715200 512 1 YES INACTIVE 2190629 2023-03-29 18:46:23 2190643 2023-03-29 18:46:47 0
2 1 5 209715200 512 1 NO CURRENT 2190654 2023-03-29 18:47:12 1.8447E+19 0
打开数据库:
SYS@hfzcdb> alter database open;
Database altered.
查询数据恢复:
SYS@hfzcdb> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ ------------------- ----------
1 1 4 209715200 512 1 YES INACTIVE 2190643 2023-03-29 18:46:47 2190654 2023-03-29 18:47:12 0
2 1 5 209715200 512 1 YES INACTIVE 2190654 2023-03-29 18:47:12 2390741 2023-03-29 19:05:48 0
3 1 6 209715200 512 1 NO CURRENT 2390741 2023-03-29 19:05:48 1.8447E+19 0
SYS@hfzcdb> select * from hfedu.itpux001;
ID SCN
---------- ----------
1 2190591
2 2190624
3 2190633
4 2190650
5 2190696
SYS@hfzcdb>
3. 总结
数据库报文件文件丢失后,通过命令查询控制文件的checkpoint一致,数据文件不一致,而且删除的文件为0,这时候把之前备份的sys* undo* user*文件拷贝到数据库目录,重新查询,数据文件checkpoint不一致,这时候需要通过recover database; 恢复数据库,启动数据库前log的checkpoit还小于恢复的,启动数据库后恢复正常,查询数据,发现没有提交的第5条数据,也在表里面,说明了没有关库的时候,这条记录已经刷到重做日志里面,再到归档里面去了。通过归档恢复了。