Oracle数据库:NOARCHIVELOG 模式恢复示例

来源:互联网 发布:python 文档管理系统 编辑:程序博客网 时间:2024/04/29 10:16
 
完全数据库恢复:NOARCHIVELOG 模式  
 
1. 关闭数据库并禁用自动归档。启动该例程并装载数据库。将数据库设置为 NOARCHIVELOG 模式,然后打开数据库。执行 ARCHIVE LOG LIST 命令以确认状态。
       SQL> shutdown immediate
       Database closed.
       Database dismounted.
       ORACLE instance shut down.
       SQL> exit
       $ vi $HOME/ADMIN/PFILE/init<sid>.ora
       comment out the log_archive_start parameter
       $ sqlplus /nolog
       SQL> connect / as sysdba
       Connected to an idle instance.
       SQL> startup mount pfile=$HOME/ADMIN/PFILE/init<sid>.ora
       SQL> alter database noarchivelog;
       sql> alter database open;
       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.    关闭数据库,使用操作系统命令执行关闭的数据库的完全备份,即将文件复制到 $HOME/BACKUP/NOARCHTEST 目录中。验证副本是否完整。启动该例程,装载并打开数据库。
       SQL> shutdown immediate
       SQL> exit
       $ cp -r $HOME/ORADATA/u* $HOME/BACKUP/NOARCHTEST
       $ ls -alr $HOME/BACKUP/NOARCH/*
       $ sqlplus /nolog
       SQL> connect / as sysdba
       SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
 
3.         运行 以下脚本,新建一个名为 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.emphist;
      
4.    以 system/manager 的身份进行连接,并执行以下脚本以获取包含 TEST 表的数据文件的名称:
       SQL> select f.file_name from dba_tables t, dba_data_files f
       2> where table_name = ‘TEST‘ and
       3> t.tablespace_name=f.tablespace_name;
       FILE_NAME
       ----------------------------------------------/databases/db01/ORADATA/u03/users01.dbf
 
5.    在 SQL*Plus 中运行以下脚本以模拟出现故障时的情况
    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;
 
6.    试着重新正常启动数据库。结果怎样?
       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 的数据文件。因此,数据库仍处于装载状态。由于服务器认为出现了介质故障,所以它无法找到 USERS 表空间的文件。
 
7. 关闭数据库,使用相应的操作系统命令将当前数据库替换为最新的备份(提示:从 NOARCHTEST 目录复制到 ORADATA 目录)。
       SQL> connect / as sysdba;
       SQL> shutdown abort;
       SQL> !cp -r $HOME/BACKUP/NOARCHTEST/u* $HOME/ORADATA
 
8. 启动并打开数据库,以使所有用户都能使用。
       SQL> connect / as sysdba;
       SQL> startup pfile=$HOME/ADMIN/PFILE/init<sid>.ora
 
9. 以 hr/hr 的身份连接到数据库,并对 TEST 表执行查询。结果怎样?为什么?
       SQL> connect hr/hr;
       SQL> SELECT * FROM TEST;
       ORA-00942: table or view does not exist
       该表不存在,因为它是在执行上次备份之后创建的。
 
10.   结论
       脱机备份可用于还原数据库。处于 NOARCHIVELOG 模式的数据库没有可用于恢复到故障点的归档重做日志文件。因此,上次备份后的所有更改都已丢失。由此可解释为什么 TEST 表已不存在。