一文聊聊快速迁移MySQL数据的方法

怎样快速地迁移 mysql 中的数据?下面本篇文章给大家聊聊快速迁移mysql数据的两种方式,希望对大家有所帮助!

一文聊聊快速迁移MySQL数据的方法

我们通常会遇到这样的一个场景,就是需要将一个数据库的数据迁移到一个性能更加强悍的数据库服务器上。这个时候需要我们做的就是快速迁移数据库的数据。

那么,如何才能快速地迁移数据库中的数据呢?今天我们就来聊一聊这个话题。

数据库的数据迁移无外乎有两种方式,一种是物理迁移,另一种则是逻辑迁移

首先,我们生成 5 万条测试数据。具体如下:

-- 1. 准备表create table s1(  id int,  name varchar(20),  gender char(6),  email varchar(50));-- 2. 创建存储过程,实现批量插入记录delimiter $$create procedure auto_insert1()BEGIN    declare i int default 1;    while(i<50000)do        insert into s1 values(i,'shanhe','male',concat('shanhe',i,'@helloworld'));        set i=i+1;        select concat('shanhe',i,'_ok');    end while;END$$delimiter ;-- 3. 查看存储过程show create procedure auto_insert1G -- 4. 调用存储过程call auto_insert1()

逻辑迁移

逻辑迁移的原理是根据 MySQL 数据库中的数据和表结构转换成 SQL 文件。采用这一原理常用的迁移工具有 mysqldump

下面我们就来测试一下:

[root@dxd ~]# mysqldump -h172.17.16.2 -uroot -pTest123!  s1 s1 --result-file=/opt/s1.sql[root@dxd ~]# ll /opt/-rw-r--r--  1 root root 2684599 5月  10 00:24 s1.sql

我们可以看到的是,生成了相应的 SQL 。现在我们通过生成的 SQL 迁移到另一个数据库中。

mysql> use s2;Database changedmysql> source /opt/s1.sql

通过简单的时间累加计算,大约消耗了 1 秒钟的时间,但是随着数据库递增,迁移的时长也会相应地增加。此时,如果需要迁移的数据表中的数据足够大(假设上千万条),mysqldump 很有可能会将内存撑爆进而导致迁移失败。所以,在迁移这样的数据表的时候,我们可以简单优化一下 mysqldump ,具体如下。

--add-locks=0:这个参数表示在迁移数据的时候不加 LOCK TABLES s1.s1 WRITE;,也就是说在导入数据时不锁定数据表。--single-transaction:表示的是在导出数据时,不锁定数据表。--set-gtid-purged=OFF:表示在导入数据时,不输出 GTID 相关的信息。

加上这三个参数主要是为了减少所有的操作导致不必要的 IO ,具体如下:

[root@dxd ~]# mysqldump -h172.17.16.2 -uroot -pTest123! --add-locks=0 --single-transaction --set-gtid-purged=OFF s1 s1 --result-file=/opt/s1.sql

通过上面的案例,我们看最终结果,优化的效果微乎其微。所以,这种逻辑优化的方式,在数据量比较大的情况下(百万条以上)不可取。

文件迁移

文件迁移顾名思义就是直接迁移数据库的存储文件。这种迁移方式相对于逻辑迁移的方式来说,性能上要高出很多,同时也很少会把内存撑爆;在面对数据量较大的场景下迁移数据,建议使用文件迁移的方式,具体如下:

mysql> select * from s1 into outfile '/var/lib/mysql-files/1.txt';Query OK, 55202 rows affected (0.04 sec)

我们可以看到的是,将 5 万多条数据导出到文件中时,只花了 0.04 秒左右的时间。相比较 mysqldump 来说快了一倍多。

注意:这种方式导出的数据只能导出到 MySQL 数据库的目录中。配置这个目录的参数是 secure_file_priv,如果不这样做,数据库会报一个 ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement 的错误。

导出数据之后,我们再将该文件中的数据导入到数据库中,看一下效果,具体如下:

mysql> load data infile '/var/lib/mysql-files/1.txt' into table s3.s1;Query OK, 55202 rows affected (0.27 sec)Records: 55202  Deleted: 0  Skipped: 0  Warnings: 0

