1 现象说明
公司内部培训,演示达梦表空间备份还原时翻车了。 主要是操作的时候使用了MAIN 表空间。
[dave@www.cndba.cn ~]$ disql SYSDBA/SYSDBA@localhost:5237
服务器[localhost:5237]:处于普通打开状态
登录使用时间 : 3.396(ms)
disql V8
SQL> select * from v$version;
行号 BANNER
---------- -------------------------
1 DM Database Server 64 V8
2 DB Version: 0x7000c
已用时间: 1.004(毫秒). 执行号:7601.
SQL>
SQL> backup database backupset '/dm/backup/backup1';
操作已执行
已用时间: 00:00:01.299. 执行号:284501.
SQL> BACKUP TABLESPACE MAIN BACKUPSET '/dm/backup/backup2';
操作已执行
已用时间: 975.195(毫秒). 执行号:284502.
SQL> ALTER TABLESPACE MAIN OFFLINE;
操作已执行
已用时间: 164.038(毫秒). 执行号:284503.
SQL> RESTORE TABLESPACE MAIN FROM BACKUPSET '/dm/backup/backup2';
RESTORE TABLESPACE MAIN FROM BACKUPSET '/dm/backup/backup2';
[-2004]:不支持的语句类型.
已用时间: 16.341(毫秒). 执行号:0.
因为达梦8 里不支持联机恢复表空间了,所以打算把表空间ONLINE起来,结果拉不起来:
SQL> ALTER TABLESPACE MAIN ONLINE;
ALTER TABLESPACE MAIN ONLINE;
[-3408]:表空间[MAIN]处于脱机状态.
已用时间: 1.312(毫秒). 执行号:0.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 1
5 DMHR 0
6 HMAIN NULL
6 rows got
已用时间: 4.409(毫秒). 执行号:7606.
SQL>
准备在创建其他表空间测试下,结果因为MAIN 表空间脱机无法执行:
SQL> create tablespace ustc datafile '/dm/dmdbms/data/dave/ustc01.DBF' size 64;
create tablespace ustc datafile '/dm/dmdbms/data/dave/ustc01.DBF' size 64;
[-3408]:表空间[MAIN]处于脱机状态.
已用时间: 14.068(毫秒). 执行号:0.
SQL>
2 换个实例测试
因为MAIN 表空间起不来,所以其他操作也不了。 因为上小节offline 之前有备份的操作,担心是备份的影响,所以换了个实例,直接offline,结果直接起不来:
[dave@www.cndba.cn bin]$ disql SYSDBA/'"dameng@123"'
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 2.835(ms)
disql V8
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 HMAIN NULL
已用时间: 5.105(毫秒). 执行号:140900.
SQL> ALTER TABLESPACE MAIN OFFLINE;
操作已执行
已用时间: 157.614(毫秒). 执行号:140901.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 1
5 HMAIN NULL
已用时间: 1.171(毫秒). 执行号:140902.
SQL> ALTER TABLESPACE MAIN ONLINE;
ALTER TABLESPACE MAIN ONLINE;
[-3408]:表空间[MAIN]处于脱机状态.
已用时间: 1.213(毫秒). 执行号:0.
SQL>
SQL> ALTER TABLESPACE SYSTEM OFFLINE;
ALTER TABLESPACE SYSTEM OFFLINE;
第1 行附近出现错误[-3409]:表空间[SYSTEM]不能置为脱机状态.
已用时间: 0.381(毫秒). 执行号:0.
SQL>
所以基本确定,应该是这个版本的bug。 SYSTEM 为系统表空间,直接提示不能不能脱机,MAIN 允许脱机,但又不能ONLINE,关键库的运行还依赖该表空间,所以一旦执行脱机,这个实例就废了。
3 继续测试表空间
前面干废了2个达梦实例,在第三个实例上,又重新测试了一把业务表空间,可以正常操作。
[dave@www.cndba.cn bin]$ disql SYSDBA/SYSDBA@localhost:15236
服务器[localhost:15236]:处于普通打开状态
登录使用时间 : 7.204(ms)
disql V8
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 HMAIN NULL
已用时间: 7.372(毫秒). 执行号:1231041.
SQL> create tablespace ustc datafile '/dm/dmdbms/data/dave/ustc01.DBF' size 64;
操作已执行
已用时间: 199.682(毫秒). 执行号:1231112.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 USTC 0
6 HMAIN NULL
6 rows got
已用时间: 1.444(毫秒). 执行号:1231136.
SQL> ALTER TABLESPACE USTC OFFLINE;
操作已执行
已用时间: 170.201(毫秒). 执行号:1231235.
SQL> ALTER TABLESPACE USTC ONLINE;
操作已执行
已用时间: 51.294(毫秒). 执行号:1231273.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 USTC 0
6 HMAIN NULL
6 rows got
已用时间: 3.154(毫秒). 执行号:1231293.
SQL>
4 重建控制文件拉起MAIN 表空间
上面的操作直接废了2个实例,所以不想放弃,决定在抢救一下,所以直接通过重建控制文件,修改控制文件中表空间的状态,把MAIN 表空间拉起来。
DM7 达梦数据库 查看并重建控制文件 操作示例
https://www.cndba.cn/dave/article/3574
[dave@www.cndba.cn bin]$ ./DmServicedave stop
Stopping DmServicedave: [ OK ]
[dave@www.cndba.cn ~]$ cat /dm/dmdbms/data/dave/dm.ini|grep CTL
CTL_PATH = /dm/dmdbms/data/dave/dm.ctl #ctl file path
CTL_BAK_PATH = /dm/dmdbms/data/dave/ctl_bak #dm.ctl backup path
CTL_BAK_NUM = 10 #backup number of dm.ctl, allowed to keep one more backup file besides specified number.
DSC_N_CTLS = 10000 #Number Of LBS/GBS ctls
[dave@www.cndba.cn ~]$
[dave@www.cndba.cn ~]$ dmctlcvt type=1 SRC=/dm/dmdbms/data/dave/dm.ctl DEST=/tmp/dmct.txt
DMCTLCVT V8
convert ctl to txt success!
[dave@www.cndba.cn ~]$ vim /tmp/dmct.txt
找到MAIN 表空间,将ts_state=0 改成0.
# table space name
ts_name=MAIN
# table space ID
ts_id=4
# table space status
ts_state=0
# table space cache
ts_cache=
# DSC node number
ts_nth=0
[dave@www.cndba.cn ~]$ dmctlcvt type=2 SRC=/tmp/dmct.txt DEST=/dm/dmdbms/data/dave/dm.ctl
DMCTLCVT V8
convert txt to ctl success!
[dave@www.cndba.cn ~]$
[dave@www.cndba.cn bin]$ ./DmServicedave start
Starting DmServicedave: [ OK ]
[dave@www.cndba.cn bin]$
验证表空间,已经ONLINE了:
[dave@www.cndba.cn ~]$ disql SYSDBA/SYSDBA@localhost:5237
服务器[localhost:5237]:处于普通打开状态
登录使用时间 : 3.760(ms)
disql V8
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 DMHR 0
6 HMAIN NULL
6 rows got
已用时间: 6.031(毫秒). 执行号:401.
SQL>
5 小结
达梦数据库,慎重对MAIN 表空间执行OFFLINE 操作,常规SQL拉不起来,只能通过重建控制文件的方式来强制拉。
版权声明:本文为博主原创文章,未经博主允许不得转载。