签到成功

知道了

CNDBA社区CNDBA社区

DM 达梦数据库 生产环境 实例 推荐配置参数

2022-08-24 16:19 4086 0 原创 DM 达梦
作者: dave

1 生产环境推荐配置参数

在之前的博客中,我们了解了达梦实例的创建:

DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580http://www.cndba.cn/cndba/dave/article/108599

在dminit命令中可以看到达梦数据库实例有很多的配置参数,官方对这些参数也有说明,如果是测试环境,那么可以直接默认值来创建实例。 如果是生产环境使用,建议对参数进行相应的调整,以保证最佳性能。

这里先看推荐的实例创建参数:http://www.cndba.cn/cndba/dave/article/108599

./dminit PATH=/dm/data DB_NAME=CNDBA INSTANCE_NAME=DAVE page_size=32 extent_size=32 length_in_char=1 LOG_SIZE=2048 CASE_SENSITIVE=Y CHARSET=1 PORT_NUM=5236

这里指定的几个参数,有特别的作用,并且不是默认值,除此之外,还因为这些参数只能在实例创建的时候指定,一定创建成功,无法在进行修改。 如果环境已经按默认值创建,只能重新创建实例,然后使用DM DTS 工具,将数据迁移过来。

这里有个小细节,也是达梦与Oracle的不同,达梦库的DB_NAME和INSTANCE_NAME 在使用时并没有太多的实际意义。因为达梦是通过IP和端口直接连接的,不需要实例名的信息。

2 相关参数说明

2.1 LOG_SIZE=2048

该参数控制日志文件使用的簇大小,以 M为单位, 默认每个日志文件大小为 256M,可以配置为64和 2048之间的整数。 如果设置过小,可能会导致redo log 的频繁切换,从而影响性能。 所以推荐直接设置成最大值:2048。

2.2 CHARSET=1

控制实例的字符集。0代表 GB18030,1代表UTF-8,2代表韩文字符集 EUC-KR。默认值为 0,可以取值 0、1或 2之一。 这里推荐使用UTF-8,即设置为1。

2.3 CASE_SENSITIVE=Y

该参数控制标识符大小写敏感,默认值为 Y。当大小写敏感时,小写的标识符应用双引号括起,否则被转换为大写;当大小写不敏感时,系统不自动转换标识符的大小写,在标识符比较时也不区分大小写。

http://www.cndba.cn/cndba/dave/article/108599
http://www.cndba.cn/cndba/dave/article/108599

具体是否启用大小写敏感看具体业务,大多数还是启用大小写敏感的。

2.4 PAGE_SIZE=32

数据文件使用的页大小,可以为 4K、8K、 16K或 32K之一,选择的页大小越大,则 DM支持的元组长度也越大,但同时空间利用率可能下降,该参数默认是8K。只能是 4K、8K、16K或32K之一。http://www.cndba.cn/cndba/dave/article/108599

DM 达梦数据库 记录超长 错误解决方法
https://www.cndba.cn/dave/article/108596

实际生产环境,推荐是32k的页,达梦对32k做了一些优化,虽然大页会导致IO的增加,但优化后性能并没有太大影响。

2.5 EXTENT_SIZE =32

该参数控制数据文件使用的簇大小,即每次分配新的段空间时连续的页数,默认是16页,只能配置16页、32页、64页之一,生产环境推荐使用32页。即每次扩容 32*PAGE_SIZE。

2.6 LENGTH_IN_CHAR=1

该参数控制VARCHAR类型对象的长度是否以字符为单位。 取值 0或 1。默认值为0。

1:是,设置为以字符为单位时,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。
同时,存储的字节长度 8188上限仍然不变,也就是说,即使定义列长度为8188字符,其实际能插入的字符串占用总字节长度仍然不能超过 8188;
0:否,所有 VARCHAR类型对象的长度以字节为单位。

通俗一点理解,在同样varchar长度的情况,使用字符(1)来计算长度,可以存储更多的内容,但总的上线还是8188字符。

以下测试都是基于该大小:

http://www.cndba.cn/cndba/dave/article/108599

create table cndba(c1 varchar(10));http://www.cndba.cn/cndba/dave/article/108599

2.6.1 CHARSET=0,LENGTH_IN_CHAR=0

这是初始化数据库时的默认配置,字符集为gb18030,varchar长度以字节为单位,汉字一般需要占用两个字节。

插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
--插入11个英文,错误
插入11个英文,错误
insert into cndba(c1) values('ABCDEFGHIJA');

--插入5个中文,正常
插入5个中文,正常
insert into cndba(c1) values('测试一下测');
--插入6个中文,错误
插入6个中文,错误
insert into cndba(c1) values('测试一下测试');

2.6.2 CHARSET=0,LENGTH_IN_CHAR=1

字符集为GB18030,在length_in_char=1的情况下,varchar按字符来计数,varchar的实际可存储字节数会按2倍的比例放大。
例如定义varchar(10),那么就可以存储10 * 2 = 20个字节的数据。

插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
插入11个英文,正常
insert into cndba(c1) values('ABCDEFGHIJA');
插入20个英文,正常
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJ');
插入21个英文,错误
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJA');

插入10个中文,正常
insert into cndba(c1) values('测试一下测试一下测试');
插入11个中文,错误
insert into cndba(c1) values('测试一下测试一下测试一');
插入10个中文1个英文,错误
insert into cndba(c1) values('测试一下测试一下测试A');

GB18030字符集下,一个汉字字符占2个字节。 http://www.cndba.cn/cndba/dave/article/108599

2.6.3 CHARSET=1,LENGTH_IN_CHAR=0

字符集为UTF-8,varchar长度以字节为单位,一个汉字字符占据三个字节。

--插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
--插入11个英文,错误
insert into cndba(c1) values('ABCDEFGHIJA');

--插入3个中文,正常
insert into cndba(c1) values('测试一');
--插入3个中文1个英文,正常
insert into cndba(c1) values('测试一A');

--插入4个中文,错误
insert into cndba(c1) values('测试一下');
--插入3个中文2个英文,错误
insert into cndba(c1) values('测试一AB');

2.6.4 CHARSET=1,LENGTH_IN_CHAR=1

字符集为UTF-8,varchar长度以字符为单位,varchar的实际存储字节数会按4倍的比例放大。
例如定义varchar(10),那么就可以存储10 * 4 = 40个字节的数据http://www.cndba.cn/cndba/dave/article/108599

http://www.cndba.cn/cndba/dave/article/108599

--插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
--插入20个英文,正常
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入40个英文,正常
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ');
--插入41个英文,错误
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA');

--插入10个中文,正常
insert into cndba(c1) values('测试一下测试一下测试');
--插入13个中文,正常
insert into cndba(c1) values('测试一下测试一下测试一下测');
--插入14个中文,错误
insert into cndba(c1) values('测试一下测试一下测试一下测试');
--插入13个中文1个英文,正常
insert into cndba(c1) values('测试一下测试一下测试一下测A');
--插入13个中文2个英文,错误
insert into cndba(c1) values('测试一下测试一下测试一下测AB');

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2296
    原创
  • 3
    翻译
  • 582
    转载
  • 198
    评论
  • 访问:8500271次
  • 积分:4477
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