前言
常在河边走,哪能不湿鞋?
今天有客户联系说误更新数据表,导致数据错乱了,希望将这张表恢复到 一周前 的指定时间点。
-
数据库版本为
11.2.0.1
-
操作系统是
Windows64
-
数据已经被更改超过1周时间
-
数据库已开启归档模式
-
没有DG容灾
-
有RMAN备份
下面模拟一下问题的详细解决过程!
一、分析
以下只列出常规恢复手段:
-
数据已经误操作超过一周,所以排除使用UNDO快照来找回;
-
没有DG容灾环境,排除使用DG闪回;
-
主库已开启归档模式,并且存在RMAN备份,可使用RMAN异机恢复表对应表空间,使用DBLINK捞回数据表;
-
Oracle 12C后支持单张表恢复;
结论:安全起见,使用RMAN异机恢复表空间来捞回数据表。
二、思路
客户希望将表数据恢复到 <2021/06/08 17:00:00> 之前某个时间点。
大致操作步骤如下:
-
主库查询误更新数据表对应的表空间和无需恢复的表空间。
-
新主机安装Oracle 11.2.0.1数据库软件,无需建库,目录结构最好保持一致。
-
主库拷贝参数文件,密码文件至新主机,根据新主机修改参数文件和创建新实例所需目录。
-
新主机使用修改后的参数文件打开数据库实例到nomount状态。
-
主库拷贝备份的控制文件至新主机,新主机使用RMAN恢复控制文件,并且MOUNT新实例。
-
新主机RESTORE TABLESPACE恢复至时间点 <2021/06/08 16:00:00>。
-
新主机RECOVER DATABASE SKIP TABLESPACE恢复至时间点 <2021/06/08 16:00:00>。
-
新主机实例开启到只读模式。
-
确认新主机实例的表数据是否正确,若不正确则重复 第7步 调整时间点慢慢往 <2021/06/08 17:00:00> 推进恢复。
-
主库创建连通新主机实例的DBLINK,通过DBLINK从新主机实例捞取表数据。
📢 注意: 选择表空间恢复是因为主库数据量比较大,如果全库恢复需要大量时间。
三、测试环境模拟
为了数据脱敏,因此以测试环境模拟场景进行演示!
⭐️ 测试环境可以使用脚本安装,可以使用博主编写的 Oracle 一键安装脚本,同时支持单机和 RAC 集群模式!
1、环境准备
测试环境信息如下:
节点 | 主机版本 | 主机名 | 实例名 | Oracle版本 | IP地址 |
---|---|---|---|---|---|
主库 | rhel6.9 | orcl | orcl | 11.2.0.1 | 10.211.55.111 |
新主机 | rhel6.9 | orcl | 不创建实例 | 11.2.0.1 | 10.211.55.112 |
2、模拟测试场景
主库开启归档模式:
sqlplus / as sysdba
## 设置归档路径
alter system set log_archive_dest_1='LOCATION=/a