MySQL数据库迁移

背景

本文的需求同上一篇Red Hat安装MySQL之旅,既然要做数据库的切换,安装是第一步,数据库、数据表、数据的迁移自然是紧随其后的事情了。

在做迁移之前,大概在网上谷歌了一下,关于如何将Oracle迁移到MySQL的内容是有的,但是感觉消息太杂了,可以看出迁移Oracle数据库到MySQL方法是很多的,只不过是哪个更靠谱的问题。曾经一度,我想自己用Python写个迁移工具。(只是迁移数据表和数据,不包括 存储过程,毕竟MySQL的存储过程还不够成熟,同Oracle的存储过程差别也比较大)。

但这样造个轮子,无疑是增加了开发成本。所以经过多方权衡之后,我选择了官方提供的工具和方法,毕竟没有谁会比开发MySQL的人更了解MySQL,于是就有了下面这篇迁移记录。

PS:这里补充一点,关于Python开发一个迁移数据库表、数据的工具这件事情,我是会去做的,已经提到业余时间的安排日程上了。

工具选择

在经过查找权衡之后,我选择了MySQL Migration Toolkit这个MySQL的官方工具。因为公司电脑有权限限制,所以我下载的是免安装版。官网下载网址:MySQL Migration Toolkit;也可以从我上传的资源下载MySQL Migration Toolkit免安装版

PS: 由官网可以看到,MySQL Migration Toolkit这个工具从2006年之后就再也没有更新过,也就是说自从MySQL被收购之后,就没再更新该工具,所以后面会讲到,这些年过去了,该工具也确实存在一些BUG。但个人感觉,并不影响该工具处理数据库的能力。

MySQL Migration Toolkit的坑

MySQL Migration Toolkit这个工具是依赖于JRE的,所以老老实实的到官网去下载了JDK最新版本的安装文件,并安装完毕。

下载好MySQL Migration Toolkit之后,解压使用,在软件初始化过程中,就报出了错误。

“An error occured during the initialization of the runtime system.Please make sure your have the Java Runtime Environment (JRE) 1.4.2 or 5.0 Update or newer installed”。

奇怪,刚才明明已经安装了JDK,而且查看Java目录下确实也已经有了jre1.8.0的目录,所以可以确定的是,本机上确实是已经安装了JRE了。经过搜索发现,原来这是MySQL Migration Toolkit工具自身的BUG,因为其最新版本是06年发布的,当时的JRE应该还只是1.4、1.5版本的,而工具内部代码可能有JRE版本的判断,所以就导致即使安装了最新版的JRE,但是注册表里,并没有1.4、1.5的项,因此软件启动过程中在注册表内找不到相应的项,就会报出相应的错误。根据网上给出的解决方法,可以通过新增1.4或1.5注册表项,然后对应到最新版的JRE即可解决问题,看这里

但是公司电脑有权限限制,我(我自己的开发机竟然没有权限!!!!)没权限修改注册表,因此我只能退而求其次,在这里重新下载了JRE 5.0的安装包,安装完成后,再启动MySQL Migration Toolkit,一切正常了。然后,我们就可以开始真正的迁移工作了!!!JRE 5.0的安装包可以从这里下载。

数据库迁移

MySQL Migration Toolkit能够正常启动之后,就可以开始使用它进行数据库的迁移了。

正常启动的界面如图:
MySQL Migration Toolkit正常启动界面

直接点击Next。

这里写图片描述

选择Direct Migration,点击Next。

这里写图片描述

在Source Database界面中填写需要进行转换的源数据库的一些参数。

  • Database System为源数据库类型,这里选Oracle
  • Driver为使用的驱动程序,需要加载Oracle JDBC驱动,即ojdbc14.jar(支持JRE 1.4或1.5),果断去官网或者[这里][8]下载。在首次加载驱动程序后,会提示重启MySQL Migration Toolkit。
  • 下一项可选SID或者Service,因为我不知道Oracle数据库的SID,所以这里我选择了使用Service,即数据库名称service name,可以使用下面命令来查看数据库service name
select value from v$parameter where name='service_names'
  • Host和Port分别为数据库所在服务器地址和端口
  • Username为源数据库的用户名
  • Password为上面用户名对应的密码

点击Next。

这里写图片描述

在Target Database界面中填写需要转换的目标数据库的一些参数。

