Oracle 使用闪回表flashback table功能并解决错误

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638 QQ号:47079569 邮箱:[email protected]

 

 

适用于:

Oracle Database – Enterprise Edition –版本10.1.0.2及以上
本文信息适用于任何平台。

 

目标

本文将由于以下目的:

  1. 了解闪回表功能
  2. 以几个例子使用闪回表功能。
  3. 解决当使用该功能时可能出现的常见错误

 

解决方案

闪回表功能的什么:
——————————————————

  • 该功能引入SQL中的FLASHBACK TABLE语句,这能快速恢复表到过去时间点,而无需还原备份。
  • 表能被闪回到的过去时间取决于系统中的undo数据量。此外, Oracle数据库无法通过更改表结构的任何DDL操作将表还原到一个较早状态。
  • 你无法回滚一个FLASHBACK TABLE语句。但是,你可以发出另一个FLASHBACK TABLE语句并自指定一个当前时间之前的时间。因此,建议在发出FLASHBACK TABLE子句之前记录当前SCN。

如何启用并使用该功能:
—————————————————–

要闪回表到一个较早SCN或时间戳,你必须有以下之一

  1. 在表上的FLASHBACK 对象权限或FLASHBACK ANY TABLE 系统权限。
  2. 在表上的SELECT, INSERT, DELETE, 和 ALTER对象权限。
  3. 必须对闪回列表中的所有表启用行移动。

展示其使用与常见错误:
—————————————————————————————————

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


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *