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 数据启动后迁移数据
此种情况重启的数据库可能无法进行正常的读写操作。即使可以正常读写操作,可能存在一些未知的问题。为了数据库的稳定运行,建议重建新库,将数据迁移到新库中。
三、redo日志损坏后怎么办?
3.1 服务器异常断电后,启动数据库提示redo日志文件损坏
客户30服务器因为断电,导致数据库无法正常启动,启动过程中数据库日志提示redo日志文件损坏。如下所示。
dmdba@sysl-PC:/sysl/dmdbms20/bin$ ./DmServiceDMSERVER start
Starting DmServiceDMSERVER:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ FAILED ]
version info: enterprise
DM Database Server x64 V8?1-1-190-21.03.12-136419-ENT? startup…
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
begin redo pwr log collect, last ckpt lsn: 513838393 …
redo pwr log collect failed, code=-723
main rfil[/sysl/dmdbms20/data/DAMENG/DAMENG01.log]'s grp collect 5880 valid pwr record, discard 963 invalid pwr record
main rfil[/sysl/dmdbms20/data/DAMENG/DAMENG01.log]'s grp discard 0 invalid recv_pwr record
dmdba@sysl-PC:/sysl/dmdbms20/bin$
30服务器数据库无备份,也未开启归档,无法通过备份集进行数据库恢复。试着通过修复redo日志文件(DAMENG01.log)。
在进行修复操作之前,将所有的数据文件进行备份。将/sysl/dmdbms20/data目录下的数据进行完全备份。
3.2 初始化新实例
通过查看原数据库的实例参数,实例初始化参数配置文件在/sysl/dmdbms20/data/DAMENG目录下,文件名是/sysl/dmdbms20/data/DAMENG/dminit*.log。
(1)初始化一个新实例:
./dminit path=/sysl/dmdbms20/data/20220112 page_size=8 extent_size=16 case_sensitive=1 charset=0 port_num=15236
(2)启动实例
./dmserver /sysl/dmdbms20/data/20220112/DAMENG/dm.ini
数据库运行正常后,手动停止数据库。
(3)拷贝redo文件到原数据库
将新实例的DAMENG01.log文件拷贝到/sysl/dmdbms20/data/DAMENG目录下,替换掉原实例的DAMENG01.log文件,DAMENG02.log不用替换。
3.3 通过dmmdf查看原库的db_magic值
通过查看原库的系统文件SYSTEM.DBF,查看原库的db_magic和pemnt_magic值
./dmmdf TYPE=1 FILE=/sysl/dmdbms20/data/DAMENG/SYSTEM.DBF
1 db_magic=1740903524
2 next_trxid=24622236
3 pemnt_magic=834377848
把查询的结果保存到文本文件中。
3.4 通过dmmdf修改重做日志文件的db_magic和pemnt_magic值。
./dmmdf TYPE=2 FILE=/sysl/dmdbms20/data/DAMENG/DAMENG01.log
把redo日志文件的db_magic和pemnt_magic值改为上一步查询的值。修改完成后,核对修改的结果。
修改dm.ini文件的参数PSEG_RECV值为0,跳过回滚活动事务和PURGE已经提交事务。
3.5 正常启动数据库
(1)启动数据库
dmdba@sysl-PC:/sysl/dmdbms20/bin$ ./dmserver /sysl/dmdbms20/data/DAMENG/dm.ini
version info: enterprise
DM Database Server x64 V8 1-1-190-21.03.12-136419-ENT startup…
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
file lsn: 24845
ndct db load finished
ndct fill fast pool finished
iid page’s trxid[24623237]
NEXT TRX ID = 24623238
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.
(2)业务用户连接
数据库启动成功后,用SYSDBA用户可以正常连接数据库。但是使用业务用户连接数据库,数据库服务进程会马上自动挂掉,提示“追踪与中断点陷阱”,如下所示。
dmdba@sysl-PC:/sysl/dmdbms20/bin$ ./dmserver /sysl/dmdbms20/data/DAMENG/dm.ini
version info: enterprise
DM Database Server x64 V8 1-1-190-21.03.12-136419-ENT startup…
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
file lsn: 24845
ndct db load finished
ndct fill fast pool finished
iid page’s trxid[24623237]
NEXT TRX ID = 24623238
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.
追踪与中断点陷阱
dmdba@sysl-PC:/sysl/dmdbms20/bin$
测试了多次,业务用户连接数据库后,数据库服务进程还是异常挂掉。
(3)脱机备份数据库
脱机备份数据库,将备份集拷贝到31服务器上进行恢复。31服务器是客户的另外一台数据库服务器,没有发生异常断电的情况。
backup database ‘/sysl/dmdbms20/data/DAMENG/dm.ini’ full backupset ‘/sysl/dmdbms20/dmbackup/full_20220113’;
在31服务器新建实例,然后恢复数据库。恢复完成后,数据库的SYSDBA用户和业务用户均可以正常登陆数据库,没有出现数据库服务进程异常挂掉的情况。
(4)30服务器重新安装软件
在30服务器上重新安装数据库软件,初始化一个新的实例,数据库参数和原实例参数一致。
启动30服务器上的新实例数据库。
(5)将31服务器上数据库恢复到30服务器上
在31服务器上,通过dexpdp导出数据。将备份的dmp文件拷贝到30服务器上。
在30服务器上,通过dimpdp导入数据。导入数据后,SYSDBA和业务用户均可以正常连接数据库,没有出现数据库服务进程异常挂掉的情况。
特别说明:在此步数据库恢复的过程中,尝试通过物理备份恢复的方式修复数据库,还是出现了业务用户连接数据库,服务进程异常挂掉的情况。由于数据库日志无相关记录,没有追踪到具体原因。
(6)客户验证数据
数据库恢复完成后,请客户验证数据。SYSDBA用户和业务用户均可以正常连接数据库,可以查询到相关的数据库。因为是服务器异常断电,丢失了部分数据,客户表示可以接受。
文章
阅读量
获赞