在DM初始化数据库时,有几个参数需特别注意,一旦设置,初始化数据库后很难或者无法改变,以下将通过测试例子来分析这几个参数。

上周在做Oracle迁移数据到达梦数据库时,就因为初始化数据库时一些参数没有设置好,导致数据迁移出现问题。

一、大小写敏感参数(CASE_SENSITIVE)

CASE_SENSITIVE有 0 和 1 两个值,分别代表不同含义。

  • CASE_SENSITIVE = 1  代表数据库对大小写敏感,会将A和a当成两个不同的字符对待,初始化数据库时,如不指定CASE_SENSITIVE值,默认为 1,数据库大小写敏感。
  • CASE_SENSITIVE = 0  大表数据库对大小写不敏感,会将A和a看作是相同的字符。

另外,在使用disql查询工具进行查询时,默认会将小写转为大写。

1.1 查询当前数据库大小写是否敏感

-- 查询

[dmdba@openstack ~]$ disql sysdba

密码:

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间 : 4.994(ms)

disql V8

SQL> select decode(case_sensitive,1,'大小写敏感','大小写不敏感'); 

行号     DECODE(CASE_SENSITIVE,1,'大小写敏感','大小写不敏感')

---------- ---------------------------------------------------------------

1          大小写敏感

已用时间: 2.150(毫秒). 执行号:1395000.

-- 还可以通过如下方式查询

SQL> SELECT SF_GET_CASE_SENSITIVE_FLAG();

行号     SF_GET_CASE_SENSITIVE_FLAG()

---------- ----------------------------

1          1

已用时间: 0.725(毫秒). 执行号:1395001.

-- 再查询另一个库

[dmdba@openstack ~]$ disql SYSDBA@localhost:5237      

服务器[localhost:5237]:处于普通打开状态

登录使用时间 : 4.111(ms)

disql V8

SQL> select decode(case_sensitive,1,'大小写敏感','大小写不敏感'); 

行号     DECODE(case_sensitive,1,'大小写敏感','大小写不敏感')

---------- ---------------------------------------------------------------

1          大小写不敏感

已用时间: 3.361(毫秒). 执行号:500.

SQL>

SQL> SELECT SF_GET_CASE_SENSITIVE_FLAG();

行号     SF_GET_CASE_SENSITIVE_FLAG()

---------- ----------------------------

1          0

已用时间: 0.825(毫秒). 执行号:501.

1.2 对比测试

1.2.1 大小写敏感库

-- 1) 大小写敏感数据库测试记录

SQL> select decode(case_sensitive,1,'大小写敏感','大小写不敏感');

行号     DECODE(CASE_SENSITIVE,1,'大小写敏感','大小写不敏感')

---------- ---------------------------------------------------------------

1          大小写敏感

已用时间: 0.422(毫秒). 执行号:1395002.

SQL>

SQL> create table dmtb01(letter varchar(20));

操作已执行

已用时间: 40.360(毫秒). 执行号:1395003.

SQL>

SQL> insert into dmtb01 values ('A'),('A'),('a'),('a'),('a');

影响行数 5

已用时间: 8.933(毫秒). 执行号:1395004.

SQL>

SQL> commit;

操作已执行

已用时间: 4.677(毫秒). 执行号:1395005.

SQL>

SQL> select from dmtb01 where letter = 'a';

行号     LETTER

---------- ------

1          a

2          a

3          a

已用时间: 1.434(毫秒). 执行号:1395006.

SQL>

SQL> select from dmtb01 where letter = 'A';

行号     LETTER

---------- ------

1          A

2          A

已用时间: 1.579(毫秒). 执行号:1395007.

-- 通过 dbms_metadata.get_ddl查询表结构时,大小写敏感库对表名大小写有要求

SQL> select dbms_metadata.get_ddl('TABLE','DMTB01','SYSDBA')from dual;

1          CREATE TABLE "SYSDBA"."DMTB01"

