HOWTO · MySQL
在 MySQL 中复制数据库
本文介绍如何复制 MySQL 数据库。
本页内容
使用 mysqldump 复制 MySQL 数据库会创建逻辑 SQL 副本。这不会使用 MySQL 的 Clone 插件、配置复制,也不能提供高可用性或在服务器故障时进行恢复。以下命令会将一个数据库复制到同一台 MySQL 服务器上的另一个数据库。命令在操作系统 shell 中运行,例如命令提示符、PowerShell 或类 Unix shell;SQL 语句则在 MySQL 客户端中运行。
在同一台服务器上复制 MySQL 数据库
将源数据库的转储内容传到目标数据库,常见方法有两种:先写入 SQL 文件,或直接通过管道传给 MySQL 客户端。两种方法都需要能使用 MySQL 命令行工具,并具备读取源数据库以及创建或写入目标数据库的凭据。请将示例中的名称替换为你的数据库名称。示例使用 root 账户作说明;条件允许时,请使用仅具有当前任务所需权限的账户。
准备源数据库和目标数据库
为源数据库和目标数据库选择不同的名称,并确认连接的是预期服务器。导入前必须先创建目标数据库。你可以连接 MySQL 客户端并输入 CREATE DATABASE targetDb; 来创建数据库,也可以使用有权限创建数据库的账户。如果 targetDb 已存在,导入操作可能会依据转储文件中的 SQL 语句添加或替换对象;如果目标数据库中的现有内容很重要,请先检查它。
确保可以在 shell 中使用 mysqldump 和 mysql。如果它们不在系统的 PATH 中,请使用可执行文件的完整路径。为转储文件选择一个可写入的位置,并在导出和导入时使用同一路径。示例将 firstDbDump.sql 保存到当前工作目录。
使用 SQL 转储文件复制数据库
这种方法会保留一个中间 SQL 文件,供你检查或留存。在操作系统 shell 中运行 mysqldump -u root -p firstDb > firstDbDump.sql。-u 选项用于指定账户,-p 会让客户端提示输入密码。shell 重定向符号 > 会将转储内容写入指定文件;它不会创建目标数据库。
创建 targetDb 后,在同一个 shell 目录中运行 mysql -u root -p targetDb < firstDbDump.sql 来导入文件。这里的 < 会将文件内容传给连接到 targetDb 的 MySQL 客户端。如果转储文件保存在其他位置,请在两条命令中使用相同的完整路径。若导出失败,应先解决问题再进行导入,以免把旧文件误当成刚生成的副本。
这些操作需要连接 MySQL 服务;本文没有实际执行这些命令。运行命令需要可访问的 MySQL 服务器、有效凭据和适当权限。
使用管道复制数据库
若要直接将转储内容流式传入目标数据库而不保留中间文件,请先确认 targetDb 已存在,然后在操作系统 shell 中运行:mysqldump -u root -p firstDb | mysql -u root -p targetDb。
管道符号(|)会将 mysqldump 的标准输出传给 mysql 的标准输入。两个命令分别建立客户端连接,而且每个 -p 都会提示输入密码,因此会出现两次密码提示。不要直接在命令中写入密码,以免它出现在 shell 历史记录或进程列表中。这种方法不需要临时转储文件,但也就没有文件可供检查或重复使用。与文件方法一样,它只会执行一次逻辑复制,并不会创建定期备份。
下方图片展示了管道命令和两次密码提示。上方也提供了可选择并复制的命令文本。
终端示例显示两个客户端分别提示输入密码。
验证复制结果
使用 mysql -u root -p 连接到预期服务器,然后运行 SHOW DATABASES;,确认目标数据库名称出现在列表中。使用 USE targetDb; 选择该数据库,再用 SHOW TABLES; 列出其中的表。这些检查只能确认当前连接中可以看到该数据库及其表,不能证明每一行数据、视图、触发器、例程或其他对象都与源数据库一致。若要进行更充分的验证,请比较应用实际依赖的对象和数据。
了解密码提示和操作限制
不带值的 -p 选项会交互式提示输入密码;它不表示密码会在下一条命令行中提供。在管道工作流程中,mysqldump 和 mysql 是两个独立程序,因此会分别提示输入密码。无人值守的进程需要根据运行环境采用安全的凭据配置;避免将密码嵌入 shell 命令中。
这两种工作流程都是在同一台服务器上复制一个数据库,并且每次调用只运行一次。它们不会安排每日备份、建立复制,也不能保证在服务器或节点故障后恢复。特殊对象、存储引擎行为、权限、字符集和服务器选项都可能影响迁移;如果这些因素与你的环境有关,请检查转储文件并相应调整命令。