达梦数据库恢复到指定时间点

1,044 阅读5分钟

1、开启归档

1、联机配置归档

联机配置归档的步骤如下:

  1. 修改数据库为 MOUNT 状态 NORMAL 模式,并开启归档模式;
  2. 增加、修改或删除归档;
  3. 修改数据库为 OPEN 状态。
//修改数据库为MOUNT状态NORMAL模式,并开启归档模式
ALTER DATABASE MOUNT;

ALTER DATABASE NORMAL;

ALTER DATABASE ARCHIVELOG;

//配置本地归档
ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/arch, TYPE = local, FILE_SIZE = 1024,SPACE_LIMIT = 2048,ARCH_FLUSH_BUF_SIZE=16,HANG_FLAG=1';

//修改数据库为OPEN状态
ALTER DATABASE OPEN;

执行完成如下: image.png

2、手动配置归档

手动配置归档即在数据库实例未启动的情况下,手动编写 dmarch.ini 文件和设置参数 ARCH_INI。下面将分别说明如何手动配置本地归档和远程归档。

  1. 手动编辑 dmarch.ini 文件,之后保存在 dm.ini 所在的目录;

dmarch.ini 文件内容如下:

[ARCHIVE_LOCAL1] 

ARCH_TYPE = LOCAL 

ARCH_DEST = /dmdata/arch

ARCH_FILE_SIZE = 1024 

ARCH_SPACE_LIMIT = 2048

2. 编辑 dm.ini 文件,设置参数 ARCH_INI=1,保存; 3. 启动数据库实例,数据库已运行于归档模式。

3、验证归档是否生效

select ARCH_IS_VALID from v$dm_arch_ini;

image.png

2、备份

连接主机进行数据库备份,连接备机进行归档备份。

1、主机生成一个数据库备份

disql /nolog
SQL>conn SYSDBA/SYSDBA
SQL>CREATE TABLE T1(C1 VARCHAR(20),C2 VARCHAR(20));
SQL>INSERT INTO T1 SELECT LEVEL,LEVEL+1 FROM DUAL CONNECT BY LEVEL<=10000;
SQL>COMMIT;
SQL>BACKUP DATABASE BACKUPSET 'db_bak_01';
SQL>SELECT SF_BAKSET_CHECK('DISK','/dmdata/data/DAMENG/bak/db_bak_01');
SQL>SELECT SYSDATE();

image.png

– 查询当前数据库时间并记录: ‘2024-11-20 10:51:37’

2、主机生成一个归档日志备份

SQL>INSERT INTO T1 SELECT LEVEL,LEVEL+1 FROM DUAL CONNECT BY LEVEL<=10000;
SQL>COMMIT;
SQL>BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01';
SQL>SELECT SF_BAKSET_CHECK('DISK','/dmdata/data/DAMENG/bak/arch_bak_01');
SQL>SELECT SYSDATE();
SQL>SELECT COUNT(*) FROM T1;

image.png

image.png

– 查询当前数据库时间并记录:‘2024-11-20 10:54:16’

3、还原

将数据库备份文件和归档备份文件复制到另一台机器上

1、拷贝备份文件到目录

/home/dmdba/arch_bak_01 和 /home/dmdba/db_bak_01

2、还原归档

./dmrman

RMAN>restore archive log from backupset '/home/dmdba/arch_bak_01' to archivedir '/dmdata/arch'

image.png

3、 查看归档文件的DB_MAGIC

./dmrachk arch_fil=/dmdata/arch/ARCHIVE_LOCAL1_0x6DEE9DDC_EP0_2024-11-19_11-59-55.log

image.png

4、还原数据库

还原数据库、利用归档文件恢复数据库到’2024-11-20 10:51:37’ :

dmrman
RMAN>restore database to '/dmdata/all' from backupset '/home/dmdba/db_bak_01'
RMAN>recover database '/dmdata/all/dm.ini' with archivedir '/dmdata/arch' use db_magic 1844354524 until time '2024-11-20 10:51:37'
RMAN> recover database  /dmdata/all/dm.ini update db_magic;

