mysql数据库迁移到达梦数据库记录
mysql数据库迁移到达梦数据库记录
达梦环境准备
初始化数据库,mysql 迁移到dm,page_size设置为16,大小写不敏感(COMPATIBLE_ MODE=4为表态参数,不能初始化指定)
./dminit path=/dm8/data PAGE_SIZE=16 EXTENT_SIZE=16 CASE_SENSITIVE=n CHARSET=1 DB_NAME=DMDB INSTANCE_NAME=DBSERVER PORT_NUM=5237
注册服务,服务类型为:dmserver,服务名为:DMSERVER
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DMDB/dm.ini -p DMSERVER
执行后返回:
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMSERVER.service to /usr/lib/systemd/system/DmServiceDMSERVER.service.
创建服务(DmServiceDMSERVER)完成
如有其它dm数据库实例注册,使用以下命令设置
cd /dm8/tool ./dbca.sh
启动数据库
systemctl start DmServiceDMSERVER.service
查看数据库启动状态
systemctl status DmServiceDMSERVER.service
作用disql登陆
./disql SYSDBA/SYSDBA@192.168.0.88:5237
查询兼容模式
SELECT para_name,para_type,para_value FROM V$DM_INI WHERE PARA_NAME ='COMPATIBLE_MODE';
返回:
LINEID para_name para_type para_value ---------- --------------- --------- ---------- 1 COMPATIBLE_MODE IN FILE 0 used time: 7.267(ms). Execute id is 57800.
- 将COMPATIBLE_MODE改为兼容mysql的模式
sp_set_para_value(2,’compatible_mode’,4);
由于需要重启才生效,重启下数据库:
systemctl restart DmServiceDMSERVER.service
再次查询返回:
SQL> SELECT para_name,para_type,para_value FROM V$DM_INI WHERE PARA_NAME =’COMPATIBLE_MODE’;
LINEID para_name para_type para_value
1 COMPATIBLE_MODE IN FILE 4
used time: 9.265(ms). Execute id is 500.
- 创建目标用户和目标表空间
从 MySQL 移植到 DM,要求先创建好待使用的用户和这个用户的表空间, 不要把数据移植到系统默认的管理员 SYSDBA 用户下和 MAIN 表空间下。
创建upms表空间,初始大小为32M, 每次自动扩展28M,最大可扩展到一个384M:
pageSize:16
create tablespace “UPMS” datafile ‘/dm8/data/DMDB/UPMS.DBF’ size 64 autoextend on next 28 maxsize 384;
Pagesize:32
create tablespace "UPMS" datafile '/dm8/data/DMDB2/UPMS.DBF' size 128 autoextend on next 28 maxsize 384;
创建用户upms,并关联表空间:
create user "UPMS" identified by "upmstest001" password_policy 0
default tablespace "UPMS"
default index tablespace "UPMS";
授权:
grant "DBA","PUBLIC","RESOURCE","SOI","SVI","VTI" to "UPMS";
CREATE SCHEMA “UPMS” AUTHORIZATION “UPMS”;
mysql数据库准备
查询upms占用数据物理大小
SELECT
concat( round( sum( data_length / 1024 / 1024 ), 2 ), ‘MB’ ) AS DATA
FROM
TABLES
WHERE
table_schema = ‘upms’
查询upms中所有表数量
SELECT count(*) TABLES, table_schema FROM information_schema.TABLES
where table_schema = ‘upms’ GROUP BY table_schema;
- 归档待迁移表数据,用于检查迁移正确性
insert into MySQLs_tables select 'upms' as table_owner,table_name,table_rows from information_schema.TABLES where TABLE_SCHEMA = 'upms' order by table_rows desc;
select * from MySQLs_tables;
达梦dts工具环境准备
由于dts工具是图形化界面,达梦没有提供命令行工具,只能通过桌面端centos打开或者windows平台打开。参照达梦官网文档
如果达梦数据库服务器是linux操作系统(无界面端),要将数据从mysql批量转到达梦数据库,就比较麻烦。
将mysql数据迁移到linux环境的达梦数据库
将mysql中的表导出为sql
** 不要跟我说用他们的dts迁移工具,经过长时间测试与使用,此dts工具极其难用,而且bug极多,文档极少,完全没法用!!!!**
所以只能通过笨办法,将sql导出,通过sql进行迁移。
通过navicat-mysql客户端导出的sql文件无法直接放到dm8上执行,需要改几个地方:
- 需要加上schema
- 将别名的特殊字符改为英文双引号
- 不能将自增id进行显示的插入
🕊️如下:
INSERT INTO "UPMS"."application_menu" ("identity", "application_identity", "name", "permission", "display_name", "icon", "category", "parent_identity", "url", "router_name", "router_path", "router_level", "corner_mark", "url_type", "open_mode", "sort", "status", "remark", "create_time", "update_time", "delete_flag") VALUES ( 116111481001, 116111484, '经营主体信息', 'jyzhtxx', '农场信息', '1', 1, -1, '11', NULL, NULL, NULL, NULL, 1, 1, 1, 1, NULL, '2022-11-23 10:45:03', '2022-11-23 10:45:03', 0);
INSERT INTO "UPMS"."application_menu" ("identity", "application_identity", "name", "permission", "display_name", "icon", "category", "parent_identity", "url", "router_name", "router_path", "router_level", "corner_mark", "url_type", "open_mode", "sort", "status", "remark", "create_time", "update_time", "delete_flag") VALUES ( 116111481002, 116111484, '疏菜标准园', '12323', '疏菜标准园', '1', 1, -1, '111', NULL, NULL, NULL, NULL, 1, 1, 1, 1, NULL, '2022-11-23 10:45:27', '2022-11-23 10:45:34', 0);
INSERT INTO "UPMS"."application_menu" ("identity", "application_identity", "name", "permission", "display_name", "icon", "category", "parent_identity", "url", "router_name", "router_path", "router_level", "corner_mark", "url_type", "open_mode", "sort", "status", "remark", "create_time", "update_time", "delete_flag") VALUES ( 116111481003, 116111484, '查看', 'CK', '查看', '1', 3, 147364010, '11', NULL, NULL, NULL, NULL, 1, 1, 1, 1, NULL, '2022-11-23 10:45:49', '2022-11-23 10:45:49', 0);
COMMIT;
使用开源迁移工具进行数据迁移
fork自**inrgihc**
并作如下修改:
- 修复mysql迁移到达梦数据库字符串字段长度问题的bug
- 修复中文乱码问题
- 修复int类型溢出问题
- 将jdk8升级到jdk11
- 将mysql5.7升级到mysql8.0.30
- 修改镜像打包脚本与运行,适配支持M1芯片的arm64架构
https://gitee.com/huguiqifk/dbswitch
使用DBSwitch迁移upms
迁移达梦数据库表时遇到的问题与解决方案
日期格式问题导致无法迁移成功
**官方dts方式迁移不可用: 将原datetime类型迁出为字符串类型,但此方式通过dts工具迁移出来的数据变成了不规则的未格式化的日期类型,导出后也不可用 **
只能将数据导出成sql语句,进行修改;
中文乱码问题
主要由两个问题导致:
- MySQL 用的是 UTF8MB4 字符集,迁移到 DM 数据库后中文乱码,DM 数据库目前不支持 UTF8MB4, 需要将UTF8MB4字符集换成UTF8
- 由于在达梦数据库中,UTF8字符集中,迁移过来的char或者varchar字段的值都会扩大到原来的3倍,即原来大小是50的,迁移到dm8数据库里,就占用3*150
所以在目标数据库建表语句中,对varchar和char都要乘以3
mysql定义数据库表结构与sql注意事项
- 自增id必须定义为bigInt
- Mapper.xml里定义的sql,都需要加上数据库前缀
- sql查询中不要使用函数
- 日期类型不允许值为0000-00-0000,取值范围为: ‘00:00:00.000000’和’9999-12-31 23:59:59.999999’
- 在表中不要同一字段建多个索引
- dm数据库不支持字符集为UTF8MB4,所以表字符集要改成UTF8