本案例根据真实案例整理,但是文档中目录与环境均在虚拟机环境中模拟,不涉及任何敏感信息,由于经过了多次修改,所以存在不同部分,目录与文件不对应情况,但是不影响整体阅读。
- 数据库版本11.2.0.4
1. 基础数据备份恢复
由于Windows与Linux同属于little endian平台,所以Windows平台RMAN数据库备份可以在Linux直接使用,但是Windows平台下的归档日志无法在Linux平台直接用于recover database,所以需要使用增量备份解决增量问题,使用增量恢复,可以在不借助第三方复制软件时,最大限度减少停机时间。
1.1 源端Windows 做0级备份
# 下面仅给出示例,实际命令与并行度需要根据实际服务器负载以及磁盘能力配置。
RMAN> backup as compressed backupset incremental level 0 database format 'd:\rmanbak\full_level0_%d_%T_%s_%p' tag 'full_level_0';
RMAN> backup current controlfile format 'd:\rmanbak\ctl_level0_%d_%T_%s_%p' tag 'ctl_bak_1';
复制
1.2 Linux端恢复0级备份
# 恢复spfile与修改pfile中参数、上传备份集到Linux服务器等基础步骤略过,下面仅演示恢复过程 RMAN> startup nomount; RMAN> restore controlfile from '/home/oracle/oradata/CTL.BAK'; RMAN> alter database mount; RMAN> crosscheck backup; RMAN> delete noprompt expired backup; RMAN> catalog start with '/home/oracle/oradata/'; RMAN> run{ set newname for database to '+dgdata'; set newname for tempfile 'C:\APP\ORADATA\TEST\TEMP01.DBF' to '+dgdata/test/temp01.dbf'; restore database; switch datafile all; switch tempfile all; }
复制
2. 增量数据恢复
2.1 源端Windows做1级备份
增量备份与level 0之间不能有其他类似第三方备份进行level 0备份,即使通道类型是SBT_TAPE也会干扰DISK的增量,会干扰level 1备份,导致无法恢复增量,由于真实案例中未仔细检查客户是否有第三方增量备份,导致第一次在快到变更时间时,发现增量恢复无法恢复,经过排查,发现备份软件在恢复的level 0之后又发起了level0,导致后面level 1实际是根据备份软件的level 0进行的,导致无法recover,紧急取消变更,都是泪啊
- 检查是否在0级备份之后有无别的0级备份
# 可以根据自己需求以及时间进行查询判断
RMAN> list backupset;
SQL> SELECT PIECE#,DEVICE_TYPE,COMPLETION_TIME FROM V$BACKUP_PIECE WHERE COMPLETION_TIME > SYSDATE-5 AND DEVICE_TYPE='SBT_TAPE';
# 通过change命令,删除生产库中干扰增量备份的0级备份信息
SQL> SELECT 'CHANGE BACKUPPIECE '||RECID||' UNCATALOG;' FROM V$BACKUP_PIECE WHERE COMPLETION_TIME > SYSDATE- 3 AND DEVICE_TYPE='SBT_TAPE' AND DELETED='NO';
RMAN> CHANGE BACKUPPIECE XXX UNCATALOG;
...
复制
- 确认无其他0级备份信息干扰后,增量备份即可
RMAN> backup as compressed backupset incremental level 1 database format 'd:\rmanbak\incr_level0_%d_%T_%s_%p' tag 'incr_level_1';
复制
2.2 Linux端恢复1级备份
# 增量恢复,只应用增量备份即可
RMAN> catalog start with '/home/oracle/oradata/';
RMAN> recover database;
复制
2.3 停机窗口Windows最后一次1级备份
停机窗口前,可以根据需要,每天,每隔几小时定时将源端增量恢复一次,可以大幅度减少最后一次增量备份以及恢复的时间,缩短停机时间。
# 由于Linux无法直接应用Windows平台下归档,所以需要在停机窗口干净关闭数据库,启动到mount状态
SQL> create table test as select * from dba_users; # 创建测试表,以便最后验证数据是否完全恢复
RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> backup as compressed backupset incremental level 1 database format 'd:\rmanbak\incr_level0_%d_%T_%s_%p' tag 'incr_level_1';
# 需要在mount下重新备份最新的控制文件
RMAN> backup current controlfile format 'd:\rmanbak\ctl_level0_%d_%T_%s_%p' tag 'ctl_bak_final';
复制
2.4 检查是否在全量之后有无增加数据文件(非常重要)
检查是否新增数据文件,对后面处理比较重要,我的真实案例中,由于增加了数据文件,但是管理员并未告诉我,我也并未检查,导致最终验证数据时,报错ORA-01135 ORA-01111 ORA-01110,由于已经open resetlogs,最后无奈只能使用bbed修改文件头,由于生产库已经静止,所以不存在数据丢失问题,只是比较曲折
生产库关闭,mount之后,最后一次增量备份恢复完成之后,理论上数据库数据文件自身已经完全一致,但是由于控制文件有以下几种情况,导致了需要注意是否在全量之后有新增加数据文件情况,不同情况处理方法也不相同。
- 生产库关闭,mount之后,备份增量同时,备份控制文件恢复到目标端,由于windows文件系统目录特殊字符限制在更改redo位置时,使用alter database rename file时无法识别,所以恢复了最后一次控制文件之后,还需要重建一次控制文件,更改windows路径,而恢复了控制文件之后,还需要重新备份生产库新增的数据文件,在目标端进行restore。
- 生产库关闭,mount之后,只备份增量,目标库采用重建控制文件方式,重建基准以原生产库的控制文件内容为基准,这种方式,就需要编辑所有数据文件,redo位置,这种方式与第一种相似,重建之后,重新在原生产库备份一次新增的数据文件,目标库restore即可。
- 未确认是否新增文件,直接使用未记录新数据文件控制文件或重建控制文件open resetlogs,导致文件名变为MISSING,由于这种MISSING未进行restore,导致物理文件并不存在,所以无法通过ALTER DATABASE rename file …子句解决问题,需要使用原库备份+bbed修改新数据文件文件头即可正常恢复。
SELECT FILE#, CREATION_TIME FROM V$DATAFILE WHERE CREATION_TIME > TO_DATE('2022-03-05 14:00:00', 'yyyy-mm-dd hh24:mi:ss'); -- 时间为全备份开始的时间。
复制
后面会有对这三种不同情况恢复的详细说明
2.5 Linux端恢复
下面以2.4章节中三种情况,新增数据文件进行详细说明解决方案
未新增数据文件情况不再详细说明,只需要恢复增量备份,恢复控制文件、switch database to copy或重建控制文件都可以,即可正常打开数据库。
- 生产库关闭,mount之后,备份增量同时,备份控制文件恢复到目标端
- 生产库关闭,mount之后,只备份增量,目标库采用重建控制文件方式,以原生产库控制文件为基准重建,由于物理上并不存在新增的数据库文件,而创建控制文件时需要控制文件语句中所有数据文件在指定的物理位置真实存在,完成校验后,才能成功创建控制文件,但是由于现有控制文件无新增文件记录,目标库无法直接使用RMAN restore新增的数据文件备份,所以这种办法需要借助DBMS_BACKUP_RESTORE包来恢复新增的数据文件,然后按照恢复的新数据文件,修改CREATE CONTROLFILE语句之后,创建控制文件之后即可成功恢复完整数据库。
- 目标库未确认是否新增文件,由于windows目录无法识别,已经通过重建控制文件解决redo路径,并且已经open resetlogs,新增的文件变为MISSING,可以使用restore+bbed修改文件头方法恢复完整数据库,由于原库已经静止,所以数据并不会丢失。
2.5.1 第一种情况
恢复原生产库最新的控制文件
# 直接恢复最后一次增量
RMAN> catalog start with '/home/oracle/oradata/';
# 一定要先recover,如果恢复了控制文件,则由于检查点靠后,无法使用最后一次增量备份。
RMAN> recover database;
# datafile应用完最后一次增量之后,重新恢复最新控制文件,保证数据文件与控制文件记录SCN保持一致。
RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> restore controlfile from '/home/oracle/oradata/CTL_FINAL.BAK';
RMAN> alter database mount;
# 修正备份片状态
RMAN> crosscheck backup;
RMAN> delete noprompt expired backup;
# 切换控制文件中数据文件记录
RMAN> catalog start with '+dgdata/test/datafile/';
# 由于在全备之后新增了数据文件,重新恢复控制文件后,新控制文件有新增的记录,所以switch时会报如下错,这个错误,只需要重新恢复新增的数据文件即可。
RMAN> switch database to copy;
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of switch to copy command at 02/18/2022 14:42:31
RMAN-06571: datafile 5 does not have recoverable copy
# 处理
-- 原生产库重新备份新增数据文件,由于为mount状态,备份出来即与现有文件一致
RMAN> backup as compressed backupset datafile 5 format 'C:\app\backup\datafile5_%U.bak';
-- 新目标库注册备份片,restore,由于mount状态备份,业务需recover,即与其他数据文件一致
RMAN> catalog start with '/home/oracle/oradata';
RMAN> run{
set newname for datafile 5 to '+dgdata';
restore datafile 5;
}
# 即可正常switch
RMAN> switch database to copy;
datafile xx switched to datafile copy "xx"
...
# open read only,验证测试表,验证数据文件名是否有异常
RMAN> alter database open read only;
SQL> desc test9;
# 检查redo log位置
SQL> select member from v$logfile;
# 修正redo举例,tempfile可以直接添加新的tempfile然后drop旧的即可。
-- select 'ALTER DATABASE RENAME FILE '''||member||''' TO '''||'&path'||'group'||group#||'.log'';'
FROM v$logfile
order by group#;
# 如果原生产库问windows文件系统,由于无法识别Windows路径,则rename将会报错,此时重建一次控制文件即可。
SYS@test > alter database rename file 'C:\APP\ORADATA\TEST\REDO01.LOG' to '+dgdata/test/redo01.log';
alter database rename file 'C:\APP\ORADATA\TEST\REDO01.LOG' to '+dgdata/test/redo01.log'
*
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01516: nonexistent log file, data file, or temporary file "C:\APP\ORADATA\TEST\REDO01.LOG"
# 再次重建控制文件,修改redo位置
SYS@test > alter database backup controlfile to trace as '/tmp/ctl.trc';
$ cat /tmp/ctl.trc
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
...
GROUP 1 'C:\APP\ORADATA\TEST\REDO01.LOG' SIZE 50M BLOCKSIZE 512,
...
# 改为
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
...
GROUP 1 '+dgdata/test/REDO01.LOG' SIZE 50M BLOCKSIZE 512,
...
# 重建控制文件
SYS@test > shutdown immediate;
SYS@test > startup nomount;
SYS@test > CREATE CONTROLFILE
...
Control file created.
SYS@test > select member from v$logfile;
MEMBER
------------------------------------------------------------
+DGDATA/test/redo03.log
+DGDATA/test/redo02.log
+DGDATA/test/redo01.log
# 验证无误,可以open打开数据库
SQL> alter database open resetlogs;
# 检查tempfile位置,如有需要,修正文件位置
SYS@test > select name from v$tempfile;
SYS@test > alter tablespace temp add tempfile '+dgdata' size 10m;
Tablespace altered.
# 至此,完成恢复
复制
2.5.2 第二种情况
以最新原生产库控制文件为基准,重建控制文件,由于物理文件不存在,创建控制文件ORA-01503修复方法
# 恢复最后一次增量,之前步骤相同,不再赘述
RMAN> catalog start with '/home/oracle/oradata/';
RMAN> recover database;
SYS@test > alter database backup controlfile to trace as '/tmp/ctl.trc';
# 可以看到控制文件中有新增数据文件5,
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'C:\APP\ORADATA\TEST\REDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 'C:\APP\ORADATA\TEST\REDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 'C:\APP\ORADATA\TEST\REDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'C:\APP\ORADATA\TEST\SYSTEM01.DBF',
'C:\APP\ORADATA\TEST\SYSAUX01.DBF',
'C:\APP\ORADATA\TEST\UNDOTBS01.DBF',
'C:\APP\ORADATA\TEST\USERS01.DBF',
'C:\APP\ORADATA\TEST\USERS02.DBF'
CHARACTER SET AL32UTF8
;
# 改为
# 新增的文件新目标库物理上并不存在,需要后期restore,所以先暂时保留原来记录即可
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '+dgdata/test/REDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 '+dgdata/test/REDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 '+dgdata/test/REDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'+DGDATA/test/datafile/system.263.1097006937',
'+DGDATA/test/datafile/sysaux.275.1097006937',
'+DGDATA/test/datafile/undotbs1.321.1097006937',
'+DGDATA/test/datafile/users.269.1097006937',
'+dgdata/test/USERS02.DBF'
CHARACTER SET AL32UTF8
;
SYS@test > shutdown immediate;
SYS@test > startup nomount;
SYS@test > CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
...
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '+dgdata/test/USERS02.DBF'
ORA-17503: ksfdopn:2 Failed to open file +dgdata/test/USERS02.DBF
ORA-15173: entry 'USERS02.DBF' does not exist in directory 'test'
# 可以看到,第二种情况并无法恢复这种情况,且由于目标库控制文件中未记录新增数据文件,也无法完成物理恢复
# 这种情况下,需要nomount状态下,借助dbms_backup_restore包恢复新增数据文件备份
SYS@test > startup nomount;
SYS@test > DECLARE
devtype varchar2(256);
done boolean;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate (type=>'',ident=>'t2');
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>05,toname=>'+dgdata/test/datafile5.dbf');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'/home/oracle/oradata/DATAFILE5_1M0NPK0H_1_1.BAK', params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END;
/
PL/SQL procedure successfully completed.
# 更改真实物理文件位置,重新新建控制文件
SYS@test > CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '+dgdata/test/REDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 '+dgdata/test/REDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 '+dgdata/test/REDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'+DGDATA/test/datafile/system.263.1097006937',
'+DGDATA/test/datafile/sysaux.275.1097006937',
'+DGDATA/test/datafile/undotbs1.321.1097006937',
'+DGDATA/test/datafile/users.269.1097006937',
'+dgdata/test/datafile5.dbf'
CHARACTER SET AL32UTF8
;
Control file created.
# 查看文件恢复情况,可以看到已经正确恢复,只是文件名为asm alias不是真实OMF文件名,这个不重要,可以根据需要修正,不影响使用
RMAN> report schema;
using target database control file instead of recovery catalog
RMAN-06139: WARNING: control file is not current for REPORT SCHEMA
Report of database schema for database with db_unique_name TEST
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 700 SYSTEM *** +DGDATA/test/datafile/system.263.1097006937
2 600 SYSAUX *** +DGDATA/test/datafile/sysaux.275.1097006937
3 205 UNDOTBS1 *** +DGDATA/test/datafile/undotbs1.321.1097006937
4 5 USERS *** +DGDATA/test/datafile/users.269.1097006937
5 10 USERS *** +DGDATA/test/datafile5.dbf
RMAN> alter database open resetlogs;
database opened
# 检查tempfile位置,如有需要,修正文件位置
SYS@test > select name from v$tempfile;
SYS@test > alter tablespace temp add tempfile '+dgdata' size 10m;
Tablespace altered.
# 至此,完成恢复
复制
2.5.3 第三种情况
# 恢复最后一次增量
RMAN> catalog start with '/home/oracle/oradata/';
RMAN> recover database;
# 重建控制文件,可以看到内容中并未有新增的datafile 5数据文件记录。
SYS@test > CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '+dgdata/test/REDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 '+dgdata/test/REDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 '+dgdata/test/REDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'+DGDATA/test/datafile/system.269.1097012541',
'+DGDATA/test/datafile/sysaux.321.1097012541',
'+DGDATA/test/datafile/undotbs1.275.1097012541',
'+DGDATA/test/datafile/users.263.1097012541'
CHARACTER SET AL32UTF8
;
Control file created.
# alert日志中,会提示如下信息,如果不注意,由于不明显,很容易忽略
Dictionary check beginning
Tablespace 'TEMP' #3 found in data dictionary,
but not in the controlfile. Adding to controlfile.
File #5 found in data dictionary but not in controlfile.
Creating OFFLINE file 'MISSING00005' in the controlfile.
This file can no longer be recovered so it must be dropped.
Dictionary check complete
# 查看目前数据库文件
SYS@test > select name,status from v$datafile;
NAME STATUS
------------------------------------------------------------ ----------
+DGDATA/test/datafile/system.269.1097012541 SYSTEM
+DGDATA/test/datafile/sysaux.321.1097012541 ONLINE
+DGDATA/test/datafile/undotbs1.275.1097012541 ONLINE
+DGDATA/test/datafile/users.263.1097012541 ONLINE
/oracle/app/oracle/product/11.2/db_1/dbs/MISSING00005 RECOVER
SYS@test > ! ls -l /oracle/app/oracle/product/11.2/db_1/dbs/MISSING00005
ls: cannot access /oracle/app/oracle/product/11.2/db_1/dbs/MISSING00005: No such file or directory
# 可以看到MISSING不存在,此时重新源库备份,再次进行restore
# 原生产库备份datafile 5
RMAN> backup as compressed backupset datafile 5 format 'C:\app\backup\datafile5_%U.bak';
# 目标库注册,恢复
RMAN> catalog start with '/home/oracle/oradata/DATAFILE5_1M0NPK0H_1_1.BAK';
RMAN> report schema;
Report of database schema for database with db_unique_name TEST
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 700 SYSTEM *** +DGDATA/test/datafile/system.269.1097012541
2 600 SYSAUX *** +DGDATA/test/datafile/sysaux.321.1097012541
3 205 UNDOTBS1 *** +DGDATA/test/datafile/undotbs1.275.1097012541
4 5 USERS *** +DGDATA/test/datafile/users.263.1097012541
5 0 USERS *** /oracle/app/oracle/product/11.2/db_1/dbs/MISSING00005
# restore datafile 5
RMAN> restore datafile 5;
Starting restore at 18-FEB-22
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=41 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 02/18/2022 22:01:33
RMAN-06085: must use SET NEWNAME command to restore datafile /oracle/app/oracle/product/11.2/db_1/dbs/MISSING00005
# set newname恢复
RMAN> run{
set newname for datafile 5 to '+dgdata';
restore datafile 5;
switch datafile 5;
}
executing command: SET NEWNAME
...
datafile 5 switched to datafile copy
input datafile copy RECID=2 STAMP=1097013754 file name=+DGDATA/test/datafile/users.278.1097013753
# 尝试online数据文件
SYS@test > select file#,status from v$datafile_header;
FILE# STATUS
----- ----------
1 ONLINE
2 ONLINE
3 ONLINE
4 ONLINE
5 OFFLINE
Elapsed: 00:00:00.01
22:08:21 SYS@test > select name,status from v$datafile;
NAME STATUS
------------------------------------------------------------ ----------
+DGDATA/test/datafile/system.269.1097012541 SYSTEM
+DGDATA/test/datafile/sysaux.321.1097012541 ONLINE
+DGDATA/test/datafile/undotbs1.275.1097012541 ONLINE
+DGDATA/test/datafile/users.263.1097012541 ONLINE
+DGDATA/test/datafile/users.278.1097013753 RECOVER
Elapsed: 00:00:00.00
22:08:27 SYS@test > select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ----------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
Elapsed: 00:00:00.01
22:08:41 SYS@test > alter database datafile 5 online;
alter database datafile 5 online
*
ERROR at line 1:
ORA-01190: control file or data file 5 is from before the last RESETLOGS
ORA-01110: data file 5: '+DGDATA/test/datafile/users.278.1097013753'
# 这种情况只能通过BBED修改数据文件头恢复了,因为已经resetlogs了,下面会详细说明修改过程
# 下面bbed例子为之前其他案例修改,本例子中采用同样方法即可。
复制
2.6 BBED修复ORA-01190
2.6.1 需要修改的信息
# 使用bbed来修改文件头信息
# 有4个属性来判断datafile是否和其他的datafile 一致,如果都一致,可以正常online
kcvfhsta (at offset 138) - fuzzy status
kcvfhcpc (at offset 140) - Checkpoint count.
kcvfhccc (at offset 148) - Unknown, but is always 1 less than thecheckpoint point count.
kscnbas (at offset 484) - SCN of last change to the datafile.
kcvcptim (at offset 492) -Time of the last change to the datafile.
# 还有2个跟resetlog相关的属性:
kcvfhrlc - resetlogs count
kcvfhrls - resetlogs scn
复制
2.6.2 检查状态以及将ASM文件拷贝到文件系统
# 1. 查看数据文件状态信息
SYS@honor1 > select file#,status,checkpoint_change#,CHECKPOINT_COUNT,CHECKPOINT_TIME,RESETLOGS_CHANGE#,RESETLOGS_TIME,fuzzy from v$datafile_header;
FILE# STATUS CHECKPOINT_CHANGE# CHECKPOINT_COUNT CHECKPOINT_TIME RESETLOGS_CHANGE# RESETLOGS_TIME FUZ
----- ---------- ------------------ ---------------- ------------------- ----------------- ------------------- ---
1 ONLINE 21484872432 2867 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
2 ONLINE 21484872432 2860 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
3 ONLINE 21484872432 2784 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
4 ONLINE 21484872432 2882 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
5 ONLINE 21484872432 2786 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
6 ONLINE 21484872432 1459 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
7 ONLINE 21484872432 2729 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
8 ONLINE 21484872432 2715 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
9 ONLINE 21484872432 1356 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
10 ONLINE 21484872432 214 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
11 ONLINE 21484872432 1356 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
12 ONLINE 21484872432 789 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
13 ONLINE 21484872432 606 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
14 ONLINE 21484872432 471 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
15 ONLINE 21484872432 331 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
16 ONLINE 21484872432 165 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
17 ONLINE 21484872432 84 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
18 OFFLINE 21484852691 27 2021-11-30 10:37:30 21474861774 2021-04-14 21:50:34 NO
# 2. 使用RMAN将ASM文件拷贝到文件系统
$ rman target /
RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> backup as copy datafile 17 format '/veridata/rman/test_resize.dbf';
# 下面文件是为了作为参考,拷贝两个文件,可以在bbed修改时互为参考。
RMAN> backup as copy datafile 18 format '/veridata/rman/test_aut.dbf';
RMAN> switch datafile 18 to copy;
RMAN> exit;
复制
2.6.3 BBED准备
# bbed配置文件编辑
$ cat datafile.list
17 /veridata/rman/test_aut.dbf
18 /veridata/rman/test_resize.dbf
$ cat bbed.par
blocksize=8192
listfile=/home/oracle/datafile.list
mode=edit
$ bbed parfile=bbed.par
Password: blockedit
BBED> info all
File# Name Size(blks)
----- ---- ----------
17 /veridata/rman/test_aut.dbf 0
18 /veridata/rman/test_resize.dbf 0
复制
2.6.4 kcvfhsta修改
# kcvfhsta状态,一致则不需要修改
BBED> set file 17 block 1
FILE# 17
BLOCK# 1
BBED> p kcvfhsta
ub2 kcvfhsta @138 0x0000 (NONE)
BBED> set file 18 block 1
FILE# 18
BLOCK# 1
BBED> p kcvfhsta
ub2 kcvfhsta @138 0x0000 (NONE)
复制
2.6.5 kcvfhcpc修改
# kcvfhcpc状态修改
BBED> d file 17 block 1 offset 140 count 10
File: /veridata/rman/test_aut.dbf (17)
Block: 1 Offsets: 140 to 149 Dba:0x04400001
------------------------------------------------------------------------
54000000 467dfa40 5300
<32 bytes per line>
BBED> m /x 54
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 140 to 149 Dba:0x04800001
------------------------------------------------------------------------
54000000 0d41f640 1a00
<32 bytes per line>
# 每次修改一项之后,应用之后verify,防止错误修改
BBED> sum apply
Check value for File 18, Block 1:
current = 0x43a8, required = 0x43a8
BBED> verify
复制
2.6.6 kcvfhccc修改
# kcvfhccc修改
BBED> p file 17 block 1 kcvfhccc
ub4 kcvfhccc @148 0x00000053
BBED> p file 18 block 1 kcvfhccc
ub4 kcvfhccc @148 0x0000001a
BBED> d /v file 18 block 1 offset 148
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 148 to 157 Dba:0x04800001
-------------------------------------------------------
1a000000 00000000 0000 l ..........
<16 bytes per line>
BBED> m /x 53 file 18 block 1 offset 148
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 148 to 157 Dba:0x04800001
------------------------------------------------------------------------
53000000 00000000 0000
<32 bytes per line>
BBED> p file 18 block 1 kcvfhccc
ub4 kcvfhccc @148 0x00000053
BBED> sum apply
Check value for File 18, Block 1:
current = 0x43e1, required = 0x43e1
BBED> verify
复制
2.6.7 kscnbas修改
如果SCN差距巨大,需要修改kscnwrp则,使用相同方法修改即可
# kscnbas以及kcvcptim修改
BBED> p file 17 block 1 kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x009922f0
ub2 kscnwrp @488 0x0005
ub4 kcvcptim @492 0x40faabce
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x00000001
ub4 kcrbabno @504 0x00011f34
ub2 kcrbabof @508 0x0010
ub1 kcvcpetb[0] @512 0x02
ub1 kcvcpetb[1] @513 0x00
ub1 kcvcpetb[2] @514 0x00
ub1 kcvcpetb[3] @515 0x00
ub1 kcvcpetb[4] @516 0x00
ub1 kcvcpetb[5] @517 0x00
ub1 kcvcpetb[6] @518 0x00
ub1 kcvcpetb[7] @519 0x00
BBED> p file 18 block 1 kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x0098d5d3
ub2 kscnwrp @488 0x0005
ub4 kcvcptim @492 0x40f7afea
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x00000207
ub4 kcrbabno @504 0x00000007
ub2 kcrbabof @508 0x0010
ub1 kcvcpetb[0] @512 0x02
ub1 kcvcpetb[1] @513 0x00
ub1 kcvcpetb[2] @514 0x00
ub1 kcvcpetb[3] @515 0x00
ub1 kcvcpetb[4] @516 0x00
ub1 kcvcpetb[5] @517 0x00
ub1 kcvcpetb[6] @518 0x00
ub1 kcvcpetb[7] @519 0x00
BBED> m /x f02299 file 18 block 1 offset 484
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 484 to 515 Dba:0x04800001
------------------------------------------------------------------------
f0229900 05000000 eaaff740 01000000 07020000 07000000 10009804 02000000
<32 bytes per line>
BBED> sum apply
Check value for File 18, Block 1:
current = 0xb4c3, required = 0xb4c3
BBED> verify
复制
2.6.8 kcvcptim修改
# kcvcptim状态修改
BBED> set file 18 block 1 offset 492
# 由于其他kcvcptim为ceabfa40,尾号为0,无法直接整个字符串修改,所以分两次修改,才能修改40
BBED> m /x ceabfa
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 492 to 523 Dba:0x04800001
------------------------------------------------------------------------
ceabfaa4 01000000 07020000 07000000 10009804 02000000 00000000 00000000
<32 bytes per line>
BBED> set offset 495
OFFSET 495
BBED> d
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 495 to 526 Dba:0x04800001
------------------------------------------------------------------------
a4010000 00070200 00070000 00100098 04020000 00000000 00000000 00000000
<32 bytes per line>
BBED> m /x 4001
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 495 to 526 Dba:0x04800001
------------------------------------------------------------------------
40010000 00070200 00070000 00100098 04020000 00000000 00000000 00000000
<32 bytes per line>
BBED> set offset 492
OFFSET 492
BBED> d
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 492 to 523 Dba:0x04800001
------------------------------------------------------------------------
ceabfa40 01000000 07020000 07000000 10009804 02000000 00000000 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 18, Block 1:
current = 0xb0ea, required = 0xb0ea
BBED> verify
复制
2.6.9 kcvfhrlc修改
# kcvfhrlc修改
BBED> p file 17 block 1 kcvfhrlc
ub4 kcvfhrlc @112 0x40fa7d53
BBED> p file 18 block 1 kcvfhrlc
ub4 kcvfhrlc @112 0x3fc5202a
BBED> d /v file 17 block 1 offset 112
File: /veridata/rman/test_aut.dbf (17)
Block: 1 Offsets: 112 to 143 Dba:0x04400001
-------------------------------------------------------
537dfa40 e8d59800 05000000 00000000 l S}.@............
00000000 00000000 00000000 54000000 l ............T...
<16 bytes per line>
BBED> d /v file 18 block 1 offset 112
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 112 to 143 Dba:0x04800001
-------------------------------------------------------
2a20c53f ce620000 05000000 00000000 l * .?.b..........
00000000 00000000 00000000 54000000 l ............T...
<16 bytes per line>
BBED> m /x 537dfa file 18 block 1 offset 112
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 112 to 143 Dba:0x04800001
------------------------------------------------------------------------
537dfa3f ce620000 05000000 00000000 00000000 00000000 00000000 54000000
<32 bytes per line>
BBED> set offset 115
OFFSET 115
BBED> d
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 115 to 146 Dba:0x04800001
------------------------------------------------------------------------
3fce6200 00050000 00000000 00000000 00000000 00000000 00540000 000d41f6
<32 bytes per line>
BBED> m /x 40ce
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 115 to 146 Dba:0x04800001
------------------------------------------------------------------------
40ce6200 00050000 00000000 00000000 00000000 00000000 00540000 000d41f6
<32 bytes per line>
BBED> p file 18 block 1 kcvfhrlc
ub4 kcvfhrlc @112 0x40fa7d53
BBED> sum apply
Check value for File 18, Block 1:
current = 0x92ac, required = 0x92ac
BBED> verify
复制
2.6.10 kcvfhrl修改
# kcvfhrl修改
# resetlogs scn只需要修改scn base即可,scn wrap一致,不需要修改
# 如果scn wrap不一致,参照同样方法修改即可
BBED> p file 17 block 1 kcvfhrls
struct kcvfhrls, 8 bytes @116
ub4 kscnbas @116 0x0098d5e8
ub2 kscnwrp @120 0x0005
BBED> p file 18 block 1 kcvfhrls
struct kcvfhrls, 8 bytes @116
ub4 kscnbas @116 0x000062ce
ub2 kscnwrp @120 0x0005
BBED> set file 18 block 1 offset 116
FILE# 18
BLOCK# 1
OFFSET 116
BBED> d
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 116 to 147 Dba:0x04800001
------------------------------------------------------------------------
ce620000 05000000 00000000 00000000 00000000 00000000 54000000 0d41f640
<32 bytes per line>
BBED> m /x e8d598
File: /veridata/rman/test_resize.dbf (18)
Block: 1 Offsets: 116 to 147 Dba:0x04800001
------------------------------------------------------------------------
e8d59800 05000000 00000000 00000000 00000000 00000000 54000000 0d41f640
<32 bytes per line>
BBED> sum apply
Check value for File 18, Block 1:
current = 0x2512, required = 0x2512
BBED> verify
复制
2.6.11 验证修改
# 验证修改效果
SYS@honor1 > col file# for 99
SYS@honor1 > col checkpoint_change# for 99999999999999999
SYS@honor1 > col checkpoint_count for 99999
SYS@honor1 > col resetlogs_change# for 9999999999999999
SYS@honor1 > select file#,status,checkpoint_change#,CHECKPOINT_COUNT,CHECKPOINT_TIME,RESETLOGS_CHANGE#,RESETLOGS_TIME,fuzzy from v$datafile_header;
FILE# STATUS CHECKPOINT_CHANGE# CHECKPOINT_COUNT CHECKPOINT_TIME RESETLOGS_CHANGE# RESETLOGS_TIME FUZ
----- ---------- ------------------ ---------------- ------------------- ----------------- ------------------- ---
1 ONLINE 21484872432 2867 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
2 ONLINE 21484872432 2860 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
3 ONLINE 21484872432 2784 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
4 ONLINE 21484872432 2882 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
5 ONLINE 21484872432 2786 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
6 ONLINE 21484872432 1459 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
7 ONLINE 21484872432 2729 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
8 ONLINE 21484872432 2715 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
9 ONLINE 21484872432 1356 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
10 ONLINE 21484872432 214 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
11 ONLINE 21484872432 1356 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
12 ONLINE 21484872432 789 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
13 ONLINE 21484872432 606 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
14 ONLINE 21484872432 471 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
15 ONLINE 21484872432 331 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
16 ONLINE 21484872432 165 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
17 ONLINE 21484872432 84 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
18 OFFLINE 21484872432 84 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
复制
2.6.12 恢复数据文件open数据库
SYS@honor1 > alter database datafile 18 online;
Database altered.
SYS@honor1 > select file#,status,checkpoint_change#,CHECKPOINT_COUNT,CHECKPOINT_TIME,RESETLOGS_CHANGE#,RESETLOGS_TIME,fuzzy from v$datafile_header;
FILE# STATUS CHECKPOINT_CHANGE# CHECKPOINT_COUNT CHECKPOINT_TIME RESETLOGS_CHANGE# RESETLOGS_TIME FUZ
----- ---------- ------------------ ---------------- ------------------- ----------------- ------------------- ---
1 ONLINE 21484872432 2867 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
2 ONLINE 21484872432 2860 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
3 ONLINE 21484872432 2784 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
4 ONLINE 21484872432 2882 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
5 ONLINE 21484872432 2786 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
6 ONLINE 21484872432 1459 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
7 ONLINE 21484872432 2729 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
8 ONLINE 21484872432 2715 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
9 ONLINE 21484872432 1356 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
10 ONLINE 21484872432 214 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
11 ONLINE 21484872432 1356 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
12 ONLINE 21484872432 789 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
13 ONLINE 21484872432 606 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
14 ONLINE 21484872432 471 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
15 ONLINE 21484872432 331 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
16 ONLINE 21484872432 165 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
17 ONLINE 21484872432 84 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
18 ONLINE 21484872432 84 2021-12-01 16:56:46 21484852712 2021-12-01 13:38:27 NO
# 由于未修改控制文件数据文件相关信息以及kcvcprba的rba相关信息,所以需要media recovery
SYS@honor1 > alter database datafile 18 online;
alter database open
*
ERROR at line 1:
ORA-01113: file 18 needs media recovery
ORA-01110: data file 18: '/veridata/rman/test_resize.dbf'
SYS@honor1 > recover datafile 18;
Media recovery complete.
SYS@honor1 > alter database datafile 18 online;
Database altered.
复制
评论

