如何将MySQL/MariaDB的testreporting4库全量数据结构复制到testreportingdebug库
MySQL/MariaDB 同实例跨库全量复制实现方案
数据量影响说明
3.1GB属于中小规模数据量,只要服务器剩余磁盘空间≥6GB(预留临时文件和目标库存储空间),常规复制操作不会对生产库造成过高负载,操作时避开业务高峰即可,不会有明显性能问题。
推荐实现方案
方案1:mysqldump管道直接导入(最常用,适合绝大多数场景)
该方案不需要生成中间备份文件,直接完成导出+导入操作,步骤最简单:
- 如果源库表均为InnoDB引擎,执行以下命令:
mysqldump -u 你的数据库用户名 -p'你的数据库密码' --single-transaction --routines --triggers --events testreporting4 | mysql -u 你的数据库用户名 -p'你的数据库密码' testreportingdebug
- 注意事项:
- 密码紧贴
-p,或者像示例用单引号包裹,避免密码泄露到进程历史 --single-transaction参数会在事务中完成导出,不会锁源库表,不影响正常业务读写--routines --triggers --events参数会同步复制存储过程、触发器、事件,没有这些对象可以省略- 如果源库存在大量MyISAM表,将
--single-transaction替换为--lock-tables即可
- 密码紧贴
方案2:SQL语句批量复制(适合需要分批控制进度的场景)
不需要退出数据库命令行,直接在MySQL终端内完成操作:
- 先查询源库的字符集配置,保证目标库和源库字符集一致:
SHOW CREATE DATABASE testreporting4;
- 创建目标库,字符集和排序规则和上一步查询结果保持一致:
CREATE DATABASE IF NOT EXISTS testreportingdebug DEFAULT CHARSET 源库字符集 COLLATE 源库排序规则;
- 生成批量复制表结构和数据的语句:
SELECT CONCAT('CREATE TABLE testreportingdebug.', table_name, ' LIKE testreporting4.', table_name, '; INSERT INTO testreportingdebug.', table_name, ' SELECT * FROM testreporting4.', table_name, ';') FROM information_schema.tables WHERE table_schema = 'testreporting4';
- 执行上一步生成的所有SQL语句即可完成复制,也可以拆分后分批执行,避免长事务占用过多资源。
方案3:物理文件复制(不推荐新手使用)
适合更大数据量场景,需要暂时停库:
- 停止MySQL服务
- 进入MySQL数据目录,将
testreporting4文件夹完整复制一份,重命名为testreportingdebug - 给新复制的文件夹赋予和原文件夹一致的MySQL运行用户权限
- 重启MySQL服务即可完成复制
校验规则
复制完成后需要做一致性校验,避免数据丢失:
- 比对两个库的表数量:
SELECT table_schema, COUNT(*) FROM information_schema.tables WHERE table_schema IN ('testreporting4','testreportingdebug') GROUP BY table_schema; - 随机抽取几张大表比对行数,确认数据一致
- 若有存储过程等对象,单独查询确认同步完成
内容的提问来源于stack exchange,提问作者Mads Sander Høgstrup
相关产品推荐
相关产品推荐

