数据库flashback

网友投稿 523 2023-11-27

[oracle@rhel5 ~]$ sqlplus / as sysdba

数据库flashback

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Nov 30 22:56:46 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL>

查看数据库能闪回到的最早的scn,如果数据库没有开闪回功能是没有记录返回的。

SQL> select oldest_flashback_scn from v$flashback_database_log;

no rows selected

查看数据库是否开闪回

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

NO

数据库open状态尝试开启数据库的闪回功能,返回报错信息说明需要在mount状态下来操作。

SQL> alter database flashback on;

alter database flashback on

*

ERROR at line 1:

ORA-38759: Database must be mounted by only one instance and not open.

关闭数据库

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

打开数据库到mount状态

SQL> startup mount

ORACLE instance started.

Total System Global Area 184549376 bytes

Fixed Size 1218412 bytes

Variable Size 83888276 bytes

Database Buffers 96468992 bytes

Redo Buffers 2973696 bytes

Database mounted.

数据库在mount状态下再次尝试开启数据库的闪回功能,又返回错误信息说明数据库在非归档状态下不支持数据库的闪回。

SQL> alter database flashback on;

alter database flashback on

*

ERROR at line 1:

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.

ORA-38707: Media recovery is not enabled.

开归档

SQL> alter database archivelog;

Database altered.

开闪回成功

SQL> alter database flashback on;

Database altered.

打开数据库

SQL> alter database open;

Database altered.

开启归档,默认的归档目录:USE_DB_RECOVERY_FILE_DEST ,与9i不同10g开启归档很要简单一些。以后可以自行修改归档目录的位置,在此暂时保留默认。

SQL> archive log list

Database log mode Archive Mode

Automatic archival Enabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 59

Next log sequence to archive 61

Current log sequence 61

检验数据库闪回是否开启

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

YES

查看闪回区信息,默认安装大小为2G,根据数据库的具体情况作修改。

SQL> show parameter recover

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest string /u01/app/oracle/flash_recovery_area

db_recovery_file_dest_size big integer 20G

recovery_parallelism integer 0

数据库可以恢复到多少分钟以前,默认1440分钟(一天)

SQL> show parameter flash

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_flashback_retention_target integer 1440

查看数据库能恢复到最早的scn,和最早的时间

SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME

-------------------- ---------------------

1021372 20101130 23:07:18
===================oralce flashback 使用方法总结 ===================
oralce flashback 使用方法总结:
一,关键知识点

在oracle 10g中,如果是使用drop 把表对象删除了,会把这个对象放在回收站里

查看回收站:select * from recyclebin;

然后恢复对象:flashback table TABLENAME to before drop;

删除不放回回收站:drop table TABLENAME purge;
如果不小心误删除了某个表中的部分数据,需要恢复回来,可以利用oracle flashback闪回误删除的表数

据。但要注意:flashback table 需要下面几个条件:

1. 需要有flashback any table的系统权限或者是flashback这个表的对象权限;

2. 需要有对这个表的基本的dml,alter操作权限;

3. 必须保证该表row movement(这主要是让flashback记住表的rowid)
扩展:oracle flashback闪回不仅可以误删除的表数据,还可以错误的修改也可以恢复过来;

注意:

ORA-08189: cannot flashback the table because row movement is not enabled

但是抛出了8189错误,原因就是因为表没有row movement,改变下表的属性

SQL> alter table test_tablename enable row movement;

再执行闪回操作;
二,实例
1.创建示例表:

CREATE TABLE TBL_TEST

(

ID    NUMBER,

NAME VARCHAR2(100 BYTE),

PID   NUMBER                                  DEFAULT 0

);
2.插入测试数据:

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(1,10,0);

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(2,11,1);

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(3,20,0);

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(4,12,1);

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(5,121,2);

3.恢复误删除的表数据

例如:

FlashBack table TBL_TEST to timestamp to_timestamp(2009-8-1 16:59:36,yyyy-mm-dd

hh24:mi:ss);

