source 命令是MySQL客户端本地批量导入SQL文件最轻量可控的方式,路径为客户端本地路径,不支持通配符,需注意USE语句切换库及避免LOAD DATA INFILE等服务端语句。
MySQL 客户端执行 source 命令批量导入本地 SQL 文件
直接在 mysql 命令行里用 source 是最轻量、最可控的方式,不需要改服务器配置,也不依赖 web 界面或额外工具。前提是你的本地机器能连上目标数据库(权限够、网络通),且 sql 文件本身不含绝对路径引用或非标准语法。
- 先登录:
mysql -h your-server-ip -u username -p database_name - 进库后执行:
source /path/to/your/file1.sql;(注意路径是**客户端本地路径**,不是服务器上的) - 多个文件?挨个
source就行,MySQL 不支持通配符批量,别试source /path/*.sql—— 会报错Failed to open file - 如果 SQL 文件里有
USE other_db;,它会切换上下文,可能意外写到别的库,得提前确认或删掉
用 mysql 命令行工具配合 shell 循环导入(Linux/macOS)
适合一次性跑完一整个目录的 SQL 文件,比手动 source 省事,也更容易加日志和错误检查。
- 基础命令:
for f in *.sql; do mysql -h host -u user -p'pass' db_name - 关键点:
是重定向输入,文件路径是**本地 shell 当前路径**,不是服务器路径 - 常见坑:
-p'pass'中间不能有空格,否则密码会被忽略;更安全的做法是用~/.my.cnf配置凭据,避免密码明文出现在命令行或历史记录里 - 如果某个 SQL 文件出错(比如建表已存在),后续文件默认继续执行,加
|| exit 1可中断:mysql ...
PHP 脚本调用 mysqli::multi_query() 导入单个 SQL 文件(含多语句)
适用于已有 PHP 环境、想用脚本触发导入的场景。注意:mysqli::multi_query() 能跑多语句,但不解析分号位置——它靠 MySQL 自己切分,所以文件里不能有存储过程定义里的分号干扰,否则会断句失败。
- 读取文件内容:
$sql = file_get_contents('/local/path/file.sql'); - 执行:
$mysqli->multi_query($sql); - 必须循环调用
next_result()清空结果集,否则下一次multi_query()会报Commands out of sync - 不支持
LOAD DATA INFILE这类需要服务器端文件路径的语句——它走的是客户端连接通道,不是服务器本地读盘
为什么不要碰服务器端的 secure_file_priv 和 LOAD DATA INFILE
看到“服务器端上传目录”就想去配 secure_file_priv?先停一下。这个配置本质是让 MySQL 服务进程去读自己机器上的文件,和“本地文件夹批量导入”根本不是一回事——你传上去的 SQL 文件,还得再 ssh 登进去手动 mysql db ,反而多一步,还引入文件权限、SELinux、路径写死等问题。
-
secure_file_priv设为空字符串或指定目录,都需要重启 MySQL,线上库基本不允许 -
LOAD DATA INFILE只能加载单个文件,且语句里写的路径是**服务器视角**,没法动态遍历目录 - 一旦开放
LOCAL INFILE(即客户端发起的LOAD DATA LOCAL INFILE),有被 SSRF 或文件读取利用的风险,很多云厂商默认禁用
真正卡住的往往不是技术路径,而是误把“本地执行导入”理解成“必须把文件先扔到服务器上”。只要网络通、权限对,SQL 文件留在你笔记本里,一样能倒进去。










