kettle从oracle到mysql数据迁移

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: kettle从oracle到mysql数据迁移

写在前面

数据迁移并不是,只靠工具的,目前发现的问题是 oracle 的 date 类型是指 mysql 的 date 和 datetime 的综合,

而迁移过来,mysql都会变成 datetime 类型, 也就是会在日期后面补 “00:00:00”, 还有的表结构迁移不过来,应该是数据类型转换不了的问题,这个也要实际去观察,好在是执行完成的有标志,也有日志打印,可以根据日志,从断掉的重新开始。

注释,存储,视图,索引 目前没发现是否可以迁移。

注释迁移可以根据下面自己实现, 现实方法在最后。

配置环境

在 kettle 的 bin 目录下放入 mysql 和 oracle jdbc jar 包

oracle: ojdbc8
mysql: mysql-connector-java

1.迁移表结构与表数据

创建一个转换

image-20221214100020371

新建 oracle 和 mysql 链接

image-20221214100131363

oracle 链接

image-20221214100505804

mysql 链接

image-20221214100813384

表结构迁移

image-20221214103344767

image-20221214103429471

选择你要迁移的表

image-20221214103620474

创建一个 job 名称,选择存放路径

image-20221214103739404

得到

image-20221214104000571

这个是创建表和倒入数据,如果我们需要数据的话,直接点击红框的执行按钮即可,如果只要到表结构的话,需要删除和链接节点,我们选中我们不需要的线然后,点击链接线,线会变成灰色。按着 shift 可以创建链接线,这样就可以只生成表结构了。

image-20221214105529671

2.迁移 oracle 查询语句的数据到 mysql 已存在的表结构中

我们回到 转换1 的窗口,有个核心对象

image-20221214105834344

在 输入 里面有个表输入,双击表输入
在 输出 里面有个表输出,双击表输出

image-20221214110226680

双击表输入 -- 选择数据库,写你想到的 sql 语句,注意,不要加“;”, 可以点击预览看看是否是你想要的数据

image-20221214110357570

双击表输出 -- 选择数据库,和你想倒入的表名

image-20221214110801439

点击执行既可以看到数据迁移。

image-20221214110852062

注释迁移

select * from user_tab_comments  -- 查询表注释,(包括试图)
select * from user_col_comments  -- 查询字段注释

image-20221214112312555

image-20221214112442576

