安装
1、图形化安装
参照:https://eco.dameng.***/document/dm/zh-***/pm/install-uninstall.html#2.2.2.1%20%E5%9B%BE%E5%BD%A2%E5%8C%96%E5%AE%89%E8%A3%85
2、静默安装
输入命令:./DMInstall.bin -q 配置文件全路径
配置文件模板:https://eco.dameng.***/document/dm/zh-***/pm/dm8-appendix.html#5.2%20%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A8%A1%E6%9D%BF
3、命令行安装
参照:https://eco.dameng.***/document/dm/zh-***/pm/install-uninstall.html#2.2.2.2%20%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%AE%89%E8%A3%85
数据库工具介绍
DM管理工具
通过以下命令进入管理工具
[dmdba@localhost ~]$ cd /home/dmdba/dmdbms/tool/
[dmdba@localhost tool]$ ll
[dmdba@localhost tool]$ ./manager
对表空间、用户、模式的理解:
表空间就相当于是数据库,用户关联表空间,模式是被用户所拥有,每个用户有一个默认的同名的模式,访问自己模式下的表不需要加模式名,访问其他模式下的对象需要拥有访问权限,访问时还需加上模式名,且模式是表空间的一个映射,对表的操作都在模式中进行,表空间对模式是一对多的关系,如果没有建立表空间直接创建模式就会默认是SYSDBA
创建数据库流程
- 先建立一个表空间,
- 然后创建一个用户,设置用户名和密码,再授予权限,权限是可以对某个表空间进行操作,
- 再将用户和表空间绑定,
- 后续在模式下创建、修改、查看表等操作
DM数据迁移工具
进入tool文件夹中(同上)运行命令:
[dmdba@localhost tool]$ ./dts
1.新建工程
点击新建工程,输入工程名即可
2.新建迁移
3.填写数据源和目的源
url和驱动选择默认的即可
4.勾选迁移选项
5.指定迁移的模式
勾选创建模式他就会创建一个同名的模式名,也可以自行更改模式名
6.指定对象(即迁移的表)
7.通过预览可查看中文是否乱码
8.正常后点击下一步完成
9.迁移完成后可查看迁移报告
适配达梦后遇到的问题
1.基本差异
| MySQL | 达梦 | 说明 | |
|---|---|---|---|
| 反引号 `` | 支持 | 不支持 | 改成双引号"";若开启 CASE_SENSITIVE=1,则双引号也不允许,只能改别名 |
| 双引号 | 字符串常量 | 仅允许标识符 | 字符串统一用单引号 ’ ’ |
| 注释位置 | 可以在sql语句后面直接加 | 列级 ***ment 不支持 | 要单独出来,拆成 ***MENT ON TABLE/COLUMN IS 语句 |
| 字符集 | 可以在建表语句中指定 | 建表语句不能指定 | 在服务安装时选择字符集规范 |
2.数据迁移中文出现乱码问题
原因是原数据的字符集和现在的 DM 数据初始化的字符集不一致
例如:MySQL 用的是 UTF8MB4 字符集,迁移到 DM 数据库后中文乱码,DM 数据库目前不支持 UTF8MB4。但UTF8是可以的
3.数据类型和长度
char:
问题: 老版本的DTS工具从 MySQL 迁移到 DM,char 长度是原来的 3 倍,(新版本已修复)
从 MySQL 移植达梦,char 类型在 MySQL 不会自动空格补齐,达梦会自动空格补齐。可能会导致查询过程中不会自动过滤 char 类型中的空格,查询不到数据;
解决方案:
1、在数据迁移时,映射 char 类型为 varchar 类型;
2、通过 rtrim 函数把数据右边的空格清除掉
update 表名 set 列名1=rtrim(列名1);
varchar:
问题: MySQL中 varchar(1) 可以存一个汉字,DM 数据库是以字节为单位;达梦中 gb18030 字符集,varchar(2) 才可以存一个汉字;UTF-8 字符集,varchar(3) 才可以存一个汉字
解决方案: 将对应的字段类型修改为 varchar(32 char)(32 为实际 mysql 字段长度)。这样 DM 中实际存储的中文字符长度与 MYSQL 是一致的。
CREATE TABLE "KAUSB_TEST"."user"
(
"uid" VARCHAR(32 CHAR) NOT NULL,
"user_name" VARCHAR(255 CHAR) NOT NULL,
"password" VARCHAR(255) NOT NULL, --实际长度只有85
...
时间类型:
在 MySQL 中时间类型 TIMESTAMP 默认 default 设置为“0000-00-00 00:00:00”,而在 DM 中 TIMESTAMP 类型数据必须在 ‘0001-01-01 00:00:00.000000’ 到 '9999-12-31 23:59:59.999999’之间,“0000-00-0000:00:00”在 DM 中是不合法的
4.自增AUTO_INCREMENT:
问题: 在 MySQL 表结构默认值使用 AUTO_INCREMENT 函数来做自增长,达梦不支持,会报错
解决方案: 达梦数据库当前通过 IDENTITY(1,1)函数设置自增长,等效于 mysql 的 AUTO_INCREMENT
CREATE TABLE "KAUSB_TEST"."log_terminal"
(
"id" INT IDENTITY(1, 1) NOT NULL,
...
5.迁移 user 表到达梦后,无法查询表内容和插入数据:
USER 在 DM 数据库中属于关键字,在进行 SQL 查询时,需要用双引号括起来。
在插入语句失败时,需要检查表结构,了解是否含有自增列等特殊定义的字段。
除此之外,还有top、domain、***ment等,可以通过SELECT * FROM V$RESERVED_WORDS进行查询
若名称无法修改,用双引号包裹标识符或在 dm.ini 的 EXCLUDE_RESERVED_WORDS 参数中屏蔽对应关键字
6.聚合函数:
MySQL中用GROUP_CONCAT函数将多行数据合并成一行
SELECT GROUP_CONCAT(name ORDER BY id SEPARATOR ', ')
FROM users
GROUP BY department_id;
而达梦中没有此函数,需用LISTAGG代替
SELECT LISTAGG(name, ' ') WITHIN GROUP (ORDER BY id)
FROM users
GROUP BY department_id;
SELECT WM_CONCAT(name) -- 旧版本兼容
FROM users
GROUP BY department_id;
7.GROUP BY分组列:
分组列不能为集函数表达式或者在 SELECT 子句中定义的别名:
<select id="statistic3" resultType="java.util.Map">
SELECT port_position, TO_CHAR(create_time, 'YYYY-MM-DD') ym, count(1) num
FROM log_apply_permission
WHERE TO_CHAR(create_time, 'YYYY-MM-DD') BETWEEN #{startTime} AND #{endTime}
<if test="forwardList != null">
AND forward_program_uid in
<foreach collection="forwardList" item="uid" open="(" separator="," close=")">
#{uid}
</foreach>
</if>
GROUP BY port_position, TO_CHAR(create_time, 'YYYY-MM-DD') <!-- 这里不能用 ym 别名 -->
</select>
8.模糊查询不能省略ESCAPE:
在MySQL中可以不写ESCAPE,但是达梦中不能省略
SELECT * FROM "USER" where user_name LIKE '%operator\_%' escape '\'
9.代替MySQL的uuid()函数的是sys_guid:
达梦原生支持生成 UUID 的函数是 SYS_GUID()。两个函数都是生成一个全局唯一标识符,但MySQL返回的数据会有-,达梦没有
-- mysql
INSERT INTO secure_platform_assets (uid, object_uid, assets_status, create_time)
VALUES (REPLACE(uuid(), '-', ''), null,'1','1',now());
-- 达梦
INSERT INTO secure_platform_assets (uid, object_uid, assets_status, create_time)
VALUES (sys_guid(), null,'1','1',now());
10.不支持change修改列名:
达梦中用rename to来修改,且后面不能直接跟数据类型
--mysql
ALTER TABLE device_register CHANGE COLUMN device_register_forward_uid forward_uid varchar(32)
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL ***MENT '设备注册站点' AFTER device_register_forward;
--达梦
ALTER TABLE device_register rename COLUMN device_register_forward_uid to forward_uid;
ALTER TABLE device_register MODIFY forward_uid VARCHAR(32);
11.返回值为整数转为BigDecimal
达梦查询返回后,Mybatis会将其映射为BigDecimal类型,而MySQL映射的为Integer类型,所以需要加CAST(... AS BIGINT)防止抛出抛 ClassCastException 异常
SELECT forward_auth,
CASE
WHEN uuid_serial_number = #{uuidSerialNumber} THEN 1
WHEN uuid_serial_number = #{pidVidSerialNumber} THEN 2
ELSE 0
END AS checkSerialNumber,
FROM device_register WHERE uuid_serial_number = '111'
--达梦需要转换
cast(
CASE
WHEN uuid_serial_number = #{uuidSerialNumber} THEN 1
WHEN uuid_serial_number = #{pidVidSerialNumber} THEN 2
ELSE 0
END AS BIGINT) AS checkSerialNumber,
...
12.不是group by表达式
group by子句中需要包含所有查询列,聚合函数除外
SELECT user_name,last_login_ip,SUM(type)
FROM "user"
GROUP BY user_name,last_login_ip --和上面的列保持一致
Tips:更多问题可以参照达梦的官方论坛和迁移问答
参考文献:https://eco.dameng.***/document/dm/zh-***/pm/index.html