误删除 undo/redo 日志怎么办?
分以下两种情况:
1.如果有备份文件
如果有备份文件,可以重新初始化一个新的数据库(初始化参数要和原库一样,比如页大小、大小写敏感、字符集等,这些可以在 DM 数据库安装路径,../data/DAMENG 目录下以 dminit+日期时间.log 命名的文件中查询),然后将备份文件和归档日志文件拷贝到新的环境,然后再进行备份+归档的还原操作。
2.如果没有备份文件
如果没有备份,可以通过修改永久魔术值db_magic的方式来恢复,但是这种情况下有可能丢失数据。
[dmdba@:/dm8/dmdbms/bin]$ ./dmmdf help
格式: ./dmmdf KEYWORD=value
例程: ./dmmdf TYPE=1 FILE=/opt/data/DAMENG/SYSTEM.DBF
关键字 说明
--------------------------------------------------------------------------------
TYPE 类型
1表示dbf
2表示rlog
3表示original bak
4表示bakset meta
5表示bakset bkp
6表示bakset
7表示数据库降级:
SCOPE=1,表示仅支持0x0007000A降级到0x00070009,FILE指定为dm.ctl路径
SCOPE=2,表示仅支持0x0007000B降级到0x0007000A,FILE指定为dm.ini路径
SCOPE=3,表示仅支持单节点由0x0007000C降级到0x0007000B,FILE指定为dm.ini路径
8表示联机日志降级(仅支持0x7006降级到0x7005)
9表示特定版本的数据库升级(仅支持执行码版本号在[V8.1.1.88(V7.1.7.88), V8.1.1.100(V7.1.7.100)]范围内的数据库升级)
FILE 文件路径
DCR_INI dmdcr.ini路径
DFS_INI dmdfs.ini路径
SCOPE TYPE=7时使用,指定具体的降级范围
HELP 打印帮助信息
--------------------------------------------------
示例: ./dmmdf TYPE=1 FILE=/opt/data/DAMENG/SYSTEM.dbf
./dmmdf TYPE=2 FILE=/opt/data/DAMENG/DAMENG01.log
./dmmdf TYPE=3 FILE=/opt/data/DAMENG/bak/dmdb.bak
./dmmdf TYPE=4 FILE=/opt/data/DAMENG/bak/bset/nbak.meta
./dmmdf TYPE=5 FILE=/opt/data/DAMENG/bak/bset/nbak.bak
./dmmdf TYPE=6 FILE=/opt/data/DAMENG/bak/bset
./dmmdf TYPE=7 SCOPE=1 FILE=/opt/data/DAMENG/dm.ctl
./dmmdf TYPE=7 SCOPE=2 FILE=/opt/data/DAMENG/dm.ini
./dmmdf TYPE=7 SCOPE=3 FILE=/opt/data/DAMENG/dm.ini
./dmmdf TYPE=8 FILE=/opt/data/DAMENG/dm.ini
./dmmdf TYPE=9 FILE=/opt/data/DAMENG/dm.ini
[dmdba@:/dm8/dmdbms/bin]$
3. 测试删除 redo 文件,使用dmmdf恢复
1)测试删除DMTEST02.log联机日志文件
--启动数据库实例
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-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-11-11
file lsn: 0
ndct db load finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct fill fast pool finished
......
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.
checkpoint requested, rlog free space[528128512], used space[8734208]
checkpoint generate by ckpt_interval
checkpoint begin, used_space[8734208], free_space[528128512]...
checkpoint end, 0 pages flushed, used_space[0], free_space[536862720].
-- 删除DMTEST02.log
[dmdba@dmdb01 DMTEST]$ ls -l *.log
-rw-r--r-- 1 dmdba dinstall 973 Jun 20 15:57 dminit20220620155743.log
-rw-r--r-- 1 dmdba dinstall 268435456 Jun 20 16:01 DMTEST01.log
-rw-r--r-- 1 dmdba dinstall 268435456 Jun 20 15:58 DMTEST02.log
-rw-r--r-- 1 dmdba dinstall 12 Jun 20 15:58 rep_conflict.log
[dmdba@dmdb01 DMTEST]$ rm -f DMTEST02.log
[dmdba@dmdb01 DMTEST]$
-- 关闭数据库实例
exit
Server is stopping...
listener closed and all sessions disconnected
adjust undo_retention & wakeup purge thread...full check point starting...
generate force checkpoint, rlog free space[536862720], used space[0]
checkpoint begin, used_space[0], free_space[536862720]...
checkpoint end, 0 pages flushed, used_space[0], free_space[536862720].
full check point end.
......
shutdown dtype subsystem...OK
shutdown huge buffer and memory pools...OK
close lsnr socket
DM Database Server shutdown successfully.
[dmdba@dmdb01 bin]$
--启动数据库实例报错:
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
/dm8/dmdbms/data/DMTEST/DMTEST02.log not exist, can not startup
[dmdba@dmdb01 bin]$
2)重新初始化一个新的数据库,(初始化参数要和原库一样,比如页大小、大小写敏感、字符集等,这些可以在 DM 数据库安装路径,../data/DAMENG 目录下以 dminit+日期时间.log 命名的文件中查询)。
/dm8/dmdbms/bin/dminit PATH=/dm8/dmdbms/data PORT_NUM=5238 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=256 CHARSET=0 DB_NAME=DMTEST
3)将步骤 (2) 中重新初始化的数据库中 DMTEST02.log 文件拷贝到当前丢失 REDO 日志的库目录下。
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ scp DMTEST02.log dmdba@192.168.186.128:/dm8/dmdbms/data/DMTEST/
dmdba@192.168.186.128's password:
DMTEST02.log 100% 256MB 100.7MB/s 00:02
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$
4)使用 dmmdf 工具获取源库中 SYSTEM.DBF 的 db_magic,并记录下来。(此时可以使用root用户,也可以使用dmdba用户)
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=1 FILE=/dm8/dmdbms/data/DMTEST/SYSTEM.DBF
dmmdf V8
**********************************************************
1 db_magic=943643448
2 next_trxid=3007
3 pemnt_magic=1706932456
**********************************************************
Please input which parameter you want to change(1-3), q to quit: q
[dmdba@dmdb01 bin]$
5)使用 dmmdf 工具设置 DMTEST02.log 文件的 db_magic 和 pemnt_magic 值,设置为步骤 (4) 中记录的值。
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=2 FILE=/dm8/dmdbms/data/DMTEST/DMTEST02.log
dmmdf V8
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 1782075654
4 sta = 0
5 n_magic = 7
6 db_magic = 1136631966
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1227258588
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: 943643448
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 297347744
4 sta = 0
5 n_magic = 7
6 db_magic = 943643448
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1227258588
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@dmdb01 bin]$ ./dmmdf TYPE=2 FILE=/dm8/dmdbms/data/DMTEST/DMTEST02.log
dmmdf V8
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 297347744
4 sta = 0
5 n_magic = 7
6 db_magic = 943643448
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1227258588
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: 12
Input the new value: 1706932456
**********************************************************
1 sig = DMRLOG
2 ver = 7006
3 chksum = 1025697940
4 sta = 0
5 n_magic = 7
6 db_magic = 943643448
7 len = 268435456
8 free = 4096
9 clsn = 0
10 clsn_fil = 0
11 clsn_off = 0
12 pemnt_magic = 1706932456
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@dmdb01 bin]$
6)使用 dmmdf 工具设置 DMTEST02.log 文件的 db_magic 和 pemnt_magic 值后,数据库启动成功
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-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-11-11
file lsn: 33072
......
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.
4. 测试删除 undo 文件,使用dmmdf恢复
1)测试删除 ROLL.DBF 文件
-- 启动数据库实例
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-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-11-11
file lsn: 33072
......
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.
-- 删除 ROLL.DBF 文件
[dmdba@dmdb01 DMTEST]$ ls -l ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 161480704 Jun 20 16:29 ROLL.DBF
[dmdba@dmdb01 DMTEST]$ rm -f ROLL.DBF
[dmdba@dmdb01 DMTEST]$ ls -l ROLL.DBF
ls: cannot access ROLL.DBF: No such file or directory
-- 关闭数据库
exit
Server is stopping...
listener closed and all sessions disconnected
adjust undo_retention & wakeup purge thread...full check point starting...
generate force checkpoint, rlog free space[536572928], used space[289792]
checkpoint begin, used_space[289792], free_space[536572928]...
checkpoint end, 0 pages flushed, used_space[289792], free_space[536572928].
full check point end.
......
shutdown dtype subsystem...OK
shutdown huge buffer and memory pools...OK
close lsnr socket
DM Database Server shutdown successfully.
[dmdba@dmdb01 bin]$
-- 启动数据库报错
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-ENT startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
/dm8/dmdbms/data/DMTEST/ROLL.DBF not exist, can not startup
[dmdba@dmdb01 bin]$
2)重新初始化一个新的数据库,(初始化参数要和原库一样,比如页大小、大小写敏感、字符集等,这些可以在 DM 数据库安装路径,../data/DAMENG 目录下以 dminit+日期时间.log 命名的文件中查询)。
/dm8/dmdbms/bin/dminit PATH=/dm8/dmdbms/data PORT_NUM=5238 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=256 CHARSET=0 DB_NAME=DMTEST
3)将步骤 (2) 中重新初始化的数据库中 ROLL.DBF 文件拷贝到当前丢失 UNDO 文件的库目录下。
[dmdba@dmdb03:/dm8/dmdbms/bin]$ cd /dm8/dmdbms/data/DMTEST/
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ ls -l *.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 Jun 20 15:57 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 161480704 Jun 20 15:58 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 180355072 Jun 20 15:58 SYSTEM.DBF
-rw-r--r-- 1 dmdba dinstall 77594624 Jun 20 15:58 TEMP.DBF
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$ scp ROLL.DBF dmdba@192.168.186.128:/dm8/dmdbms/data/DMTEST/
dmdba@192.168.186.128's password:
ROLL.DBF 100% 154MB 122.3MB/s 00:01
[dmdba@dmdb03:/dm8/dmdbms/data/DMTEST]$
4)使用 dmmdf 工具获取源库中 SYSTEM.DBF 的 db_magic,并记录下来。(此时可以使用root用户,也可以使用dmdba用户)
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=1 FILE=/dm8/dmdbms/data/DMTEST/SYSTEM.DBF
dmmdf V8
**********************************************************
1 db_magic=943643448
2 next_trxid=4009
3 pemnt_magic=1706932456
**********************************************************
Please input which parameter you want to change(1-3), q to quit: q
5)使用 dmmdf 工具设置 ROLL.DBF 文件的 db_magic 和 pemnt_magic 值,设置为步骤 (4) 中记录的值。
[dmdba@dmdb01 bin]$ ./dmmdf TYPE=1 FILE=/dm8/dmdbms/data/DMTEST/ROLL.DBF
dmmdf V8
group_id, file_id, page_no error, file /dm8/dmdbms/data/DMTEST/ROLL.DBF is not system dbf.
[dmdba@dmdb01 bin]$
说明:看来dmmdf命令只能修改dbf文件中的SYSTEM.DBF
6)测试启动数据库实例成功,看来undo表空间可以通过直接"异库拷贝"的方式就能恢复
[dmdba@dmdb01 bin]$ ./dmserver /dm8/dmdbms/data/DMTEST/dm.ini
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-94-21.11.11-150650-10038-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-11-11
file lsn: 35647
......
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.
达梦在线服务平台:https://eco.dameng.com