报错:ORA-08189: cannot flashback the table because row movement is not enabled

错误解决,要执行:alter table TBL_TEST enable row movement;

FlashBack table TBL_TEST to timestamp to_timestamp(2009-8-1 16:59:36,yyyy-mm-dd
hh24:mi:ss);

4.恢复误表数据错误的修改:

例如:

update TBL_TEST set pid=1 where id =5;

FlashBack table TBL_TEST to timestamp to_timestamp(2009-8-1 16:59:36,yyyy-mm-dd
hh24:mi:ss);

5.恢复被删除表的步骤:

(1)显示回收站信息

select * from RECYCLEBIN;

(2)确定被删除表存在后,可以恢复诶删除表,此时可以指定表明或者回收站对象名

  flashback table TBL_TEST to before drop;

  或 flashback table "BIN$zgwx7wCsQ92JRcrAVpABQg==$0" to before drop

6.恢复被删除表的同时可以改变被删除表的名称

flashback table TBL_TEST to before drop rename to test_TBL_TEST

或 flashback table "BIN$zgwx7wCsQ92JRcrAVpABQg==$0" to before drop rename to test_TBL_TEST

7.删除不放回回收站:

drop table TBL_TEST purge;
目前只在pl/sql developer 上,实际操作了上面几点,也是常用的知识点。可能还有其他的处理方法,如Flashback Database to time to_timestamp(xxx),这些有待继续研究。

本文出自 “在路上” 博客,请务必保留此出处http://yuwenhu.blog.**.com/672091/186601

================================flash back 闪回测试================================

--1. 开启功能

SQL> shutdown immediate

已经卸载数据库。

例程已经关闭。

SQL> startup mount

ORACLE 例程已经启动。

Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             146803588 bytes

Database Buffers          457179136 bytes

Redo Buffers                7135232 bytes

数据库装载完毕。

SQL>alter database archivelog;

数据库已更改。

SQL>alter database on ;

数据库已更改。

SQL> alter database open;

数据库已更改。
--2. 查看闪回模式下相关参数

SQL> archive log list

数据库日志模式            存档模式

自动存档             启用

存档终点            USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列     773

下一个存档日志序列   775

当前日志序列           775

SQL> show parameter db_recover

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest                string      C:\oracle\product\10.2.0/flash_recovery_area

db_recovery_file_dest_size           big integer 2G

--闪回相关文件及文件大小

SQL> show parameter flashback

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_flashback_retention_target        integer     1440

--默认支持闪回的时间,单位为分。

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

YES
--开启闪回功能后,启动RVWR(recover writer)进程。

SQL> col program format a18

SQL> col pid format 99

SQL> select program,pid,spid,background,pga_used_mem,pga_alloc_mem,pga_freeable_mem,pga_max_mem

  2  from v$process where program like %RVWR%;

PROGRAM            PID SPID         B PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM

------------------ --- ------------ - ------------ ------------- ---------------- -----------

ORACLE.EXE (RVWR)   16 2924         1       206881        623853                0      623853

SQL> select * from v$sgastat where name like %flashback%;

POOL         NAME                            BYTES

------------ -------------------------- ----------

shared pool  flashback generation buff     3981204      

SQL> select * from v$sysstat where name like %flashback log%;

STATISTIC# NAME                                                                  CLASS      VALUE    STAT_ID

---------- ---------------------------------------------------------------- ---------- ---------- ----------

       168 flashback log writes                                                      2         11 3123176560       

--3. 闪回数据库

SQL> create table yangxl as select * from dba_objects;

表已创建。

SQL> select count(1) from yangxl;

  COUNT(1)

----------

     52511

SQL> alter session set nls_date_format=YYYY-MM-DD HH24:MI:SS;

会话已更改。

SQL> select sysdate from dual;

SYSDATE

-------------------

2009-06-04 11:06:12

SQL> truncate table yangxl;

表被截断。

