:::info
参考链接:
https://eco.dameng.com/document/dm/zh-cn/start/mysql_dm.html#2.2.6%20%E7%A7%BB%E6%A4%8D%E5%AE%9E%E6%96%BD
https://eco.dameng.com/document-preview/dm/zh-cn/start/dm-create-tablespace
:::
:::info
window 安装达梦工具:https://www.yuque.com/heyyall/zwitgw/xgmleg1ag6y15prx?singleDoc
(如果 linux 安装达梦数据库,并且支持可视化界面那么就不需要安装)
迁移使用工具:DM数据迁移工具
:::
从语雀写好导入的,格式有点错乱,语雀链接:https://www.yuque.com/heyyall/zwitgw/tzt3t8zy0m3nsigo?singleDoc# 《MySQL 5.7.27 迁移 DM 8》
迁移前对象统计
- 统计指定库中表的数目
SELECT COUNT(*) TABLES, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '数据库名称' GROUP BY TABLE_SCHEMA;
- 统计指定库中视图的数目
SELECT TABLE_SCHEMA,COUNT(*) VIEWS FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = '数据库名称' GROUP BY TABLE_SCHEMA;
- 统计指定库中所有的存储过程
SELECT SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE='PROCEDURE' AND ROUTINE_SCHEMA='数据库名称';
- 统计指定库中所有的函数
SELECT SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE='FUNCTION' AND ROUTINE_SCHEMA='数据库名称';
- 统计指定库中所有的触发器
SELECT TRIGGER_SCHEMA,TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA= '数据库名称';
- 将指定库中所有表数据量记录到辅助表
CREATE TABLE MYSQL_TABLES(TAB_OWNER VARCHAR(100),TAB_NAME VARCHAR(100),TAB_COUNT INT);
INSERT INTO MYSQL_TABLES SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '数据库名称' ORDER BY TABLE_ROWS DESC;
迁移评估
官网中用的是 达梦企业管理器 DEM,但是 DM 数据迁移工具中也可以评估
- 创建评估
- 填写数据源(源数据库)
- 填写达梦数据源(目的数据库)
- 选择评估的项目
- 指定要评估的数据库模式,勾选 MySQL 中需要迁移的库进行评估。
- 选择 MySQL 库中具体需要评估的对象(表)
- 确认评估任务后开始评估
- 查看评估报告
- 点击评估概述,查看是否有不兼容的情况
不兼容情况
没处理过,官方给出的建议是:通过迁移评估可以将 DM 数据库不兼容的部分先整理出来,使用 DM 语法进行手动修改,在正式迁移时不兼容的对象就不使用工具进行迁移,待其它对象迁移完成后再将修改好的对象导入到 DM 数据库中。
迁移前准备
:::info
官网:MySQL 的体系架构是单实例多库,DM 数据库是单库多实例的架构,MySQL 可能是一个 root 用户访问多个库,访问前切换一下当前库即可。从 MySQL 迁移到达梦的时候就需要针对 MySQL 中的每一个库在达梦里面创建一个用户和表空间来对应。例如 MySQL 中有一个库 dbtest,达梦里面先创建一个表空间 dbtest,然后创建一个用户 DBTEST,指定默认表空间为 dbtest
:::
:::info
官网:在做 MySQL 迁移的时候要先分析本次迁移需要从源库中移植哪一个库或者哪几个库的数据,然后为每一个库分别在达梦中创建独立的表空间和用户
:::
建议:用户名,表空间名,索引空间名都为大写,并保持一致,要不然可能迁移的时候报各种各样的错,有时候可能还很懵
创建用户表空间
个人理解: 物理存储容器
:::info
官网:https://eco.dameng.com/document-preview/dm/zh-cn/start/dm-create-tablespace
:::
创建 DBTEST 表空间存储 MySQL 中 dbtest 库迁移过来的数据
-- 创建表空间dbtest,数据文件为DBTEST.DBF。
create tablespace "dbtest" datafile '/data/dmdata/DAMENG/DBTEST.DBF' size 2048 ;
:::info
注意:达梦数据库的数据文件在空间不足时自动增长,每次自动增长的大小和表空间空间上限可以自己设置,那如果说超过扩展上限就会导致表空间不足(可能会出现插入数据失败的情况)
:::
创建用户并授予权限
相关文档:
DM8安全管理.pdf
创建 DBTEST 用户并授予权限,使用 dbtest 表空间。
-- 创建用户
create user "DBTEST" identified by "密码"
-- 指定用户DBTEST表空间为dbtest
default tablespace "dbtest"
-- 指定用户DBTEST索引表空间为dbtest
default index tablespace "dbtest";
-- 授予用户DBTEST常规权限
grant "PUBLIC","RESOURCE","SOI","SVI","VTI" to "DBTEST";
迁移
- 新建迁移
- 选择迁移方式
- 填写数据源信息(源数据库)
-
填写达梦数据库信息(目的数据库)
:::info
注意:这里登录的用户信息要使用新建的用户
:::
-
选择迁移选项
- 选择要迁移的数据库
-
选择要迁移的表
:::info
官网建议:通过迁移评估可以将 DM 数据库不兼容的部分先整理出来,使用 DM 语法进行手动修改,在正式迁移时不兼容的对象就不使用工具进行迁移,待其它对象迁移完成后再将修改好的对象导入到 DM 数据库中。
:::
-
自定义对象迁移策略
建议在转换中,先进行表,再进行迁移数据,这样能避免一些报错,可以看下面的小建议
- 点击完成,开始迁移
点击下一步 -> 点击完成
迁移小建议
-
建议先迁移表再迁移数据,有些报错通过这种分开迁移的方式可以避免
:::info
官方:如果数据数据量较大,可以选择先迁移表结构定义相关内容,再迁移数据,最后迁移索引。大字段建议单独迁移,且迁移大字段时建议把一次读取和一次提交的值调小,一般在20或以下效率可能会更好,设置较大值时迁移效率较低。
:::- 迁移表和索引
注意:需要勾选启用标志列插入,要不然会出现一种情况就是,自增主键和 mysql 数据库的不一样
- 迁移数据
统计达梦迁移后的数据
- 统计达梦数据库中相关用户的对象数
# OWNER 后面要替换成自己的用户名
SELECT OBJECT_TYPE,COUNT(*) FROM ALL_OBJECTS WHERE OWNER='USER_NAME' GROUP BY OBJECT_TYPE;
- 统计 MySQL 迁移过来的表的数据量并记录到辅助表
CREATE TABLE DM_TABLES
(
TAB_OWNER VARCHAR(100),
TAB_NAME VARCHAR(100),
TAB_COUNT INT
);
DECLARE BEGIN FOR REC IN
(SELECT OWNER,
OBJECT_NAME
FROM ALL_OBJECTS
WHERE OWNER='USER_NAME'
AND OBJECT_TYPE='TABLE'
)
LOOP
EXECUTE IMMEDIATE 'INSERT INTO DM_TABLES SELECT '''|| REC.OWNER ||''','''|| REC.OBJECT_NAME ||''',COUNT(*) FROM '|| REC.OWNER || '.' || REC.OBJECT_NAME;
END LOOP;
END;
数据对比
- 对象对比
对比迁移前 mysql 查出来的数据,看对不对得上,表有可能会多一个,因为最后面手动添加了一张 mysql 的信息表
- 数据对比
:::info
官方:通过以下 SQL 命令可以比对表数据量,找出数据量不相等的表重新迁移数据,结果集为空表示源端和目的端数据量一致。其中 MYSQL_TABLES 为 MySQL 迁移前统计的记录所有表数据量的辅助表,DM_TABLES 为 DM 数据库中记录表数据量的辅助表。
:::
# 注意如果没有这张表 MYSQL_TABLES,可以看一下迁移前准备的语句是不是没有执行,
# 其次看一下是不是表名大小写不一致
SELECT A.TAB_OWNER,
A.TAB_NAME,
A.TAB_COUNT-B.TAB_COUNT
FROM MYSQL_TABLES A,
DM_TABLES B
WHERE A.TAB_OWNER=B.TAB_OWNER
AND A.TAB_NAME=B.TAB_NAME
AND A.TAB_COUNT-B.TAB_COUNT<>0;
补充外键约束
如果有就补充回达梦数据库
# 找出数据库名中表用到的外键约束
SELECT
TABLE_NAME,COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '数据库名'
AND REFERENCED_TABLE_NAME IS NOT NULL
查看某个表中的外键约束
show create table 表名;
# 类似于下面这一条的就是外键约束,关键字:FOREIGN KEY
CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`)
添加外键约束(达梦)
# 添加外键约束的命令
alter table "模式"."表" add constraint 约束名 foreign key ("外键列名") references "主表名" ("主键列名");