阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

191次阅读
没有评论

共计 5390 个字符,预计需要花费 14 分钟才能阅读完成。

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 恢复前的准备

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

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

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

场景 1:只读数据文件 yhqt01.dbf 丢失,db 无法正常启动,停留在 mount,ORA-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.dbf 和 controlfile 同时损坏。

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;
}

更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5390字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中