注册
还原恢复时,无法还原到最新数据的问题复现及解决
培训园地/ 文章详情 /

还原恢复时,无法还原到最新数据的问题复现及解决

难忘那夜色如水荡漾 2022/11/18 1563 1 0

一句话解释

数据库全库恢复一次后,魔数也会变化。新产生的归档日志文件与之前的文件魔数不同。

1. 问题复现

第一步:执行备份,生成联机热备。

backup database BACKUPSET 'db_bak_01';

第二步:手动添加数据。

select count(*) from HRTEST.T_EMP02;
>>>13696
insert INTO HRTEST.T_EMP02 select * from HRTEST.T_EMP01;
select count(*) from HRTEST.T_EMP02;
>>>27392
commit

第三步:使用dmrman还原并恢复,查看数据是否正常。

restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/data/DAMENG/bak/db_bak_01';
recover database '/dm8/data/DAMENG/dm.ini' with archivedir '/dm8/arch'; 
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;
select count(*) from HRTEST.T_EMP02;
>>>27392

第四步:重复第二步、第三步,再次恢复并还原查看数据是否正常。

select count(*) from HRTEST.T_EMP02;
>>>27392
insert INTO HRTEST.T_EMP02 select * from HRTEST.T_EMP01;
select count(*) from HRTEST.T_EMP02;
>>>41088
commit

restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/data/DAMENG/bak/db_bak_01';
recover database '/dm8/data/DAMENG/dm.ini' with archivedir '/dm8/arch'; 
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;
select count(*) from HRTEST.T_EMP02;
>>>27392

问题出现,此时恢复的数据并不是刚刚添加后的数据。

2. 原因及解决方案

2.1 魔数

DM中魔数(MAGIC)分为 PERMANENT_MAGIC 和 DB_MAGIC。DM 在初始化数据库时生成 PERMANENT_MAGIC 和 DB_MAGIC 值,其中PERMANENT_MAGIC 一经生成,除特定情况永远不会改变,称为数据库永久魔数。 DB_MAGIC 称为数据库魔数,同样可以用来表示某一个数据库,但 DB_MAGIC 是可以变化的,每经过一次还原、恢复操作后, DB_MAGIC 就会产生变化,用来区分备份源库和还原目标库。

2.2 问题产生原因

生成备份时,数据库当前的DB_MAGIC会写入备份文件中,相应的归档日志文件也会表明数据库的DB_MAGIC。

在第一步中,查询数据库魔数如下

select db_magic
>>>679472138

而此时归档日志文件名如下:

ARCHIVE_LOCAL1_0x287FEC0A_EP0_2022-11-17_22-42-18.log

此时可以通过文件名直接判断魔数,也可以通过dmrachk工具来查询。

--可以通过文件名
0x287FEC0A = 679472138
--也可以用dmrachk工具
dmrachk arch_fil=ARCHIVE_LOCAL1_0x287FEC0A_EP0_2022-11-17_22-42-18.log
>>>db_magic       : 679472138

第二步、第三步执行完后可以正常恢复数据,但恢复数据后由于魔数改变,导致第四步中还想用以前的旧备份恢复时,无法恢复到最新数据。第四步执行完毕后,数据库魔数如下:

select db_magic
>>>738384779

此时归档文件夹新增一个归档文件,名字为:

ARCHIVE_LOCAL1_0x2C02DB8B_EP0_2022-11-17_22-46-16.log
--对应魔数为
0x2C02DB8B = 738384779

2.3 解决方案

第四步中,再次还原恢复时多加入一步恢复

restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/data/DAMENG/bak/db_bak_02';
recover database '/dm8/data/DAMENG/dm.ini' with archivedir '/dm8/arch'; 
--新增下列一行
recover database '/dm8/data/DAMENG/dm.ini' with archivedir '/dm8/arch' use db_magic 738384779;
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;

执行完毕后,查看数据发现已经恢复到最新状态。

select count(*) from HRTEST.T_EMP02;
>>>41088

3. 建议

每次全库还原后,数据库魔数都会改变。所以最好在每次全库还原后进行一次全量备份,以避免更多繁琐的操作。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服