为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:麒麟V10
【CPU】:
【问题描述】*:不小心删除data中DAMENG01.log和DAMENG02.log
redo_pwr_collect error,code = -712
REDO日志文件丢失修复
一、什么是redo日志?redo日志有什么作用?
redo日志即重做日志,重做日志是在DM数据库中添加、删除、修改对象,或者改变数据,DM都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以log为扩展名。每个DM数据库实例必须至少有2个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启DM实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的时间点。
重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在DM数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
二、redo日志被删除了怎么办?
redo日志对于数据库来说如此重要,当redo日志被删除了,该如何修复数据库?
通过实验回答一下这个问题。
故障模拟:
数据库为单机,通过手工删除redo日志文件,来模拟数据库的redo日志被删除的故障。
2.1 删除重做日志文件
备份重做日志文件后,删除重做日志文件。
dmdba@dm3:/home/dmdba/dmdata/DAMENG$ rm DAMENG01.log
dmdba@dm3:/home/dmdba/dmdata/DAMENG$ rm DAMENG02.log
dmdba@dm3:/home/dmdba/dmdata/DAMENG$ ls -lh
total 90M
drwxr-xr-x 2 dmdba dinstall 6 Aug 28 15:05 bak
drwxr-xr-x 2 dmdba dinstall 330 Aug 28 15:40 ctl_bak
-rw-r--r-- 1 dmdba dinstall 100M Aug 28 15:13 DAMENG01bak0828.log
-rw-r--r-- 1 dmdba dinstall 100M Aug 28 15:40 DAMENG02bak0828.log
-rw-r--r-- 1 dmdba dinstall 284 Aug 28 15:10 dmarch.ini
-rw-r--r-- 1 dmdba dinstall 5.0K Aug 28 15:40 dm.ctl
-rw-r--r-- 1 dmdba dinstall 50K Aug 28 15:10 dm.ini
-rw-r--r-- 1 dmdba dinstall 908 Aug 28 15:05 dminit20210828150553.log
-rw-r--r-- 1 dmdba dinstall 633 Aug 28 15:05 dm_service.prikey
drwxr-xr-x 2 dmdba dinstall 6 Aug 28 15:05 HMAIN
-rw-r--r-- 1 dmdba dinstall 128M Aug 28 15:05 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 12 Aug 28 15:08 rep_conflict.log
-rw-r--r-- 1 dmdba dinstall 128M Aug 28 15:41 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 481 Aug 28 15:05 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 42M Aug 28 15:40 SYSTEM.DBF
-rw-r--r-- 1 dmdba dinstall 26M Aug 28 15:40 TEMP.DBF
drwxr-xr-x 2 dmdba dinstall 6 Aug 28 15:08 trace
dmdba@dm3:/home/dmdba/dmdata/DAMENG$
2.2 重启数据库
删除重做日志文件后,重启数据库,会提示重做日志文件不存在,无法启动数据库。
dmdba@dm3:/home/dmdba/dmdbms/bin$ ./DmServiceDAMENG restart
Stopping DmServiceDAMENG: [ OK ]
Starting DmServiceDAMENG: [ FAILED ]
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-2-21.05.07-138925-10006-ENT startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
/home/dmdba/dmdata/DAMENG/DAMENG01.log not exist, can not startup
dmdba@dm3:/home/dmdba/dmdbms/bin$
2.3 修改PSEG_RECV参数
如下是修改后的参数PSEG_RECV值为0,跳过回滚活动事务和PURGE已经提交事务。
dmdba@dm3:/home/dmdba/dmdata/DAMENG$ more dm.ini | grep PSEG_RECV
PSEG_RECV = 0 #Whether to rollback active transactions and purge committed transactions when system restarts after failure
dmdba@dm3:/home/dmdba/dmdata/DAMENG$
(1)修改dm.ini参数PSEG_RECV为0,跳过回滚活动事务和PURGE已经提交事务的步骤。
(2)关于PSEG_RECV参数:
该参数是系统级的动态参数,默认为1。系统故障重启时,对活动事务和已提交事务的处理方式。0:跳过回滚活动事务和PURGE已经提交事务的步骤。在回滚表空间出现异常、损坏、系统无法正常启动时,可将PSEG_RECV设置为0,让系统启动;但存在一定风险,未提交事务的修改将无法回滚,破坏事务的原子性;另外,已提交未PURGE的事务,将导致部分存储空间无法回收;1:回滚活动事务并PURGE已经提交事务;2:延迟PURGE已提交事务,延迟回滚活动事务;3:回滚活动事务,延迟PURGE已提交事务。
(3)该参数可以在线修改。
2.4 查看原库参数
根据数据库目录下dminit+日期时间.log(例如:dminit20210828150553.log)的文件查看数据库的各个参数,重新初始化一个数据库实例;
dmdba@dm3:/home/dmdba/dmdata/DAMENG$ more dminit20210828150553.log
start init database: V8, 2021-08-28 15:05:53
init params:
db path: /home/dmdba/dmdata/DAMENG
db name: DAMENG
auto overwrite: 0
page size: 16384
extent size: 16
time zone: +08:00
string case sensitive: 1
charset: 1
length in char: 0
page check mode: 0
priv flag: 0
rlog enc flag: 0
use new hash: 1
blank pad mode: 1
sec priv mode: 0
huge with delta: 1
rlog gen for huge: 0
pseg_mgr_flag: 0
log file path: /home/dmdba/dmdata/DAMENG/DAMENG01.log
log file path: /home/dmdba/dmdata/DAMENG/DAMENG02.log
create ini file /home/dmdba/dmdata/DAMENG/dm.ini success.
create rlog file /home/dmdba/dmdata/DAMENG/DAMENG01.log success.
create rlog file /home/dmdba/dmdata/DAMENG/DAMENG02.log success.
SYSTEM file : /home/dmdba/dmdata/DAMENG/SYSTEM.DBF
MAIN file : /home/dmdba/dmdata/DAMENG/MAIN.DBF
ROLL file : /home/dmdba/dmdata/DAMENG/ROLL.DBF
create dm database success. 2021-08-28 15:05:56
2.5 初始化新实例
在另外一台服务器上重新初始化一个实例,参数和原库保持一致。原库在dm3服务器上,新实例在dm4服务器上。
dmdba@dm4:/home/dmdba/dmdbms/bin$ ./dminit path=/home/dmdba/dmdata page_size=16 extent_size=16 log_size=100 case_sensitive=1 charset=1 BLANK_PAD_MODE=1 port_num=5236
2.6 启动数据库
初始化数据库后,启动数据库。
dmdba@dm4:/home/dmdba/dmdbms/bin$ ./dmserver /home/dmdba/dmdata/DAMENG/dm.ini
启动完成后正常关闭数据库,然后将新实例的两个重做日志文件拷贝到原实例目录下。
2.7 将新初始化数据库的redo日志拷贝到要修复数据库
将新初始化的数据库的redo日志拷贝到要修复数据库文件夹下(拷贝前对要修复数据库的原redo日志做好备份)
dmdba@dm4:/home/dmdba/dmdata/DAMENG$ scp DAMENG0*.log dm3:/home/dmdba/dmdata/DAMENG/
2.8 利用dmmdf 修改redo日志的db_magic的值
替换完成后,利用dmmdf 修改redo日志的db_magic的值,否则启动会报如下错:
dmdba@dm3:/home/dmdba/dmdbms/bin$ ./DmServiceDAMENG start
Starting DmServiceDAMENG: ./DmServiceDAMENG: line 406: 5197 Floating point exception(core dumped) eval exec ""$EXEC_PROG_FULL_PATH"" "$STARTUP_PARAMS" -noconsole $TMP_START_MODE > "$SERVICE_LOG_FILE" 2>&1
[ FAILED ]
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-2-21.05.07-138925-10006-ENT 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 2022-05-07
rfil grp log file error in (db_magic, permanent_magic),
log file /home/dmdba/dmdata/DAMENG/DAMENG01.log is (173054809, 800943287),
dbfile is(870887862, 2000257466).
dmdba@dm3:/home/dmdba/dmdbms/bin$
2.9 通过dmmdf查看原库的db_magic值
通过查看原库的系统文件SYSTEM.DBF,查看原库的db_magic值
dmdba@dm3:/home/dmdba/dmdbms/bin$ ./dmmdf TYPE=1 FILE=/home/dmdba/dmdata/DAMENG/SYSTEM.DBF
dmmdf V8
1 db_magic=870887862
2 next_trxid=10021
3 pemnt_magic=2000257466
Please input which parameter you want to change(1-3), q to quit: q
dmdba@dm3:/home/dmdba/dmdbms/bin$
2.10 通过dmmdf修改重做日志文件的db_magic
(1)修改重做日志文件DAMENG01.log
dmdba@dm3:/home/dmdba/dmdbms/bin$ ./dmmdf TYPE=2 FILE=/home/dmdba/dmdata/DAMENG/DAMENG01.log
dmmdf V8
1 sig = DMRLOG
2 ver = 7006
3 chksum = 2321349746
4 sta = 1
5 n_magic = 7
6 db_magic = 173054809
7 len = 104857600
8 free = 6271488
9 clsn = 23188
10 clsn_fil = 0
11 clsn_off = 6271488
12 pemnt_magic = 800943287
13 fil_id = 0
15 next_seq = 4091
16 g_next_seq = 4091
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)
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(20) or n_apply_ep(21).
Please input the num which one you want to change, q to quit: 6
Input the new value: 870887862
1 sig = DMRLOG
2 ver = 7006
3 chksum = 3018118813
4 sta = 1
5 n_magic = 7
6 db_magic = 870887862
7 len = 104857600
8 free = 6271488
9 clsn = 23188
10 clsn_fil = 0
11 clsn_off = 6271488
12 pemnt_magic = 800943287
13 fil_id = 0
15 next_seq = 4091
16 g_next_seq = 4091
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)
Do you want to quit and save the change to file (y/n): y
Save to file success!
dmdba@dm3:/home/dmdba/dmdbms/bin$
重做日志文件DAMENG01.log修改后,DAMENG02.log也同样需要修改
(2)修改重做日志文件DAMENG02.log
dmdba@dm3:/home/dmdba/dmdbms/bin$ ./dmmdf TYPE=2 FILE=/home/dmdba/dmdata/DAMENG/DAMENG02.log
dmmdf V8
1 sig = DMRLOG
2 ver = 7006
3 chksum = 1801234130
4 sta = 0
5 n_magic = 7
6 db_magic = 173054809
7 len = 104857600
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 800943287
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)
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(20) or n_apply_ep(21).
Please input the num which one you want to change, q to quit: 6
Input the new value: 870887862
1 sig = DMRLOG
2 ver = 7006
3 chksum = 1390709821
4 sta = 0
5 n_magic = 7
6 db_magic = 870887862
7 len = 104857600
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 800943287
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)
Do you want to quit and save the change to file (y/n): y
Save to file success!
dmdba@dm3:/home/dmdba/dmdbms/bin$
2.11 正常启动数据库
重做日志文件DAMENG01.log和DAMENG02.log修改完成后,启动数据库。
dmdba@dm3:/home/dmdba/dmdbms/bin$ ./DmServiceDAMENG start
Starting DmServiceDAMENG: [ OK ]
dmdba@dm3:/home/dmdba/dmdbms/bin$
数据库启动成功,说明修复数据库成功,查询相关数据,写入部分测试数据,检查是否可以正常读写数据库数据。
2.12 数据启动后迁移数据
此种情况重启的数据库可能无法进行正常的读写操作。即使可以正常读写操作,可能存在一些未知的问题。为了数据库的稳定运行,建议重建新库,将数据迁移到新库中。
备份还原