Spoon实现跨库数据迁移

Spoon是个功能很强大的ETL工具,下面使用spoon来实现不同数据库之间数据迁移的小demo。在此过程中遇到了数据迁移后出现中文乱码的问题,在结尾处我会列出中文乱码的问题和解决方法。

首先打开Spoon后创建一个转换
接着在转换里创建两个数据库连接,这里分别创建了mysql和oracle的连接。
然后把表输入插入/更新 拖到右边空白区域。
这里写图片描述

双击表输入,对表输入进行编辑
点击获取SQL查询语句,在弹出的数据库浏览器页面里找到目标表。
这里写图片描述

双击插入/更新,对插入/更新进行编辑,数据库连接选择mysql_db,因为我们准备把oracle里的数据迁移到mysql数据库里。
这里写图片描述

点击目标表旁边的浏览按钮,将弹出数据库浏览器窗口,在窗口里找到迁移的目标表,然后点击确定。
这里写图片描述

接下来开始对两个数据库表的字段进行编辑映射,如果两个数据库中的表结构相同,则可以直接点击获取更新字段,如果两个数据库中的表结构不相同,可以通过手动编辑字段之间的映射关系。
这里写图片描述

编辑映射,这个功能很好用,如果字段名称相同,spoon可以自动帮我们实现映射关系。
这里写图片描述

编辑迎神完成后。
这里写图片描述

点击开始运行,运行结束后,去mysql数据库查看是否有数据同步过来。
这里写图片描述

数据已经同步过来了。
这里写图片描述

下面是我遇到的中文乱码问题

没做任何设置之前,迁移后查看mysql表里面的数据中文被?号代替了。
这里写图片描述

在创建数据库连接那里修改mysql_db连接的参数
选项那里添加参数characterEncoding=utf8 ,如下图所示
这里写图片描述

修改后运行
这里写图片描述

乱码变成了上图这个样子,看来问题还是没有解决。

上网查了后进行如下修改,问题解决!
找到spoon解压目录下的spoon.bat文件,打开该文件对其进行编辑,在

if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx2048m" "-XX:MaxPermSize=256m"

后面加上下面这句

“-Dfile.encoding=UTF-8”

如图
这里写图片描述

修改完成保存后,重新启动Spoon,然后运行作业,去mysql数据库查看数据,发现mysql数据库中的中文正常了。

