在Linux环境下执行MySQL脚本是数据库管理和自动化运维中的常见操作,无论是数据迁移、初始化表结构还是定期执行数据维护任务,都离不开高效的脚本执行方法,本文将详细介绍Linux下执行MySQL脚本的多种方式、准备工作、注意事项及常见问题解决方案,帮助读者掌握不同场景下的最佳实践。

准备工作:环境与脚本规范
在执行MySQL脚本前,需确保环境配置和脚本文件符合规范,避免因基础问题导致执行失败。
环境配置
- MySQL安装与连接:确保MySQL服务已启动(可通过
systemctl status mysqld检查),且Linux系统已安装MySQL客户端工具(通常包含mysql命令),若未安装,可通过sudo apt-get install mysql-client(Ubuntu/Debian)或sudo yum install mysql(CentOS/RHEL)安装。 - 用户权限:执行脚本的用户需具备MySQL目标数据库的相应权限(如
SELECT、INSERT、UPDATE等),建议使用具有足够权限但非root的用户(如创建专用管理用户:CREATE USER 'script_user'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON database_name.* TO 'script_user'@'localhost';)。 - 环境变量:若MySQL未加入系统PATH,可通过
export PATH=$PATH:/usr/local/mysql/bin(路径根据实际安装位置调整)临时配置,或永久配置到~/.bashrc文件中。
脚本文件规范
- 格式与编码:脚本文件建议使用
.sql扩展名,编码统一为UTF-8(避免因编码问题导致乱码或语法错误),可通过file script.sql检查文件编码,用iconv -f gbk -t utf-8 script.sql -o script_utf8.sql转换编码。 - 语句规范:SQL语句需以分号结尾(除非使用
mysql命令的--skip-line-numbers或--ignore-spaces参数),注释可用(单行)或(多行)。-- 创建用户表 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
执行方法一:交互式客户端直接执行(source/命令)
适用于已登录MySQL客户端的场景,通过内置命令直接执行脚本文件,操作简单且能实时查看执行结果。
操作步骤:
- 登录MySQL客户端:
mysql -u 用户名 -p 数据库名(输入密码后进入MySQL命令行)。 - 执行脚本:使用
source命令或命令(两者功能相同)指定脚本路径,需使用绝对路径或相对路径(从当前工作目录算起)。mysql> source /home/user/scripts/init.sql; -- 或 mysql> ./init.sql;
优点:
- 直接在当前会话执行,脚本中的临时变量、临时表等会话对象不会丢失,适合需要交互或依赖会话状态的脚本。
- 执行过程中可实时输出错误信息,便于调试。
缺点:
- 需预先登录MySQL客户端,不适合自动化批量执行场景。
执行方法二:非交互式命令行执行(mysql命令+重定向)
自动化运维中最常用的方法,通过Linux命令行直接调用mysql工具执行脚本,无需交互式登录,适合定时任务、脚本集成等场景。
操作步骤:
基本语法:mysql -u 用户名 -p[密码] -h 主机名 -P 端口号 数据库名 < 脚本路径

