首页
登录 | 注册

生产案例:开发不小心把某个表数据清了,没有逻辑备份,有物理备份

刚到公司坐下,开发人员就匆匆跑过来跟我说:“由于不知道哪一天不小心把某某表的数据清空了,能否帮我恢复一下。” 第一反应,只要备份,那很简单,所以下面是我的解决办法。
 

思路一:利用闪回找回

select * from INFO_FEEDBACK_ORCLE as of timestamp to_timestamp('2016-12-06 12:00:30','YYYY-MM-DD HH24:MI:SS')
--提示闪回时间已很久

现在时间是2016年12月8号10点,我马上用闪回查询到能查到的最早时间12月6号12:00,发现那时的数据就已经清空了,所以闪回找不到了,放弃。

思路二:利用逻辑备份恢复

因为逻辑备份,无论是expdp或者exp都能指定恢复某一张表,所以赶快到服务器的调度任务里查看有没有逻辑备份,发现没有用逻辑备份,只有物理备份RMAN,所以逻辑备份恢复还是无法还原。

思路三:RMAN物理备份

最后只能用最麻烦的RMAN物理备份里,为什么说麻烦呢,因为如果在本机直接用RMAN恢复的话,就会导致其它所以表的数据都恢复了,那最近的数据就没了,所以这是万万不行的,只能利用RMAN异地恢复,然后再exp导出该表,在到服务器导入该表,所以操作有点麻烦,不管如何我答应开发,一个小时搞定,所以得赶快动手,一下是我的恢复步骤:
前提:我有一个安装oracle的测试环境

1、把原库的备份文件拷贝到测试库

备份文件包括archive归档,datafile数据,spfile参数文件,control控制文件,原库备份脚本如下:
run {
allocate channel d1 type disk;
backup as COMPRESSED BACKUPSET database format='/backup/oracle/b2bdb/full_%d_%T_%s_%p.bak';
sql 'alter system archive log current';
backup as COMPRESSED BACKUPSET archivelog all format '/backup/oracle/b2bdb/arch_log_%d_%T_%s_%p.bak' delete all input;
backup current controlfile format='/backup/oracle/b2bdb/controlfile_%d_%T_%s_%p.bak' spfile format='/backup/oracle/b2bdb/spfile_%d_%T_%s_%p.bak';
release channel d1;
}
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete;

2、生成密码文件

orapwd file=?/dbs/orapwb2bdb password=oracle

3、RMAN连接备库,并启动到nomount状态,恢复init参数文件

--指定SID
export ORACLE_SID=b2bdb
--连接RMAN测试库
rman target /
--启动到nomount状态
startup nomount
--restire spfile
RMAN> restore spfile to pfile'/u01/app/oracle/product/11.2.0/dbhome_1/dbs/initb2bdb.ora' from '/u01/bak/spfile_B2BDB_20161201_959_1.bak';

4、把恢复的参数文件initb2bdb.ora修改里面的路径内容

为了能让恢复的速度更快,我几乎不修改里面的内容,我仅仅把里面参数文件提到的目录都在测试环境建一个,与原库一样。
生产案例:开发不小心把某个表数据清了,没有逻辑备份,有物理备份

5、利用新生产的初始参数文件启动到nomount

另外开一个窗口,用我们修改会的initb2bdb.ora重启数据库倒nomount
sqlplus / as sysdba
--由于刚开始启动过,所以先关闭一下
shutdown immediate
--指定我们恢复的参数文件启动
startup nomount pfile=?/dbs/initb2bdb.ora

6、恢复控制文件

上面启动到nomount状态后,我们就可以恢复控制文件了,退出,或者另开一个窗口
--指定SID
[oracle@oratest bak]$ export ORACLE_SID=b2bdb
--连接RMAN
[oracle@oratest bak]$ rman target /
 
Recovery Manager: Release 11.2.0.4.0 - Production on Thu Dec 1 01:42:42 2016
 
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
 
connected to target database: B2BDB (not mounted)
 --恢复控制文件,from指向我们刚才拷贝过来的备份文件
RMAN> restore controlfile from '/u01/bak/controlfile_B2BDB_20161201_958_1.bak';
 
Starting restore at 01-DEC-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=19 device type=DISK
 
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/b2bdb/control01.ctl
output file name=/u01/app/oracle/oradata/b2bdb/control02.ctl
Finished restore at 01-DEC-16

7、将数据库启动到mount状态

 
RMAN> alter database mount;
 
database mounted
released channel: ORA_DISK_1

8、restore数据库(同目录)

此处我是为了能更快速度的恢复,所以数据目录那些建的跟原库是一样的,同目录情况下,我只要执行以下命令即可:
restore database;

8、restore数据库(不同目录)

若需要恢复到不同的目录,需要查出原库数据文件对应的序列号,然后set以下,如下:
注意:此次恢复不执行如下步骤,因为我的是同目录
(1)先到原库查询一下如下信息:
select file_id,file_name from dba_data_files;
1   /oradata/b2bdb/system01.dbf
2   /oradata/b2bdb/sysaux01.dbf
3   /oradata/b2bdb/undotbs01.dbf
4   /oradata/b2bdb/users01.dbf
5   /oradata/b2bdb/tbs_sso_001.dbf
6   /oradata/b2bdb/tbs_cableex_001.dbf
7   /oradata/b2bdb/tbs_b2b_001.dbf
8   /oradata/b2bdb/tbs_kh_test_001.dbf
9   /oradata/b2bdb/tbs_mmbao2_001.dbf
 
