Skip to content

MySQL - 数据库导入

导入数据库涉及从 SQL 脚本文件(通常称为“转储”文件或 ‘dump’ 文件)恢复其结构和数据。此过程对于数据库迁移、从备份恢复或设置开发环境至关重要。本教程将介绍将数据导入 MySQL 的主要方法。

### 先决条件
* **SQL 转储文件**:您需要一个包含 `CREATE TABLE` 和 `INSERT INTO` 语句(或其他有效 SQL 命令)的 `.sql` 文件来重新创建数据库。这些文件通常由 `mysqldump` 等工具生成。
* **目标数据库**:您需要一个现有(通常是空的)数据库来导入数据。
* **权限**:执行导入操作的 MySQL 用户需要对目标数据库拥有足够的权限(`CREATE`、`INSERT`、`DROP` 等)。

方法 1:使用 mysql 命令行工具(推荐)

Section titled “方法 1:使用 mysql 命令行工具(推荐)”

导入 SQL 文件最常用且高效的方法是使用 mysql 命令行客户端将文件内容重定向作为输入。此方法速度快,适用于任何大小的文件。

mysql -u [username] -p [database_name] < [path_to_your_sql_file.sql]
  • -u [username]:您的 MySQL 用户名。
  • -p:提示您安全地输入密码。避免直接在命令行中输入密码。
  • [database_name]:您要导入数据的数据库名称。此数据库必须首先存在。
  • <:这是 shell 环境中的标准输入重定向运算符。它告诉 shell 将文件内容发送到 mysql 客户端的标准输入。

假设我们有一个名为 tut_backup.sql 的备份文件,我们想将其导入到一个名为 testdb 的新数据库中。

  1. 登录 MySQL 并创建目标数据库
$ mysql -u root -p
Enter password: ********
mysql> CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

出现 Query OK 消息表示数据库创建成功。现在,退出 MySQL 客户端。

mysql> exit
Bye
  1. 在您的系统终端中运行导入命令
$ mysql -u root -p testdb < tut_backup.sql
Enter password: ********

如果命令成功执行,则不会有任何输出。没有错误消息表示成功。如果 SQL 文件中存在任何语法错误或权限问题,MySQL 会将其打印到终端。

要验证导入,请重新登录 testdb 数据库并检查其内容。

$ mysql -u root -p testdb
mysql> SHOW TABLES;

这将列出从 tut_backup.sql 文件创建的表。例如,如果备份包含一个 customers 表:

testdb 中的表
customers

您可以通过查询数据进一步验证:

mysql> SELECT * FROM customers LIMIT 5;

方法 2:在 MySQL 客户端中使用 SOURCE 命令

Section titled “方法 2:在 MySQL 客户端中使用 SOURCE 命令”

另一种方法是在交互式 MySQL 会话中,使用 SOURCE 命令。这种方法功能上相似,但如果您已经在 MySQL 客户端中工作,可能会更方便。

SOURCE /path/to/your/sql_file.sql;
  1. 登录 MySQL 并选择目标数据库。
$ mysql -u root -p
Enter password: ********
mysql> USE testdb;
  1. 运行 SOURCE 命令。 请注意,您必须提供文件的完整绝对路径,或者相对于您启动 mysql 客户端的位置的相对路径。
mysql> SOURCE /home/user/backups/tut_backup.sql;

MySQL 将执行文件中的命令,并为每个语句打印 Query OK,这对于大型文件可能会非常冗长。

* **字符集**:SQL 文件的字符集与目标数据库之间的不匹配可能导致数据损坏(乱码 mojibake)。最佳实践是使用与源数据库相同的字符集(通常是 `utf8mb4`)创建目标数据库。
* **大型文件**:对于非常大的转储文件,命令行重定向方法(`<`)通常更节省内存。您可能还会遇到 `max_allowed_packet` 限制。如果您看到诸如“MySQL server has gone away”之类的错误,您可能需要在 MySQL 配置文件(`my.cnf` 或 `my.ini`)中增加此值。
* **安全性**:切勿从不受信任的来源导入 SQL 文件。它们是纯文本文件,可能包含恶意命令,如 `DROP DATABASE` 或其他破坏性操作。
* **常见错误**:
* `ERROR 1044 (42000): Access denied for user...`:用户对目标数据库缺少必要的权限。
* `ERROR 1046 (3D000): No database selected`:您忘记在命令行中指定 `database_name` 或在 `SOURCE` 之前使用 `USE database_name;`。
* `ERROR 1050 (42S01): Table '...' already exists`:您正在导入到一个已包含同名表的数据库中。请确保目标数据库为空,或者 SQL 文件包含 `DROP TABLE IF EXISTS` 语句。