SQL> select * from yangxl;
未选定行 

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount;

ORACLE 例程已经启动。

Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             150997892 bytes

Database Buffers          452984832 bytes

Redo Buffers                7135232 bytes

数据库装载完毕。

SQL> flashback database to timestamp to_timestamp(2009-06-04 11:06:12,yyyy-mm-dd hh24:mi:ss);

闪回完成。

SQL> alter database open;

alter database open

*

第 1 行出现错误:

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*) from yangxl;

  COUNT(*)

----------

     52511
--4. 闪回表测试

SQL> select object_name,original_name,type from user_recyclebin;

未选定行

SQL> drop table yangxl;

表已删除。
SQL> select object_name,original_name,type from user_recyclebin where original_name = YANGXL;

OBJECT_NAME                    ORIGINAL_NAME                    TYPE

------------------------------ -------------------------------- -------------------------

BIN$93EgIpKgQb2UYDLGbvb7tQ==$0 YANGXL                           TABLE

BIN$9Bl7UGOgT36SmT9+7g7ijQ==$0 YANGXL                           TABLE

BIN$QlDzOZx8TWmM+YuaXYWIrA==$0 YANGXL                           TABLE

BIN$gr27sKM4T5imRUIE4Lu1eQ==$0 YANGXL                           TABLE

BIN$wSaMD+dxQxqEqR1RG/bJKA==$0 YANGXL                           TABLE

SQL> flashback table yangxl to before drop;

闪回完成。

SQL> select count(1) from yangxl;

  COUNT(1)

----------

         9
--5. 闪回表数据测试

--闪回表都可以,闪回数据肯定是没有问题的了。

SQL> select count(1) from yangxl;

  COUNT(1)

----------

         9

SQL> delete from yangxl where rownum = 1;

已删除 1 行。

SQL> commit;

提交完成。

SQL> flashback table yangxl to timestamp to_timestamp(2009-06-04 13:07:01,yyyy-mm-dd hh24:mi:ss);

flashback table yangxl to timestamp to_timestamp(2009-06-04 13:07:01,yyyy-mm-dd hh24:mi:ss)              *

第 1 行出现错误:

ORA-08189: 因为未启用行移动功能, 不能闪回表

SQL> alter table yangxl enable row movement;

表已更改。

SQL> flashback table yangxl to timestamp to_timestamp(2009-06-04 13:07:01,yyyy-mm-dd hh24:mi:ss);

闪回完成。

SQL> select count(1) from yangxl;

  COUNT(1)

----------

         9

--6. 回收站

SQL> show parameter recyclebin

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      on       

SQL> alter system set recyclebin = off;

系统已更改。

SQL> show parameter recyclebin

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      OFF

SQL> alter system set recyclebin = on;

系统已更改。
--清空回收站

purge user_recyclebin;

SQL> purge user_recyclebin;

回收站已清空。

SQL> select * from user_recyclebin;

未选定行

purge dba_recyclebin;

SQL> purge dba_recyclebin;

DBA 回收站已清空。

--清空本用户回收站和所有用户回收站(需SYS权限)

purge table <表名>;

SQL> purge table yangxl;

表已清除。

purge index <表名>;

SQL> purge index ind_yxl;

索引已清除。

从回收站清除表和索引

注:如果清除的对象在回收站中有同名的,那么会清除在回收站中时间更久的那个对象
purge tablespace <表空间名>;
清除回收站中指定表空间的所有对象
drop table <表名> purge;
直接彻底删除,不会放入回收站
--7. SYS 与闪回1. 用户 SYS、SYSTEM 不支持闪回
2. 说明缺省SYSTEM表空间删除对象不放入回收站

来自 “ ITPUB博客 ” ,链接:http://blog.itpub-/9390331/viewspace-694380/,如需转载,请注明出处,否则将追究法律责任。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mysql中not exists有什么用
下一篇:mysql如何增加数据库
相关文章

 发表评论

暂时没有评论,来抢沙发吧~