Oracle之表空间基于时间点的恢复

记一次优化过程中;一次误操作,在不影响其他表空间的情况下;采用表空间基于时间点的恢复(TSPITR)方法恢复数据的过程。

1.TSPITR恢复原理

   TSPITR目前最方便的方法是使用RMAN进行自动的恢复。其使用前提为两个,一个是必须存在相应的备份集合,另一个是表空间对象是“self-contain”,也就是其他表空间中不包括与这个表空间对象相关的对象数据。

恢复步骤和原理如下:

  • RMAN三个对象集合:catalog、target和auxiliary。其中auxiliary就是用于辅助target各种备份还原要求的操作数据库。这个库在TSPITR中扮演临时数据还原作用的;
  • 首先完成数据检查工作,确定备份集合和表空间完整性;
  • 当前时间是T1,如果需要将数据还原为T0。使用RMAN提取备份数据集合,还原到auxiliary上形成一个新的实例数据库。选择性应用归档日志序列,还原auxiliary到TO时间点;
  • 使用expdp工具从auxiliary中导出目标表空间为dump对象。注意:还原auxiliary并不是100%重建target,而是选择系统运行表空间和目标表空间;
  • 在target数据库中删除原表空间。使用impdp工具导入dump文件进入target数据库;
  • 清理环境,将创建的auxiliary数据库删除;

2. 模拟环境:
2.1 备份数据库

  backup database format '/data/oracle/rman/back_db_%U';

2.2 误操作模拟

SQL> alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS";

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
2017-04-07 11:14:22

SQL> conn lottu/li0924
Connected.

SQL> select count(1) from lottu02;

  COUNT(1)
----------
       999

SQL> truncate table lottu02;                   --误操作

Table truncated.

3.模拟恢复操作
3.1 第一次恢复过程
模拟第一次恢复结果是失败的;我的恢复脚本如下:

run{
sql 'alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"';
sql 'alter session set NLS_LANGUAGE=American';
recover tablespace LOTTU until time='2017-04-07 11:14:22' auxiliary destination '/u01/auxiliary';
}

在上述的步骤4出现错误;即使用expdp工具从auxiliary中导出目标表空间为dump对象这个过程;错误信息如下:

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 04/06/2017 16:43:57
RMAN-06136: ORACLE error from auxiliary database: ORA-01097: cannot shutdown while in a transaction - commit or rollback first
RMAN-06962: Error received during export of metadata
RMAN-06960:    EXPDP> ORA-39065: unexpected master process exception in MAINORA-04031: unable to allocate 32 bytes of shared memory ("shared pool","select obj# from oid$ where ...","SQLA","tmp")
RMAN-06960:    EXPDP> ORA-39097: Data Pump job encountered unexpected error -4031

根据错误信息中“EXPDP> ORA-39065: unexpected master process exception in MAINORA-04031: unable to allocate 32 bytes of shared memory” 出现辅助实例内存不够。


3.2第二次恢复
本次恢复结果是成功的;与上次不同的是;本次添加了辅助实例的参数文件。操作如下;

[oracle@oracle234 auxiliary]$ cat initaux.ora 
db_name=ORA11G                                  
db_unique_name=swhw_tspitr_ORA11G
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=1024M
processes=50

其中 "db_name="和"compatible=" 需要跟恢复数据库是一致的;这个可以从第一次恢复信息拷贝。
恢复脚本如下:

run{
set auxiliary instance parameter file to '/u01/auxiliary/initaux.ora'
sql 'alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"';
sql 'alter session set NLS_LANGUAGE=American';
recover tablespace LOTTU until time='2017-04-07 11:14:22' auxiliary destination '/u01/auxiliary';
} 

3.3 验证结果:

SQL> select file#,status from v$datafile;

     FILE# STATUS
---------- -------
     1 SYSTEM
     2 ONLINE
     3 ONLINE
     4 ONLINE
     5 OFFLINE
     6 ONLINE

6 rows selected.

SQL> alter tablespace lottu online;

Tablespace altered.

SQL> conn lottu/li0924
Connected.
SQL> select count(1) from lottu02;

  COUNT(1)
----------
       999

从结果来看;恢复是成功的。

4. 参考文献
http://www.cnblogs.com/jyzhao/p/4956220.html

你可能感兴趣的:(Oracle之表空间基于时间点的恢复)