目前去O很热,在考虑从Oracle迁移到其它数据库时,达梦数据库确实是一款很适合的数据库,之前曾和一个业界大佬沟通过,其迁移了很多Oracle数据库到达梦,据其反馈,达梦数据库对Oracle的兼容性是最强,很多在Oracle上执行的SQL可以直接在达梦数据库上执行。
目前我司也在进行去O的项目,为此我也抽出时间好好研究了下达梦数据库,并做了Oracle到达梦的迁移测试,但从Oracle迁移到达梦,特别是在初始化达梦数据库时,有些特别要注意的地方,特别是一些参数的设置,这些参数关系着迁移的成败。
在DM初始化数据库时,有几个参数需特别注意,一旦设置,初始化数据库后很难或者无法改变,以下将通过测试例子来分析这几个参数。
上周在做Oracle迁移数据到达梦数据库时,就因为初始化数据库时一些参数没有设置好,导致数据迁移出现问题。
CASE_SENSITIVE有 0 和 1 两个值,分别代表不同含义。
另外,在使用disql查询工具进行查询时,默认会将小写转为大写。
-- 查询
[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) 大小写敏感数据库测试记录
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.
-- 大小写敏感库测试记录
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参数有 0 和 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.
-- 不兼容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等操作不严格区分。
-- 兼容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默认值是 0。
当SPACE_COMPARE_MODE=0时,除去group by 类似操作严格区分外,其他操作不严格区分。
space_compare_mode 有 0 和 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
已用时间: 14.994(毫秒). 执行号:1401312.
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.
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.
[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.
文章
阅读量
获赞