【Oracle数据库】手滑删错数据,一步步教你如何挽救?

简介: 【Oracle数据库】手滑删错数据,一步步教你如何挽救?

前言

常在河边走,哪能不湿鞋?

今天有客户联系说误更新数据表,导致数据错乱了,希望将这张表恢复到 一周前 的指定时间点。


  • 数据库版本为 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 集群模式!


开源项目:Install Oracle Database By Scripts!


更多更详细的脚本使用方式可以订阅专栏:Oracle一键安装脚本。


1、环境准备

测试环境信息如下:

image.png2、模拟测试场景

主库开启归档模式:

sqlplus /as sysdba
## 设置归档路径
alter system set log_archive_dest_1='LOCATION=/archivelog';## 重启开启归档模式
shutdown immediate
startup mount
alter database archivelog;
## 打开数据库
alter database open;


创建测试数据:

sqlplus /as sysdba
## 创建表空间
create tablespace lucifer datafile '/oradata/orcl/lucifer01.dbf' size 10M autoextend off;create tablespace ltest datafile '/oradata/orcl/ltest01.dbf' size 10M autoextend off;## 创建用户
create user lucifer identified by lucifer;grant dba to lucifer;## 创建表
conn lucifer/lucifer
createtable lucifer(id number notnull,name varchar2(20)) tablespace lucifer;## 插入数据
insertinto lucifer values(1,'lucifer');insertinto lucifer values(2,'test1');insertinto lucifer values(3,'test2');commit;

image.png

进行数据库全备:

rman target /## 进入 rman 后执行以下命令
run {allocate channel c1 device type disk;allocate channel c2 device type disk;crosscheck backup;crosscheck archivelog all;sql"alter system switch logfile";delete noprompt expired backup;delete noprompt obsolete device type disk;backup database include current controlfile format '/backup/backlv0_%d_%T_%t_%s_%p';backup archivelog all DELETE INPUT;release channel c1;release channel c2;}

image.png


模拟数据修改:

sqlplus /as sysdba
conn lucifer/lucifer
deletefrom lucifer where id=1;update lucifer set name='lucifer'where id=2;commit;

image.png

📢 注意: 为了模拟客户环境,假设无法通过UNDO快照找回,当前删除时间点为:<2021/06/17 18:10:00>。


如果使用UNDO快照,比较方便:

sqlplus /as sysdba
## 查找UNDO快照数据是否正确
select*from lucifer.luciferas of timestamp to_timestamp('2021-06-17 18:05:00','YYYY-MM-DD HH24:MI:SS');## 将UNDO快照数据捞至新建表中
createtable lucifer.lucifer_0617asselect*from lucifer.luciferas of timestamp to_timestamp('2021-06-17 18:05:00','YYYY-MM-DD HH24:MI:SS');

image.png


四、RMAN完整恢复过程


主库查询误更新数据表对应的表空间和无需恢复的表空间:

sqlplus /as sysdba
## 查询误更新数据表对应表空间
select owner,tablespace_name from dba_segments where segment_name='LUCIFER';## 查询所有表空间
select tablespace_name from dba_tablespaces;

image.png

image.png

主库拷贝参数文件,密码文件至新主机,根据新主机修改参数文件和创建新实例所需目录:

## 生成pfile参数文件
sqlplus /as sysdba
create pfile='/home/oracle/pfile.ora'from spfile;exit;## 拷贝至新主机
su - oracle
scp /home/oracle/pfile.ora10.211.55.112:/tmp
scp $ORACLE_HOME/dbs/orapworcl 10.211.55.112:$ORACLE_HOME/dbs
## 新主机根据实际情况修改参数文件并且创建目录
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /oradata/orcl/mkdir -p /archivelog
chown -R oracle:oinstall /archivelog
chown -R oracle:oinstall /oradata

image.png


新主机使用修改后的参数文件打开数据库实例到nomount状态:

sqlplus /as sysdba
startup nomount pfile='/tmp/pfile.ora';

image.png

主库拷贝备份的控制文件至新主机,新主机使用RMAN恢复控制文件,并且MOUNT新实例:

