本文主要介绍通过dts工具迁移mysql的数据到达梦
准备工作
- mysql数据库(本文中的mysql采用docker部署),需要造一点数据
- dm数据库
- dts迁移工具
拓展:
docker 的端口映射
- 还没启动容器,启动时加上 -p 直接指定
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dmdba123 -v /opt/mysql/data:/var/lib/mysql --name mysql mysql:8.0.28
ps:本处加上 -v 挂载数据库数据目录文件夹,防止容器删除后数据丢失
- 已经启动容器,修改容器的配置文件
# 进入到对应容器的配置文件目录
docker inspect mysql |grep Id
cd /var/lib/docker/containers/"容器Id"
# 停止对应的容器
docker stop mysql
systemctl stop docker
# 修改hostconfig.json的文件
vi hostconfig.json
# 启动容器
systemctl start docker
docker start mysql
踩坑:
本地windows环境监听不到服务器的3306端口,检查了服务器的防火墙和安全组配置,没有问题,本地windows可以监听到其他端口如5236,其他服务器也能访问此服务器的3306端口;暂时没有找到原因。
临时解决方法:
用其他端口代替了3306端口,避开了此问题,本文采用9450端口作为mysql数据端口。
xhost
xhost 是一个用于控制 X 服务器访问控制的命令行工具,X 服务器是一种用于图形用户界面的基础架构,允许程序在图形环境下运行
linux 可以通过xhost + 运行dts工具。
本文在windows环境下操作
数据迁移
-
在windows界面,解压dm数据库的压缩包,进入source/tool目录,找到dts工具并运行
-
新建项目并新建迁移
按照图形化界面提示进行操作,依次输入mysql的连接信息、dm的连接信息,选定要迁移的库、表,最后一步如下图所示
迁移完成后可以连接 dm 客户端进行数据查看
数据校验
在 mysql 端查询数据信息
SQL> SELECT COUNT(*) TABLES, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES group by TABLE_SCHEMA;
SQL> SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' ORDER BY TABLE_ROWS DESC;
在 dm 端查询数据信息
SQL> SELECT OBJECT_TYPE,COUNT(*) FROM ALL_OBJECTS WHERE OWNER='test' GROUP BY OBJECT_TYPE;
两者结果进行比对,若正确,则需更新 dm 的统计信息
统计信息更新
- 通过模式名进行更新
SQL> DBMS_STATS.GATHER_SCHEMA_STATS(
'test', --test 为模式名,需要根据实际情况修改为自己的模式名。
100,
FALSE,
'FOR ALL COLUMNS SIZE AUTO');
- 通过表名进行更新
SQL> DBMS_STATS.GATHER_TABLE_STATS(
'test',--模式名
'Users',--表名
null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
踩坑:
oracle 中对象(如表、列、索引等)的名称是不区分大小写的,因此 oracle 数据库引擎会将未加引号的字段名自动转换为大写,以保持统一性;dm 在这方面的设计与 oracle 一致;而 mysql 默认是区分大小写的
在 mysql 中,可以通过 SHOW VARIABLES LIKE ‘lower_case_table_names’; 查询数据库对象(表和数据库)名的大小写处理方式
lower_case_table_names 的取值有以下几种情况:
- 0:表示数据库对象名区分大小写(默认取值)
- 1:表示数据库对象名不区分大小写,但是存储在文件系统中的对象名和标识符在名称解析时会被强制转换为小写
- 2:表示数据库对象名不区分大小写,并且存储在文件系统中的对象名和标识符在名称解析时保留其原始大小写
当 mysql 的数据中存在小写库名时,如 test ,且在dts工具迁移过程中有勾选保持对象大小写,则在迁移完后对于 test 的操作要加上 “”,否则会报错找不到 test 模式(mysql 的 test 库迁移至达梦后会变成 test 模式)
ps: desc 语句仅能通过命令行执行,在管理工具中查询会报语法错误