关于达梦数据库redo log ,在之前的博客中有说明,如下:
DM 达梦数据库 重做日志 redo log 的进一步测试
https://www.cndba.cn/cndba/dave/article/3733DM7 达梦数据库 重做日志管理 及 归档模式切换
https://www.cndba.cn/dave/article/3575
本片关注另外一个问题,就是在达梦redo log 出现损坏,且实例无法正常启动情况下,如何进行处理的过程。
1 处理思路说明
对于Redo log 损坏的情况,处理方法就是新建一个同配置(页大小、大小写敏感、字符集等)的实例,然后把新实例的redo log 文件替换掉原实例的所有redo log,然后重启数据库。
因为这种redo log 替换可能会存在其他问题,所以等实例启动之后,将数据导出,重新导入到新的实例中。
DM 达梦数据库 生产环境 实例 推荐配置参数
https://www.cndba.cn/dave/article/108599
2 具体操作过程
2.1 创建测试实例
这里直接对单机进行测试,先创建测试实例。 主要因为原环境是DMDW的,不想破坏了环境,所以新建议一个实例进行测试。
[dave@www.cndba.cn data]$ dminit path=/data/dm/dmdbms/data page_size=32 extent_size=32 charset=0 db_name=cndba instance_name=cndba
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2023-03-04
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
log file path: /data/dm/dmdbms/data/cndba/cndba01.log
log file path: /data/dm/dmdbms/data/cndba/cndba02.log
write to dir [/data/dm/dmdbms/data/cndba].
create dm database success. 2022-08-04 23:07:09
[dave@www.cndba.cn data]$
这里即使忘记旧环境的参数也没有关系,虽然库无法启动,也可以通过数据库日志来查看,日志在DATA目录下以 dminit+日期时间.log 命名。
[dave@www.cndba.cn cndba]$ cat dminit20220804230707.log
start init database: V8, 2022-08-04 23:07:07
init params:
db path: /data/dm/dmdbms/data/cndba
db name: cndba
auto overwrite: 0
page size: 32768
extent size: 32
char_fix_storage: 0
sql_log_forbid: 0
secur_flag: 2
time zone: +08:00
string case sensitive: 1
charset: 0
length in char: 0
page check mode: 0
page check algorithm id: 0
priv flag: 0
rlog enc flag: 0
use new hash: 1
blank pad mode: 0
sec priv mode: 0
huge with delta: 1
rlog gen for huge: 0
pseg_mgr_flag: 0
log file path: /data/dm/dmdbms/data/cndba/cndba01.log
log file path: /data/dm/dmdbms/data/cndba/cndba02.log
create ini file /data/dm/dmdbms/data/cndba/dm.ini success.
create rlog file /data/dm/dmdbms/data/cndba/cndba01.log success.
create rlog file /data/dm/dmdbms/data/cndba/cndba02.log success.
SYSTEM file : /data/dm/dmdbms/data/cndba/SYSTEM.DBF
MAIN file : /data/dm/dmdbms/data/cndba/MAIN.DBF
ROLL file : /data/dm/dmdbms/data/cndba/ROLL.DBF
create dm database success. 2022-08-04 23:07:09
[dave@www.cndba.cn cndba]$
2.2 破坏redo log 文件
这里直接MV 掉。
[dave@www.cndba.cn cndba]$ mv cndba01.log cndba01.log.bak
[dave@www.cndba.cn cndba]$ mv cndba02.log cndba02.log.bak
此时启动直接报错:
[dave@www.cndba.cn cndba]$ dmserver dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server 64 V8 03134283890-20220304-158322-10045 startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
/data/dm/dmdbms/data/cndba/cndba01.log not exist, can not startup
[dave@www.cndba.cn cndba]$
2.3 新建临时实例
注意我这里实例名不同,不过并不影响恢复,能创建同名,最好。
[dave@www.cndba.cn data]$ dminit path=/data/dm/dmdbms/data page_size=32 extent_size=32 charset=0 db_name=dave instance_name=dave port_num=5238
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2023-03-04
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
log file path: /data/dm/dmdbms/data/dave/dave01.log
log file path: /data/dm/dmdbms/data/dave/dave02.log
write to dir [/data/dm/dmdbms/data/dave].
create dm database success. 2022-08-04 23:17:31
[dave@www.cndba.cn data]$
这里要先启动一次实例,在正常关闭。 达梦实例创建后,必须先启动一次才能正常使用。
[dave@www.cndba.cn data]$ cd dave
[dave@www.cndba.cn dave]$ ls
bak dave01.log dm.ctl dminit20220804231728.log HMAIN ROLL.DBF SYSTEM.DBF
ctl_bak dave02.log dm.ini dm_service.prikey MAIN.DBF sqllog.ini
[dave@www.cndba.cn dave]$ dmserver dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server 64 V8 03134283890-20220304-158322-10045 startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2023-03-04
file lsn: 0
ndct db load finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct fill fast pool finished
iid page's trxid[1002]
NEXT TRX ID = 1003
……
2.4 将临时实例的redo 复制到旧环境
[dave@www.cndba.cn data]$ cp dave/dave01.log cndba/cndba01.log
[dave@www.cndba.cn data]$ cp dave/dave02.log cndba/cndba02.log
2.5 利用dmmdf 修改redo日志的db_magic的值
两个文件都要改,保持和源库一样。
DM7 达梦数据库 使用dmmdf 工具 修改 db_magic
https://www.cndba.cn/dave/article/3613
[dave@www.cndba.cn cndba]$ dmmdf type=1 file=SYSTEM.DBF
dmmdf V8
**********************************************************
1 db_magic=1287424634
2 next_trxid=3007
3 pemnt_magic=909598176
**********************************************************
Please input which parameter you want to change(1-3), q to quit: Q
[dave@www.cndba.cn cndba]$
[dave@www.cndba.cn cndba]$ dmmdf type=2 file=cndba02.log
dmmdf V8
**********************************************************
1 sig = DMRLOG
2 ver = 7007
3 chksum = 3739147829
4 sta = 0
5 n_magic = 7
6 db_magic = 881908182
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1117177040
13 fil_id = 1
15 next_seq = 0
16 g_next_seq = 0
17 arch_lsn = 0
18 arch_seq = 0
19 dbversion = 0x7000c
20 min_exec_version = V8.1.1.1
21 min_dct_version = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
27 l_term_id = 0
28 term_id = 0
29 c_seqno = 0
30 c_lsn = 0
**********************************************************
You can only reset sta(4) or db_magic (6) or clsn (9) or clsn_fil(10) or clsn_off(11) or pemnt_magic(12) or fil_id(13) or next_seq(15) or g_next_seq(16) or p_db_magic(22) or n_apply_ep(23).
Please input the num which one you want to change, q to quit: 6
Input the new value: 1287424634
**********************************************************
1 sig = DMRLOG
2 ver = 7007
3 chksum = 2800913817
4 sta = 0
5 n_magic = 7
6 db_magic = 1287424634
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1117177040
13 fil_id = 1
15 next_seq = 0
16 g_next_seq = 0
17 arch_lsn = 0
18 arch_seq = 0
19 dbversion = 0x7000c
20 min_exec_version = V8.1.1.1
21 min_dct_version = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
27 l_term_id = 0
28 term_id = 0
29 c_seqno = 0
30 c_lsn = 0
**********************************************************
Do you want to quit and save the change to file (y/n): y
Save to file success!
[dave@www.cndba.cn cndba]$
2.6 修改PSEG_RECV参数为0
PSEG_RECV参数控制系统故障重启时,对活动事务和已提交事务的处理方式。 默认为3。
0:跳过回滚活动事务和 PURGE已经提交事务的步骤。在回滚表空间出现异常、损坏、系统无法正常启动时,可将 PSEG_RECV 设置为 0,让系统启动;但存在一定风险,未提交事务的修改将无法回滚,破坏事务的原子性;另外,已提交未 PURGE的事务,将导致部分存储空间无法回收;
1:回滚活动事务并PURGE已经提交事务;
2:延迟 PURGE已提交事务,延迟回滚活动事务;
3:回滚活动事务,延迟 PURGE已提交事务。
我们这里直接编辑dm.ini将PSEG_RECV设置为0(原值为3,0代表故障也启动),启动故障数据库服务。
[dave@www.cndba.cn cndba]$ cat dm.ini|grep PSEG
PSEG_RECV = 0 #Whether to rollback active transactions and purge committed transactions when system restarts after failure
[dave@www.cndba.cn cndba]$
2.7 启动故障实例
[dave@www.cndba.cn cndba]$ dmserver dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server 64 V8 03134283890-20220304-158322-10045 startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2023-03-04
file lsn: 35869
ndct db load finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct fill fast pool finished
iid page's trxid[4008]
NEXT TRX ID = 4009
pseg recv finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end, total 0 active crash trx, include 0 empty_trxs, 0 empty_pages which only need to delete mgr recs.
pseg_crash_trx_rollback end
SYSTEM IS READY.
实例成功启动,因为采用的是故障启动,所以无法保障事务的一致性和原子性,所以这里必须将数据导出,然后导入的新建的环境中。
备份恢复这块参考我之前的博客,这里不再描述:
DM7 达梦数据库 物理备份还原之 备份管理 操作手册
https://www.cndba.cn/dave/article/3600
DM7 达梦数据库 物理备份还原之 联机备份(SQL备份) 使用手册
https://www.cndba.cn/dave/article/3595
版权声明:本文为博主原创文章,未经博主允许不得转载。