/** * 源数据库连接池配置 * */ ConnPoolConfig config = new ConnPoolConfig(); config.setMaxPoolSize(30); config.setInitialPoolSize(20); config.setUrl("jdbc:sqlserver://192.168.0.222;databaseName=ciems"); config.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver"); config.setUsername("sa"); config.setPassword("Password2017"); /** * 源 * "queryDB" DBManager的自定义名称 * config 连接池配置 */ DBManager queryDb = new DBManager("queryDB",config); /** * 目标数据库连接池配置 * */ ConnPoolConfig tarconfig = new ConnPoolConfig(); tarconfig.setMaxPoolSize(30); tarconfig.setInitialPoolSize(20); tarconfig.setDriverClass("com.mysql.jdbc.Driver"); tarconfig.setUrl("jdbc:mysql://localhost:3306/datatransfer?useUnicode=true&characterEncoding=UTF8&useSSL=true"); tarconfig.setPassword("accp"); tarconfig.setUsername("root"); /** * 目标 */ DBManager insertDb = new DBManager("insertDB",config); /** *做数据导入处理时的接口 * */ InsertHandler handler = new DBInsertHandlerImpl("t_big_data",null,insertDb); /** * 迁移任务的配置,配置关键信息项 */ ApplicationConfig apConfig = new ApplicationConfig("t_big_data"); apConfig.setQueryThreadNum(8); //指定查询线程数量,不指定默认为8 apConfig.setDataNum(5000); //设置每次从源中抽取的数量 不指定默认为5000 /** * 源表的匹配条件 * 如果希望源表中符合条件的才迁移,请配置此项,禁止加where,请按照以下格式 */ apConfig.setConditionSql("0=0"); /** * 入方式 * ** * 增量入 ZLRK, (暂未实现) * 追加入 ZJRK, (目标有源表结构的基础上,增加源表的所有数据到目标中) * 刷新入 SXRK, (删除目标的源表结构,自动创建并导入数据) * 更新入 GXRK (暂未实现) * ** */ apConfig.setInsertType(InsertType.SXRK); /** * 日志线程,开启时可更直观的从标准输出流里观察到运行状态,不指定默认关闭 */ apConfig.setOpenLogThread(true); /** * 生命周期接口,线程不完全 * 分别有以下几个生命周期方法 * createTableDone() 目标被创建表结构时调用一次 * queryDone(boolean result, int start, int end, long time,Throwable e) * 有数据从源表中查询到数据时被调用,直到任务完成 * result 查询结果 * start 查询起始行 * end 查询结束行 * time 共耗时 单位:ms * e 查询失败时抛出的异常 * insertDone(boolean result, int num, int errorNum, long time,Throwable e) * 有数据导入到目的时被调用,直到任务完成 * result 导入结果 * num 导入总数量 * errorNum异常数量 * e 导入失败时抛出的异常 * taskDone(int all, int doneNum, int errorNum, long time,List errorRows, List e) * 任务完成时被调用 * all 任务总数据量 * doneNum 已完成的数据量 * errorNum异常的数据量 * time 总耗时 * errorRows异常的行记录 * e 所有的异常 */ TaskRunLog runLog = new TaskRunLogImpl(); /*** * 任务迁移核心类 * 以下是构造方式之一 * ApplicationConfig apConfig:任务关键配置 * DBManager queryDb: 源 * InsertHandler handler:导入处理器 */ DataThransferApplication app = new DataThransferApplication(apConfig,queryDb,handler,runLog); /** * 初始化任务 */ app.init(); /** * 任务开始 */ app.start();
### 数据迁移概述 数据迁移是从一种数据库管理系统(DBMS)迁移到另一种 DBMS 的过程。在此场景中,目标是从 GaussDB 迁移至 MySQL。由于两种数据库系统的差异,此操作通常涉及以下几个方面:表结构转换、数据导出与导入以及索引和约束的重建。 GaussDB 是基于 PostgreSQL 架构开发的关系型数据库,而 MySQL 则是一种独立设计的开源关系型数据库系统。因此,在执行迁移之前,需了解两者之间的语法兼容性和功能差异[^2]。 --- ### 使用 Kettle 实现 GaussDB 至 MySQL迁移的配置指南 #### 1. 准备工作 在正式迁移前,需要完成以下准备工作: - **安装并验证 Kettle 工具** 下载并解压 Pentaho Data Integration (PDI) 社区版工具,并确保其能够正常运行。 - **确认 GaussDB 和 MySQL 版本** 使用 `SELECT VERSION();` 查询 GaussDB 的具体版本号,以便调整 SQL 语句中的不兼容部分[^2]。 - **创建目标 MySQL 数据库实例** 在 MySQL 中预先建立好用于接收数据的目标数据库实例,并将其连接地址加入到环境变量或 JDBC 配置文件中[^3]。 #### 2. 创建 GaussDB 数据源 打开 Kettle 工具后,按照如下步骤定义 GaussDB 数据源: ```plaintext 输入名称 -> GaussDB_Source 选择数据库类型 -> Postgresql (因为 GaussDB 基于 Postgres 开发) 填写主机名/IP 地址、端口号(默认为5432)、用户名密码等必要参数 测试连接以确保无误 ``` #### 3. 定义 MySQL 目标数据源 同样地,新增另一个名为 “MySQL_Target” 的数据源对象,指定对应的 MySQL 参数详情: ```plaintext 输入名称 -> MySQL_Target 选择数据库类型 -> Mysql 提供服务器地址、监听端口(通常是3306),以及认证凭证 记得附加 timezone 设置来规避潜在的时间戳解析错误[^3] 例如 jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&useSSL=false 再次校验链接状态是否稳定可靠 ``` #### 4. 设计 ETL 流程 利用 Spoon 图形界面构建完整的 Extract, Transform and Load (ETL) 处理链路: ##### a. 表元数据提取阶段 采用 Table Input 步骤读取 GaussDB 内部所有待转移表格的信息列表;随后运用 Metadata Injection 或者 Schema Copy 功能复制这些模式定义给下游组件处理。 ##### b. 字段映射适配环节 鉴于不同 RDBMS 对某些内置函数或者关键字可能存在冲突情况,所以要特别注意字段类型的匹配问题。比如将 BIGSERIAL 替换成为 AUTO_INCREMENT INTEGER 类型等等[^2]。 ##### c. 执行实际的数据搬运动作 最后一步就是启动 Transformation Job 来真正实施平台间的大规模记录传输作业了。期间可以监控进度条变化趋势图观察整体效率表现如何。 --- ### 注意事项 - 如果遇到存储过程中调用了特定厂商扩展API的情况,则很可能无法直接平滑过渡过去,此时就需要手动重写这部分逻辑代码片段。 - 关联视图(Views),触发器(Triggers)之类的复杂对象也需要单独考虑解决方案。 - 性能优化建议开启批量提交机制(batch mode enabled flag set to true). ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值