我们在 mysql 里面建两个表,用 kettle 把这些数据迁移到 mysql 新建的两个表中。
然后写一个存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_comments`(
v_schema VARCHAR(100),
v_type VARCHAR(100),
v_table_name VARCHAR(100)
)
BEGIN
  if v_table_name is null THEN
        if v_type = 'tab' or v_type is null THEN
            BEGIN
                DECLARE stmt VARCHAR(5000);
                DECLARE done int DEFAULT FALSE;
                DECLARE CONTINUE HANDLER FOR not found set done = true;
                BEGIN
                    DECLARE my_cursor CURSOR for(
                        SELECT
                            CONCAT('ALTER TABLE ', v_schema, '.', table_name, ' COMMENT = "', comments, '"')
                        FROM 
                            dba_tab_comments_table
                        WHERE
                            comments is not null    
                    );
                    OPEN my_cursor;
                        team_loop:loop
                            FETCH my_cursor into stmt;
                            if done then leave team_loop;
                            end if;
                            if stmt is not null then 
                                set @sql = stmt;
                                prepare v_statement from @sql;
                                EXECUTE v_statement;
                                DEALLOCATE PREPARE v_statement;
                            end if;
                        end loop team_loop;
                    CLOSE my_cursor;
                END;
            END;
        end if;

        if v_type = 'col' or v_type is null THEN
            BEGIN
                DECLARE stmt VARCHAR(5000);
                DECLARE done int DEFAULT FALSE;
                DECLARE CONTINUE HANDLER FOR not found set done = true;
                BEGIN
                    DECLARE my_cursor CURSOR for(
                        SELECT
                            CONCAT('ALTER TABLE ', v_schema, '.', d.table_name, ' COMMENT COLUMN ', d.column_name, ' ', i.COLUMN_TYPE, ' COMMENT "', d.comments, '"')
                        FROM 
                            dba_col_comments d
                        LEFT JOIN information_schema.`COLUMNS` i 
                        ON d.table_name = i.COLUMN_NAME
                        WHERE
                            i.table_schema = v_schema
                            and i.column_type is not null
                    );
                    OPEN my_cursor;
                        team_loop:loop
                            FETCH my_cursor into stmt;
                            if done then leave team_loop;
                            end if;
                            if stmt is not null then 
                                set @sql = stmt;
                                prepare v_statement from @sql;
                                EXECUTE v_statement;
                                DEALLOCATE PREPARE v_statement;
                            end if;
                        end loop team_loop;
                    CLOSE my_cursor;
                END;
            END;
        end if;    
    ELSE
        if v_type = 'tab' or v_type is null THEN
            BEGIN
                DECLARE stmt VARCHAR(5000);
                DECLARE done int DEFAULT FALSE;
                DECLARE CONTINUE HANDLER FOR not found set done = true;
                BEGIN
                    DECLARE my_cursor CURSOR for(
                        SELECT
                            CONCAT('ALTER TABLE ', v_schema, '.', table_name, ' COMMENT = "', comments, '"')
                        FROM 
                            dba_tab_comments_table
                        WHERE
                            comments is not null    
                            and table_name = v_table_name
                    );
                    OPEN my_cursor;
                        team_loop:loop
                            FETCH my_cursor into stmt;
                            if done then leave team_loop;
                            end if;
                            if stmt is not null then 
                                set @sql = stmt;
                                prepare v_statement from @sql;
                                EXECUTE v_statement;
                                DEALLOCATE PREPARE v_statement;
                            end if;
                        end loop team_loop;
                    CLOSE my_cursor;
                END;
            END;
        end if;

        if v_type = 'col' or v_type is null THEN
            BEGIN
                DECLARE stmt VARCHAR(5000);
                DECLARE done int DEFAULT FALSE;
                DECLARE CONTINUE HANDLER FOR not found set done = true;
                BEGIN
                    DECLARE my_cursor CURSOR for(
                        SELECT
                            CONCAT('ALTER TABLE ', v_schema, '.', d.table_name, ' COMMENT COLUMN ', d.column_name, ' ', i.COLUMN_TYPE, ' COMMENT "', d.comments, '"')
                        FROM 
                            dba_col_comments d
                        LEFT JOIN information_schema.`COLUMNS` i 
                        ON d.table_name = i.COLUMN_NAME
                        WHERE
                            i.table_schema = v_schema
                            and i.column_type is not null
                            and d.table_name = v_table_name
                    );
                    OPEN my_cursor;
                        team_loop:loop
                            FETCH my_cursor into stmt;
                            if done then leave team_loop;
                            end if;
                            if stmt is not null then 
                                set @sql = stmt;
                                prepare v_statement from @sql;
                                EXECUTE v_statement;
                                DEALLOCATE PREPARE v_statement;
                            end if;
                        end loop team_loop;
                    CLOSE my_cursor;
                END;
            END;
        end if;    
    end if;    
END;
根据自己的需求,执行存储过程即可。

迁移索引

oracle导出用户下所有索引sql
Select dbms_metadata.get_ddl('INDEX', INDEX_NAME)||';' from usr_indexes;

导出查询结果至CSV文件。

修改导出sql
将sql中多余部分全部注释
(

PCTFREE

STORAGE

PCTINCREASE

BUFFER_POOL

TABLESPACE

)
批量删除oracle 数据库前缀字段 如 (“DSM”.)
导入mysql
将修改后的sql 复制到 mysql访问工具中 执行。

备注:

Msyql 创建索引语句:
create index index_name on table_name(column_name);
Oracle创建索引语句
create index 索引名 on 表名(列名);
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
1月前
|
SQL Oracle 关系型数据库
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
41 0
|
1月前
|
关系型数据库 MySQL 5G
Mysql数据迁移3个快速方法与数据库恢复
Mysql数据迁移3个快速方法与数据库恢复
26 0
|
2月前
|
缓存 关系型数据库 MySQL
Centos7 mysql和sqoop数据迁移
Centos7 mysql和sqoop数据迁移
|
2月前
|
存储 Oracle 关系型数据库
Oracle数据泵:数据迁移的魔法棒
【4月更文挑战第19天】Oracle数据泵是高效的数据迁移工具,提供并行处理、灵活数据过滤、完整数据保留及详细日志记录等功能。相比传统工具,数据泵在性能和易用性上更具优势,能大幅缩短迁移时间,降低业务中断风险。通过掌握其使用技巧,数据管理员可以充分利用数据泵,提升数据管理效率。
|
2月前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
47 0
|
2月前
|
SQL Oracle 关系型数据库
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
|
2月前
|
Oracle 关系型数据库 MySQL
数据库中对时间的操作(mySql、Oracle、pgSql)
数据库中对时间的操作(mySql、Oracle、pgSql)
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库
Oracle与MySQL的几点区别
大家都经常使用Oracle数据库和MySQL数据库,虽然在大多数sql处理上都大同小异,但是还是有一些明显的区别,以下为整理的一些区别点,希望能够对各位有所帮助。
1251 0

推荐镜像

更多