暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

【达梦8】 控制文件的管理

原创 李美静 恩墨学院 2021-08-23
2153

本篇文章主要介绍控制文件相关的内容,如下是此文的主要内容:
控制文件的管理.png

1. 控制文件的概览

每个DM 数据库都有一个名为dm.ctl的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:

1. 数据库名称;
2. 数据库服务器模式; 
3. OGUID 唯一标识; 
4. 数据库服务器版本; 
5. 数据文件版本; 
6. 数据库的启动次数;
7. 数据库最近一次启动时间;
8. 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来; 
9. 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。

2.控制文件的保护机制

在服务器运行期间,执行表空间的DDL等操作后,服务器内部需要同步修改控制文件内容。如果在修改过 程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内部会执行备份操作。
备份策略如下:

  1. 策略一:在修改dm.ctl之前,先执行一次备份,确定dm.ctl修改成功后,再将备份删除,如果dm.ctl修改 失败或中途出现故障,则保留备份文件。
  2. 策略二:在修改dm.ctl成功之后,根据dm.ini中指定的CTL_BAK_PATH/CTL_BAK_NUM对最新的dm.ctl执行备份,如果用户指定的CTL_BAK_PATH是非法路径,则不再生成备份文件,在路径有效的情况下,生成备份文 件时根据指定的CTL_BAK_NUM判断是否删除老的备份文件。
  3. 注意:
如果dm.ctl文件存放在裸设备上,则【策略一】不会生效。 如果指定的CTL_BAK_PATH是无效路径,则【策略二】也不会生效。 
如果【策略一】和【策略二】的条件都满足,则都会生效执行,否则只执行满足条件的备份策略,如果都 不满足,则不会再生成备份文件。 
如果是初始化新库,在初始化完成后,会在SYSTEM_PATH/CTL_BAK”路径下对原始的dm.ctl执行一次备份。 

3.实践

实验一:通过转储查看控制文件内容

使用dmctlcvt来转储控制文件为文本:

[dmdba@enmoedu1 ctl_bak]$ cd /opt/dm8/data/DAMENG/ 
[dmdba@enmoedu1 DAMENG]$ dmctlcvt TYPE=1 SRC=/opt/dm8/data/DAMENG/dm.ctl DEST=/home/ dmdba/dm.txt DMCTLCVT V8
convert ctl to txt success! 
[dmdba@enmoedu1 DAMENG]$ ll /home/dmdba/dm.txt -rw-r--r-- 1 dmdba dinstall 9013 8月 28 12:17 /home/dmdba/dm.txt 
[dmdba@enmoedu1 DAMENG]$ cat /home/dmdba/dm.txt | grep -v '^#' dbname=DAMENG ...... 
ts_name=SYSTEM 
# table space ID ts_id=0 
ts_create_time=DATETIME '2020-8-26 9:50:31' 
ts_modify_time=DATETIME '2020-8-26 9:50:31' ...... fil_path=/opt/dm8/data/DAMENG/SYSTEM.DBF 
fil_id=0 autoextend=1 fil_create_time=DATETIME '2020-8-26 9:50:31' 
fil_modify_time=DATETIME '2020-8-26 9:50:31' .... 

通过查看转储出来的dm.txt可以看到控制文件里的内容。

再将文本转储为二进制的控制文件:
此场景可以用于文本控制文件修改数据文件或重做日志文件名称或位置,然后再转化为二进制控制文件生效。

 [dmdba@enmoedu1 DAMENG]$ dmctlcvt TYPE=2 SRC=/home/dmdba/dm.txt DEST=/home/dmdba/dm. ctl DMCTLCVT V8 convert txt to ctl success! 

实验二:通过参数来了解控制文件的管理方式

CTL_PATH:控制文件所在路径,
CTL_BAK_PATH:控制文件备份所在路径,
CTL_BAK_NUM:控制文件备份存放份数.

SQL> select para_name,para_value from v$dm_ini where para_name in ('CTL_BAK_PATH','CTL_BAK_ NUM','CTL_PATH');
LINEID PARA_NAME PARA_VALUE 
---------- ------------ ----------------------------
 1 CTL_PATH /opt/dm8/data/DAMENG/dm.ctl 
 2 CTL_BAK_PATH /opt/dm8/data/DAMENG/ctl_bak 
 3 CTL_BAK_NUM 10 

操作系统层面查看控制文件的备份文件个数:
过滤掉以字符打头的行

cd /opt/dm8/data/DAMENG/ctl_bak 
[dmdba@dmdba ctl_bak]$ ls -l | grep '^-' |wc -l 

图片.png

实验三:通过创建表空间方式修改控制文件

  1. 创建表空间,在创建同时会在控制文件中添加物理文件条目,触发对控制文件的备份机制:
