zoukankan      html  css  js  c++  java
  • ORACLE FLASHBACK DATABASE 知识整理

    1、知识储备


    1)    只有SYSDBA有权执行,闪回前一定要记录当前SCN

    2)    需要停机,并要求处于ARCHIVELOG模式中

    3)    闪回日志不能被复用和归档,是自动管理的。RVWR进程负责读SGA中的FLASHBACK BUFFER,写闪回日志,写的的内容是完整的数据块映像的日志。

    4)    使用FALSHBACK DATABASE闪回后的各数据块SCN很可能不一致,即闪回结果不是一个确定的时间点,而是该时间点前后的一个范围,所以必须用RESETLOGS打开数据库,或者使用alter database open readonly打开查看是否所需(如果在生产环境,read only后就可以EXP重要的表甚至是整个库了),如果是,再RESETLOGS打开,如果不是,shutdown abort后重新闪回。

    5)    闪回的结果与不完全恢复一样,闪回点之后的工作都丢失

    6)    不能返回物理讹误,只能返回用户错误导致的逻辑错误。

    7)    TRUNCATE的表如果选择闪回,只能应用闪回数据库。

    8)    闪回数据库将忽略脱机的表空间

    2、配置


    SQL> select name,flashback_on from v$database; //查看是否已经启用了闪回,如果启用了就不必重复配置了

    NAME       FLASHBACK_ON

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

    TEST3        NO

    SQL> ARCHIVE LOG LIST;//必须位于ARCHIVEMODE

    Database log mode            Archive Mode

    Automatic archival             Enabled

    Archive destination            USE_DB_RECOVERY_FILE_DEST

    Oldest online log sequence     11

    Next log sequence to archive   13

    Current log sequence           13

    (可选)需要重启,如果已经设置可以不必重复设置,设置闪回区的地址,这个存储路径应该是结合硬件的具体情况,因为闪回区如果需要较大空间,或者日后可能做调整,则应该放在一个较大的磁盘分区上或独立磁盘,给日后空间调整留有余地。

    SQL>alter system set db_recovery_file_dest='/ss' scope=both;

    System altered.

    (可选)需要重启,如果已经设置可以不必重复设置,设置闪回区的大小。

    SQL>alter system setdb_recovery_file_dest_size=20G scope=both;

    System altered.

    (可选)需要重启,如果已经设置可以不必重复设置,设置保留时间,1440单位为分钟,即24小时,前提是,闪回区提供了足够的空间,可以存放24小时的内容

    SQL>alter system set db_flashback_retention_target=1440 scope=both;

    System altered.

    SQL>shutdown immediate;

    Oracle instance shut down

    SQL>startup mount;

    connected to target database (not started)

    Oracle instance started

    Total System Global Area    1272213504 bytes

    Fixed Size                     1336260 bytes

    Variable Size                788532284 bytes

    Database Buffers             469762048 bytes

    Redo Buffers                  12582912 bytes

    database mounted

     SQL>alter database flashback on;//打开闪回

    Database altered.

    /**************************************注释************************************************/

    SQL>alter tablespace xxx flashback off;//关闭某个表空间的闪回
    • 能够容忍长时间停机的表空间可以关闭闪回
    • 允许任意删除的表空间可以关闭闪回
    • 能够被非常快还原与恢复的表空间可以关闭闪回
    • 如果某表空间没有打开闪回,则在闪回数据库之前,必须将此表空间OFFLINE,闪回将忽略脱机的表空间。否则会报ORA-38753和ORA-01110

    /**************************************注释结束*********************************************/

    SQL>alter database open; //打开数据库

    Database altered

    3、查看

    1)    查看闪回恢复区及大小是否设置

    SQL>showparameter db_recovery;

    NAME                   TYPE           VALUE

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

    db_recovery_file_dest     string    /u01/app/oracle/flash_recovery_area

    db_recovery_file_dest_size big integer 3852M

    2)   查询目前的设置能够最远闪回多久的数据库

    SQL> select oldest_flashback_scn as oldest_scn,to_char(oldest_flashback_time,'yyyy-mm-ddhh24:mi:ss') as oldest_time from v$flashback_database_log; 

    OLDEST_SCNOLDEST_TIME

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

    837455 2013-07-27 16:50:30

    3)    

    select oldest_flashback_scn as oldest_scn,to_char(oldest_flashback_time,'yyyy-mm-ddhh24:mi:ss') as oldest_time,retention_target,flashback_size/1024/1024 as fb_size_mb,estimated_flashback_size/1024/1024 as estimated_size_mb from v$flashback_database_log;


    4)   查找每个时间段内闪回数据库所需的数据

    SQL>select to_char(begin_time,'yyyy-mm-dd hh24:mi:ss') as begin_time,to_char(end_time,'yyyy-mm-dd hh24:mi:ss') as end_time,flashback_data/1024/1024 as fb_date_mb,db_data/1024/1024 as db_date_mb,redo_data/1024/1024 as redo_date_mb,estimated_flashback_size as estimated_size from v$flashback_database_stat;


    5)   SGA 中自动分配的闪回缓冲区

    SQL>select * from v$sgastat where name='flashback generation buff';

    POOL         NAME                           BYTES

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

    shared pool  flashback generation buff         8388608

    6)  查找具体的表空间是否打开闪回

     SQL>select name,flashback_on from v$tablespace;

    NAME                             FLASHBACK_ON

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

    SYSTEM                                   YES

    SYSAUX                                   YES

    UNDOTBS1                                YES

    USERS                                    YES

    TEMP                                     YES

    TEST_SPACE                               YES

    READONLY_SPACE                         YES

    OFFLINE_SPACE                            YES

    INDEX_SPACE                              YES

    4、使用方法


    4.1 SQLPLUS


    4.1.1环境模拟


    1) 确定当前时间

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY

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

    2013-07-27 20:56:32

    2) 确定当前SCN

    SQL> select current_scn from v$database; 

    CURRENT_SCN

    -----------

         839748

    3) 指定表原始状态

    SQL> select * from knight.books; 

            ID NAME                      PRICE

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

             1 LINUX                     25.55

             2 AIX                        50.5

             3 NETWORK                  125.89

             4 JAVA                      88.99

             5 JQUERY                   102.98

    4) 插入新数据,这些数据在闪回后应该不存在。

    SQL> insert into knight.books values(200,'WEBWORK',299.9);

    1 row created.

    5) 插入新数据,这些数据在闪回后应该不存在。

    SQL> insert into knight.books values(201,'PMP',56.99);

    1 row created.

    SQL> commit;

    Commit complete.

    6) 表的新状态。

    SQL> select * from knight.books; 

           ID NAME                      PRICE

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

           200 WEBWORK                   299.9

           201 PMP                       56.99

             1 LINUX                     25.55

             2 AIX                        50.5

             3 NETWORK                  125.89

             4 JAVA                      88.99

             5 JQUERY                   102.98

    7 rows selected.

    7) 模拟断电关机

    SQL>shutdown abort;


    4.1.2 开始闪回数据库

    I  SQL>startup mount;
    II SQL>flashback database to timestamp to_timestamp('2013-07-27 20:56:32','yyyy-MM-dd hh24:mi:ss');//最细粒度为百万分之一秒


    Flashback complete.

    III SQL>alter database open read only;

    查看数据库在该时间点下是否为所需状态,如果不是,更换新的时间点后,重复执行I-III。如果已经为所需状态

    IV SQL>startup abort;
    V  SQL>alter database open resetlogs;

    4.2 RMAN


    在RMAN环境下,针对SQLPLUS中的第3步,可以选择另外三种实现方式

    RMAN>flashbackdatabase to time=to_date('2013-07-26 18:00:00','yyyy-mm-dd hh24:mi:ss');//最细粒度为秒
    RMAN>flashbackdatabase to scn=3655894;
    RMAN>flashbackdatabase to sequence=56 thread=1;

    5 OFFLINE状态对闪回的影响实例分析


    闪回点指历史上的时间点。

    操作点指执行闪回操作时的时间点,这个时间点理论上晚于闪回点。

    经过后边的实验,证明在闪回点是OFFLINE的文件将在闪回过程中被忽略,并且在之后的打开过程中会用到不安全的隐含参数。所以在执行全库闪回的时候,推荐按照以下步骤进行

    • 记录所有数据文件的OFFLINE/ONLINE状态
    • 将所有数据文件都上线
    • Flashback database
    • 按照记录情况,手动改回各数据文件的状态


    5.1 闪回点OFFLINE,操作点OFFLINE


    这是很麻烦的情况,闪回结果是数据没有被闪回,状态出现错误,最后要求做全备份

    1) 确定当前时间

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY

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

    2013-07-27 20:56:32

    2) 确定当前SCN

    SQL> select current_scn from v$database;

    CURRENT_SCN

    -----------

     839748

    3)插入另外一个表knight.keyboards新数据

    SQL> insert into knight.keyboards values(200,'SANSUMG','MECHINE'); 

    1 row created.

    4)插入另外一个表新数据

    SQL> insert into knight.keyboards values(201,'SNAKE','MECHINE');

    1 row created.

    SQL> commit;

    Commit complete.

    5)新表状态

    SQL> select * from knight.keyboards; 

           ID COMPANY              TYPE

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

           200 SANSUMG              MECHINE

           201 SNAKE                MECHINE

             1 IBM                  500.55

             2 HP                   200.5

             3 SONY                 1200.5

             4 ACER                 55.6

             5 MICROSOFT            108

    6)将表knight.keyboards所在空间OFFLINE

    SQL> alter tablespace offline_space offline; 

    Tablespace altered.

    7)检查一下,已经不能访问了

    SQL> select * from knight.keyboards;

    select * from knight.keyboards

    *

    ERROR at line1:

    ORA-00376: file7 cannot be read at this time

    ORA-01110: datafile 7: '/ss/offline_space01.dbf'

    8)模拟断电关机

    SQL>shutdown abort;

    9)启动到mount模式

    SQL>startup mount;


    10) 开始闪回

    SQL>flashback database to timestamp to_timestamp('2013-07-27 20:56:32','yyyy-MM-dd hh24:mi:ss');

    Flashback complete.

    11)resetlogs打开数据库

    SQL>alter database open resetlogs;

    Database altered.

    12)尝试将表空间online,结果报错了,糟糕的01190

    SQL> alter tablespace offline_space online;

    altert ablespace offline_space online

    *

    ERROR at line1:

    ORA-01190:control file or data file 7 is from before the last RESETLOGS

    ORA-01110: datafile 7: '/ss/offline_space01.dbf'

    13)使用隐藏参数设置

    SQL> alter system set"_allow_resetlogs_corruption"=TRUE scope=spfile;

    System altered.

    SQL>  ALTER SESSIONSET EVENTS 'IMMEDIATE TRACE NAME ADJUST_SCN LEVEL 1';

    Session altered.

    14)重启数据库后尝试不完全恢复

    SQL> shutdown immediate;

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup mount;

    ORACLE instance started.

    Total System Global Area 1272213504 bytes

    Fixed Size                  1336260 bytes

    Variable Size             822086716 bytes

    Database Buffers          436207616 bytes

    Redo Buffers               12582912 bytes

    Database mounted.

    SQL> recover database until cancel;

    Media recovery complete.

    SQL> alter database datafile 7 online;

    Database altered.

    SQL> alter database open resetlogs;

    Database altered.

    SQL> alter tablespace offline_space online;

    Tablespace altered.

    SQL> select * from knight.keyboards;

           ID COMPANY              TYPE

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

           200 SANSUMG              MECHINE

           201 SNAKE                MECHINE

             1 IBM                  500.55

             2 HP                   200.5

             3 SONY                 1200.5

             4 ACER                 55.6

            5 MICROSOFT            108

    7 rows selected.

    从结果可以看出,新加入的记录被保存了,并没有按照被闪回到指定的时间点,由此说明,闪回数据库时是忽略操作点OFFLINE表空间的。但是此时SCN已经很乱了,必须全备数据库。


    5.2 闪回点OFFLINE,操作点ONLINE


    闪回被很好的执行了,无论是数据还是数据文件的状态都恢复到之前的状态。

    1)确定当前时间

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY

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

    2013-07-2720:56:32

    2)确定当前SCN

    SQL> select current_scn from v$database;

    CURRENT_SCN

    -----------

     839748

    3)插入knight.keyboards新数据

    SQL>alter tablespace offline_space online;

    Tablespace altered.

    4)插入knight.keyboards新数据

    SQL> insert into knight.keyboards values(200,'SANSUMG','MECHINE'); 

    1 row created.

    5)插入knight.keyboards新数据

    SQL> insert into knight.keyboards values(201,'SNAKE','MECHINE'); 

    1 row created.

    SQL> commit;

    Commit complete.

    6) 查看一下表新状态

    SQL> select * from knight.keyboards;

           ID COMPANY              TYPE

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

           200 SANSUMG              MECHINE

           201 SNAKE                MECHINE

             1 IBM                  500.55

             2 HP                   200.5

             3 SONY                 1200.5

             4 ACER                 55.6

             5 MICROSOFT            108

    7)模拟断电关机

    SQL>shutdown abort;

    8)启动到mount模式

    SQL>startup mount;


    9) 开始闪回

    SQL>flashback database to timestamp to_timestamp('2013-07-27 20:56:32','yyyy-MM-dd hh24:mi:ss');

    Flashback complete.

    10)闪回后各数据文件的状态。

    SQL> select file#,status from v$datafile;

        FILE# STATUS

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

             1 SYSTEM

             2 RECOVER

             3 RECOVER

             4 RECOVER

             5 RECOVER

             6 ONLINE

             7 RECOVER

             8 RECOVER

    8 rows selected.

    11)打开前查看一下

    SQL> alter database open read only;

    Database altered.

    12)看到此时新加入的数据已经不存在了。

    SQL> select * from knight.keyboards;

            ID COMPANY              TYPE

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

             1 IBM                  500.55

             2 HP                   200.5

             3 SONY                 1200.5

             4 ACER                 55.6

             5 MICROSOFT            108

    13)重新启动并尝试打开数据库

    SQL> shutdown abort;

    ORACLE instance shut down.

    SQL> startup mount;

    ORACLE instance started.

    Total System Global Area 1272213504 bytes

    Fixed Size                  1336260 bytes

    Variable Size             822086716 bytes

    Database Buffers          436207616 bytes

    Redo Buffers               12582912 bytes

    Database mounted.

    SQL> alter database open resetlogs;

    Database altered.

    14) 打开后,指定表空间是OFFLINE的状态,符合闪回点的状态。

    SQL> select * from knight.keyboards;

    select * from knight.keyboards

                         *

    ERROR at line1:

    ORA-00376: file7 cannot be read at this time

    ORA-01110: datafile 7: '/ss/offline_space01.dbf'

    15)使表空间online

    SQL> alter tablespace offline_space online;

    Tablespace altered.

    16) 没有新加入的数据

    SQL> select * from knight.keyboards;

           ID COMPANY              TYPE

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

             1 IBM                  500.55

             2 HP                   200.5

             3 SONY                 1200.5

             4 ACER                 55.6

             5 MICROSOFT            108


    5.3 闪回点ONLINE,操作点OFFLINE


    闪回失败,闪回后无论数据还是数据文件状态都是操作点的状态,并且使用了隐含参数,需要做全库备份。

    1)确定当前时间

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY

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

    2013-07-2720:56:32

    2)确定当前SCN

    SQL> select current_scn from v$database;

    CURRENT_SCN

    -----------

     839748

    3)查看表原始状态

    SQL> select * from knight.books; 

            ID NAME                      PRICE

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

             1 LINUX                     25.55

             2 AIX                        50.5

             3 NETWORK                  125.89

             4 JAVA                      88.99

             5 JQUERY                   102.98

    4) 插入新数据,这些数据在闪回后应该不存在。

    SQL> insert into knight.books values(200,'WEBWORK',299.9);

    1 row created.

    5) 插入新数据,这些数据在闪回后应该不存在。

    SQL> insert into knight.books values(201,'PMP',56.99);

    1 row created.

    SQL> commit;

    Commit complete.

    6) 表的新状态。

    SQL> select * from knight.books; 

            ID NAME                      PRICE

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

           200 WEBWORK                   299.9

           201 PMP                       56.99

             1 LINUX                     25.55

             2 AIX                        50.5

             3 NETWORK                  125.89

             4 JAVA                      88.99

             5 JQUERY                   102.98

    7 rows selected.

    7) 将表空间离线

    SQL> alter tablespace test_space offline;

    Tablespace altered.

    8)已经无法查询了

    SQL> select * from knight.books; 

    select * from knight.books

                         *

    ERROR at line1:

    ORA-00376: file5 cannot be read at this time

    ORA-01110: datafile 5: '/ss/test_space01.dbf'

    9)模拟断电

    SQL> shutdown abort;

    ORACLE instance shut down.

    10)启动至mount

    SQL> startup mount;

    ORACLE instance started.

    Total System Global Area 1272213504 bytes

    Fixed Size                  1336260 bytes

    Variable Size             822086716 bytes

    Database Buffers          436207616 bytes

    Redo Buffers               12582912 bytes

    Database mounted.

    11)闪回至指定SCN

    SQL> flashback database to scn 839748;

    Flashback complete.

    12)查看数据文件状态,注意文件5是OFFLINE的状态。与闪回点状态不一致,与操作点状态一致

    SQL> select file#,status from v$datafile;

        FILE# STATUS

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

             1 SYSTEM

             2 RECOVER

             3 RECOVER

             4 RECOVER

             5 OFFLINE

             6 ONLINE

             7 OFFLINE

             8 RECOVER

    8 rows selected.

    13)打开数据库

    SQL> alter database open resetlogs;

    Database altered.

    14)无法查看

    SQL> select * from knight.books; 

    select * from knight.books

                         *

    ERROR at line1:

    ORA-00376: file5 cannot be read at this time

    ORA-01110: datafile 5: '/ss/test_space01.dbf'

    15)无法上线

    SQL> alter tablespace test_space online; 

    alter tablespace test_space online

    ERROR at line1:

    ORA-01190: control file or data file 5 is from before the last RESETLOGS

    ORA-01110: datafile 5: '/ss/test_space01.dbf'

    无法上线

    SQL> alter database datafile 5 online;

    alter database datafile 5 online

    *

    ERROR at line1:

    ORA-01190: control file or data file 5 is from before the last RESETLOGS

    ORA-01110: datafile 5: '/ss/test_space01.dbf'

    16)使用隐含参数

    SQL> alter system set "_allow_resetlogs_corruption"=TRUE scope=spfile;

    System altered.

    SQL> ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME ADJUST_SCN LEVEL1';

    Session altered.

    17)重启数据库至mount

    SQL> shutdown immediate;

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup mount;

    ORACLE instance started.

    Total System Global Area 1272213504 bytes

    Fixed Size                  1336260 bytes

    Variable Size             822086716 bytes

    Database Buffers          436207616 bytes

    Redo Buffers               12582912 bytes

    Database mounted.

    18)不完全恢复

    SQL> recover database until cancel;

    Media recovery complete.

    19)此时可以上线

    SQL> alter database datafile 5 online;

    Database altered.

    SQL> alter database open resetlogs;

    Database altered.

    20)报内部错误

    SQL> select * from knight.books; 

    select * from knight.books

                         *

    ERROR at line1:

    ORA-00600:internal error code, arguments: [2662], [0], [840208], [0],

    [840576],[20971648], [], [], [], [], [], []

    21)再次重启

    SQL> shutdown immediate;

    ORA-00600:internal error code, arguments: [2662], [0], [840230], [0], [840576],[20971648], [], [], [], [], [], []

    SQL> shutdown abort

    ORACLE instance shut down.

    SQL> startup nomount;

    ORACLE instance started.

    Total System Global Area 1272213504 bytes

    Fixed Size                  1336260 bytes

    Variable Size             822086716 bytes

    Database Buffers          436207616 bytes

    Redo Buffers               12582912 bytes

    SQL> alter database mount;

    Database altered.

    SQL> alter database open;

    Database altered.

    22)文件5已经上线

    SQL> select file#,status from v$datafile; 

        FILE# STATUS

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

             1 SYSTEM

             2 ONLINE

             3 ONLINE

             4 ONLINE

             5 ONLINE

             6 ONLINE

             7 OFFLINE

            8 ONLINE

    8 rows selected.

    23)可以查看,但结果不是闪回点的结果,而是操作点的结果。

    SQL> select * from knight.books; 

           ID NAME                      PRICE

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

           200 WEBWORK                   299.9

           201 PMP                       56.99

             1 LINUX                     25.55

             2 AIX                        50.5

             3 NETWORK                  125.89

             4 JAVA                      88.99

             5 JQUERY                   102.98

    7 rows selected.

    全备数据库

    从结果可以看出,新加入的记录被保存了,并没有按照被闪回到指定的时间点,由此说明,闪回数据库时是忽略操作点OFFLINE表空间的。但是此时SCN已经很乱了,必须全备数据库。


    (完)


    另请参见
    欢迎转载,转载请注明源出处,请勿用于商业用途,快乐的哈喇子保留所有权利。
  • 相关阅读:
    php5.3连接sqlserver2005
    U盘文件名称变成乱码的解决方法
    sql小计汇总 rollup用法实例分析(转)
    关于document.all.item遇到IE8时无法正常取到数据
    jQuery 库中的 $() 是什么?
    JavaScript内置可用类型
    jquery中$.get()提交和$.post()提交有区别吗?
    什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    说一说Servlet的生命周期?
    request.getAttribute()和 request.getParameter()有何区别?
  • 原文地址:https://www.cnblogs.com/pangblog/p/3317909.html
Copyright © 2011-2022 走看看