如何在MySQL控制台内复制完整数据库并设置不同名称
结论
MySQL原生mysql>交互控制台没有提供单命令一键克隆数据库的内置语法,但完全可以在不退出控制台的前提下完成全量数据库复制,不需要切回系统命令行操作。
控制台内克隆数据库的可落地方案
方案1:控制台内调用系统命令实现(推荐,无对象遗漏)
你已经熟悉的mysqldump导出导入逻辑不需要推翻,在mysql>交互提示符下可以通过system关键字(Windows环境可简写为!)直接调用系统层面的命令,全程不需要退出控制台:
- 先创建空的目标库,字符集、排序规则和原库保持一致即可:
CREATE DATABASE IF NOT EXISTS newDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - 直接执行管道命令一键完成导出导入,把参数里的连接信息替换成你自己的实际值即可:
如果不想在命令里明文写密码,可以走临时文件中转,执行时按提示输入密码即可:-- 明文写密码适合本地测试环境,生产环境建议用下面的临时文件方式 system mysqldump -hDBHOST -uDBUSER -p你的数据库密码 oldDB | mysql -hDBHOST -uDBUSER -p你的数据库密码 newDB
复制完成后手动删掉临时sql文件即可。-- Windows路径示例,Linux/macOS可以换成/tmp目录下的临时路径 system mysqldump -hDBHOST -uDBUSER -p oldDB > C:\temp\oldDB_bak.sql system mysql -hDBHOST -uDBUSER -p newDB < C:\temp\oldDB_bak.sql
这个方案和你之前手动切命令行跑mysqldump的效果完全一致,会完整复制表结构、数据、视图、触发器、存储过程、外键约束所有对象,不会出现兼容性问题。
方案2:纯SQL语句克隆(适合无shell执行权限场景)
如果你登录的数据库账号没有系统命令执行权限,只能跑SQL语句,可以通过查询系统表生成批量复制语句逐表迁移,注意这个方法默认不会复制触发器、存储过程、视图等特殊对象,需要单独迁移:
- 先创建好目标空库(同方案1的建库语句)
- 执行下面的查询生成所有基础表的复制SQL:
SELECT CONCAT( 'CREATE TABLE newDB.', table_name, ' LIKE oldDB.', table_name, ';', 'INSERT INTO newDB.', table_name, ' SELECT * FROM oldDB.', table_name, ';' ) AS exec_sql FROM information_schema.tables WHERE table_schema = 'oldDB' AND table_type = 'BASE TABLE'; - 把查询结果里生成的所有SQL语句复制执行,即可完成所有基础表的结构和数据复制。视图、存储过程、触发器需要单独从
information_schema.VIEWS、information_schema.ROUTINES、information_schema.TRIGGERS系统表中查询定义语句,在新库手动执行创建。
注意事项
- 不要直接复制MySQL数据目录下的对应库文件夹做克隆,这种方式对InnoDB引擎兼容性极差,跨版本操作几乎必然出现表损坏、无法读取的问题。
- 如果是大于10G的大库,复制前建议先给原库加全局读锁,避免复制过程中有新数据写入导致新旧库数据不一致:
-- 复制前执行加锁 FLUSH TABLES WITH READ LOCK; -- 复制全部完成后执行解锁 UNLOCK TABLES;
内容的提问来源于stack exchange,提问作者ashokostech
相关产品推荐
相关产品推荐