注意:into outfile 是不会生成表结构的,因此在导入数据之前,需要手动创建表结构。

我们可以看出,导入花费的时间总共是0.27秒,相比较 mysqldump 而言,也要快两倍多。

这种方式主要是将每一条数据都以n换行的方式直接保存在文件之中。

导入的时候,首先会判断导入的数据表的字段是否与每一行的数据的列数一致,如果一致则一行一行地导入,如果不一致则直接报错。

这里面有一个问题需要我们注意,如果我们的数据库是主从架构的数据库,这里很可能就会产生一个问题。讲这个问题之前,我们得首先在这里稍微说明一下主从复制的原理。

主从复制的原理主要是依赖于 binlog 日志,binlog 日志具体步骤如下:

主库上执行 SQL ,并且把修改的数据保存在 binlog 日志之中;由主库上的 dump 线程转发给从库;由从库中的 IO 线程接收主库发送过来的 binlog 日志;将 binlog 日志数据写入中继日志之中;通过从库上的 SQL 线程从中继日志中重放 binlog 日志,进而达到主从数据一致。

在这个过程之中,我相信仔细阅读本小册第 15 篇文章的朋友一定有一个疑问,当 binlog 日志的工作模式为 STATEMENT 时,在主库上执行上面的 SQL load data infile '/var/lib/mysql-files/1.txt' into table s3.s1; 时,就会导致从库无法重复上方 SQL 的结果,这是因为从库中并没有 /var/lib/mysql-files/1.txt 这个文件。具体步骤如下:

主库执行 load data infile '/var/lib/mysql-files/1.txt' into table s3.s1;

binlog 日志的工作模式如果是 STATEMENT 时,将在 binlog 中记录上方的 SQL;

然后在从库中重新执行 binlog 中记录上方的 SQL。

很显然,从库上执行该 SQL 时,会立即报错,这个时候怎么办呢?

这个时候我需要再介绍上方 SQL 的 load 关键字:

文心一言 文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

文心一言 1008 查看详情 文心一言 如果增加 local 关键字,则该条 SQL 会在本地寻找 /var/lib/mysql-files/1.txt;如果不加 local 关键字,则该条 SQL 会在主库端寻找 /var/lib/mysql-files/1.txt

所以,在主从架构中,要使用文件迁移的方式迁移数据,不加 local 关键字即可。

物理迁移

物理迁移也是迁移文件,所不同是物理迁移一般是直接迁移 MySQL 的数据文件。这种迁移方式性能很好但是操作过程麻烦,容易出错。具体我们来详细解释一下

首先是非常干脆的迁移方式迁移,就是直接 MySQL 数据库的数据文件打包迁移,下面我们做一个案例:

-- 我们将s1数据库中的所有数据迁移到s4数据库之中[root@dxd mysql]# pwd/var/lib/mysql[root@dxd mysql]# cp -r s1 s4[root@dxd mysql]# chown -R mysql.mysql s4-- 重启数据库[root@dxd mysql]# systemctl restart mysqld-- 查看该表数据mysql> select count(*) from s1;ERROR 1146 (42S02): Table 's4.s1' doesn't exist

我们可以看到的是查询数据的时候报了一个 1146 的错误,这是因为 INnoDB 存储引擎中的数据表是需要在 MySQL 数据库的数据字典中注册的,我们直接将数据文件复制过去的时候并没有在数据字典中注册,换句话说就是在把数据复制过去之后,还需要在数据字典中注册数据库系统才能正常识别。

下面我们就来介绍一下在数据字典中该如何注册,具体步骤如下。

注:物理迁移数据表数据实际上最主要的就是迁移表空间,因为对于 InnoDB 存储引擎来说,数据是存储在数据表空间中的,也就是.idb文件。

1、我们在迁移到的数据库中创建与需要迁移的数据表完全相同的数据表。

mysql> create database t1;
Query OK, 1 row affected (0.01 sec)

mysql> use t1;
Database changed

