linux下如何执行.sql文件
- Linux
- 2025-08-17
- 5
mysql -u [用户名] -p[密码] [数据库名] < 文件.sql
命令执行 SQL 文件,或进入 MySQL 后用
source 文件.sql;
在Linux系统中执行.sql
文件的核心在于利用数据库管理系统提供的客户端工具将SQL脚本传递给目标数据库实例,以下是完整的操作指南,涵盖多种场景、关键参数解析、错误排查及最佳实践,适用于MySQL/MariaDB、PostgreSQL等主流关系型数据库。
前置条件准备
确认数据库服务状态
确保目标数据库已启动并正常运行:
# MySQL/MariaDB systemctl status mysql # CentOS/RHEL systemctl status mariadb # Ubuntu/Debian # PostgreSQL systemctl status postgresql
️ 若未运行需先启动:systemctl start <数据库服务名>
验证基础依赖项
根据数据库类型安装对应CLI工具:
# MySQL/MariaDB (默认包含在服务器包中) sudo apt install mysql-client # Debian系 sudo yum install mysql # RHEL系 # PostgreSQL sudo apt install postgresql-client # Debian系 sudo yum install postgresql # RHEL系
获取必要凭证
提前准备好以下信息:
| 要素 | 说明 | 示例值 |
|---------------|------------------------------|----------------------|
| 主机地址 | 本地/远程数据库IP或域名 | localhost
/ 168.1.100
|
| 端口号 | 数据库监听端口 | 3306
(MySQL), 5432
(PostgreSQL) |
| 用户名 | 具有执行权限的数据库账号 | root
/ app_user
|
| 密码 | 对应账号的认证密钥 | secure_password
|
| 目标数据库 | SQL脚本将要作用的数据库名称 | mydb
|
核心执行方法详解
▶️ 方法1:通过命令行直接执行(推荐)
适用场景:快速执行无需人工干预的标准化脚本
命令格式:
mysql -h 主机地址 -P 端口号 -u 用户名 -p 目标数据库 < /path/to/file.sql
参数详解:
| 参数 | 缩写 | 功能说明 | 备注 |
|------|------|------------------------------|-------------------------------|
| -h | | 指定数据库主机地址 | 本地可省略为localhost
|
| -P | | 指定非默认端口号 | 注意大写P与小写p的区别 |
| -u | | 数据库用户名 | |
| -p | | 提示输入密码 | 不会显示密码回显 |
| < | | 重定向输入流(读取SQL文件) | 文件路径需用绝对路径更安全 |
完整示例:
# 本地MySQL执行test.sql到mydb库 mysql -h localhost -P 3306 -u root -p mydb < /home/user/backup/test.sql # 远程PostgreSQL执行schema.sql到prod_db库 psql -h db.example.com -U admin_user -d prod_db -W < /opt/migrations/schema.sql
特殊技巧:
- 敏感操作防护:若脚本含
DROP TABLE
等危险语句,建议添加--force
参数强制确认 - ️ 加速大文件导入:添加
--skip-comments
跳过注释提升解析速度 - 二进制日志控制:MySQL可通过
--disable-keys
临时禁用索引加快插入
▶️ 方法2:进入交互式终端后执行
适用场景:需要动态调整执行上下文或调试复杂脚本
操作流程:
# 1. 连接数据库 mysql -h localhost -P 3306 -u root -p Enter password: # 2. 选择目标数据库(可选) USE mydb; # 3. 执行SQL文件 source /home/user/backup/test.sql;
优势对比:
| 特性 | 方法1(命令行) | 方法2(交互式) |
|--------------------|----------------------|------------------------|
| 自动化程度 | | |
| 错误定位能力 | 仅最终退出码 | 实时报错+光标位置提示 |
| 事务控制灵活性 | 依赖脚本内SET语句 | 可手动BEGIN/COMMIT |
| 适合脚本复杂度 | 简单线性流程 | 含条件分支的复杂逻辑 |
▶️ 方法3:通过进程替代方案(高级用法)
适用场景:需要捕获详细执行日志或集成监控体系
实现原理:利用tee
命令分流输出结果
# 同时输出到屏幕和日志文件 mysql -u root -p mydb < setup.sql | tee execution.log # 结合grep过滤特定错误 mysql -u app_user -p metrics < update_stats.sql 2>&1 | grep -i "error" >> errors.log
典型错误及解决方案
错误现象 | 根本原因 | 解决方案 |
---|---|---|
ERROR 1045 (28000): Access denied |
用户名/密码错误或无权限 | ①核对凭证 ②授予权限:GRANT ALL ON mydb TO 'user'@'host'; FLUSH PRIVILEGES; |
Can't connect to MySQL server |
网络不通/端口未开放/防火墙拦截 | ①telnet host port 测试连通性 ②ufw allow 3306/tcp |
Unknown database |
目标库不存在 | ①先创建数据库:CREATE DATABASE mydb; ②检查脚本中的USE 语句 |
You have an error in your SQL syntax |
SQL语法错误/版本不兼容 | ①启用严格模式排查:set @@sql_mode='STRICT_TRANS_TABLES'; ②检查保留字使用 |
Disk full |
磁盘空间不足 | ①df -h 查看剩余空间 ②清理旧备份/日志文件 |
安全与性能优化建议
-
最小权限原则:
- 禁止使用
root
账户执行生产环境脚本 - ️ 创建专用账号并限制IP来源:
CREATE USER 'script_user'@'192.168.1.%' IDENTIFIED BY 'pass'; GRANT EXECUTE ON . TO 'script_user'@'192.168.1.%';
- 禁止使用
-
大文件处理优化:
- 分批次执行:将超大脚本拆分为多个小文件
- ️ 调整缓冲区大小:
mysql --max-allowed-packet=512M
- ️ 禁用无关引擎:
ALTER TABLE table_name ENGINE=MyISAM;
(视存储引擎而定)
-
审计追踪:
- 开启通用日志:
SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/var/log/mysql/general.log';
- 定期分析慢查询日志:
pt-query-digest slow_query.log
- 开启通用日志:
相关问答FAQs
Q1: 执行SQL文件时报"Access denied for user 'root'@'localhost'"怎么办?
A:这是典型的身份验证失败问题,请按以下顺序排查:
- 确认使用的密码是否正确(注意特殊字符转义)
- 检查MySQL配置文件
/etc/my.cnf
中的bind-address
是否允许本地环回 - 验证是否启用PAM认证(某些系统会覆盖原生密码机制)
- 尝试重置root密码:
mysqld_safe --skip-grant-tables &
→ 新终端执行mysql -u root
→FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Q2: 如何让SQL文件自动执行而不弹出密码输入框?
A:有三种安全解决方案:
-
明文密码(仅限受控环境):
mysql -u root --password=your_password mydb < script.sql
️ 警告:此方式会在进程列表中暴露密码,不建议生产环境使用
-
免密登录配置:
- 编辑
~/.my.cnf
文件:[client] user=root password=your_password
- 设置文件权限:
chmod 600 ~/.my.cnf
- 编辑
-
环境变量注入:
export DB_PASSWORD="secret" mysql -u root -p$DB_PASSWORD mydb < script.sql
提示:可将上述命令写入定时任务脚本,配合
at
或cron
实现自动化