MySQL - 数据库导入
MySQL - 从 SQL 文件导入数据库
Section titled “MySQL - 从 SQL 文件导入数据库”导入数据库涉及从 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 的新数据库中。
- 登录 MySQL 并创建目标数据库
$ mysql -u root -pEnter password: ********
mysql> CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;出现 Query OK 消息表示数据库创建成功。现在,退出 MySQL 客户端。
mysql> exitBye- 在您的系统终端中运行导入命令
$ mysql -u root -p testdb < tut_backup.sqlEnter 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;- 登录 MySQL 并选择目标数据库。
$ mysql -u root -pEnter password: ********
mysql> USE testdb;- 运行
SOURCE命令。 请注意,您必须提供文件的完整绝对路径,或者相对于您启动mysql客户端的位置的相对路径。
mysql> SOURCE /home/user/backups/tut_backup.sql;MySQL 将执行文件中的命令,并为每个语句打印 Query OK,这对于大型文件可能会非常冗长。
重要注意事项和故障排除
Section titled “重要注意事项和故障排除”* **字符集**: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` 语句。