SQL> create tablespace test1 datafile '/opt/dm8/data/DAMENG/test101.dbf' size 5 0;
executed successfully 

2.查看控制文件的备份:

[dmdba@dmdba ctl_bak]$ ls -l | grep ‘^-’ | wc -l 11

如下红框内为创建表空间之后新增的控制文件备份:
图片.png

查询新生成的控制文件的备份,能够发现在创建表空间之前会创建备份,过程中及创建完成之后依然会创建备份:

[dmdba@enmoedu1 ctl_bak]$ strings dm_20200828114507_596967.ctl | grep -i test1 
[dmdba@enmoedu1 ctl_bak]$ strings dm_20200828114507_606208.ctl | grep -i test1 TEST1 
[dmdba@enmoedu1 ctl_bak]$ strings dm_20200828114507_624093.ctl | grep -i test1 TEST1 /opt/dm8/data/DAMENG/test101.dbf 
[dmdba@enmoedu1 ctl_bak]$ strings dm_20200828114507_629990.ctl | grep -i test1 TEST1 /opt/dm8/data/DAMENG/test101.dbfTEST1 

以上证明了在修改控制文件前先做备份,修改成功后仍做备份的效果.

实验四:利用备份来恢复控制文件

1.模拟故障:
将控制文件删除:

[dmdba@enmoedu1 ~]$ cd /opt/dm8/data/DAMENG/ 
[dmdba@enmoedu1 DAMENG]$ rm -f dm.ctl

2.重启服务报错:

[dmdba@enmoedu1 ~]$ DmServiceDMSERVER stop 
[dmdba@enmoedu1 ~]$ DmServiceDMSERVER start 
Starting DmServiceDMSERVER: [ FAILED ] 
file dm.key not found, use default license! ==Read ini error, name:CTL_PATH, value:/opt/dm8/data/DAMENG/dm.ctl dmserver startup failed==, code = -803 [Invalid ini config value] nsvr_ini_file_read failed, [code: -803] 

3.恢复控制文件:将最新的控制文件的备份拷贝回来,重启服务

[dmdba@enmoedu1 ctl_bak]$ cd /opt/dm8/data/DAMENG/ctl_bak [dmdba@enmoedu1 ctl_bak]$ cp dm_20200828114507_629990.ctl /opt/dm8/data/DAMENG/dm.ctl 
[dmdba@enmoedu1 ctl_bak]$ DmServiceDMSERVER start Starting DmServiceDMSERVER: [ OK ] 
[dmdba@enmoedu1 ctl_bak]$ DmServiceDMSERVER status 
DmServiceDMSERVER (pid 2498) is running. 

4.查看数据库的状态:

SQL> select status$ from v$instance; 
行号 STATUS$ 
---------- ------- 
1 OPEN 

实验五:利用控制文件修改数据文件的位置(或者修改重做日志文件的位置)

1.停止服务

[dmdba@enmoedu1 DAMENG]$ DmServiceDMSERVER stop Stopping DmServiceDMSERVER: [ OK ]

2.转储控制文件为文本
[dmdba@enmoedu1 DAMENG]$ dmctlcvt TYPE=1 SRC=/opt/dm8/data/DAMENG/dm.ctl DEST=/home/dm dba/dm.txt DMCTLCVT V8
convert ctl to txt success!
3.修改文本控制文件中数据文件的目录
[dmdba@enmoedu1 DAMENG]$ cat /home/dmdba/dm.txt | grep test101.dbf fil_path=/home/dmdba/test101.dbf
4.转储控制文件为二进制文件
[dmdba@enmoedu1 DAMENG]$ dmctlcvt TYPE=2 SRC=/home/dmdba/dm.txt DEST=/home/dmdba/dm.ctl DMCTLCVT V8 convert txt to ctl success!
5.相应的将数据文件拷贝到新目录/home/dmdba
[dmdba@enmoedu1 DAMENG]$ cp /opt/dm8/data/DAMENG/test101.dbf /home/dmdba/
6.启动服务
[dmdba@enmoedu1 DAMENG]$ DmServiceDMSERVER start
Starting DmServiceDMSERVER: [ OK ]
7.验证

SQL> select file_name from dba_data_files; 
行号 FILE_NAME 
---------- --------------------------------- 
1 /opt/dm8/data/DAMENG/SYSTEM.DBF 
2 /home/dmdba/test101.dbf 

与配置文件类似,控制文件对系统的运行及性能有很大的影响,但不同的是,配置文件中的配置项可以随 意更改,而控制文件中的控制信息一般在系统第一次创建完毕后就不能随意更改,所以控制文件不是一个 文本文件,而是一个二进制文件。另外控制文件一旦被破坏或丢失仍就无法手工重新创建,基于这一点, 对控制文件的保护显得尤为重要。

最后修改时间:2021-08-30 15:32:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论