kettle从oracle到mysql数据迁移

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
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 表名(列名);
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
285 18
|
5月前
|
Oracle 关系型数据库 MySQL
Oracle linux 8 二进制安装 MySQL 8.4企业版
Oracle linux 8 二进制安装 MySQL 8.4企业版
162 1
|
6月前
|
关系型数据库 MySQL Java
【YashanDB知识库】Kettle迁移MySQL到YashanDB
本文介绍了使用Kettle将MySQL数据库中的中文数据迁移到YashanDB的方法,解决因YMP不支持Latin1字符集导致的乱码问题。提供了Windows和Linux两种环境下的操作步骤,包括配置JAVA环境、解压作业包、设置数据库连接(MySQLInput与YashanOutput)、修改表列表配置文件及运行迁移任务。Windows环境支持图形界面便于调试,Linux环境网络性能更优。通过详细的操作指南,确保数据迁移成功并可重试无冲突。
|
7月前
|
SQL Oracle 关系型数据库
MySQL 和 Oracle 的区别?
本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
848 7
MySQL 和 Oracle 的区别?
|
6月前
|
Oracle 关系型数据库 MySQL
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
|
8月前
|
监控 Oracle 关系型数据库
Mysql、Oracle审计日志的开启
通过上述步骤,可以在 MySQL 和 Oracle 数据库中启用和配置审计日志。这些日志对于监控数据库操作、提高安全性和满足合规性要求非常重要。确保正确配置审计参数和策略,定期查看和分析审计日志,有助于及时发现并处理潜在的安全问题。
435 11
|
9月前
|
数据采集 SQL Oracle
从ORACLE源进行批量数据迁移到GBase8a参考示例
从ORACLE源进行批量数据迁移到GBase8a参考示例
从ORACLE源进行批量数据迁移到GBase8a参考示例
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。

推荐镜像

更多