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 恢复前的准备
可以在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-: 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单个数据文件超过32G后扩容
Oracle单个数据文件超过32G后扩容 表空间数据文件容量与DB_BLOCK_SIZE的设置有关,而这个参数在创建数据库实例的时候就已经指定.DB_BLOCK_SIZE参数可以设置为4K.8K. ...
- oracle rename数据文件的两种方法
oracle rename数据文件的两种方法 2012-12-11 20:44 10925人阅读 评论(0) 收藏 举报 分类: oracle(98) 版权声明:本文为博主原创文章,未经博主允许不 ...
- oracle 普通数据文件备份与恢复
普通数据文件指:非system表空间.undo_tablespace表空间.临时表空间和只读表空间的数据文件.它们损坏导致用户数据不能访问,不会导致db自身异常.实例崩溃.数据库不恢复就无法启动的情况 ...
- ORACLE 移动数据文件 控制文件 重做日志文件
ORACLE数据库有时候需要对存储进行调整,增加分区.IO调优等等,此时需要移动数据文件.重做日志文件.控制文件等等,下文结合例子总结一下这方面的知识点. 进行数据文件.重做日志文件.控制文件的迁移前 ...
- ORACLE查看数据文件包含哪些对象
在上篇ORACLE查看表空间对象中,我介绍了如何查询一个表空间有那些数据库对象,那么我们是否可以查看某个数据文件包含那些数据库对象呢?如下所示 SELECT E.SEGMENT_TYPE ...
- Oracle 10g 数据文件的第一个数据块结构
一.数据文件的第一个数据块结构kcvfh BBED> set file 1 FILE# 1 BBED> set block 1 BLOCK# 1 --查看第一个数据块的整体结构 BBED& ...
- Oracle误删数据文件后出现oracle initialization or shutdown in progress解决
一.错误分析 1.首先本人在出现这种情况的背景是执行如下SQL语句后生成的表空间 --自定义表空间 数据表空间 临时表空间 CREATE TEMPORARY TABLESPACE HOUSE_TEMP ...
- oracle 修改数据文件路径
一.关库修改文件位置 1.连接到数据库 [oracle@linux]$ ./sqlplus /nolog SQL> conn / as sysdba 2. 查看数据文件位置 SQL> ...
- ORACLE数据库数据文件转移方法(不同于move方法)
1) 手动拷贝要转移的数据数据文件'd:\OracleData\GWTABLE42.DBF'到新的位置'E:\OracleData\GWTABLE42.DBF'. 2) 把数据文件所属的表空间Offl ...
- python连接oracle导出数据文件
python连接oracle,感觉table_list文件内的表名,来卸载数据文件 主脚本: import os import logging import sys import configpars ...
随机推荐
- 019-zabbix数据库表详解
https://www.cnblogs.com/yaoyaojcy/p/10367945.html 1. 查看目前zabbix系统所有数据表: 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- caffe py3 docker
https://hub.docker.com/r/mapler/caffe-py3/ docker pull mapler/caffe-py3 docker run -it mapler/caff ...
- rsync服务端排错思路
rsync服务端排错思路 rsync服务端排错思路 查看rsync服务配置文件路径是否正确,正确的默认路径为/etc/rsyncd.conf 查看配置文件里host allow,host ...
- buuctf@rip
exp: from pwn import * buf_start = 0x00007FFDBD754931 buf_end = 0x00007FFDBD754948 func_fun_addr= 0x ...
- 对MySQL binlog日志解析,统计每张表的DML次数
想要获取每天数据库每张表的DML的次数,统计热度表,可以使用该脚本 # coding:utf-8 # 解析binlog,统计热度表,表的DML个数 import sys import os # mys ...
- 导出csv文件(使用a标签)
https://blog.csdn.net/oscar999/article/details/16342699 productsCSV(e) { const { download } = this ...
- PHP基础教程 PHP的页面缓冲处理机制
PHP有很多机制.函数,其实就是魔术师,重复发挥好,其实甚至是简单应用,就会出现神奇的效果.兄弟连PHP培训 这里来讲一个ob_start()函数. ob_start()函数用于打开缓冲区,比如hea ...
- 序列式容器————forward_list
单链表的形式存储元素.forward_list 的模板定义在头文件 forward_list 中.fdrward_list 和 list 最主要的区别是:它不能反向遍历元素:只能从头到尾遍历. for ...
- 我的Android案例签到日历
2015年的Android案例之旅 案例八:签到日历 知识点: GridView的使用SQLite的使用 涉及文件: res->layout->activity_main.xml 主布局文 ...
- sqli-labs(27)
0X01 先查询闭合 ?id=' 报错 ?id='' 正确 知道是’的闭合语句 0X02那么开始我们的注入之旅 空格过滤了 尝试一下%0a绕过 #也被过滤了 那么用and '1'='1构造闭合 ?i ...