具体各个参数的意义和上面差不多,唯一需要注意的是对于MySQL,可能需要手工填写JDBC URL,点击Advanced键,在Connection String栏里输入JDBC URL,具体格式为:

jdbc:mysql://IP:PORT/?user=USER&password=PASSWD&useServerPrepStmts=false&characterEncoding=gbk

其中IP、PORT、USER、PASSWD根据MySQL服务器的参数填写,基本和上面的参数一样,字符编码方式根据自己需要填写。

参数填写完毕后,点击Next。

这里写图片描述

连接服务器,结果为“Execution completed successfully”则说明连接服务器成功。点击Next。

这里写图片描述

选择需要迁移的数据库,点击Next。

这里写图片描述

对源数据库进行逆向工程,若是结果为”Execution completed successfully”则说明逆向处理执行成功。点击Next。

这里写图片描述

在Object Type Selection页面,基于我的需求,只需要选中Objects of type Oracle Table即可,点击Detailed selection可以对所要迁移的表项进行编辑,可以将不需要迁移的表加入到ignore list。点击Next。

这里写图片描述

在Object Mapping页面,编辑Migration of type Oracle Schema,Migration method选择Generic,点击Set Parameter,若是MySQL Schema的字符集和校对选择UTF8相关的,则选择Multilanguage即可,若是选择gbk相关的,则选择User defined,下面charset=gbk, collation=gbk_chinese_ci;

编辑Migration of type Oracle Table,Migration method选择Generic,点击Set Parameter,若是MySQL Table的字符集和校对选择UTF8相关的,则选择Data consistency/multilanguage即可,若是选择gbk的话,则在User defined中填入,addAutoincrement=yes, charset=gbk, collation=gbk_chinese_ci, engine=INNODB。

点击Next。

这里写图片描述

然后开始迁移前面选中的对象。结果为”Execution completed successfully”说明迁移成功,点击Next。

这里写图片描述

Manual Editing列出了有问题的映射对象及其创建脚本。结果为”No mapping problems found.”说明迁移映射过程中并没有问题。点击Next。

这里写图片描述

Object Creation Options页面是用来配置如何创建数据库对象的,对当前来说,即是数据库中的表。可以选择直接通过网络在数据库中创建还是先保存为本地脚本文件再创建。如果网络流量不是很大的话,建议选择第二种,我是直接选择第二种,先在本地创建脚本文件。点击Next。

这里写图片描述

可以看到创建脚本文件成功,点击Next,显示创建结果。点击Next。

这里写图片描述

创建结果。创建成功,此时会生成创建数据表等对象的.sql脚本文件。点击Next。

这里写图片描述

Data Mapping Options页面,用来配置如何进行数据映射的,同样,可以选择直接通过网络将数据迁移映射到MySQL数据库,也可以现在本地保存脚本文件,然后再通过脚本文件迁移数据到MySQL。基于网络流量考虑,我选择第二种。点击Next。

这里写图片描述

开始进行数据转换,若是结果为”Execution completed successfully”则说明数据转换成功,此时会生成数据迁移的.sql脚本文件。点击Next。

这里写图片描述

Summary页面,即处理完成的总结页面,若想保存总结结果,则点击Generate Migration Script。然后点击Finish。

接下来可以使用所生成的.sql脚本文件在MySQL客户端进行数据库、数据表的创建和数据的迁移。具体语句为:

source xxx.sql

这其中会存在一些问题,主要是字符集编码的问题,首要思想就是要保证mysql客户端的字符集编码和脚本的编码保持一致,否则会报出编码错误。