select file_id,file_name from dba_temp_files;
1   /oradata/b2bdb/temp01.dbf

注意,restore 的时候不会对temp 表空间进行restore。所以等restore 之后,我们需要手工创建temp表空间。

 利用rman脚本还原
 
RMAN>  run
 {
 set newname for datafile  1 to  "/u01/app/oracle/oradata/system01.dbf";
 set newname for datafile  2 to  "/u01/app/oracle/oradata/sysaux01.dbf";
 set newname for datafile  3 to  "/u01/app/oracle/oradata/undotbs01.dbf";
 set newname for datafile  4 to  "/u01/app/oracle/oradata/users01.dbf";
 set newname for datafile  5 to  "/u01/app/oracle/oradata/tbs_sso_001.dbf";
 set newname for datafile  6 to  "/u01/app/oracle/oradata/tbs_cableex_001.dbf";
 set newname for datafile  7 to  "/u01/app/oracle/oradata/tbs_b2b_001.dbf";
 set newname for datafile  8 to  "/u01/app/oracle/oradata/tbs_kh_test_001.dbf";
 set newname for datafile  9 to  "/u01/app/oracle/oradata/tbs_mmbao2_001.dbf";
 restore database;
 switch datafile all;
 }

9、recover 数据库

然后恢复数据库
RMAN> recover database;
 
Starting recover at 01-DEC-16
using channel ORA_DISK_1
 
starting media recovery
 
channel ORA_DISK_1: starting archived log restore to default destination
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=1814
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=1815
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=1816
channel ORA_DISK_1: reading from backup piece /backup/oracle/b2bdb/arch_log_B2BDB_20161201_957_1.bak
channel ORA_DISK_1: errors found reading piece handle=/backup/oracle/b2bdb/arch_log_B2BDB_20161201_957_1.bak
channel ORA_DISK_1: failover to piece handle=/u01/bak/arch_log_B2BDB_20161201_957_1.bak tag=TAG20161201T050152
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
archived log file name=/u01/app/oracle/oradata/b2bdb_archivelog/archivelog/1_1814_915284737.arch thread=1 sequence=1814
archived log file name=/u01/app/oracle/oradata/b2bdb_archivelog/archivelog/1_1815_915284737.arch thread=1 sequence=1815
archived log file name=/u01/app/oracle/oradata/b2bdb_archivelog/archivelog/1_1816_915284737.arch thread=1 sequence=1816
unable to find archived log
archived log thread=1 sequence=1817
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 12/01/2016 02:20:41
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 1817 and starting SCN of 180140127

若后面报这个错RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 1817 and starting SCN of 180140127

我们可以直接恢复到他指定的SCN点
RMAN> recover database until scn 180140127;
Starting recover at 01-DEC-16
using channel ORA_DISK_1
 
starting media recovery
media recovery complete, elapsed time: 00:00:00
 
Finished recover at 01-DEC-16

 10、用open resetlogs 打开数据库

SQL> alter database open resetlogs;
Database altered.

到此就够用了,至于后续一些小问题,如临时空间,日志路径问题等看着错误去处理。

11、用exp把需要恢复的那张表备份出来

exp xxx/xxx file=xxx tables=xx

12、先在原库里把那张表备份一下,然后删除

 

create table xx_bak as select * from xx;
drop table xx;

 

 

13、用imp把备份恢复进去

 

imp xxx/xxx file=xx fromuser=xxx touser=xxx

 

 

14、把刚刚备份的数据也插入到刚刚恢复的表里

insert into xx select * from xx_bak;

 

 
搞定!!
 

相关文章

  • 用消息队列和socket实现聊天系统
    前言:最近在学进程间通信,所以做了一个小项目练习一下.主要用消息队列和socket(UDP)实现这个系统,并数据库存储数据,对C语言操作不熟悉的可以参照我的这篇博客:https://www.cnblogs.com/liudw-0215/p/ ...
  • 已经更新100+篇~ 关注公众号,BAT大神带你飞~ 听说你还在写Java,看Spring,看Dubbo,今天SpringCloud, 明天Dubbo3.X新版本... 10个开发9个半在写Java后台?框架层出不穷,天天学新东西怕被甩淘汰 ...
  • 1.前言 最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系.当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下. 2.概念 在开始之前,先明确几个基础概念: 正向查询:关联字段所在的表 ...
  • c#开发Android初学(一)
    我也是最近开始学习用c#开发android,最近找在好心网友那里下到了四个android开发安卓的视频(传智的)有想要的朋友可以留下邮箱 废话不多收,分享我最近一个星期的成果. 先看最主要的一个获取数据的方法FindViewById< ...
  • TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)
    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟合问题,一般有两种思路,一种是用正则化方 ...
  • java游戏开发杂谈
    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序关闭时消亡. 这个线程里执行的逻辑,支撑 ...

2020 cecdns.com webmaster#cecdns.com
12 q. 0.077 s.
京ICP备10005923号