为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 03134284294-20241009-244896-20119
【操作系统】:银河麒麟v10sp3
【CPU】:
【问题描述】*:已提交未归档的事务不能恢复
我每周1次 全量备份,每天一次增量备份, 每隔1小时做一次 归档日志备份,
在最后一次归档备份后,
按时间顺序, 事务A提交 -->切换日志 --> 事务B提交了, 但没有切换日志,
这时候如果宕机, 但备份齐全,归档日志也齐全, 恢复的话事务B丢失, 怎么才能实现恢复到宕机前的一刻?
备份演示如下:
create table T1 ( A char(200)); insert into T1 VALUES('1.before full backup'); COMMIT; ALTER system switch logfile;
BACKUP DATABASE FULL BACKUPSET '/bak/full' BACKUPINFO 'full';
insert into T1 VALUES('2.before inc1 backup'); COMMIT; ALTER system switch logfile;
BACKUP DATABASE INCREMENT WITH BACKUPDIR '/bak/full' BACKUPSET '/bak/inc1' BACKUPINFO 'inc1';
insert into T1 VALUES('6.before archlog backup'); COMMIT; ALTER system switch logfile;
BACKUP ARCHIVELOG ALL NOT BACKED UP BACKUPSET '/bak/arch' BACKUPINFO 'arch';
insert into T1 VALUES('7.after archlog backup, before switch logfile'); COMMIT; alter system switch logfile;
insert into T1 VALUES('8.after archlog backup, after switch logfile'); COMMIT;
insert into T1 VALUES('9.before crash');
异机恢复演示如下
RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/bak/full';
RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/bak/inc1' WITH BACKUPDIR '/bak/full';
RESTORE ARCHIVE LOG FROM BACKUPSET '/bak/arch' TO ARCHIVEDIR '/dmdata/arch' OVERWRITE 3;
源主机可用,比较归档日志,复制未备份归档日志到新环境 /dmdata/arch
RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/arch';
RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
此时, 恢复后的数据库,只有 ‘7.after archlog backup, before switch logfile’
怎么恢复到已提交的 ‘8.after archlog backup, after switch logfile’
即使我把源环境的dameng01.log , dameng02.log 覆盖新环境的dameng01.log , dameng02.log , 也不行。
信息
DM和Oracle恢复机制有所不同,switch logfile操作不是必须的,可移除。
恢复时until子句指定LSN或时间戳确定恢复范围,执行不完整恢复,类似于Oracle DBPITR。
对于该测例,可在事务提交后查询v$rlog视图cur_lsn字段作为当前LSN,或者sysdate作为当前时间戳。后续recover语句使用until子句指定预期的LSN或时间戳。
看了一下 可能得原因是备份的归档不完整导致。
这个备份归档的时间点在8之前,还原的话 要想有8的数据 必须带上最新的归档。
试一下把模拟宕机前最新的归档也copy过去再还原。