image.png

出现错误 Read ini error, name:BCT_PATH, value:/dmdata/data/DAMENG [-803]:非法INI配置值

修改  vi /dmdata/all/dm.ini

BCT_PATH 修改为 /dmdata/all

image.png

4、验证

  • 启动还原后的库,验证数据

1、启动备库

./dmserver /dmdata/all/dm.ini mount 报错如下:

image.png

修复错误

RMAN> recover database  /dmdata/all/dm.ini update db_magic;

image.png

2、验证数据

./disql SYSDBA/SYSDBA
SQL>ALTER DATABASE NORMAL;
SQL>ALTER DATABASE OPEN FORCE;
SQL>SELECT COUNT(*) FROM T1;

image.png

5、本机还原

1、还原到最新时刻

  1. 停止数据库服务,还原步骤如下:
##检验备份集是否正确
CHECK BACKUPSET  '/dmdata/data/DAMENG/bak/db_bak_01';

##还原
RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini'  FROM  BACKUPSET  '/dmdata/data/DAMENG/bak/db_bak_01';

##恢复
RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini'  WITH ARCHIVEDIR '/dmdata/arch';

##更新数据库魔数
RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini'  UPDATE DB_MAGIC;

2、恢复到指定时间点

  1. 停止数据库服务,还原步骤如下:

##检验备份集是否正确
CHECK BACKUPSET  '/dmdata/data/DAMENG/bak/db_bak_01';

##还原
RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini'  FROM  BACKUPSET  '/dmdata/data/DAMENG/bak/db_bak_01';
 
 ##恢复
RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini'  WITH ARCHIVEDIR '/dmdata/arch' UNTIL TIME '2024-11-20 15:41:12';


RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC;

6、修复归档日志

达梦数据库支持在基于 REDO 日志将数据库恢复到最新数据,但此处存在个问题,若原数据库不是正常停止,是被人为的 kill 掉或其它原因异常中止的,就会导致数据库 CKPT_LSN 与 FILE_LSN 之间的数据无法恢复。针对这种情况,达梦数据库提供了归档修复的功能,支持从联机日志文件中将 CKPT_LSN 之后有效的数据,写成新的本地归档文件,从而可支持数据库在异常中断的情况下,也能将数据库数据恢复到最新,不丢失数据。

具体方法如下:

  1. 确认数据库实例已停止。
  2. 判断实例是否异常中止,归档是否需要修复。

以下方法为查看数据库实例的最后一个本地归档文件的状态

dmrachk arch_path=/dmdata/arch
rachk V7.1.5.81-Build(2016.05.10-68432trunc-debug)
/*******************************************************************/
archive file ARCHIVE_LOCAL1_20160518094034438.log itemize.
arch_status    : ACTIVE
arch n_rpags   : 992
arch_db_magic  : 1463364211
arch_pemnt_magic : 1463364245
arch_next_seq  : 12669
arch_lsn       : 34548
arch_seq       : 11678
clsn           : 40135
rarch file len : 268435456
rarch file free: 512000
rarch create time  : 2016- 5-18  9:39:46
rarch close time  : 2016- 5-18  9:40:34
/*******************************************************************/

The SUMMARY:
total files: 1
okey files: 1
fail file: 0

the rachk tool running cost 0.901 ms

通过上述我们看到 status : ACTIVE,若归档状态是 INACTIVE,则认为数据库正常退出,否则,则认为数据库异常退出。故此时应该进行归档修复,将数据库中异常中断时的 CKPT_LSN 与 FILE_LSN 之间的数据找回来。

  1. 进入 DMRMAN,进行归档修复。
RMAN>REPAIR ARCHIVELOG DATABASE '/dbdata/CNDT/dm.ini';

4. 修复归档完成后,查看数据库实例的归档目录,发现多了一个归档日志文件,查看最后 2 个日志文件的状态。