kettle从oracle到mysql数据迁移

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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 表名(列名);
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
数据采集 SQL Oracle
从ORACLE源进行批量数据迁移到GBase8a参考示例
从ORACLE源进行批量数据迁移到GBase8a参考示例
从ORACLE源进行批量数据迁移到GBase8a参考示例
|
3月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
727 18
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
97 3
|
2月前
|
关系型数据库 MySQL API
MySQL 历史数据迁移到 Elasticsearch
MySQL 历史数据迁移到 Elasticsearch
106 4
|
3月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
656 2
|
2月前
|
Oracle 关系型数据库 MySQL
shell获取多个oracle库mysql库所有的表
请注意,此脚本假设你有足够的权限访问所有提到的数据库。在实际部署前,请确保对脚本中的数据库凭据、主机名和端口进行适当的修改和验证。此外,处理数据库操作时,务必谨慎操作,避免因错误的脚本执行造成数据损坏或服务中断。
49 0
|
4月前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
271 3
|
5月前
|
开发框架 Oracle 关系型数据库
ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理
ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理
|
2月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
200 64
|
17天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
63 11

推荐镜像

更多