达梦归档归档日志丢失不连续的备份处理
环境:
OS:Centos 7
DB:DM8
1.归档目录看不出连续性
[dmdba@host01 arch]$ ls -al
total 148
drwxr-xr-x 2 dmdba dinstall 250 Mar 20 14:09 .
drwxr-xr-x 7 dmdba dinstall 67 Mar 15 14:47 ..
-rw-r--r-- 1 dmdba dinstall 118784 Mar 20 14:03 ARCHIVE_LOCAL1_0x61603F60_EP0_2024-03-20_13-50-25.log
-rw-r--r-- 1 dmdba dinstall 16384 Mar 20 14:06 ARCHIVE_LOCAL1_0x61603F60_EP0_2024-03-20_14-04-05.log
-rw-r--r-- 1 dmdba dinstall 8192 Mar 20 14:09 ARCHIVE_LOCAL1_0x61603F60_EP0_2024-03-20_14-07-38.log
-rw-r--r-- 1 dmdba dinstall 8192 Mar 20 14:09 ARCHIVE_LOCAL1_0x61603F60_EP0_2024-03-20_14-09-57.log
若是其中一个归档被删除,只有在联机备份的时候才会有提示,如下:
SQL> backup database full backupset '/dmdbms/bak/fullbak_20240320';
backup database full backupset '/dmdbms/bak/fullbak_20240320';
[-730]:Archive log absent.
used time: 00:00:03.995. Execute id is 0.
这里丢失的是中间的归档,好像丢失第一个归档是可以备份的.
单独备份归档日志是失败的:
SQL> backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
[-718]:Archive log collected not consecutive.
used time: 00:00:02.892. Execute id is 0.
2.若要成功备份需要重启下数据库
[root@host01 ~]#systemctl stop DmServiceDMSERVER.service
[root@host01 ~]#systemctl start DmServiceDMSERVER.service
全备可以成功:
SQL> backup database full backupset '/dmdbms/bak/fullbak_20240320';
executed successfully
used time: 00:00:03.051. Execute id is 501
但是备份归档还是失败的
SQL> backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
[-718]:Archive log collected not consecutive.
used time: 00:00:02.841. Execute id is 0.
3.需要修复归档(针对我这里是某个归档日志丢失的场景不管用)
[dmdba@host01 ~]$ dmrman
dmrman V8
RMAN> repair archivelog database '/dmdbms/data/DAMENG/dm.ini';
repair archivelog database '/dmdbms/data/DAMENG/dm.ini';
file dm.key not found, use default license!
repair archive log failed.error code: -137
[-137]:DM server is running or exist other process which is operating the same database
需要关闭数据库
[root@host01 ~]# systemctl stop DmServiceDMSERVER.service
RMAN> repair archivelog database '/dmdbms/data/DAMENG/dm.ini';
repair archivelog database '/dmdbms/data/DAMENG/dm.ini';
file dm.key not found, use default license!
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Can not open ini file /dmdbms/data/DAMENG/dmmal.ini!
EP[0]'s cur_lsn[44616], file_lsn[44616]
repair archive log successfully.
repair time used: 298.653(ms)
time used: 299.690(ms)
4.启动数据库
[root@host01 ~]# systemctl start DmServiceDMSERVER.service
5.再次备份归档日志
SQL> backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
[-718]:Archive log collected not consecutive.
used time: 00:00:02.906. Execute id is 0.
解决办法:
重新全备,然后删除备份之前的归档日志
SQL> backup database full backupset '/dmdbms/bak/fullbak_20240320';
executed successfully
used time: 00:00:03.028. Execute id is 506.
SQL> alter system switch logfile;
executed successfully
used time: 48.116(ms). Execute id is 0.
多切换几次,让其生产一个新的归档日志,然后把该归档日志之前的删除掉
删除之后再做归档日志的备份:
SQL> backup archivelog to "archbak_20240320" backupset '/dmdbms/bak/archbak_20240320';
executed successfully
used time: 00:00:02.959. Execute id is 604.
6.相关查询语句
#能恢复到的最后一个归档,如果显示一条状态为ACTIVE表示不缺归档,如果有其他行表示中间有日志丢失
select ARCH_LSN,status,path from v$arch_file a
where not exists ( select * from v$arch_file b
where b.arch_seq=a.next_seq+1);
SQL> select ARCH_LSN,status,path from v$arch_file a
2 where not exists ( select * from v$arch_file b
3 where b.arch_seq=a.next_seq+1);
LINEID ARCH_LSN status PATH
---------- -------------------- -------- ------------------------------------------------------------------
1 44001 INACTIVE /dmdbms/arch/ARCHIVE_LOCAL1_0x61603F60_EP0_2024-03-20_14-07-38.log
2 44979 ACTIVE /dmdbms/arch/ARCHIVE_LOCAL1_0x61603F60_EP0_2024-03-20_14-37-24.log
#显示最近一次备份以来是否缺失归档日志,空行代表不缺失,如果查出一行,代表这行归档日志下面缺失
select path,create_time from v$arch_file a
where not exists ( select * from v$arch_file b
where a.arch_seq=b.next_seq+1)
and arch_lsn >=(select max(begin_lsn) from v$backupset)
SQL> select path,create_time from v$arch_file a
2 where not exists ( select * from v$arch_file b
3 where a.arch_seq=b.next_seq+1)
4 and arch_lsn >=(select max(begin_lsn) from v$backupset);
no rows