zoukankan      html  css  js  c++  java
  • ORACLE 11G 闪回技术(闪回数据库、表、回收站)

    ORACLE 11G 闪回技术(闪回数据库、表、回收站)

    weixin_45389319 
    分类专栏: 数据库 文章标签: 数据库
    版权
    闪回数据库
    就是将数据库回退到过去的一个时间点或scn上,从而实现数据库的恢复,这种恢复不需要通过备份,所以更方便、更快速。该功能不基于撤销数据,而是基于闪回日志。

    语法
    flashback 【standby】 database database_name
    【to 【scn | timestamp】 expr | to before 【scn | timestamp】expr】;

    参数说明:
    standby:表示恢复一个备用数据库,如果没有相应的备用数据库,
    则系统返回一个错误。如果不指定该选项,则所恢复的数据库可以是主数
    据库,也可以是备用数据库。
    database_name:数据库名称。
    to scn:指定一个scn。
    to timestamp:指定一个时间戳。
    expr:指定一个值或表达式。
    to before scn:前滚到指定的scn。
    to before timestamp:前滚到指定的时间戳。

    闪回恢复区配置
    db_recovery_file_dest : 闪回日志的存放位置(闪回恢复区位置)。
    db_recovery_file_dest_size :存放闪回日志的空间(闪回恢复区大小)

    查看:show parameter db_recovery_file_dest ;
    配置:alter system set db_recovery_file_dest_size=4g scope=both:
    如果要停用散会恢复区,只要将参数DB_RECOVERY_FILE_DEST(描述闪回恢复区位置)的值清空即可。

    闪回数据库配置

    查看闪回数据库是否打开

    select flashback_on from v$database;


    开启闪回数据库的步骤
    1确定数据库模式是归档模式
    archive log list:
    2更改为归档模式
    shutdown immediate;
    startup mount;
    alter database archivelog;
    3设置时间
    db_flashback_retention_target :闪叫数据的保留时间,其单位为分,默认值为1440,即一天。

    show parameter db_flashback_retention_target;

    4开启闪回数据库
    alter database flashback on;
    alter database open;
    select flashback_on from v$database;


    闪回数据库的一些存储信息

    select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;


    备注1:归档模式与非归档模式
    Oracle分为非归档模式(NOARCHIVELOG) 和归档模式(ARCHIVELOG)。非归档模式不产生归档日志,虽然节省了硬盘空间,但是备份方案选择很有限,通常只能选择冷备份。还原也只能还原到备份那一时刻的数据,通常也仅在开发时使用(据说在数据仓库中也使用),Oracle安装默认就是非归档模式。在生产环境中我们因该使用归档模式,它会产生归档日志,可以使用多种备份和还原方案,对与Oracle管理员来说应该更改模式是必然的选择。

    首先查看数据库现有模式可使用以下语句

    select name,log_mode from v$database;

    也可以用下面的语句
    archive log list;(该方法需要as sysdba)

    对于非归档模式的数据库该为归档模式(主要以Oracle 10g为参考)使用以下步骤:

    SQL> alter system set log_archive_dest_1=‘location=/oracle/oracle10g/log/archive_log’;
    该语句含义是确定归档日志的路径,实际上Oracle 10g可以生成多份一样的日志,保存多个位置,以防不测
    例如再添加一个日志位置可使用以下语句

    SQL>alter system set log_archive_dest_2=‘location=/oracle/oracle10g/log2/archive_log’;

    2.关闭数据库
    SQL> shutdown immediate

    3.启动数据mount状态:
    SQL> startup mount;

    4、修改数据库为归档模式:
    SQL> alter database archivelog;

    5、打开数据库,查询:
    SQL> alter database open;

    修改日志文件命名格式:
    SQL> alter system set log_archive_max_processes = 5;
    SQL> alter system set log_archive_format = “archive_%t_%s_%r.log” scope=spfile;

    修改完成后可以查看日志模式是否修改成功!
    特别指出的是在Oracle 9i中还要修改参数alter system set log_archive_start = true才能生效,oracle 10g中已经废除了该参数,所以不需要设置该参数。

    备注2:归档模式与非归档模式
    查看oracle数据库是否为归档模式

    [1]

    1.select name,log_mode from v$database;

    NAME LOG_MODE

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

    QUERY NOARCHIVELOG

    2.使用ARCHIVE LOG LIST 命令

    Database log mode No Archive Mode

    Automatic archival Disabled

    Archive destination /data/oracle/product/10.2.0/db_1//dbs/arch

    Oldest online log sequence 739

    Current log sequence 741

    什么是Oracle归档模式
      Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。

    如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。

    数据库使用归档方式运行时才可以进行灾难性恢复。

    1.归档日志模式和非归档日志模式的区别

    非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.

    归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.

    用ARCHIVE LOG LIST 可以查看当前模式状态是归档模式还是非归档模式.

    配置数据库的归档模式
      1.改变非归档模式到归档模式:

    1)SQL> conn / as sysdba (以DBA身份连接数据库)

    2)SQL> shutdown immediate; (立即关闭数据库)

    3)SQL> startup mount (启动实例并加载数据库,但不打开)

    4)SQL> alter database archivelog; (更改数据库为归档模式)

    5)SQL> alter database open; (打开数据库)

    6)SQL> alter system archive log start; (启用自动归档)

    7)SQL> exit (退出)

    做一次完全备份,因为非归档日志模式下产生的备份日志对于归档模式已经不可用了.这一步非非常重要!

    2.改变归档模式到非归档模式:

    1)SQL>SHUTDOWN NORMAL/IMMEDIATE;

    2)SQL>STARTUP MOUNT;

    3)SQL>ALTER DATABASE NOARCHIVELOG;

    4)SQL>ALTER DATABASE OPEN;

    3.启用自动归档: LOG_ARCHIVE_START=TRUE

    归档模式下,日志文件组不允许被覆盖(重写),当日志文件写满之后,如果没有进行手动归档,那么系统将挂起,知道归档完成为止.

    这时只能读而不能写.

    运行过程中关闭和重启归档日志进程

    SQL>ARCHIVE LOG STOP

    SQL>ARCHIVE LOG START

    4.手动归档: LOG_ARCHIVE_START=FALSE

    归档当前日志文件

    SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;

    归档序号为052的日志文件

    SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 052;

    归档所有日志文件

    SQL>ALTER SYSTEM ARCHIVE LOG ALL;

    改变归档日志目标

    SQL>ALTER SYSTEM ARCHIVE LOG CURRENT TO ‘&PATH’;

    5.归档模式和非归档模式的转换

    第4步的逆过程.

    6.配置多个归档进程

    Q:什么时候需要使用多个归档进程?

    A:如果归档过程会消耗大量的时间,那么可以启动多个归档进程,这是个动态参数,可以用ALTER SYSTEM动态修改.

    SQL>ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=10;

    Oracle9i中最多可以指定10个归档进程

    与归档进程有关的动态性能视图

    vb g p r o c e s s , v bgprocess,vbgprocess,varchive_processes

    7.配置归档目标,多归档目标,远程归档目标,归档日志格式

    归档目标 LOG_ARCHIVE_DEST_n

    本地归档目标:

    SQL>LOG_ARCHIVE_DEST_1 = “LOCATION=D:ORACLEARCHIVEDLOG”;

    远程归档目标:

    SQL>LOG_ARCHIVE_DEST_2 = “SERVICE=STANDBY_DB1”;

    强制的归档目标,如果出错,600秒后重试:

    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_4 = “LOCATION=E:ORACLEARCHIVEDLOG MANDATORY REOPEN=600”;

    可选的归档目标,如果出错,放弃归档:

    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_3 = “LOCATION=E:ORACLEARCHIVEDLOG OPTIONAL”;

    归档目标状态:关闭归档目标和打开归档目标

    关闭归档目标1

    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = DEFER

    打开归档目标2

    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE

    归档日志格式

    LOG_ARCHIVE_FORMAT

    8.获取归档日志信息

    V$ARCHIVED_LOG

    V$ARCHIVE_DEST

    V$LOG_HISTORY

    V$DATABASE

    V$ARCHIVE_PROCESSES

    ARCHIVE LOG LIST;

    备注:Oracle的Flashback用法汇总

    11g的flashbackup 分好几种,分别用途不一样。

    A.flashback database 闪回数据库,简单理解就是把数据库闪回到某个以前的时间点,

    能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN

    B.flashback drop 回收数据库表,用于表误drop后恢复。类似Windows的回收站。

    C.flashback query 闪回表记录,用于数据表记录的恢复

    D.falshabck Table 闪回数据库表(基于撤销数据来实现,因此必须确保与撤销表空间有关的参数设置合理,与此有关的参数有UNDO_MANAGEMENT、UNDO_TABLESPACE与UNDO_RETENTION),

    后两个是重点,下面说明。

    */

    – A.flashback database相关

    /*

    1.默认情况数据库的flashback database是关闭,可以在mount exclusive状态下打开。

    在设置了闪回恢复区后,可以启动闪回数据库功能。

    */

    –1.检查是否启动了flash recovery area

    show parameter db_recovery_file

    –2.检查是否启用了归档

    archive log list;

    –3.flashback database 默认是关闭的,查看方法

    select flashback_on from v$database;

    –4.查询当前的scn

    SELECT CURRENT_SCN FROM V$DATABASE;

    –5.查询当前的时间

    select to_char(sysdate,’yy-mm-dd hh24:mi:ss’) time from dual;

    –6.查看SCN 和 timestamp 之间的对应关系:

    select scn,to_char(time_dp,’yyyy-mm-dd hh24:mi:ss’)from sys.smon_scn_time;

    –7.恢复到时间点,或者恢复到SCN

    flashback database to timestamp to_timestamp(’09-10-14 14:37:05′,’yy-mm-dd hh24:mi:ss’);

    flashback database to scn 947921;

    – B. flashback table 恢复误drop表

    drop table sphsy.login_table;

    select * from flash_table;

    –purge table sphsy.login_table;清空回收站

    flashback table sphsy.login_table to before drop;

    select * from sphsy.login_table;

    – C. flashback query 实现行级恢复

    /*

    flashback查询用于获取先前时间点的表行级数据。当使用flashback查询时,

    需要在表名后指定as of timestamp子句或as of SCN子句,其中as of timestamp用于指定早期时间点,

    而as of SCN用于指定早期的SCN值,示例如下:

    */

    – 1.查原始记录 ,区间内有62 行

    select *

    from sphsy.login_table a

    where a.id > 201204171078

    and a.id < 201204171141

    order by a.id ;

    – 2.晚于区间的有 3016

    select program,count(*)

    from sphsy.login_table a

    where a.id >= 201204171141

    group by program ;

    –3. 删除

    delete from sphsy.login_table a

    where a.id > 201204171078

    and a.id < 201204171141

    –4.利用闪回特性查到区间内,有62行

    select * from sphsy.login_table

    as of timestamp to_timestamp(’2012-04-17 17:20:30′,’YYYY-MM-DD HH24:MI:SS’)

    where id > 201204171078

    and id < 201204171141

    – 5.不利用闪回特性,直接查询发现没有

    select * from sphsy.login_table

    where id > 201204171078

    and id < 201204171141

    – 6.进行数据恢复

    – 禁止表上的触发器

    alter trigger sphsy.T_INS_LOGIN_TABLE disable ;

    – 恢复数据

    insert into sphsy.login_table

    select * from sphsy.login_table

    as of timestamp to_timestamp(’2012-04-17 17:20:30′,’YYYY-MM-DD HH24:MI:SS’)

    where id > 201204171078

    and id < 201204171141

    – 恢复触发器

    alter trigger sphsy.T_INS_LOGIN_TABLE enable ;

    – 7.晚于区间的数据回来了3130 = 3016 +62 + 后来的数据。实现了区间恢复误删除。

    select program,count(*)

    from sphsy.login_table a

    where a.id >= 201204171078

    group by program ;

    – D. flashback table 恢复表到先前状态

    /*

    flashback查询可以用于恢复被误删除的表行数据,但是用户在表上执行了其他的DML语句误操作(insert或update),则不能直接使用flashback查询将表数据恢复到先前时间点,从oracle10g开始,使用flashback table语句可以将表恢复到先前时间点,通过使用该特征,可以避免执行基于时间点的不完全恢复,注意如果要在某个表上使用flashback table特征,则要求必须具有以下条件:

    a.用户必须具有flashback any table系统权限或flashback对象权限

    b.用户必修在表上具有select insert delete和alter权限

    c.必须合理设置初始化参数undo_retention,以确保UNDO信息保留足够时间

    d.必须激活行移动特征:alter table table_name enable row movement;

    */

    – 1.查原始记录 ,区间内有62 行

    select *

    from sphsy.login_table a

    where a.id > 201204171078

    and a.id < 201204171141

    order by a.id ;

    – 2.晚于区间的有 3074

    select count(*)

    from sphsy.login_table a

    where a.id >= 201204171141;

    –3. 删除 ,先记下时间点,2012-04-17 17:43:46

    select to_char(sysdate,’YYYY-MM-DD HH24:MI:SS’) from dual ;

    delete from sphsy.login_table a

    where a.id > 201204171078

    and a.id < 201204171141

    – 4.删除之后表 sphysy.login_table继续有修改 ,行3082

    select count(*)

    from sphsy.login_table a

    where a.id >= 201204171141;

    –5.激活行移动特征

    alter table sphsy.login_table enable row movement

    –6.利用闪回特性,直接恢复到删除时间点前

    flashback table sphsy.login_table to timestamp to_timestamp(’2012-04-17 17:43:46′,’YYYY-MM-DD HH24:MI:SS’);

    – 7.晚于区间的数据 回到了3080 ,说明时间点之后的修改丢失。

    select count(*)

    from sphsy.login_table a

    where a.id >= 201204171141

    – 8.往前推1分,恢复到删除之前,删除的62条也回来了。

    flashback table sphsy.login_table to timestamp to_timestamp(’2012-04-17 17:40:46′,’YYYY-MM-DD HH24:MI:SS’);

    – 62 行

    select count(*)

    from sphsy.login_table a

    where a.id > 201204171078

    and a.id < 201204171141

    – 删除之后的数据为3074,代表还有修改丢失。

    select count(*)

    from sphsy.login_table a

    where a.id >= 201204171141

    /*

    总结:方法C,方法D均可以用数据恢复。

    方法C安全,恢复麻烦。方法D简单,有可能数据丢失。

    */
    ————————————————
    版权声明:本文为CSDN博主「weixin_45389319」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_45389319/article/details/109171677

  • 相关阅读:
    asp.net跳转页面的三种方法比较
    DotNet软件开发框架
    asp.net在ie7中使用FileUpload上传前预览图片
    uv贴图详解
    3d之 panda3d
    3dmax9中文版注册机
    flash player本地安全设置
    处理2D图像和纹理——扩展图像内容处理器
    处理2D图像和纹理——扩展图像内容处理器:灰度变换和处理器参数
    处理2D图像和纹理——将场景绘制到纹理
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/14626168.html
Copyright © 2011-2022 走看看