首页 > Sysadmin > 正文

Linux 下导入 SQL 文件的两种做法

huyuanwen 2026-10-26 Sysadmin

拿到一份 .sql 转储文件,导入 MySQL 或 MariaDB 通常只要一行命令。成败的关键在于文件里有没有建库语句。

先确认转储文件里有没有建库语句

grep -n 'CREATE DATABASE\|USE ' app.sql
wc -l app.sql

mysqldump 用 --all-databases 或 --databases 生成的文件自带 CREATE DATABASE 和 USE 语句,因此不需要指定目标数据库,直接 mysql < dump.sql 就够了 [1]。单库转储常常没有这两句,必须先自己建库,否则会报 Unknown database。

重定向导入:单库转储先建库

mysqladmin create db1
mysql db1 < dump.sql

官方文档的写法是:若转储文件不含 CREATE DATABASE 和 USE,先创建数据库,再把文件作为标准输入重定向给 mysql 客户端 [1]。批量脚本还可以把输出写进文件,例如 mysql db_name < script.sql > output.tab [2]。

交互式导入:source 命令

mysql -u root -p db1
mysql> CREATE DATABASE IF NOT EXISTS db1;
mysql> USE db1;
mysql> source dump.sql

source file_name 与 \. file_name 是 mysql 客户端自己解释的内置命令,适合在已经打开的会话里执行脚本文件 [3]。MariaDB 的 mariadb 客户端同样支持脚本批处理,在 Unix 上 mysql 是指向它的符号链接 [5]。

验证导入是否成功

mysql --execute="SHOW TABLES" db1
mysql --verbose db1 < dump.sql

-e(--execute=statement)执行语句后立即退出,适合快速核对表名和行数 [4]。--verbose 会在每条语句的结果前打印该语句本身,方便观察导入进度 [2]。文件开头带 BOM 时 mysql 会自动忽略,但中文数据建议显式加上 --default-character-set=utf8mb4 [2]。导入很大的转储文件时,--quick 让客户端逐行取结果而不一次性缓冲,内存开销更低 [5]。

用文本编辑器打开 .sql 文件

.sql 本质是纯文本,cat app.sql、less app.sql 或 head -20 app.sql 都能直接查看;需要修改时用 nano app.sql 或 vim app.sql。导入前先读前几行,确认有没有 USE 语句和 DELIMITER 定义,比盲目执行安全得多。

遇到 Unknown database 报错,基本就是转储文件里没有 USE 语句——补一行 USE db1; 或给命令行加数据库名,再导入即可。


参考资料

本文命令与选项逐项核对自上述来源,发布前未在实机执行,跑通与否欢迎反馈。