ORACLE数据恢复
- 格式:docx
- 大小:62.33 KB
- 文档页数:8
ORACLE数据库闪回
一、恢复删除掉的数据 (2)
方法1:通过SCN查找 (2)
方法二:通过删除时间查找 (2)
二、恢复drop掉的表 (3)
1、打开闪存功能: (3)
1、服务起不来,未初始化服务句柄: (4)
2、空闲进程登录: (4)
3、找到init文件,创建spfile: (4)
4、开启闪存功能:alter database flashback on (5)
5、先开启归档模式,再开启闪存功能 (5)
2、查看闪回参数: (5)
3、闪回实例: (6)
4、表版本和闪回功能 (6)
5、表结构更改还能不能恢复 (7)
6、为普通用户添加查看字典表的权限 (8)
7、管理回收站 (8)
8、禁用或启用recyclebin (8)
Oracle9i版本开始支持闪回查询,即可以及时取回误删的数据。
一、恢复删除掉的数据
例:
1、创建表
createtable tt (idnumber,namevarchar2(20));
2、表中插入数据
select * from tt;
ID NAME
1 1 张三
2 2 李四
3 3 王五
3、删除所有数据,并提交
deletefrom tt ;
commit;
方法1:通过SCN查找
(每隔5分钟,系统产生一次系统时间标记与scn的匹配并存入sys.smon_scn_time表。
)
3、查找删除前后的SCN
select dbms_flashback.get_system_change_number from dual;
-- 结果为:1387348
selectcount(*) from tt asofscn1387348;
-- 结果为:0
selectcount(*) from tt asofscn1387310;
-- 结果为:3
4、恢复数据
insertinto tt select * from tt asofscn1387310;
commit;
selectcount(*) from tt
-- 结果为:3
最终delete的数据已经找回了。
方法二:通过删除时间查找
重新执行步骤2、3.
4、通过删除时间找数据
select *
from tt asof
timestamp to_date('2016-03-23 23:45:00', 'yyyy-mm-dd hh24:mi:ss');
-- 结果为:三条数据
5、还原数据
insertinto tt
select *
from tt asof
timestamp to_date('2016-03-23 23:45:00', 'yyyy-mm-dd hh24:mi:ss'); commit;
selectcount(*) from tt;
-- 结果为:3
二、恢复drop掉的表
1、打开闪存功能:
Microsoft Windows [版本6.1.7601]
版权所有(c) 2009 Microsoft Corporation。
保留所有权利。
C:\Users\gxy>sqlplus sys/orcl@orcl as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期四3月24 22:17:44 2016 Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 1670221824 bytes
Fixed Size 2176328 bytes
Variable Size 1023412920 bytes
Database Buffers 637534208 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> alter system set db_recovery_file_dest_size=80g scope=spfile;
系统已更改。
SQL> alter system set db_recovery_file_dest='D:\app\flash_recovery_area' sco pe=spfile;
系统已更改。
SQL> alter system set db_flashback_retention_target=1440 scope=spfile;
系统已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
1、服务起不来,未初始化服务句柄:
SQL> startup mount;
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
SQL> startup mount;
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误, hostdef 扩展名不存在
SQL> startup open;
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误, hostdef 扩展名不存在
SQL> startup nomount
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误, hostdef 扩展名不存在
2、空闲进程登录:
1.关掉当前的sqlplus窗口
2.打开cmd窗口,输入sqlplus /nolog
3.conn /as sysdba;
4.startup; 即可
Microsoft Windows [版本6.1.7601]
版权所有(c) 2009 Microsoft Corporation。
保留所有权利。
C:\Users\gxy>sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 星期四3月24 22:34:50 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL> conn sys/orcl as sysdba;
已连接到空闲例程。
SQL> startup;
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translat
ed
ORA-01263: Name given for file destination directory is invalid
OSD-04018: ??????????????????????????
O/S-Error: (OS 3) ??????????????????????
SQL>create spfile from pfile;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file
'D:\app\product\11.2.0\dbhome_1\database\INITORCL.ora'
3、找到init文件,创建spfile:
在目录:d:\app\admin\orcl\pfile找到init.ora.022*********文件,可以看出这个文件是报错之前的备份参数文件。
然后在D:\app\product\11.2.0\dbhome_1\database目录下新建一个INITORCL.ora文件,然后执行create spfile from pfile;然后执行startup;可见启动正常了。
注:Spfileorcl.ora文件存放路径:D:\app\product\11.2.0\dbhome_1\database
4、开启闪存功能:alter database flashback on
SQL> conn / as sysdba;
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 1670221824 bytes
Fixed Size 2176328 bytes
Variable Size 1023412920 bytes
Database Buffers 637534208 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> alter database flashback on;
alter database flashback on
*
第1 行出现错误:
ORA-38706: 无法启用FLASHBACK DA TABASE 事件记录。
ORA-38707: 尚未启用介质恢复。
5、先开启归档模式,再开启闪存功能
1、shutdown normal或shutdown immediate关闭数据库
2、startup mount;
3、启用或停止归档模式alter database archivelog、alter database noarchivelog
4、alter database open;
5、archive log list;
具体操作:
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> alter database flashback on;
数据库已更改。
SQL> select log_mode,open_mode,flashback_on from v$database;
LOG_MODE OPEN_MODE FLASHBACK_ON
------------------------ ---------------------------------------- ------------------------------------ ARCHIVELOG READ WRITE YES
2、查看闪回参数:
SQL> show parameters db_recovery_file_dest;
NAME TYPEV ALUE
------------------------------------ ----------------------------------------------------
db_recovery_file_dest string D:\app\flash_recovery_area
db_recovery_file_dest_size big integer 3912M
3、闪回实例:
createtable tt (idnumber,namevarchar2(20));
select * from tab where tabtype = 'TABLE';
droptable tt;
查看回收站的表:select * from recyclebin;
可见原来recyclebin下没有数据,现在多了一条数据,这个object_name并不是TT,但是却是之前的TT表,查看Tab表可见TT表没了,而新增了一张
TNAME=BIN$nfMPUn54RK+JrwMu+ouD8A==$0的表
select * from tab where tabtype = 'TABLE';
恢复表:flashback table TT to before drop;
恢复表后回收站中就没有了。
清空回收站:PURGE RECYCLEBIN;
永久删除该表:DROP TABLE RECYCLETEST PURGE;
4、表版本和闪回功能
向表tt中添加数据:报错:对表空间users无权限:
insertinto tt(id,name) values(1,'张三');
处理方法:在sysdba用户下,给test用户分配权限:quota(分配配额,配额管理)
alterusertestquotaunlimitedonusers;
再次执行insert语句已经成功了。
--第一个版本删除,再创建,插入数据,生成第二个版本
droptable tt;
createtable tt(idnumber,namevarchar2(20));
insertinto tt(id,name) values(2,'李四');
commit;
--第二个版本删除,再创建,插入数据,生成第三个版本
droptable tt;
createtable tt(idnumber,namevarchar2(20));
insertinto tt(id,name) values(3,'王五');
commit;
--将第二个版本的闪回到tt2表中
flashbacktable tt tobeforedroprenameto tt2;
--将第一个版本的闪回到tt3表中
flashbacktable tt tobeforedroprenameto tt3;
--查询看看结果
select * from tt2; --2、李四
select * from tt3; --1、张三
select * from tt; --3、王五
Drop前,tt上建了索引INX_TT:
createindex INX_TT on TT (id);
那么执行下面sql:
SELECT OBJECT_NAME,
ORIGINAL_NAME,
TYPE
FROM USER_RECYCLEBIN
WHERE BASE_OBJECT in (SELECT BASE_OBJECT
FROM USER_RECYCLEBIN
WHERE ORIGINAL_NAME = 'TT')
结果如下:可见,删除table后,index对象也在USER_RECYCLEBIN中(位图索引特殊,不放置在回收站中,因而无法检索它们):
OBJECT_NAME ORIGINAL_NAME TYPE
BIN$yScHvey+QEWB43W74JGOoA==$0 INX_TT INDEX
BIN$4RVHcirYTnGv321SgLkiAg==$0 TT TABLE
5、表结构更改还能不能恢复
--1、建表;
createtable tt(idnumber,namevarchar2(20),address varchar2(100));
--2、删表;
droptable tt;
--3、创建表结构不一样的表;
createtable tt(idnumber,namevarchar2(20));
--4、如果这个时候flashback before drop的话,那么报对象已经被引用的错误;
select * from user_recyclebin;
--5、重命名3中新建的表;
rename tt to tt55;
--6、flashback before drop就还原了1中新建的表结构及内容
flashbacktable TT tobeforedrop;
6、为普通用户添加查看字典表的权限
在普通用户下执行sql:select dbid,name,flashback_on,current_scn from v$database;
发现没有权限,那么添加权限方式为:grant SELECT ANY DICTIONARY to test;
7、管理回收站
清除回收站中的单个表:purge table test_drop
清除整个回收站:purge recyclebin
清除不同的对象回收站:purge user_recyclebin或purge dba_recyclebin
注意:需要注意的是sysdba的drop操作不会被记录,Oracle也从不推荐用户使用sysdba身份创建用户对象
如果删除一个表且不放到回收站中不能进行恢复,在drop语句中可以利用purge选项。
SQL>drop table test_drop purge;
8、禁用或启用recyclebin
可以在session/system级动态修改:
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------
recyclebin string on
SQL> alter session set recyclebin=off;
会话已更改。
SQL> alter session set recyclebin=on;
会话已更改。
SQL> alter system set recyclebin=off;
系统已更改。
SQL> alter system set recyclebin=on;
系统已更改。