zoukankan      html  css  js  c++  java
  • oracle-只读数据文件的备份与恢复

    11 只读数据文件的备份与恢复

    只读数据文件是只读表空间的数据文件,数据块包括文件头在内部允许更改

    SQL> alter tablespace yhqt read only;
    SQL> alter tablespace yhqt read write;

    11.1 只读数据文件损坏的后果

    当一个表空间从读/写状态更改为只读状态时,其数据文件中的脏数据块必须有DBWn进程写到磁盘,完成一次不完整的完全检查点,该表空间内数据文件即称为只读数据文件。

    其数据块及文件头信息包括检查点不在改变,每次打开数据库实例也不会检查只读文件的检查点SCN是否与其他数据文件的或在线日志的同步,但访问该数据文件内的对象报错

    --实例运行时文件丢失

    SQL> select * from yhqt.t1;
    ORA-01116: error in opening database file 10
    ORA-01110: data file 10 : /u01/app/oracle/oradata/orcl/yhqt01.dbf
    ORA-27041: unable to open file
    LINUX-X86-64 Error: 2: No such file or directory

    --实例运行时数据块损坏

    YHQT@ orcl >select * from yhqtest_1;
    select * from yhqtest_1
                  *
    ERROR at line 1:
    ORA-01578: ORACLE data block corrupted (file # 10, block # 135)
    ORA-01110: data file 10: '/u01/app/oracle/oradata/orcl/yhqt01.dbf'

    --实例启动时发现文件丢失

    SQL> startup
    Database mounted
    ORA-01157: cannot identify/lock data file 10 - see DBWR  trace file
    ORA-01110: data file 10: '/u01/app/oracle/oradata/orcl/yhqt01.dbf'

    --实例启动时发现文件头损坏

    SQL> startup
    Database mounted
    ORA-01122: database file 10 failed verification check
    ORA-01110: data file 10: '/u01/app/oracle/oradata/orcl/yhqt01.dbf'
    ORA-01210: data file header is media corrupt

    在只读文件头损坏后,在发送检查点时所有进程不会管它,实例不会崩溃(system等关键数据文件损坏的后果),文件也不会自动下线(普通数据文件头损坏的后果),总体上只读文件正常,只是当执行需要访问头部的操作才在alert log中报错

    SQL> select checkpoint_change# from v$datafile where file#=10;

    告警日志报错

    Corrupt block relative dba: 0x014000 (file 10,block 135)

    Fractured block found during kcvxfh v10

    此时内部的所有对象还是可以查询的(只要相应的数据块没有损坏),但是alter tablespace ... read write alter tablespace ... offline之后的online会报错ora-01120数据文件头损坏。

    11.2 备份

    RMAN> backup as backupset tablespace yhqt;

    RMAN> backup as backupset datafile 10;

    由于只读数据文件内没有个数据块能够修改,所以完全不用反复的备份。

    只读数据文件的备份还可以使用cp命令

    $ cp /u01/app/oracle/oradata/orcl/yhqt01.dbf /home/oracle/backup/yhqt01.bak

    注意:当一个表空间从只读read only修改为read write后,应该立即备份其数据文件和控制文件,否则,将来若控制文件和数据文件损坏,在恢复流程中可能会出现ORA-01152:数据文件不够旧的错误。

    11.3 恢复

    其他类型的数据文件恢复包括:还原(restore)和恢复(recover),对于只读文件来说,重做日志不需要,在恢复的时候不需要recover操作

    --mount状态下恢复步骤

    --1 SQL> startup mount
    --2 RMAN> restore datafile 10;
    --3 SQL> alter database open;

    --open下恢复步骤

    --1 SQL> alter database datafile 10 offline;
    --2 RMAN> restore datafile 10;
    --3 SQL> alter database datafile 10 online;

    11.3.1 恢复前的准备

    可以在mountopen状态下恢复,参数文件和控制文件必须正常,关键数据文件也必须正常。

    11.3.2 控制文件无损情况下的恢复

    控制文件无损情况下的恢复指:只读数据文件损坏时控制文件没有损坏

    场景1:只读数据文件yhqt01.dbf丢失,db无法正常启动,停留在mountORA-01157  cannot identify/lock data file 10 - see DBWR  trace file

    只要使用RMAN执行restore(适合备份集)还原数据文件,然后open数据库

    RMAN> restore datafile 10;
    SQL> alter database open;

    场景2:只读数据文件yhqt01.dbf在实例运行时丢失,导致其内数据无法访问

    SQL> select * from yhqt.t1;
    ORA-01116: error in opening database file 10
    ORA-01110: data file 10 : /u01/app/oracle/oradata/orcl/yhqt01.dbf
    ORA-27041: unable to open file
    LINUX-X86-64 Error: 2: No such file or directory
    --open
    RMAN> run {
    sql'alter database datafile 10 offline';
    restore datafile 10;
    sql'alter database datafile 10 online';
    }

    场景3:运行时只读数据文件yhq01.dbf内数据块损坏,导致数据无法访问,但是文件依然存在

    YHQT@ orcl >select * from yhqtest_1;
    select * from yhqtest_1
                  *
    ERROR at line 1:
    ORA-01578: ORACLE data block corrupted (file # 10, block # 135)
    ORA-01110: data file 10: '/u01/app/oracle/oradata/orcl/yhqt01.dbf'
    --open
    RMAN> run {
    sql'alter database datafile 10 offline';
    restore datafile 10 force;
    sql'alter database datafile 10 online';
    }

    使用镜像复制的恢复

    RMAN> run {
    sql'alter database datafile 10 offline';
    switch datafile 10 to datafilecopy
    '/u01/app/oracle/fra/ORCL/autobackup/2019_07_23/o1_mf_s__glzrwsd5_.dbf';
    sql'alter database datafile 10 online';
    }

    场景4:数据文件yhqt01.dbf在备份时为只读状态(read only),后来所在的表空间yhqt被修改为read write状态, 但没有备份,现在该数据文件损坏了

    --open
    RMAN> run {
    sql'alter database datafile 10 offline';
    restore datafile 10;
    recover datafile 10;
    sql'alter database datafile 10 online';
    }

    场景5:数据文件yhqt01.dbf在备份时为read write,后来被修改为read only状态,没有备份,现该数据文件损坏

    --open
    RMAN> run {
    sql'alter database datafile 10 offline';
    restore datafile 10 force;
    recover datafile 10;
    sql'alter database datafile 10 online';
    }

    restore中使用force关键字是为了使该命令能够应付文件虽然损坏却依然存在的情况。

    11.3.3 控制文件损坏情况下的恢复

    所谓控制文件损坏情况下的恢复是指:只读数据文件与控制文件一起损坏时的恢复

    --1 启动到nomount
    --2 用restore 还原控制文件
    --3 启动到mount
    --4 用restore还原只读数据文件
    --5 用recover恢复整个数据库
    --6 用resetlogs打开数据库

    场景1:只读数据文件yhqt01.dbf与控制文件一起损坏或丢失,db只能启动到nomount状态,错误报告:ORA-00205: error in identifying control file ,check alert log more info

    RMAN> run {
    startup nomount;
    restore controlfile from autobackup;
    mount database;
    restore datafile 10;
    recover database;
    alter database open resetlogs;
    }

    ##recover database 是恢复控制文件的标准操作,对只读的10号数据文件是没有作用的,该命令对应的输出结果中将显示“10号文件未被处理的信息”

    using channel ORA_DISK_1

    datafile 10 not processed because file is read-only

    场景2:在数据文件yhqt01.dbf为只读状态时,对该文件和控制文件进行了备份,随后yhqt表空间(包含yhqt01.dbf数据文件)修改为read write,但数据文件和控制控制文件没有备份,如今yhqt01.dbfcontrolfile同时损坏。

    ORA-00205: error in identifying control file ,check alert log more info

    RMAN> run {
    startup nomount;
    restore controlfile from '/u01/app/oracle/fra/ORCL/autobackup/2019_07_18/o1_mf_s_1013968921_gm0jws37_.bkp';
    mount database;
    restore datafile 10;
    recover database;
    alter database open resetlogs;
    }
    Oracle Error
    ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error blew
    ORA-01152: file 10 was not restored from a sufficiently old backup
    ORA-01110: data file 10 :'/u01/app/oracle/oradata/orcl/yhqt01.dbf'

    造成此问题的原因是数据文件头和控制文件内信息一致,表示yhqt01.dbf应该是只读文件,导致执行了recover database时,yhqt01.dbf文件根本没有被列入应该恢复的范畴。

    但随着恢复的进行,redo log中有一条变更记录把yhqt01.dbf修改为read write状态,此时通道意识不到不应该将yhqt01.dbf文件排除在恢复之外,继而在recover时报错。

    解决办法:在执行一次recover database

    正确的方案

    RMAN> run {
    startup nomount;
    restore controlfile from '/u01/app/oracle/fra/ORCL/autobackup/2019_07_18/o1_mf_s_1013968921_gm0jws37_.bkp';
    mount database;
    restore datafile 10;
    recover database;
    recover database;
    alter database open resetlogs;
    }

    当控制文件和数据文件(只读或曾经处于只读状态)同时损坏之后。

    RMAN> run {
    startup nomount;
    restore controlfile from autobackup;
    mount database;
    restore datafile 10;
    recover database;
    recover database;
    alter database open resetlogs;
    }
  • 相关阅读:
    爬虫防止浏览器防止debug处理
    php
    代码日记
    Linux定时任务
    Linux 三剑客(Awk、Sed、Grep)
    golang中使用ETCD
    golang中使用mysql数据库
    golang中使用Redis
    Linux进阶知识和命令
    Linux核心命令使用方法
  • 原文地址:https://www.cnblogs.com/yhq1314/p/11232135.html
Copyright © 2011-2022 走看看