(

"LETTER" VARCHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;

已用时间: 2.914(毫秒). 执行号:1395010.

SQL>

SQL> select dbms_metadata.get_ddl('TABLE','dmtb01','SYSDBA')from dual;

select dbms_metadata.get_ddl('TABLE','dmtb01','SYSDBA')from dual;

[-20008]:未找到对象或不允许查询系统定义的内部索引

-20008: DBMS_METADATA.GET_DDL line 2236 .

已用时间: 2.769(毫秒). 执行号:0.

-- 甚至在同一个表可设置两个相同名称字段

SQL> create table dmtb03('letter' varchar(20),'LETTER' varchar(20));  -- 使用单引号会报错

create table dmtb03('letter' varchar(20),'LETTER' varchar(20));

create table dmtb03('letter' varchar(20),'LETTER' varchar(20));

                          *                                   

第 1 行, 第 27 列[']附近出现错误[-2007]:

语法分析出错.

已用时间: 0.534(毫秒). 执行号:0.

SQL> create table dmtb03("letter" varchar(20),"LETTER" varchar(20)); -- 使用双引号正常

操作已执行

已用时间: 44.448(毫秒). 执行号:1395012.

SQL>

SQL> insert into dmtb03 values ('AA','AA'),('AA','AA'),('aa','aa'),('aa','aa'),('aa','aa');

影响行数 5

已用时间: 2.377(毫秒). 执行号:1395013.

SQL>

SQL> commit;

操作已执行

已用时间: 7.987(毫秒). 执行号:1395014.

SQL> select dbms_metadata.get_ddl('TABLE','DMTB03','SYSDBA')from dual;

1          CREATE TABLE "SYSDBA"."DMTB03"

(

"letter" VARCHAR(20),

"LETTER" VARCHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;

已用时间: 7.179(毫秒). 执行号:1395019.

1.2.2 大小写不敏感库

-- 大小写敏感库测试记录

SQL> select decode(case_sensitive,1,'大小写敏感','大小写不敏感');

行号     DECODE(case_sensitive,1,'大小写敏感','大小写不敏感')

---------- ---------------------------------------------------------------

1          大小写不敏感

已用时间: 2.932(毫秒). 执行号:600.

SQL>

SQL> create table dmtb02(letter varchar(20));

操作已执行

已用时间: 41.465(毫秒). 执行号:601.

SQL>

SQL> insert into dmtb02 values ('A'),('A'),('a'),('a'),('a');

影响行数 5

已用时间: 1.650(毫秒). 执行号:602.

SQL>

SQL> commit;

操作已执行

已用时间: 11.532(毫秒). 执行号:603.

SQL>

SQL>

SQL> select from dmtb02 where letter = 'A';

行号     letter

---------- ------

1          A

2          A

3          a

4          a

5          a

已用时间: 1.974(毫秒). 执行号:604.

SQL>

SQL> select from dmtb02 where letter = 'A';

行号     letter

---------- ------

1          A

2          A

3          a

4          a

5          a

已用时间: 0.522(毫秒). 执行号:605.

-- 通过 dbms_metadata.get_ddl查询表结构时,大小写敏感库对表名大小写没有要求

SQL> select dbms_metadata.get_ddl('TABLE','DMTB02','SYSDBA')from dual;

1          CREATE TABLE "SYSDBA"."dmtb02"

(

"letter" VARCHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;

已用时间: 109.162(毫秒). 执行号:606.

SQL>

SQL> select dbms_metadata.get_ddl('TABLE','dmtb02','SYSDBA')from dual;

1          CREATE TABLE "SYSDBA"."dmtb02"

(

"letter" VARCHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;

已用时间: 5.157(毫秒). 执行号:607.

-- 大小写不敏感库不允许在同一个表创建同名字段

SQL> create table dmtb04("letter" varchar(20),"LETTER" varchar(20));

create table dmtb04("letter" varchar(20),"LETTER" varchar(20));

第1 行附近出现错误[-2116]:列[LETTER]已存在.

已用时间: 0.793(毫秒). 执行号:0.

二、空格填充模式参数(BLANK_PAD_MODE)

BLANK_PAD_MODE参数有 0 和 1 两个值,设置不同的值,会影响对Oracle的兼容性。该参数在整个实例生命周期内是不能被修改的,若要修改,只能重建数据库。

  • BLANK_PAD_MODE = 1 当BLANK_PAD_MODE=1,代表创建的达梦数据库兼容Oracle模式。
  • BLANK_PAD_MODE = 0 当BLANK_PAD_MODE=0,代表创建的达梦数据库不兼容Oracle模式,这也是达梦创建库时默认参数

2.1 查询是否兼容Oracle模式

-- BLANK_PAD_MODE 值为0 不兼容Oracle模式

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间 : 4.741(ms)

disql V8

SQL>

SQL> select para_name,para_value from v$dm_ini where para_name='BLANK_PAD_MODE';

行号     PARA_NAME      PARA_VALUE

---------- -------------- ----------

1          BLANK_PAD_MODE 0

已用时间: 16.720(毫秒). 执行号:1399000.

-- 还可以通过如下方式查询BLANK_PAD_MODE 值

SQL> select blank_pad_mode();

行号     BLANK_PAD_MODE()

---------- ----------------

1          0

已用时间: 1.046(毫秒). 执行号:1399001.

-- 查询另一个库,BLANK_PAD_MODE 值为 1,代表兼容Oracle模式

[dmdba@openstack ~]$ disql SYSDBA@localhost:5237

服务器[localhost:5237]:处于普通打开状态

登录使用时间 : 4.302(ms)

disql V8

SQL> select para_name,para_value from v$dm_ini where para_name='BLANK_PAD_MODE';

行号     para_name      para_value

---------- -------------- ----------

1          BLANK_PAD_MODE 1

已用时间: 18.282(毫秒). 执行号:700.

SQL> select blank_pad_mode();

行号     blank_pad_mode()

---------- ----------------

1          1

已用时间: 1.082(毫秒). 执行号:701.

2.2 测试对比

2.2.1 不兼容Oracle模式库

-- 不兼容Oracle模式库测试 BLANK_PAD_MODE = 0

[dmdba@openstack ~]$ disql sysdba

密码:

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间 : 4.807(ms)

disql V8

SQL> select blank_pad_mode();

行号     BLANK_PAD_MODE()

---------- ----------------

1          0

已用时间: 0.617(毫秒). 执行号:1401311

SQL> create table blank1tb01 (letter varchar(20));

操作已执行

已用时间: 43.654(毫秒). 执行号:1401300.

SQL> insert into blank1tb01 values ('AA');

影响行数 1

已用时间: 1.539(毫秒). 执行号:1401301.

SQL>                                      

SQL> insert into blank1tb01 values ('AA ');

影响行数 1

已用时间: 0.988(毫秒). 执行号:1401302.

SQL>

SQL> insert into blank1tb01 values ('AA  ');

影响行数 1

已用时间: 1.021(毫秒). 执行号:1401303.

SQL> commit;

操作已执行

已用时间: 4.167(毫秒). 执行号:1401304.

SQL>

SQL> select count(*) from blank1tb01 group by letter;

行号     COUNT(*)           

---------- --------------------

1          1

2          1

3          1

已用时间: 7.941(毫秒). 执行号:1401305.

SQL>

SQL> select from blank1tb01 where letter = 'A';

未选定行

已用时间: 2.081(毫秒). 执行号:1401306.

SQL>

SQL> select from blank1tb01 where letter = 'AA';

行号     LETTER

---------- ------

1          AA

2          AA

3          AA 

已用时间: 1.643(毫秒). 执行号:1401307.

SQL>

SQL> select count(*) from blank1tb01 where letter = 'A';

行号     COUNT(*)           

---------- --------------------

1          0

已用时间: 1.632(毫秒). 执行号:1401308.

SQL> select count(*) from blank1tb01 where letter = 'AA';

行号     COUNT(*)           

---------- --------------------

1          3

已用时间: 2.559(毫秒). 执行号:1401309.

SQL> select count(*) from blank1tb01 where letter = 'AA ';

行号     COUNT(*)           

---------- --------------------

1          3

-- 当BLANK_PAD_MODE=0时,除去group by 这种分组操作时严格区分外,其他比较、count等操作不严格区分'AA'和'AA ','AAA  ',认为这三个字符串是相等的

2.2.2 兼容Oracle模式库

-- 兼容Oracle模式库测试 BLANK_PAD_MODE = 1

[dmdba@openstack ~]$ disql SYSDBA@localhost:5237

服务器[localhost:5237]:处于普通打开状态

登录使用时间 : 3.842(ms)

disql V8

SQL> select blank_pad_mode();

行号     blank_pad_mode()

---------- ----------------

1          1

已用时间: 1.286(毫秒). 执行号:800.

SQL>

SQL> create table blank1tb02 (letter varchar(20));

操作已执行

已用时间: 33.347(毫秒). 执行号:801.

SQL> insert into blank1tb02 values ('AA');

影响行数 1

已用时间: 1.488(毫秒). 执行号:802.

SQL> insert into blank1tb02 values ('AA ');

影响行数 1

已用时间: 0.917(毫秒). 执行号:803.

SQL> insert into blank1tb02 values ('AA  ');

影响行数 1

已用时间: 0.950(毫秒). 执行号:804.

SQL> commit;

操作已执行

已用时间: 8.027(毫秒). 执行号:805.

SQL>

SQL> select count(*) from blank1tb02 group by letter;

行号     COUNT(*)           

---------- --------------------

1          1

2          1

3          1

已用时间: 4.275(毫秒). 执行号:806.

SQL> select from blank1tb02 where letter = 'AA';

行号     letter

---------- ------

1          AA

已用时间: 1.536(毫秒). 执行号:807.

SQL>

SQL> select count(*) from blank1tb02 where letter = 'AA';

行号     COUNT(*)           

---------- --------------------

1          1

已用时间: 1.731(毫秒). 执行号:808.

三、区分字符串结尾空格参数(SPACE_COMPARE_MODE)

space_compare_mode参数是一静态参数,在初始化数据库后可进行修改,修改后需重启数据库,初始化数据库后space_compare_mode默认值是 0。

当SPACE_COMPARE_MODE=0时,除去group by 类似操作严格区分外,其他操作不严格区分。

space_compare_mode 有 0 和 1 两个值。

  • SPACE_COMPARE_MODE = 0  代表维持原有的数据库策略,默认值
  • SPACE_COMPARE_MODE = 1 代表会对结尾空格进行比较

3.1 查询SPACE_COMPARE_MODE参数值

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

行号     PARA_NAME          PARA_VALUE

---------- ------------------ ----------

1          SPACE_COMPARE_MODE 0

已用时间: 14.994(毫秒). 执行号:1401312.

3.2 修改SPACE_COMPARE_MODE参数值

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

行号     PARA_NAME          PARA_VALUE

---------- ------------------ ----------

1          SPACE_COMPARE_MODE 0

已用时间: 14.994(毫秒). 执行号:1401312.

SQL> SP_SET_PARA_VALUE(2,'SPACE_COMPARE_MODE',1);

DMSQL 过程已成功完成

已用时间: 14.816(毫秒). 执行号:1401313.

SQL>

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

行号     PARA_NAME          PARA_VALUE

---------- ------------------ ----------

1          SPACE_COMPARE_MODE 0

已用时间: 13.535(毫秒). 执行号:1401314.

SQL> shutdown immediate;

操作已执行

已用时间: 0.605(毫秒). 执行号:0.

SQL>

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

连接丢失

SQL> startup;

连接丢失

-- 重启数据库

-- 使用root用户

[root@openstack ~]# systemctl start DmServicexxx.service

[root@openstack ~]# su - dmdba

Last login: Tue Nov  8 11:43:28 CST 2022 on pts/4

[dmdba@openstack ~]$ disql sysdba

密码:

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间 : 4.843(ms)

disql V8

SQL> select status$ from v$instance;

行号     STATUS$

---------- -------

1          OPEN

已用时间: 3.948(毫秒). 执行号:1200.

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

行号     PARA_NAME          PARA_VALUE

---------- ------------------ ----------

1          SPACE_COMPARE_MODE 1

已用时间: 15.209(毫秒). 执行号:1201.

3.3 对比测试

3.3.1 当SPACE_COMPARE_MODE=1

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

行号     PARA_NAME          PARA_VALUE

---------- ------------------ ----------

1          SPACE_COMPARE_MODE 0

已用时间: 13.535(毫秒). 执行号:1401314.

SQL>

SQL> create table blank1tb03 (letter varchar(20))

2   ;

操作已执行

已用时间: 35.942(毫秒). 执行号:1202.

SQL> insert into blank1tb03 values ('AA');

影响行数 1

已用时间: 1.357(毫秒). 执行号:1203.

SQL> insert into blank1tb03 values ('AA ');

影响行数 1

已用时间: 1.130(毫秒). 执行号:1204.

SQL> insert into blank1tb03 values ('AA  ');

影响行数 1

已用时间: 0.897(毫秒). 执行号:1205.

SQL> commit;

操作已执行

已用时间: 5.474(毫秒). 执行号:1206.

SQL>

SQL> select from blank1tb03 where letter = 'AA';      

行号     LETTER

---------- ------

1          AA

已用时间: 1.858(毫秒). 执行号:1207.

SQL> select from blank1tb03 where letter = 'AA ';

行号     LETTER

---------- ------

1          AA

已用时间: 1.318(毫秒). 执行号:1208.

SQL> select from blank1tb03 where letter = 'AA  ';

行号     LETTER

---------- ------

1          AA 

已用时间: 1.548(毫秒). 执行号:1209.

SQL>

SQL> select count(*) from blank1tb03 where letter = 'AA';

行号     COUNT(*)           

---------- --------------------

1          1

已用时间: 1.550(毫秒). 执行号:1210.

SQL> select count(*) from blank1tb03 where letter = 'AA ';

行号     COUNT(*)           

---------- --------------------

1          1

已用时间: 1.625(毫秒). 执行号:1211.

SQL> select count(*) from blank1tb03 where letter = 'AA  ';

行号     COUNT(*)           

---------- --------------------

1          1

已用时间: 1.640(毫秒). 执行号:1212.

3.3.2 当SPACE_COMPARE_MODE=0

[root@openstack ~]# systemctl restart DmServicexxx.service

[root@openstack ~]# su - dmdba

Last login: Tue Nov  8 14:46:11 CST 2022 on pts/0

[dmdba@openstack ~]$ disql sysdba

密码:

服务器[LOCALHOST:5236]:处于普通打开状态

登录使用时间 : 4.892(ms)

disql V8

SQL> select para_name,para_value from v$dm_ini where para_name='SPACE_COMPARE_MODE';

行号     PARA_NAME          PARA_VALUE

---------- ------------------ ----------

1          SPACE_COMPARE_MODE 0

已用时间: 18.481(毫秒). 执行号:900.

SQL> create table blank1tb04 (letter varchar(20));

操作已执行

已用时间: 43.372(毫秒). 执行号:901.

SQL> insert into blank1tb04 values ('AA');

影响行数 1

已用时间: 1.844(毫秒). 执行号:902.

SQL> insert into blank1tb04 values ('AA ');

影响行数 1

已用时间: 1.082(毫秒). 执行号:903.

SQL> insert into blank1tb04 values ('AA  ');

影响行数 1

已用时间: 1.154(毫秒). 执行号:904.

SQL>

SQL> commit;

操作已执行

已用时间: 7.854(毫秒). 执行号:905.

SQL>

SQL> select from blank1tb04 where letter = 'AA';

行号     LETTER

---------- ------

1          AA

2          AA

3          AA 

已用时间: 1.493(毫秒). 执行号:906.

SQL> select from blank1tb04 where letter = 'AA ';

行号     LETTER

---------- ------

1          AA

2          AA

3          AA 

已用时间: 1.656(毫秒). 执行号:907.

SQL>

SQL> select from blank1tb04 where letter = 'AA  ';

行号     LETTER

---------- ------

1          AA

2          AA

3          AA 

已用时间: 1.913(毫秒). 执行号:908.

SQL>

SQL> select count(*) from blank1tb04 where letter = 'AA';

行号     COUNT(*)           

---------- --------------------

1          3

已用时间: 1.422(毫秒). 执行号:909.

SQL> select count(*) from blank1tb04 where letter = 'AA ';

行号     COUNT(*)           

---------- --------------------

1          3

已用时间: 1.838(毫秒). 执行号:910.

SQL> select count(*) from blank1tb04 where letter = 'AA  ';

行号     COUNT(*)           

---------- --------------------

1          3

已用时间: 1.984(毫秒). 执行号:911.

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