<think>好的,我现在需要帮助用户了解如何进行MySQL数据库迁移。首先,我得理清用户的需求。用户可能正在计划迁移数据库,需要具体的步骤方案,可能还关心注意事项不同方法的优缺点。根据提供的引用内容,迁移方式有几种,比如使用mysqldump、直接复制数据文件、主从复制等。我需要将这些方法整理出来,确保结构清晰。 首先,用户提到“MySQL数据库迁移教程或方案”,所以回答应该分步骤说明。根据引用1,迁移前需要准备,比如确定需求、备份数据,这些很重要,必须包括进去。然后具体的迁移方法,引用24提到了mysqldump的使用方法,需要详细说明命令步骤。另外,引用3中提到了直接复制数据文件的方法,可能适用于大数据库,但需要停止服务,这点需要注意。 接下来,我需要考虑用户可能的疑问,比如不同迁移方法的优缺点,如何选择合适的方法。例如,mysqldump适合中小型数据库,而直接复制文件适合大型的,但需要停机时间。主从复制可能对高可用性环境有用。这些都需要在回答中对比说明。 还要注意用户可能没有提到的细节,比如迁移后的验证步骤,确保数据一致性服务正常。引用中提到的备份是关键步骤,必须强调。另外,权限问题、版本兼容性这些注意事项也要提到,避免用户迁移后出现兼容性问题。 生成相关问题的时候,要围绕用户可能进一步想知道的内容,比如如何减少迁移时间、迁移后数据不一致怎么办、不同方法的优缺点比较,以及迁移后的性能优化。这些问题可以帮助用户更全面地了解迁移过程。 最后,确保回答符合格式要求,使用中文,正确应用引用标注,例如在备份数据部分引用[^1],在mysqldump命令引用[^2][^4]。同时,检查LaTeX语法是否正确,但根据用户的问题,可能数学公式较少,主要注意代码块引用格式。 现在组织内容:分迁移前准备、三种迁移方法、注意事项、优缺点对比、相关问题。确保每个部分简洁明了,步骤清晰,用户能一步步跟随操作。同时,提醒用户根据实际情况选择方法,比如数据量大小、允许的停机时间等。</think>### MySQL数据库迁移教程及方案 #### 一、迁移前准备工作 1. **明确迁移需求** - 确定迁移目标(如新服务器配置、MySQL版本、操作系统等)时间窗口。 - 评估数据库复杂度(数据量、表结构、索引、存储过程等)。 2. **备份数据** - 使用`mysqldump`或MySQL官方工具备份所有数据,防止迁移失败导致数据丢失。例如: ```bash mysqldump -u root -p 数据库名 > 数据库.sql # 导出整个数据库[^2][^4] ``` 3. **检查版本兼容性** - 确保目标服务器的MySQL版本不低于源服务器,避免语法或功能不兼容。 --- #### 二、常用迁移方法及步骤 ##### 方法1:使用`mysqldump`导出导入(适合中小型数据库) 1. **导出数据** ```bash mysqldump -u 用户名 -p --single-transaction 数据库名 > 备份文件.sql # --single-transaction保证一致性 ``` 2. **传输备份文件** 使用`scp`、FTP或云存储将`.sql`文件传输到目标服务器。 3. **导入数据** ```bash mysql -u 用户名 -p 新数据库名 < 备份文件.sql ``` **优点**:操作简单,兼容性好。 **缺点**:大数据量时导入耗时较长[^3]。 ##### 方法2:直接复制数据文件(适合大型数据库) 1. **停止MySQL服务** ```bash systemctl stop mysql ``` 2. **复制数据目录** - 默认数据目录为`/var/lib/mysql`,将整个目录复制到目标服务器。 3. **修改文件权限** ```bash chown -R mysql:mysql /var/lib/mysql ``` 4. **启动MySQL服务** ```bash systemctl start mysql ``` **优点**:速度快,适合TB级数据[^3]。 **缺点**:需停机,且要求MySQL版本配置一致。 ##### 方法3:主从复制(适用于高可用环境) 1. **配置主库** 修改`my.cnf`,启用二进制日志: ```ini server-id=1 log-bin=mysql-bin ``` 2. **创建同步账户** ```sql CREATE USER 'replica'@'从库IP' IDENTIFIED BY '密码'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'从库IP'; ``` 3. **配置从库** ```ini server-id=2 relay-log=mysql-relay-bin ``` 4. **启动同步** 在从库执行: ```sql CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='replica', MASTER_PASSWORD='密码'; START SLAVE; ``` --- #### 三、注意事项 1. **权限与依赖** - 迁移后检查用户权限、触发器、存储过程是否完整。 2. **数据一致性验证** - 使用`CHECKSUM TABLE`或工具(如`pt-table-checksum`)验证数据。 3. **服务切换策略** - 建议在低峰期操作,并通过DNS切换或代理层逐步迁移流量。 --- #### 四、方案优缺点对比 | 方法 | 适用场景 | 优点 | 缺点 | |--------------|-------------------|-----------------------|-----------------------| | `mysqldump` | 中小型数据库 | 简单、兼容性好 | 导入慢,需停机 | | 直接复制文件 | 大型数据库 | 速度快 | 需停机,配置需一致 | | 主从复制 | 高可用/无缝迁移 | 无需停机,可增量同步 | 配置复杂,延迟风险 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值