Skip to content

MySQL - 复制数据库

复制或克隆数据库是一项常见的管理任务,具有几个关键目的,这与为灾难恢复创建备份不同。您可能需要复制数据库以达到以下目的:

  • 创建一个镜像生产环境的测试或暂存环境(staging or testing environment)。
  • 为开发人员提供包含真实数据的开发数据库。
  • 在应用于生产环境之前,在副本上执行重大的数据迁移或架构升级(schema upgrade)。
  • 在不影响实时生产数据库性能的情况下分析数据。

与其他一些数据库系统不同,MySQL 没有单一的 COPY DATABASE 命令。该过程涉及导出源数据库并将其导入到新的目标数据库中。

方法 1:使用 mysqldump 的标准方法(推荐)

Section titled “方法 1:使用 mysqldump 的标准方法(推荐)”

mysqldump 是 MySQL 附带的一个命令行工具。它是创建数据库逻辑副本最可靠和最全面的方法。它会生成一个 .sql 文件,其中包含架构(表、视图、触发器、存储过程)的所有 CREATE 语句以及所有数据(data)的 INSERT 语句。

首先,连接到 MySQL 并创建一个空数据库作为目标。

CREATE DATABASE source_db_copy;

从您的系统命令行(而不是 MySQL 提示符)运行 mysqldump。此命令将 source_db 导出到名为 dump.sql 的文件中。

# 语法: mysqldump -u [用户名] -p [源数据库] > [dump_file.sql]
mysqldump -u root -p source_db > dump.sql

系统将提示您输入密码。> 运算符将输出重定向到指定文件。

现在,将 .sql 文件的内容导入到您新创建的目标数据库中。

# 语法: mysql -u [用户名] -p [目标数据库] < [dump_file.sql]
mysql -u root -p source_db_copy < dump.sql

< 运算符将文件中的 SQL 命令输入到 MySQL 客户端。完成后,source_db_copy 将是 source_db 在导出时的精确副本。

对于无需离开 SQL 客户端即可快速复制几个特定表的场景,您可以使用两步 SQL 过程。警告:此方法有显著限制。

此方法仅复制表结构及其数据。它不复制索引、触发器、外键约束或自增值等关键元素。它不适用于创建完整的数据库克隆。

-- 假设 'source_db_copy' 已存在
-- 步骤 1: 在目标数据库中创建一个与源表结构相同的空表
CREATE TABLE source_db_copy.products LIKE source_db.products;
-- 步骤 2: 将所有数据从源表复制到新表
INSERT INTO source_db_copy.products SELECT * FROM source_db.products;

您需要对每个表重复此过程,然后手动重新创建所有索引、触发器和约束,这既繁琐又容易出错。

现代数据库管理工具提供了图形界面,大大简化了此过程。MySQL Workbench、DBeaver 和 DataGrip 等工具都内置了数据导出和导入功能。

通常,工作流程包括:
1. 右键单击源数据库。
2. 选择 'Data Export/Dump' 或 'Backup' 等选项。
3. 配置选项(例如,自包含 SQL 文件,包含触发器)。
4. 创建转储文件(dump file)。
5. 创建一个新的空数据库。
6. 右键单击新数据库并选择 'Data Import/Restore' 以加载文件。

如果您在云端使用托管数据库服务(例如 Amazon RDS、Google Cloud SQL、Azure Database for MySQL),这个过程通常会简单快捷得多。这些平台提供了创建数据库“快照”(snapshot)然后将该快照“恢复”到新数据库实例的功能,自动处理底层基础设施。

- **一致性:** 对于活跃的数据库,您需要一个一致的快照。使用 `mysqldump` 处理 InnoDB 表时,请添加 `--single-transaction` 标志。这会启动一个事务,并从一个一致的时间点转储数据,而不会锁定表进行读取。
`mysqldump --single-transaction -u root -p source_db > dump.sql`
- **大小:** 对于非常大的数据库,`mysqldump` 可能会很慢并生成巨大的文件。在这种情况下,通常更推荐物理备份方法(如 Percona XtraBackup)或云快照。