如何无需从服务器下载数据将MySQL数据库复制到目标schema?
Docker内MySQL8大库本地克隆方案(无需下载到本地)
你现在用Workbench把数据导到本地再回传的方案,本质是数据在服务器→你电脑→服务器之间绕了一圈,20G数据光网络传输就要耗很久,完全没必要,下面两个方案全程在服务器侧完成,效率高很多。
方案一:管道直导(零落盘、不锁原库,推荐优先用)
这个方案不需要停服务,不需要存临时备份文件,对线上业务影响最小,适合绝大多数场景。
- 首先先重置目标库,避免旧数据冲突:
不管是用Workbench连库执行,还是进容器登MySQL执行都可以,注意字符集和排序规则要跟源wordpress库保持一致:DROP DATABASE IF EXISTS wordpress_test; CREATE DATABASE wordpress_test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 然后直接在服务器的命令行执行下面的Docker命令,把源库的导出流通过管道直接写入目标库,全程数据不落地:
docker exec -i 替换成你的MySQL容器名 mysqldump -u替换成你的数据库账号 -p'替换成你的数据库密码' --single-transaction --routines --triggers --set-gtid-purged=OFF wordpress | docker exec -i 替换成你的MySQL容器名 mysql -u替换成你的数据库账号 -p'替换成你的数据库密码' wordpress_test
注意:
-p和密码之间不要加空格,直接写成-p'你的密码'格式,加空格会报错。参数里的--single-transaction会给InnoDB引擎的表做一致性快照,克隆过程不会锁原库的读写,不影响正常业务;--set-gtid-purged=OFF是MySQL8必须加的参数,避免GTID配置导致的导入报错。
等命令执行完没有报错,克隆就完成了,20G的库在普通性能的服务器上一般3-10分钟就能跑完。
方案二:物理文件冷拷贝(速度最快,需短暂停服务)
如果你的库后续涨到几十上百G,逻辑备份的速度不够快,可以用物理拷贝数据文件的方式,速度基本等于磁盘拷贝速度,但是需要短暂停MySQL服务保证数据一致性:
- 先停掉运行中的MySQL容器:
docker stop 替换成你的MySQL容器名 - 找到MySQL的数据存储目录:如果你的容器启动时挂载了宿主机目录到容器内的
/var/lib/mysql,直接进入宿主机上对应的挂载目录即可;如果没做挂载,先把容器内的数据目录拷贝到宿主机临时路径:docker cp 替换成你的MySQL容器名:/var/lib/mysql /tmp/mysql_bak cd /tmp/mysql_bak - 直接拷贝源库的整个文件夹到目标库名称,
-a参数会保留原文件的权限和属性:cp -a wordpress wordpress_test - 如果是没挂载卷的场景,把拷贝完的整个数据目录拷回容器,覆盖原数据目录,再启动容器即可;如果是挂载卷的场景,直接启动容器就行。
注意:这个方法要求源和目标的MySQL版本完全一致,你这里是同一个容器内的库,不存在版本问题,可以放心用。
注意事项
- 不要用图形化工具的导出导入功能处理10G以上的大库,数据来回传输不仅慢,还很容易因为网络波动中途失败。
- 克隆完成后可以随机抽几张原库的大表,对比下源库和目标库的行数,确认数据完整。
- 如果你的wordpress库有MyISAM引擎的表,用方案一的时候最好暂时停一下业务写入,避免备份过程中数据不一致。
内容的提问来源于stack exchange,提问作者teteyi3241
相关产品推荐
相关产品推荐

