联系:手机/微信(+86 17813235971) QQ(107644445)
标题:dm.ctl文件异常恢复
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
达梦数据库中也有类似oracle的控制文件(control0x.ctl),在达梦数据库中一般叫做dm.ctl,具体是有dm.ini(达梦默认参数文件名)中的CTL_PATH参数确定.在某些情况下,由于参数文件损坏或者丢失,导致数据库异常,这里dm.ctl文件丢失故障恢复
创建表空间和表并插入数据
SQL> create tablespace tbs_xff datafile 'tbs_xff01.dbf' size 128; 操作已执行 已用时间: 52.996(毫秒). 执行号:1303. SQL> create table t_xff tablespace tbs_xff as 2 select * from dba_objects; 操作已执行 已用时间: 71.055(毫秒). 执行号:1304. SQL> insert into t_xff select * from dba_objects; 影响行数 1094 已用时间: 28.759(毫秒). 执行号:1305. SQL> insert into t_xff select * from dba_objects; 影响行数 1094 已用时间: 13.395(毫秒). 执行号:1306. SQL> insert into t_xff select * from dba_objects; 影响行数 1094 已用时间: 13.867(毫秒). 执行号:1307. SQL> insert into t_xff select * from dba_objects; 影响行数 1094 已用时间: 13.838(毫秒). 执行号:1308. SQL> insert into t_xff select * from t_xff; 影响行数 5470 已用时间: 5.677(毫秒). 执行号:1309. SQL> select count(1) from t_xff; 行号 COUNT(1) ---------- -------------------- 1 10940 已用时间: 1.949(毫秒). 执行号:1310. SQL> insert into t_xff select * from t_xff; 影响行数 10940 已用时间: 35.035(毫秒). 执行号:1311. SQL> insert into t_xff select * from t_xff; 影响行数 21880 已用时间: 38.489(毫秒). 执行号:1312. SQL> insert into t_xff select * from t_xff; 影响行数 43760 已用时间: 86.242(毫秒). 执行号:1313. SQL> insert into t_xff select * from t_xff; 影响行数 87520 已用时间: 272.804(毫秒). 执行号:1314. SQL> insert into t_xff select * from t_xff; 影响行数 175040 已用时间: 529.733(毫秒). 执行号:1315. SQL> insert into t_xff select * from t_xff; 影响行数 350080 已用时间: 00:00:01.090. 执行号:1316. SQL> select count(1) from t_xff; 行号 COUNT(1) ---------- -------------------- 1 700160 已用时间: 0.352(毫秒). 执行号:1317.
kill达梦进程并删除dm.ctl文件
[dmdba@localhost ctl_bak]$ ps -ef|grep dmserver dmdba 2216 1963 1 21:25 pts/1 00:00:10 dmserver /home/dmdba/dmdbms/data/htdb/dm.ini dmdba 2401 1963 0 21:40 pts/1 00:00:00 grep --color=auto dmserver [dmdba@localhost ctl_bak]$ kill -9 2216 [dmdba@localhost ctl_bak]$ [1]+ 已杀死 nohup dmserver /home/dmdba/dmdbms/data/htdb/dm.ini(工作目录:~/dmdbms/log) (当前工作目录:~/dmdbms/data/htdb/ctl_bak) [dmdba@localhost htdb]$ [dmdba@localhost htdb]$ rm -rf dm.ctl [dmdba@localhost htdb]$
启动达梦数据库报错
[dmdba@localhost htdb]$ dmserver /home/dmdba/dmdbms/data/htdb/dm.ini file dm.key not found, use default license! Read ini error, name:CTL_PATH, value:/home/dmdba/dmdbms/data/htdb/dm.ctl dmserver startup failed, code = -803 [Invalid ini config value] nsvr_ini_file_read failed, 1 [dmdba@localhost htdb]$
使用备份ctl文件直接启动库
备份文件在dm.ini中的CTL_BAK_PATH参数控制备份控制文件路径(一般在达梦数据库目录的ctl_bak中),CTL_BAK_NUM控制备份文件数量
[dmdba@localhost htdb]$ cd ctl_bak/ [dmdba@localhost ctl_bak]$ ls -lhtra 总用量 96K -rw-r--r--. 1 dmdba dmsys 5.5K 4月 26 21:25 dm_20250426212532_981690.ctl -rw-r--r--. 1 dmdba dmsys 5.5K 4月 26 21:36 dm_20250426213636_596321.ctl -rw-r--r--. 1 dmdba dmsys 5.5K 4月 26 21:36 dm_20250426213636_599137.ctl -rw-r--r--. 1 dmdba dmsys 6.0K 4月 26 21:36 dm_20250426213636_604672.ctl -rw-r--r--. 1 dmdba dmsys 6.0K 4月 26 21:36 dm_20250426213636_607133.ctl -rw-r--r--. 1 dmdba dmsys 6.0K 4月 26 21:36 dm_20250426213636_610925.ctl drwxr-xr-x. 2 dmdba dmsys 4.0K 4月 26 21:36 . -rw-r--r--. 1 dmdba dmsys 6.0K 4月 26 21:36 dm_20250426213636_630282.ctl drwxr-xr-x. 6 dmdba dmsys 4.0K 4月 26 21:41 .. -rw-r--r--. 1 dmdba dmsys 5.5K 4月 27 2025 dm_20250427034852_563000.ctl -rw-r--r--. 1 dmdba dmsys 5.5K 4月 27 2025 dm_20250427034905_993889.ctl -rw-r--r--. 1 dmdba dmsys 5.5K 4月 27 2025 dm_20250427035646_961400.ctl -rw-r--r--. 1 dmdba dmsys 5.5K 4月 27 2025 dm_20250427041036_574397.ctl [dmdba@localhost ctl_bak]$ [dmdba@localhost ctl_bak]$ cp dm_20250427041036_574397.ctl ../dm.ctl [dmdba@localhost ctl_bak]$ dmserver /home/dmdba/dmdbms/data/htdb/dm.ini file dm.key not found, use default license! version info: develop csek2_vm_t = 1440 nsql_vm_t = 328 prjt2_vm_t = 176 ltid_vm_t = 216 nins2_vm_t = 1120 nset2_vm_t = 272 ndlck_vm_t = 192 ndel2_vm_t = 768 slct2_vm_t = 352 nli2_vm_t = 200 aagr2_vm_t = 304 pscn_vm_t = 376 dist_vm_t = 960 DM Database Server 64 V8 03134284336-20250117-257733-20132 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 2026-01-17 begin redo pwr log collect, last ckpt lsn: 46175 ... redo pwr log collect finished main rfil[/home/dmdba/dmdbms/data/htdb/htdb01.log]'s grp collect 0 valid pwr record, discard 1135 invalid pwr record EP[0]'s cur_lsn[61627], file_lsn[61627] begin redo log recover, last ckpt lsn: 46175 ... redo log recover finished 0 ndct db load finished, code:0 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 pseg_set_gtv_trxid_low next_trxid in mem:[26039] pseg_collect_mgr_items, total collect 0 active_trxs, 0 cmt_trxs, 0 pre_cmt_trxs, 0 to_release_trxs, 0 active_pages, 0 cmt_pages, 0 pre_cmt_pages, 0 to_release_pages, 0 mgr pages, 0 mgr recs! next_trxid in mem:[28041] next_trxid = 30043. pseg recv finished nsvr_startup end. uthr_pipe_create, create pipe[read:10, write:11] uthr_pipe_create, create pipe[read:12, write:13] uthr_pipe_create, create pipe[read:14, write:15] uthr_pipe_create, create pipe[read:16, write:17] uthr_pipe_create, create pipe[read:18, write:19] uthr_pipe_create, create pipe[read:20, write:21] uthr_pipe_create, create pipe[read:22, write:23] uthr_pipe_create, create pipe[read:24, write:25] uthr_pipe_create, create pipe[read:26, write:27] uthr_pipe_create, create pipe[read:28, write:29] uthr_pipe_create, create pipe[read:30, write:31] uthr_pipe_create, create pipe[read:32, write:33] uthr_pipe_create, create pipe[read:34, write:35] uthr_pipe_create, create pipe[read:36, write:37] uthr_pipe_create, create pipe[read:38, write:39] uthr_pipe_create, create pipe[read:40, write:41] aud sys init success. aud rt sys init success. systables desc init success. ndct_db_load_info finished, code:0. nsvr_process_before_open begin. nsvr_process_before_open success. SYSTEM IS READY. purg2_crash_cmt_trx end, total 0 trx, 0 pages purged
启动数据库成功,查询相关信息
SQL> select TABLESPACE_NAME from dba_tablespaces; 行号 TABLESPACE_NAME ---------- --------------- 1 SYSTEM 2 ROLL 3 TEMP 4 MAIN 5 TBS_XFF 6 MAIN 6 rows got 已用时间: 4.257(毫秒). 执行号:602. SQL> select count(*) from t_xff; 行号 COUNT(*) ---------- -------------------- 1 700160 已用时间: 2.893(毫秒). 执行号:603.
使用重建ctl文件方式恢复
1. 使用dmctlcvt把备份ctl转换为txt文件
[dmdba@localhost htdb]$ dmctlcvt help DMCTLCVT V8 version: 03134284336-20250117-257733-20132 格式: ./dmctlcvt KEYWORD=value 注意: 控制文件名称必须指定为dm.ctl、dmmpp.ctl、dss.ctl 关键字 说明 -------------------------------------------------------------------------------- TYPE 1 转换控制文件为文本文件(源文件路径中控制文件名称必须是dm.ctl或dmmpp.ctl或dss.ctl) 2 转换文本文件为控制文件(目标文件路径中控制文件名称必须是dm.ctl或dmmpp.ctl或dss.ctl) SRC 源文件路径 DEST 目标文件路径 DCR_INI dmdcr.ini文件路径 HELP 打印帮助信息 示例: ./dmctlcvt TYPE=1 SRC=/opt/dmdbms/data/dameng/dm.ctl DEST=/opt/dmdbms/data/dameng/dmctl.txt ./dmctlcvt TYPE=2 SRC=/opt/dmdbms/data/dameng/dmctl.txt DEST=/opt/dmdbms/data/dameng/dm.ctl [dmdba@localhost htdb]$ dmctlcvt TYPE=1 SRC=dm_20250426213636_630282.ctl DEST=/tmp/ctl.txt DMCTLCVT V8 convert ctl to txt success!
2. 查看ctl.txt文件中是的表空间和数据文件信息是否正确,如果确实可以参考达梦日志中相关创建信息参考其他表空间信息进行完善,并注意修改next_ts_id=6值
2025-04-26 21:36:36.600 [INFO] database P0000002216 T0000000000000002387 ifun_add_file_low initialize file[0] of ts[5], file_path[/home/dmdba/dmdbms/data/htdb/tbs_xff01.dbf]!
3. 利用该txt文件重建ctl文件
[dmdba@localhost ctl_bak]$ dmctlcvt TYPE=2 SRC=/tmp/ctl.txt DEST=/home/dmdba/dmdbms/data/htdb/dm.ctl DMCTLCVT V8 convert txt to ctl success!
4. 启动数据库并进行验证
[dmdba@localhost ~]$ dmserver path=/home/dmdba/dmdbms/data/htdb/dm.ini file dm.key not found, use default license! version info: develop csek2_vm_t = 1440 nsql_vm_t = 328 prjt2_vm_t = 176 ltid_vm_t = 216 nins2_vm_t = 1120 nset2_vm_t = 272 ………… aud sys init success. aud rt sys init success. systables desc init success. ndct_db_load_info finished, code:0. nsvr_process_before_open begin. nsvr_process_before_open success. SYSTEM IS READY. purg2_crash_cmt_trx end, total 0 trx, 0 pages purged
[dmdba@localhost ctl_bak]$ disql disql V8 用户名:sysdba 密码: [-2501]:用户名或密码错误. 用户名:sysdba 密码: 服务器[LOCALHOST:5236]:处于普通打开状态 登录使用时间 : 4.624(ms) SQL> select tablespace_name from dba_tablespaces; 行号 TABLESPACE_NAME ---------- --------------- 1 SYSTEM 2 ROLL 3 TEMP 4 MAIN 5 TBS_XFF 6 MAIN 6 rows got 已用时间: 9.326(毫秒). 执行号:701. SQL> select count(1) from t_xff; 行号 COUNT(1) ---------- -------------------- 1 700160 已用时间: 2.916(毫秒). 执行号:702. SQL>
基于此,对于dm的control损坏/丢失一般可以通过以上两种方法实现恢复,这里可以明显感觉到dm的control相对于oracle的control文件中少了相关的一致性检测