完全数据库恢复:ARCHIVELOG
模式
1.
查询 V$DATABASE
视图以确定数据库的归档日志模式。使用 ARCHIVE LOG LIST
检查自动归档的状态。
SQL> select dbid, name, log_mode from v$database;
DBID NAME LOG_MODE
--------- ----- ------------
1943591421 DB01 NOARCHIVELOG
1 row selected.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /databases/db01/ORADATA/ARCHIVE2/
Oldest online log sequence 69
Current log sequence 70
2.
关闭该例程,并配置自动归档。装载数据库并使用 ALTER DATABASE
命令将数据库设置为 ARCHIVELOG
模式。
SQL> shutdown immediate;
SQL> exit
编辑 init.ora 文件以设置 LOG_ARCHIVE_START 参数。
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora
SQL> alter database archivelog;
SQL> alter database open;
3.
使用 ARCHIVE LOG LIST
命令验证更改。记下当前的日志序列号。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /databases/db01/ORADATA/ARCHIVE2/
Oldest online log sequence 69
Next log sequence to archive 70
Current log sequence 70
4.
执行关闭的数据库的备份。将该备份存储在 $HOME/BACKUP/UMAN
目录中。
SQL> shutdown immediate;
SQL> !cp -rp $HOME/ORADATA/u* $HOME/BACKUP/UMAN
SQL > startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
5.
运行
以下脚本,新建一个名为 TEST
的表,并向该表中添加行。
connect system/manager
ALTER USER hr
QUOTA UNLIMITED ON users;
CREATE TABLE TEST
(
id
INTEGER,
col2 VARCHAR2(20)
)TABLESPACE users;
查询该表以获取表中的行数。
SQL> SELECT count(*) FROM hr.TEST;
6.
以 system/manager
的身份进行连接,运行
select file_name from dba_data_files
where tablespace_name in
(select tablespace_name from dba_tables
where table_name = 'TEST' and OWNER = 'HR');脚本,并记下与包含 TEST 表的表空间关联的数据文件的名称。
FILE_NAME
------------------------------------------------------
/databases/db01/ORADATA/u03/users01.dbf
1 row selected.
7.
运行脚本以模拟出现硬件故障的情况。
connect system/manager
set head off
set feedback off
set echo off
alter system switch logfile;
@/LABS/moreTEST.sql
SELECT count(*) FROM hr.TEST;
connect system/manager
alter system switch logfile;
spool %CLASS_HOME%/STUDENT/LABS/breakdb.cmd
select 'del /q ' || file_name from dba_data_files
where tablespace_name = 'USERS';
spool off
alter system switch logfile;
8.
试着正常启动数据库。结果怎样?
SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
ORACLE instance started.
Database mounted.
ORA-01157: cannot identify/lock datafile 3 - see DBWR trace file
ORA-01110: datafile 3: '/databases/db01/ORADATA/u03/users01.dbf'
Oracle 服务器无法打开编号为 3 的数据文件。因此,数据库仍旧处于 MOUNT 模式。
9.
由于 Oracle
服务器认为出现了介质故障,所以它无法找到 USERS
表空间的文件。由于归档已启用,现在可以执行完全恢复了。
从第 4 步制作的备份中还原 USERS 表空间的数据文件。
$ cp -p $HOME/BACKUP/UMAN/u03/users01.dbf $HOME/ORADATA/u03/users01.dbf
10.
用 RECOVER DATABASE
命令恢复数据库。
SQL> recover automatic database;
11.
恢复完成后,打开数据库以便让所有用户可以使用。
SQL> alter database open;
12.
查询 DBA_TABLESPACES
视图,以查看 USERS
表空间是否联机。
SQL > select tablespace_name, status from dba_tablespaces
2 > where tablespace_name = ‘USERS’;
TABLESPACE_NAME STATUS
--------------- ---------
USERS ONLINE
1 row selected.
13.
对 HR.TEST
表执行查询。结果怎样?
SQL> SELECT count(*) FROM hr.TEST;
COUNT(*)
----------
55
1 row selected
注:breakdb.sql 脚本执行 moreTEST.sql 脚本,后者将附加的行插入到 HR.TEST 表中。
14.
以 system/manager
的身份进行连接,查询 V$LOG
视图,并记下序列号。将这些值与第 3
步中找到的值进行比较。关于完全恢复,您可以得出什么结论?
SQL> SELECT * FROM v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS...
------ ------- --------- ------- ------- --- ------
1 1 77 10485760 2 YES INACTIVE
2 1 78 10485760 2 NO CURRENT
制作数据库备份时使用的日志序列号将高于第 3 步中的序列号。在恢复过程中,已应用了归档重做日志文件,并且将数据库更新到当前时间点。