注册
【与达梦同行】Oracle迁移至达梦数据库初始化数据库需特别注意的一些参数
技术分享/ 文章详情 /

【与达梦同行】Oracle迁移至达梦数据库初始化数据库需特别注意的一些参数

尚雷 2022/12/28 3206 2 2

目前去O很热,在考虑从Oracle迁移到其它数据库时,达梦数据库确实是一款很适合的数据库,之前曾和一个业界大佬沟通过,其迁移了很多Oracle数据库到达梦,据其反馈,达梦数据库对Oracle的兼容性是最强,很多在Oracle上执行的SQL可以直接在达梦数据库上执行。

目前我司也在进行去O的项目,为此我也抽出时间好好研究了下达梦数据库,并做了Oracle到达梦的迁移测试,但从Oracle迁移到达梦,特别是在初始化达梦数据库时,有些特别要注意的地方,特别是一些参数的设置,这些参数关系着迁移的成败。

在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等操作不严格区分。
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.
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服