如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
适用于:
Oracle Database – Enterprise Edition –版本10.1.0.2及以上
本文信息适用于任何平台。
目标
本文将由于以下目的:
- 了解闪回表功能
- 以几个例子使用闪回表功能。
- 解决当使用该功能时可能出现的常见错误
解决方案
闪回表功能的什么:
——————————————————
- 该功能引入SQL中的FLASHBACK TABLE语句,这能快速恢复表到过去时间点,而无需还原备份。
- 表能被闪回到的过去时间取决于系统中的undo数据量。此外, Oracle数据库无法通过更改表结构的任何DDL操作将表还原到一个较早状态。
- 你无法回滚一个FLASHBACK TABLE语句。但是,你可以发出另一个FLASHBACK TABLE语句并自指定一个当前时间之前的时间。因此,建议在发出FLASHBACK TABLE子句之前记录当前SCN。
如何启用并使用该功能:
—————————————————–
要闪回表到一个较早SCN或时间戳,你必须有以下之一
- 在表上的FLASHBACK 对象权限或FLASHBACK ANY TABLE 系统权限。
- 在表上的SELECT, INSERT, DELETE, 和 ALTER对象权限。
- 必须对闪回列表中的所有表启用行移动。
展示其使用与常见错误:
—————————————————————————————————
CANNOT FLASHBACK “SYS” TABLES:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
————————
521237
SQL> flashback table ban to scn 521237
2 ;
flashback table ban to scn 521237
*
ERROR at line 1:
ORA-08185: Flashback not supported for user SYS
CANNOT FLASHBACK A TABLE WHICH DOESN’T HAVE ROW MOVEMENT ENABLED
SQL> flashback table banchu to timestamp(systimestamp – interval ‘1’ minute);
flashback table banchu to timestamp(systimestamp – interval ‘1’ minute)
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
A USER “SOMU” TRYING TO FLASHBACK A TABLE OF USER “SOM” WITHOUT PROPER PRIVILEGES:
SQL> flashback table som.banchu to timestamp(systimestamp – interval ‘1’ minute);
flashback table som.banchu to timestamp(systimestamp – interval ‘1’ minute)
*
ERROR at line 1:
ORA-01031: insufficient privileges
GRANTING PROPER PRIVILEGES TO USER “SOMU”
Connected as “SOM”:
SQL>grant flashback on banchu to somu;
SQL> grant select,insert,delete,alter on banchu to somu;
Grant succeeded.
SQL> select * from banchu;
ID
———-
100
200
300
Connected as “SOMU”
SQL> flashback table som.banchu to timestamp(systimestamp – interval ‘3’ minute);
Flashback complete.
SQL> select * from som.banchu;
ID
———-
100
200
Please note that ‘300’ is missing.
Connected as ‘SOM’:
——————-
SQL> select * from banchu;
ID
———-
100
200
DROPPING A TABLE AND THEN FLASHBACK:
SQL> drop table banchu;
Table dropped.
SQL> flashback table banchu to scn 522748;
flashback table banchu to scn 522748
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from banchu;
ID
———-
100
200
如果你指定了用户定义名称,且回收站包含该名称的多个对象,则数据库检索最近被移动到回收站的对象
SQL> select * from banchu;
ID
———-
100
200
SQL> DROP TABLE BANCHU;
Table dropped.
SQL> CREATE TABLE BANCHU(PHONE NUMBER);
Table created.
SQL> INSERT INTO BANCHU VALUES(9999);
1 row created.
SQL> COMMIT;
Commit complete.
SQL> DROP TABLE BANCHU;
Table dropped.
SQL> FLASHBACK TABLE BANCHU TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM BANCHU;
PHONE
———-
9999
注:以上查询检索最近被drop的表。
要检索旧表,使用RENAME TO选项再次闪回:
SQL> flashback table banchu to before drop rename to banchu1;
Flashback complete.
SQL> select * from banchu1;
ID
———-
100
200
当使用系统生成名检索旧表时,显示错误:
———————————————————————————————————————-
SQL> select object_name,original_name from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
—————————— —————————–
BIN$2LsYTE+bSF/gNAgAIKT8Ng==$0 BANCHU
BIN$2K3a5EGlDtrgNAgAIKT8Ng==$0 TEST1
SQL> flashback table BIN$2LsYTE+bSF/gNAgAIKT8Ng==$0 to before drop;
flashback table BIN$2LsYTE+bSF/gNAgAIKT8Ng==$0 to before drop
*
ERROR at line 1:
ORA-00905: missing keyword
该错误是由于未使用双引号括起生成的名称
SQL> flashback table “BIN$2LsYTE+bSF/gNAgAIKT8Ng==$0” to before drop;
确保用户有正确的权限,否则会生成 ORA-1031
Comment