zoukankan      html  css  js  c++  java
  • 6.手工备份恢复打开数据库的备份与恢复(练习7、8)

    练习7:打开数据库的完全数据库恢复

    在出现数据库故障时,可以用打开数据库备份并应用重做信息,来完全恢复数据库。
    步骤一:破坏数据库
    首先需要将数据库文件脱机解除操作系统对文件的锁定,然后进行删除,如下:

    1 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/tools01.dbf’ offline;
    2 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/users01.dbf’ offline;

     

    需要注意的是,在短时间内数据库不会产生错误,因为Oracle将数据块读取到内存中。如所需的数据库实现未在内存,数据库将从磁盘读取数据,对于更改过的数据块也是如此,数据库会发现文件已经不存在,将会提示如下错误信息:

     

    此时切换日志不会产生错误,因为这两个丢失的文件不是联机的,除非我们将这两个文件恢复到联机状态。

    1 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/tools01.dbf’ online;
    2 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/users01.dbf’ online;

     由于数据库处于变化中,提示如下信息:

     

    如果我们在这时视图将数据库关闭,Oracle会提示错误,在关闭Oracle进程需要成功完成对所有联机数据文件的一个检查点,可以通过数据文件脱机然后关闭数据库。启动数据库,在打开数据库时遇到错误,查看告警日志文件,在这个文件中,可以看到如下错误信息:

     
    步骤二:还原丢失的数据文件
    使用数据字典,获取需要恢复的文件,可以通过如下方式进行查看: 

    1 SQL> SELECT * FROM v$recover_file;
    2 SQL> SELECT file#,ts#, status,name FROM v$datafile;

     

     打开数据库备份脚本所使用的备份目的路径下复制users01.dbf和tools.dbf文件,当把文件复制回他们原来的数据库位置时,检查v$recover_file中的内容,该视图的值已经发生改变,change#列有一个值,这个数字与v$datafile视图中的checkpoint_change#来的小。
     

     步骤三:恢复还原的数据文件
    为恢复一个表空间或一个数据文件,首先通过恢复数据文件恢复TOOLS表控件,然后使用RECOVER DATAFILE命令,从归档和联机日志文件实施重做。
    可以通过文件号或文件名进行恢复:
    1 SQL> RECOVER DATAFILE 6;

     对于PRACTICE数据库,文件5就是tools.dbf文件。恢复命令找出还原文件的检查点SCN,并将此数值与重做日志文件中的SCN进行比较,确定哪些文件需要恢复,然后该文件将从归档目的路径中读出并用于数据文件,可以看到类似如下信息:

     

     数据文件恢复后,会得到如下消息:

     

     查看告警日志,看以看到恢复过程的时间基线

      

    这里介绍一下指定归档路径的恢复,可以将文件复制到其初始位置或者告诉恢复命令去查看另一个路径。

    1 SQL> RECOVER FROM ‘….’ DATAFILE 5;

     对于包含还原文件的整个表空间,可以使用RECOVER命令:

    1 SQL> RECOVER FROM ‘….’ TABLESPACE TOOLS;

     也可以在一个命令中恢复多个数据文件或表空间,在REOVER命令后写上期望恢复的各个数据文件或表空间并用逗号隔开:

    1 SQL> RECOVER FROM  ‘D:\oracle\PRACTICE\ARCHIVE’;
    2          DATAFILE  ‘D:\oracle\PRACTICE\USERS01.DBF’,
    3                    ‘D:\oracle\PRACTICE\TOOLS01.DBF’;

     步骤四:确认数据库恢复
    恢复数据文件后可使用ALTER DTABASE命令将数据文件置回到联机状态,如果数据文件成功置回到联机状态表明已经成功地恢复了这些数据文件,因为只有当这些被还原的数据文件与控件文件相匹配时,数据文件才能置回到联机状态。

    1 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/tools01.dbf’ online;
    2 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/users01.dbf’ online;

     

    查询TINA.DATA_LOG中检查数据,看是否能达到预期的数据。

     

    练习8:打开数据库的不完全数据库恢复

    该情况在实际情况将经常使用,所以本练习非常重要。该练习中我们将删除一个用户SCOTT的一个表(emp,具体创建请参考“2.Oracle10g备份恢复准备工作”),然后从先前的打开数据库备份中还原所有文件,并利用备份控制文件恢复数据库。
    步骤一:删除一个表
    向TINA.DATA_LOG插入一笔时间为50年后的数据,切换日志,并从v$datafile中的 change#列中提取数据文件检查点SCN号,记下这些就可以用DROP命令来删除表了:

    1 SQL> INSERT INTO tina.date_log VALUES (sysdate+365*50);
    2 SQL> COMMIT;
    3 SQL> ALTER SYSTEM SWITCH LOGFILE;

     

     

    1 SQL> DROP TABLE scott.emp;
    2 SQL> SELECT * FROM tina.date_log; 
    3 SQL> ALTER SYSTEM SWITCH LOGFILE;

     

    删除该表后插入一笔时间为8年后数据

    1 SQL> INSERT INTO tina.date_log VALUES (sysdate+365*8);
    2 SQL> COMMIT;
    3 SQL> SELECT * FROM tina.date_log;

     

    不完全恢复PRACTICE数据库后将只能看到表中等于或早于删除表之前记录的时间的那些记录。
    步骤二:重新命名一个归档日志
    练习4中不完全恢复是基于时间,本练习中是基于取消的恢复,当某一个归档日志文件损坏或丢失时,常使用取消的恢复。
    1 SQL> SELECT sequence# FROM v$log WHERE status=’CURRENT’;

     

    查看归档路径,找出序号小于前面查询结果返回序号的归档日志文件。例如,当前日志文件序号为13,定位D:\oracle\PRACTICE\ARCHIVE文件夹下名为ARC00012_0708077288.001的文件,将这个文件命名为ARC00012_0708077288.001.backup,在步骤5恢复数据库时,模拟找不到该归档文件撤销恢复。

     

    步骤三:还原数据库
    关闭数据库,使用删除表之前所做的拷贝取代所有的数据文件(注意不要把备份的覆盖当前联机重做日志),然后把日志应用于所有的数据文件,直到表被删除的某一时间点。在关闭数据库之前如果时间允许,则需要实施全数据库的关闭备份。

     

    步骤四:将数据库恢复至某一时间点
    通过MOUNT方式启动数据库,查看v$recover_file的内容,看到所有的数据文件都需要恢复,值得注意的是除了USERS表空间的两个文件外,所有的文件都拥有不同的更改号,这是因为这些数据文件在打开数据库备份期间复制的。

     

    在此处恢复中,删除表之前的日志文件序号是12,持续应用恢复命令中建议的日志,直到日志序号11,然后撤销操作。
    1 SQL> RECOVER DATABASE;

      

    1 SQL> SET LOGSOURCE ‘D:\oracle\PRACTICE\ARCHIVE’;

     前面恢复中使用非缺省路径,也可以在RECOVER命令之前用SET LOGSOURCE项打开数据库。
    恢复完毕,需使用ALTER DATABASE OPEN命令中制定RESETLOGS,联机重做日志将以数字1开始。强烈建议数据库打开后进行备份,因为以前做的备份不能够使用了。
    步骤五:确认恢复
    查看SCOTT.EMP表是否存在,从TINA.DATE_LOG中提取数据是否存在删除表之前插入的数据,是否存在删除表之后插入的数据。

    1 SQL> SELECT * FROM tina.date_log;

     

  • 相关阅读:
    JDBC中大数据量的分页解决方法?
    JDBC中的Statement 和PreparedStatement的区别?
    JDBC操作数据库的步骤 ?
    存储过程和函数的区别?
    什么是MVC模式?   
    流行的框架部分?
    请描述一下Struts2的值栈结构,以及它是如何工作的?
    下载文件?
    Struts2的功能扩展点有哪些?
    请说说Struts1和Struts2的区别?
  • 原文地址:https://www.cnblogs.com/shishanyuan/p/1649729.html
Copyright © 2011-2022 走看看