rman target /list backup of controlfile;exit;## 拷贝备份文件至新主机
scp /backup/backlv0_ORCL_20210617_107548592*10.211.55.112:/tmp
scp /u01/app/oracle/product/11.2.0/db/dbs/0c01l775_1_1 10.211.55.112:/tmp
## 新主机恢复控制文件并开启到mount状态
rman target /restore controlfile from'/tmp/backlv0_ORCL_20210617_1075485924_9_1';alter database mount;


通过 list backup of controlfile; 可以看到控制文件位置:

image.png

image.png

image.png


新主机RESTORE TABLESPACE恢复至时间点 <2021/06/17 18:06:00> :

## 新主机注册备份集
rman target /catalog start with '/tmp/backlv0_ORCL_20210617_107548592';crosscheck backup;delete noprompt expired backup;delete noprompt obsolete device type disk;## 恢复表空间LUCIFER和系统表空间,指定时间点 `2021/06/1718:06:00`
run {sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';set until time '2021-06-17 18:06:00';allocate channel ch01 device type disk;allocate channel ch02 device type disk;restore tablespace SYSTEM,SYSAUX,UNDOTBS1,USERS,LUCIFER;release channel ch01;release channel ch02;}

image.png


新主机RECOVER DATABASE SKIP TABLESPACE恢复至时间点 <2021/06/17 18:06:00> :

rman target /run {sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';set until time '2021-06-17 18:06:00';allocate channel ch01 device type disk;recover database skip tablespace LTEST,EXAMPLE;release channel ch01;}

image.png

这里有一个小BUG: 客户环境是Windows,执行这一步最后报错,手动offline数据文件依然无法开启数据库。

image.png


解决方案:

sqlplus /as sysdba
## 将恢复跳过的表空间都offline drop掉,执行以下查询结果
select'alter database datafile '|| file_id ||' offline drop;'from dba_data_files where tablespace_name in('LTEST','EXAMPLE');## 再次开启数据库
alter database open read only;

📢 注意: 如果显示缺归档日志,可以参考如下步骤:

sqlplus /as sysdba
## 查询恢复需要的归档日志号时间 
alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";select first_time,sequence# from v$archived_log where sequence#='7';exit;## 通过备份RESTORE吐出所需的归档日志 
rman target /catalog start with '/tmp/0c01l775_1_1';crosscheck archivelog all;run {allocate channel ch01 device type disk;SET ARCHIVELOG DESTINATION TO '/archivelog';restore ARCHIVELOG SEQUENCE 7;release channel ch01;}## 再次recover进行恢复至指定时间点 2021-06-1718:06:00run {sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';set until time '2021-06-17 18:06:00';allocate channel ch01 device type disk;recover database skip tablespace LTEST,EXAMPLE;release channel ch01;}


新主机实例开启到只读模式:

sqlplus /as sysdba
alter database open read only;

image.png

确认新主机实例的表数据是否正确:

sqlplus /as sysdba
select*from lucifer.lucifer;

image.png

📢 注意: 若不正确则重复 第7步 调整时间点慢慢往 2021/06/17 18:10:00 推进恢复:

## 关闭数据库
sqlplus /as sysdba
shutdown immediate;## 开启数据库到mount状态
startup mount pfile='/tmp/pfile.ora';## 重复 第7步,往前推进1分钟,调整时间点为 `2021/06/0818:07:00`
rman target /run {sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';set until time '2021-06-17 18:07:00';allocate channel ch01 device type disk;recover database skip tablespace LTEST,EXAMPLE;release channel ch01;}


主库创建连通新主机实例的DBLINK,通过DBLINK从新主机实例捞取表数据:

sqlplus /as sysdba
## 创建dblinnk
CREATE PUBLIC DATABASE LINK ORCL112
CONNECT TO lucifer
IDENTIFIED BY lucifer
USING '(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.211.55.112)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl))))';## 通过dblink捞取数据
createtable lucifer.lucifer_0618asselect/*+full(lucifer)*/*from lucifer.lucifer@ORCL112;select*from lucifer.lucifer_0618;

image.png

image.png

至此,整个RMAN恢复过程就结束了!


写在最后

备份永远是最后一道防线,所以备份一定要做好!!!

相关文章
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
194 61
|
5天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
17 1
|
10天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
13天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
42 5
|
26天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
85 11
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
1月前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
14天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
14天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3

推荐镜像

更多