mysql> CREATE TABLE s1 (

->   `id` int(11) DEFAULT NULL,->   `name` varchar(20) DEFAULT NULL,->   `gender` char(6) DEFAULT NULL,->   `email` varchar(50) DEFAULT NULL-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Query OK, 0 rows affected (0.04 sec)

2、删除新创建的数据表的表空间,这是因为新创建的数据库的表空间没有数据且会跟迁移过来的数据表空间冲突,我们提前删除,具体删除步骤如下:

mysql> alter table t1.s1 discard tablespace;Query OK, 0 rows affected (0.01 sec)

3、创建一个原有数据表的配置文件,这样做的目的是将原有数据表的一些配置复制过来(注意:这一步会自动将数据表上锁)。

mysql> use s1;Database changedmysql> flush table s1 for export;Query OK, 0 rows affected (0.01 sec)

查看是否已经创建 .cfg 文件

[root@dxd mysql]# pwd/var/lib/mysql[root@dxd mysql]# ll s1/总用量 12312-rw-r——- 1 mysql mysql 65 5月 10 00:26 db.opt-rw-r——- 1 mysql mysql 520 5月 10 15:15 s1.cfg-rw-r——- 1 mysql mysql 8652 5月 10 00:27 s1.frm-rw-r——- 1 mysql mysql 12582912 5月 10 00:27 s1.ibd

将配置文件和表空间文件迁移至新的数据库。

复制文件的方式可以灵活多变

[root@dxd mysql]# cp s1/s1.cfg t1/[root@dxd mysql]# cp s1/s1.ibd t1/

设置权限,很重要,如果权限不一致会导致数据读取表空间数据失败

[root@dxd mysql]# chown -R mysql.mysql t1/

将原有数据表解锁。

mysql> use s1;Database changedmysql> unlock tables;Query OK, 0 rows affected (0.00 sec)

载入新的表空间。

mysql> use t1;mysql> alter table s1 import tablespace;Query OK, 0 rows affected (0.09 sec)

测试。

mysql> select count( ) from s1;+—————+| count( ) |+—————+| 55202 |+—————+1 row in set (0.03 sec)

我们看到此时就实现了数据迁移。

这种数据迁移虽然性能很好,但是过程非常麻烦,很容易出现操作失误的情况。

总结

今天,我们介绍了三种数据库迁移的方式,分别是:逻辑迁移、文件迁移和物理迁移。

逻辑迁移的方式主要是使用 mysqldump 命令进行迁移,其原理主要是将数据库中的数据和结构生成 SQL 文件,再导入即可。这种迁移方式主要适用于数据量比较小且服务器性能较好的场景下,例如数据连少于 500 万条以下的场景。

文件迁移的方式其实也算是逻辑迁移的范畴,它主要通过命令将数据保存在文件中,然后再导入数据库即可,这种迁移方式是不会迁移表结构的,所以在导入数据之前需要手动创建表结构,其原理跟逻辑迁移的方式相同。

物理迁移的方式适用于数据量比较大的场景,这种场景不易导致服务器因资源占用过多而宕机,但是操作过程麻烦且会锁定原数据表。

在实际应用过程中,我们通常选择使用 mysqldump 的方式进行数据迁移;如果数据量大,我们首选方式应该是提升服务器的性能,以至于它能够承载处理相应数据量的性能;如果必须迁移,可以考虑使用第三方专业的数据迁移工具。

【相关推荐:mysql视频教程】

以上就是一文聊聊快速迁移MySQL数据的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/351345.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
抖音双十一活动时间是几点?抖音双十一活动什么时候开始
上一篇 2025年11月5日 22:28:11
win10怎么打开注册表编辑器_win10注册表编辑器打开方法
下一篇 2025年11月5日 22:28:18

相关推荐

  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • PHP动态生成表单输入与POST数据获取实践指南

    本教程详细阐述了如何在php中根据动态数据源(如数据库值)生成多个表单输入框,并演示了如何通过post方法准确无误地获取这些动态生成的输入值。文章强调了正确的输入框命名策略,避免了常见的命名误区,并提供了完整的代码示例,确保开发者能够高效处理动态表单数据。 动态生成表单输入 在Web开发中,我们经常…

    2026年5月10日
    000
  • MySQL数据库不支持中文的解决办法

    接上一篇文章,在解决了mysql+flask环境配置问题之后,往数据库存中文字符串会报1366错误,提示不正确的字符。继而发现默认的mysql采用了latin1字符集,这种编码是不支持中文的。 如果想支持中文的话,需要设置一下mysql字符集。 众所周知utf-8是可以的,gbk也没问题,为了可扩展…

    用户投稿 2026年5月10日
    000
  • 从 JavaScript 获取 URL 并在 PHP DataGrid 中使用

    本文档旨在指导开发者如何从 JavaScript 函数中获取 URL,并将其动态应用于 PHP DataGrid。通过前端 JavaScript 动态生成 API 地址,并将其传递给后端的 PHP DataGrid,实现数据根据用户会话动态加载。 动态配置 DataGrid 的 URL 在构建动态 …

    2026年5月10日
    100
  • Go语言连接外部MySQL数据库:DSN配置与常见错误解析

    本文详细阐述了go语言使用`go-sql-driver/mysql`驱动连接外部mysql数据库的正确方法。重点介绍了数据源名称(dsn)的规范格式,特别是主机地址部分的配置,以避免常见的“getaddrinfow: the specified class was not found.”等网络解析错…

    2026年5月10日
    000
  • C++怎么使用C++17的并行算法库_C++ std::execution与多核性能优化

    c++kquote>C++17通过std::execution策略引入并行算法支持,需编译器(如GCC 8+)和线程库(如TBB)配合;提供seq、par、par_unseq三种策略控制执行模式;可用于sort、for_each等算法提升大数据性能,但需避免数据竞争,推荐使用reduce等安全…

    2026年5月10日
    000
  • Go语言与Microsoft SharePoint集成指南

    Go语言可以有效集成Microsoft SharePoint,主要通过两种途径:一是利用SharePoint提供的RESTful API进行数据交互,Go的标准HTTP客户端库即可轻松实现;二是通过SharePoint应用模型开发自托管应用,这种模型支持使用包括Go在内的任何语言编写后端逻辑。 1.…

    2026年5月10日
    000
  • 后缀php怎么打开_php文件打开方式与运行环境搭建指南

    要打开PHP文件需根据用途选择方式:查看代码可用文本编辑器或IDE,运行则需服务器环境。推荐新手使用XAMPP、WAMP等集成环境,将文件放入htdocs目录后访问localhost;开发者可利用PHP内置服务器,命令行执行php -S localhost:8000运行;高级用户可手动配置Apach…

    2026年5月10日
    000
  • PHP动态网页数据库备份恢复_PHP动态网页MySQL数据库备份教程

    答案:PHP动态网页的MySQL数据库备份与恢复需通过定期导出SQL文件并安全存储来保障数据安全,核心方法包括使用mysqldump命令行工具实现高效灵活的自动化备份,利用phpMyAdmin图形化工具进行手动导出导入以降低操作门槛,以及通过PHP脚本调用系统命令将备份过程集成到应用中;恢复时可采用…

    2026年5月10日
    000
  • Python多线程中GIL的影响 Python多线程绕过GIL限制的方法

    Python多线程因GIL无法并行执行CPU密集型任务,GIL使同一时刻仅一个线程运行字节码,限制多核利用;但I/O密集型任务中GIL会被释放,多线程仍有效。解决方法包括:1. 使用multiprocessing模块通过多进程绕过GIL,实现真正并行;2. 调用C扩展或Cython在计算时释放GIL…

    2026年5月10日
    000
  • php登录怎么实现_php用户登录系统完整实现

    <blockquote>PHP用户登录系统的核心是安全验证与会话管理。首先创建POST提交的登录表单,避免敏感信息暴露;后端通过session_start()启动会话,使用trim()和htmlspecialchars()清理输入,防止XSS攻击;利用PDO预处理语句查询数据库,防止SQ…

    用户投稿 2026年5月10日
    000
  • 如何处理在线编辑HTML时外部链接验证的处理方法

    在线编辑HTML时需验证外部链接以保障安全与可用性,可通过自动检测标记外链并添加rel属性提升安全性;2. 实时验证链接有效性,利用HEAD请求检查状态码并在编辑界面提示结果;3. 配置可信域名白名单控制高风险链接输入,适用于合规要求高的场景;4. 提供友好反馈机制,对无效或可疑链接弹出提示并支持新…

    2026年5月10日
    000
  • PHP处理大型文本文件转JSON:内存溢出诊断与优化实践

    本文深入探讨了PHP在将大型文本文件转换为结构化JSON时可能遇到的内存溢出问题。文章详细指导读者如何通过phpinfo()诊断并正确配置PHP的memory_limit,包括检查php.ini和.htaccess的潜在冲突,并提供了逐步增加内存限制的建议。同时,文章也分析了特定数据格式下内存消耗的…

    2026年5月10日
    100
  • 远程MySQL数据库连接指南:从本地PHP应用访问GCP实例数据库

    本文详细指导如何在本地php应用中连接到google cloud platform (gcp) 虚拟机实例上的远程mysql数据库。教程涵盖了数据库连接参数的配置、使用php pdo建立连接的方法、gcp环境下的网络配置要点,以及常见的安全和故障排除建议,旨在帮助开发者顺利实现跨环境的数据库通信。 …

    2026年5月10日
    000
  • 在PHP中实现MySQL数据插入时避免重复记录的策略

    本文将探讨在php应用中向mysql数据库插入数据时,如何有效避免重复记录的产生。针对当主键或唯一索引字段值已存在的情况,我们将介绍使用`insert ignore`语句的策略,以确保数据完整性并防止不必要的重复插入,从而简化数据管理逻辑。 引言:数据完整性与重复记录问题 在数据库管理中,数据完整性…

    2026年5月10日
    000
  • php实现哪些功能

    PHP是一种通用脚本语言,可用来实现广泛的功能,包括:动态Web开发:生成响应用户请求的动态 веб页面。内容管理系统(CMS):构建允许用户管理网站内容的CMS。电子商务:开发具有购物车、订单处理和支付网关集成的电子商务网站。服务器端编程:编写命令行脚本和工具。文件操作:创建、读取、写入和删除文件…

    2026年5月10日
    000
  • 多表单单按钮提交与Flask后端处理教程

    本教程将详细介绍如何使用JavaScript和Flask处理通过一个按钮提交多个HTML表单的场景。我们将探讨直接提交的局限性,并提供基于XMLHttpRequest的异步提交解决方案,确保所有表单数据都能被Flask后端正确接收和处理,避免仅接收到最后一个表单数据的问题。 1. 多表单提交的挑战 …

    2026年5月10日
    000
  • 在Python Flask中实现在线图片URL到Blurhash编码

    本教程详细介绍了如何在python flask应用中,将在线图片url转换为blurhash键。针对官方文档主要侧重本地文件处理的局限,文章通过整合`requests`库下载图片内容和`blurhash-python`库进行编码,提供了完整的解决方案,并包含代码示例、依赖安装、错误处理及在flask…

    2026年5月10日
    000
  • PHP 动态 SQL WHERE 子句构建:避免重复 AND 的策略

    本文探讨了在 php 中动态构建 sql 查询 `where` 子句时常见的“`where and`”语法错误及其解决方案。通过逐步构建条件字符串,确保第一个条件不带 `and`,后续条件正确使用 `and` 连接,从而生成符合 sql 规范的查询语句,提高代码的健壮性和可读性。 动态构建 SQL …

    2026年5月10日
    200
  • JavaScript数据结构实现_javascript算法基础

    JavaScript中常用数据结构包括栈、链表和字典:1. 栈利用数组的push和pop实现LIFO,适用于括号匹配;2. 链表由节点组成,插入删除高效,适合频繁修改场景;3. 字典用对象实现键值对存储,常用于频率统计;4. 二分查找在有序数组中以O(log n)效率查找目标值,需数组已排序。掌握这…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信