文章目录
  1. 1. mysql数据库迁移到达梦数据库记录
    1. 1.1. 达梦环境准备
    2. 1.2. mysql数据库准备
    3. 1.3. 达梦dts工具环境准备
      1. 1.3.1. 将mysql数据迁移到linux环境的达梦数据库
      2. 1.3.2. 将mysql中的表导出为sql
      3. 1.3.3. 使用开源迁移工具进行数据迁移
    4. 1.4. 使用DBSwitch迁移upms
    5. 1.5. 迁移达梦数据库表时遇到的问题与解决方案
      1. 1.5.1. 日期格式问题导致无法迁移成功
      2. 1.5.2. 中文乱码问题
    6. 1.6. mysql定义数据库表结构与sql注意事项

mysql数据库迁移到达梦数据库记录

达梦环境准备

  1. 初始化数据库,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
    
  2. 注册服务,服务类型为: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)完成

  1. 如有其它dm数据库实例注册,使用以下命令设置

     cd /dm8/tool
     ./dbca.sh
    
  2. 启动数据库

    systemctl start DmServiceDMSERVER.service

  3. 查看数据库启动状态

     systemctl status DmServiceDMSERVER.service
    
  4. 作用disql登陆

     ./disql SYSDBA/SYSDBA@192.168.0.88:5237
    
  5. 查询兼容模式

     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.
  1. 将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.

  1. 创建目标用户和目标表空间

从 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数据库准备

  1. 查询upms占用数据物理大小

    SELECT
    concat( round( sum( data_length / 1024 / 1024 ), 2 ), ‘MB’ ) AS DATA
    FROM
    TABLES
    WHERE
    table_schema = ‘upms’

  2. 查询upms中所有表数量

SELECT count(*) TABLES, table_schema FROM information_schema.TABLES
where table_schema = ‘upms’ GROUP BY table_schema;

  1. 归档待迁移表数据,用于检查迁移正确性
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上执行,需要改几个地方:

  1. 需要加上schema
  2. 将别名的特殊字符改为英文双引号
  3. 不能将自增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**

并作如下修改:

  1. 修复mysql迁移到达梦数据库字符串字段长度问题的bug
  2. 修复中文乱码问题
  3. 修复int类型溢出问题
  4. 将jdk8升级到jdk11
  5. 将mysql5.7升级到mysql8.0.30
  6. 修改镜像打包脚本与运行,适配支持M1芯片的arm64架构

https://gitee.com/huguiqifk/dbswitch

使用DBSwitch迁移upms

使用dbeaver数据库客户端连接达梦数据库

迁移达梦数据库表时遇到的问题与解决方案

日期格式问题导致无法迁移成功

**官方dts方式迁移不可用: 将原datetime类型迁出为字符串类型,但此方式通过dts工具迁移出来的数据变成了不规则的未格式化的日期类型,导出后也不可用 **

只能将数据导出成sql语句,进行修改;

中文乱码问题

主要由两个问题导致:

  1. MySQL 用的是 UTF8MB4 字符集,迁移到 DM 数据库后中文乱码,DM 数据库目前不支持 UTF8MB4, 需要将UTF8MB4字符集换成UTF8
  2. 由于在达梦数据库中,UTF8字符集中,迁移过来的char或者varchar字段的值都会扩大到原来的3倍,即原来大小是50的,迁移到dm8数据库里,就占用3*150

所以在目标数据库建表语句中,对varchar和char都要乘以3

mysql定义数据库表结构与sql注意事项

  1. 自增id必须定义为bigInt
  2. Mapper.xml里定义的sql,都需要加上数据库前缀
  3. sql查询中不要使用函数
  4. 日期类型不允许值为0000-00-0000,取值范围为: ‘00:00:00.000000’和’9999-12-31 23:59:59.999999’
  5. 在表中不要同一字段建多个索引
  6. dm数据库不支持字符集为UTF8MB4,所以表字符集要改成UTF8
文章目录
  1. 1. mysql数据库迁移到达梦数据库记录
    1. 1.1. 达梦环境准备
    2. 1.2. mysql数据库准备
    3. 1.3. 达梦dts工具环境准备
      1. 1.3.1. 将mysql数据迁移到linux环境的达梦数据库
      2. 1.3.2. 将mysql中的表导出为sql
      3. 1.3.3. 使用开源迁移工具进行数据迁移
    4. 1.4. 使用DBSwitch迁移upms
    5. 1.5. 迁移达梦数据库表时遇到的问题与解决方案
      1. 1.5.1. 日期格式问题导致无法迁移成功
      2. 1.5.2. 中文乱码问题
    6. 1.6. mysql定义数据库表结构与sql注意事项