参数说明:
-u:MySQL用户名(如-u script_user)。-p:密码(注意-p后直接跟密码会暴露在命令历史中,建议不加密码,回车后输入;或通过配置文件安全管理)。-h:MySQL服务器主机名(本地用localhost或0.0.1)。-P:端口号(默认3306,可省略)。数据库名:目标数据库名(若脚本中包含USE 数据库名;语句,可省略此参数)。<:输入重定向,将脚本文件内容作为mysql命令的输入。
示例:
# 执行本地脚本,连接本地MySQL的test数据库 mysql -u root -p test < /home/user/scripts/data_import.sql # 连接远程MySQL(主机192.168.1.100,端口3307) mysql -u script_user -p -h 192.168.1.100 -P 3307 database_name < /path/to/script.sql
安全优化:
为避免密码泄露,可通过MySQL配置文件~/.my.cnf(用户级)或/etc/my.cnf(系统级)存储认证信息:
[client] user = script_user password = your_password host = localhost port = 3306
执行时直接简化为:mysql 数据库名 < 脚本路径,无需输入密码。
优点:
- 无需交互,适合自动化脚本(如结合
crontab定时执行)。 - 可结合Linux管道、重定向等特性,实现日志输出(
mysql ... < script.sql > output.log 2>&1)或错误处理。
缺点:
- 脚本中的会话对象(如临时变量)执行后自动销毁,不适合需要保留会话状态的场景。
执行方法三:在MySQL客户端内执行动态脚本(source语句)
与方法一类似,但适合脚本路径动态生成或需要通过SQL语句调用脚本的场景(如存储过程中执行脚本)。
操作步骤:
在MySQL客户端中,通过source语句执行动态路径的脚本:
mysql> SET @script_path = '/home/user/scripts/dynamic.sql'; mysql> SOURCE @script_path;
适用场景:

- 脚本路径需根据变量动态确定(如根据日期生成路径)。
- 在存储过程或函数中调用外部脚本(需结合
PREPARE和EXECUTE语句处理动态SQL)。
高级技巧:结合Shell脚本实现复杂逻辑
实际运维中,常需结合Shell脚本实现参数传递、条件判断、循环等逻辑,增强脚本的灵活性。
示例:带参数的MySQL脚本执行
#!/bin/bash
# 定义变量
DB_USER="root"
DB_NAME="test"
SCRIPT_PATH="/home/user/scripts/data_import.sql"
DATE_PARAM=$(date +%Y%m%d)
# 执行脚本并传递参数(通过SQL变量)
mysql -u "$DB_USER" -p"$DB_NAME" "$DB_NAME" <<EOF
-- 在SQL中使用Shell变量
SET @import_date = '$DATE_PARAM';
source $SCRIPT_PATH;
SELECT 'Data imported for date: ' @import_date;
EOF
# 错误处理
if [ $? -ne 0 ]; then
echo "MySQL script execution failed at $(date)" >> /var/log/mysql_script_error.log
exit 1
else
echo "Script executed successfully at $(date)"
fi
关键点:
- 使用
here document(<<EOF…EOF)将SQL语句和Shell变量传递给mysql命令。 - 通过检查
mysql命令的退出状态(0表示成功,非0表示失败),结合if语句实现错误处理。
常见问题与解决方案
-
权限问题
- 现象:
ERROR 1142 (42000): command denied for user 'user'@'localhost'。 - 解决:检查MySQL用户权限,确保对目标数据库、表有操作权限(
SHOW GRANTS FOR 'user'@'localhost';)。
- 现象:
-
编码问题
- 现象:脚本中中文显示为乱码或执行报错(如
Incorrect string value)。 - 解决:确保脚本文件编码为UTF-8,执行时指定字符集:
mysql --default-character-set=utf8 -u user -p database < script.sql。
- 现象:脚本中中文显示为乱码或执行报错(如
-
脚本语法错误
- 现象:执行中断并提示
You have an error in your SQL syntax。 - 解决:使用
mysql -u user -p database --verbose < script.sql(--verbose会显示执行的SQL语句),定位错误行并修正。
- 现象:执行中断并提示
-
长事务或锁表
- 现象:脚本执行缓慢,导致其他查询阻塞。
- 解决:在脚本中明确控制事务(
BEGIN; ... COMMIT;或ROLLBACK;),避免长时间未提交的事务锁表。
Linux下执行MySQL脚本的方法多样,需根据场景选择:交互式调试用source命令,自动化任务用mysql命令+重定向,复杂逻辑结合Shell脚本,无论哪种方法,都需注意权限、编码、脚本语法等细节,并通过错误处理和日志记录确保执行可靠性,掌握这些技巧,能显著提升数据库运维效率和脚本管理的规范性。

















