目录
一.迁移流程图:
二.迁移前准备
2.1统计Mysql信息
对象类型:
数据库名 | 对象类型 | 对象名称 |
Liu | 普通表 | demo01 goods orders test_index |
索引 | dname_index PRIMARY | |
视图 | test_view | |
函数 | genPerson | |
存储过程 | goods_proc | |
触发器 | t1 |
1. mysql查询所有表和索引:
mysql>SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'liu' AND TABLE_TYPE ='BASE TABLE';
+------------+
| TABLE_NAME |
+------------+
| demo01 |
| goods |
| orders |
| test_index |
+------------+
查看数据库liu下的所有索引以及对应的表:
mysql> select * from (SELECT a.TABLE_SCHEMA,
a.TABLE_NAME,
a.index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics a
GROUP BY a.TABLE_SCHEMA,a.TABLE_NAME,a.index_name) as b
where b.TABLE_SCHEMA='liu';
2.mysql查询所有视图:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'liu' AND TABLE_TYPE ='VIEW';
+------------+
| TABLE_NAME |
+------------+
| test_view |
+------------+
3.mysql查询所有函数:
mysql> SELECT name from mysql.proc where db= 'liu' and type='function';
+-----------+
| name |
+-----------+
| genPerson |
+-----------+
4.mysql查询所有存储过程:
mysql> SELECT name from mysql.proc where db= 'liu' and type='procedure';
+------------+
| name |
+------------+
| goods_proc |
+------------+
5.mysql查询所有触发器:
mysql> SELECT TRIGGER_SCHEMA,TRIGGER_NAME FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA='liu';
+----------------+--------------+
| TRIGGER_SCHEMA | TRIGGER_NAME |
+----------------+--------------+
| liu | t1 |
+----------------+--------------+
2.2 创建DM实例并准备迁移环境
(1)初始化实例:
<1> 建议 MySQL 和 SQLSERVER 迁移过来的系统,使用大小写不敏感。
<2> 关于簇大小 EXTENT_SIZE,缺省使用 16 页,从 MySQL移植到 DM使用默认值就可
<3> 关于页大小 PAGE_SIZE。在 DM 数据库中,页大小可以为 4KB、8KB、
16KB 或者 32KB,从 MySQL 移植到 DM,建议设置页大小为 16KB
初始化语句:
dminit path=/dm8/dmdata PAGE_SIZE=16 EXTENT_SIZE=16 CASE_SENSITIVE=n CHARSET=1 DB_NAME=DM1 INSTANCE_NAME=DM1 PORT_NUM=5237
Root创建服务:
dm_service_installer.sh -p DM1 -t dmserver -dm_ini /dm8/dmdata/DM1/dm.ini
Dmdba启动服务:DmServiceDM1 start
(2)修改mysql兼容参数
SQL>SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',4);
(3)创建表空间和用户
注意:
MySQL 的体系架构是单实例多库,DM7 以上的版本是单库多实例的架构, MySQL 可能是一个 root 用户访问多个库,访问前切换一下当前库即可。从MySQL 迁移到达梦的时候就需要针对 MySQL 中的每一个库在达梦里面创建一个用户和表空间来对应。例如 MySQL 中有一个库 test,达梦里面先创建一个表空间 tab_test,然后创建一个用户 test,指定默认表空间为 tab_test。迁移 MySQL 中 test 库的数据的时候,用 root 用户连接 MySQL,指定当前库为 test;用 test 用户连接达梦,这样就把 MySQLtest 库中的数据迁移到了达梦test 用户中。
创建表空间和用户:
create tablespace LIU datafile '/dm8/dmdata/DM1/liu.dbf' size 1024 autoextend on next 1 maxsize 10240 CACHE = NORMAL;
create user "LIU" IDENTIFIED BY "liu123456" DEFAULT TABLESPACE "LIU";
- 根据Mysql端用户进行授权
mysql> show grants for 'liu';
SQL>grant dba to liu;
SQL> grant SOI,VTI to liu;
三.正式迁移
3.3.1 启动DTS工具
3.3.2 迁移表,索引和视图
3.3.3 迁移存储过程(改写)
由于DM迁移工具暂时不支持迁移存储过程,这里通过对比Mysql端的创建语句在进行创建:
Mysql:SHOW CREATE procedure `goods_proc`
DM端:
SQL> create or replace procedure liu.goods_proc is
begin
select * from liu.goods;
end;
/
调用存储过程:
SQL> liu.goods_proc;
行号 GID NAME NUM
---------- ----------- ------ -----------
1 1 book 19
2 2 pencel 100
3 3 ruler 25
3.3.4 迁移触发器(改写)
Mysql端查看创建语句:
mysql> show create TRIGGER `t1`;
Mysql创建触发器语句:
CREATE TRIGGER t1 --3.指定触发的时机,和要监听的表
AFTER INSERT ON orders -- 4.行触发器 固定写法
FOR EACH ROW -- 5.触发后具体要执行的事件
BEGIN -- 订单+1 库存-1
UPDATE goods SET num = num -1 WHERE gid = 1;
END$
DM端创建:
CREATE OR REPLACE TRIGGER t1
AFTER INSERT ON liu.orders
BEGIN
PRINT 'update liu.goods SET num = num -1 WHERE gid = 1';--要执行的SQL
END;
/
3.3.5 迁移函数(改写)
Mysql端:
SHOW CREATE FUNCTION `genPerson` ;
创建语句:
DELIMITER $$
DROP FUNCTION IF EXISTS genPerson$$
CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
BEGIN
DECLARE str VARCHAR(50) DEFAULT '';
SET @tableName=name;
SET str=CONCAT('create table ', @tableName,'(id int, name varchar(20));');
return str;
END $$
DELIMITER ;
DM端改写:
create or replace function genPerson(name varchar(20))
RETURN varchar(50)
IS
str VARCHAR(50);
BEGIN
str=CONCAT('create table ', liu,'(id int, name varchar(20));');
return str;
END
/
四.更新统计信息
迁移完整的库建议按照库模式更新统计信息,凡是涉及到迁移数据的及时进行更新统计信息的操作。
方法一:执行sql
更新全库统计信息:
DBMS_STATS.GATHER_SCHEMA_STATS( ‘liu’, -- LIU 为模式名 100, FALSE, 'FOR ALL COLUMNS SIZE AUTO'); |
方法二:登录管理工具
库模式更新:
表模式更新:
列模式更新:
更新索引:
五.数据比对
使用命令行对比
- 对象数对比
Mysql:
数据库名 | 对象类型 | 对象名称 |
Liu | 普通表 | demo01 goods orders test_index |
索引 | dname_index PRIMARY | |
视图 | test_view | |
函数 | genPerson | |
存储过程 | goods_proc | |
触发器 | t1 |
DM:
SQL> select owner,object_type,count(object_name) from dba_objects where owner='LIU' group by owner,object_type order by 3;
行号 owner object_type COUNT(object_name)
---------- ----- ----------- --------------------
1 LIU VIEW 1
2 LIU SCH 1
3 LIU PROCEDURE 1
4 LIU TRIGGER 1
5 LIU CONSTRAINT 3
6 LIU TABLE 4
7 LIU INDEX 10
- 数据量对比
SQL> select owner,segment_name,(bytes/1024/1024) MB from dba_segments where owner='LIU' and segment_type='TABLE';
行号 owner segment_name MB
---------- ----- ------------ --------------------
1 LIU DEMO01 0
2 LIU TEST_INDEX 0
3 LIU ORDERS 0
4 LIU GOODS 0
达梦云适配技术社区
https://eco.dameng.com/