首页/数据/数据库速查/mysql 命令行客户端

mysql 命令行客户端

MySQL 官方命令行客户端:交互执行 SQL、批量跑脚本、做巡检导出;支持 -e 直接执行、-D 指定库、多种输出格式与选项文件。

数据库速查数据更新于 2026-10-13

mysql 客户端是什么

mysql 是 MySQL 官方命令行客户端,同时是交互式 SQL 终端和批处理执行器:可以把脚本重定向进去执行、用 -e 直接跑一条语句、用 -B 或 -E 控制输出格式,再把结果交给 shell 或监控采集。它的选项体系与 mysqldump、mysqladmin 共用同一套选项文件机制,配置一次 ~/.my.cnf 就能在所有官方工具里复用连接参数。

基本信息

用途交互执行 SQL 与脚本批处理
语法mysql -h 主机 -P 端口 -u 用户 -p [库名]
所属MySQL Client(5.7 / 8.0 官方发行版)
选项文件/etc/my.cnf、~/.my.cnf、--defaults-file 指定
常用开关-e 执行后退出、-B 制表符、-E 竖排、-A 跳过库表预读
权限按账号授权,只读账号不能执行写语句

典型使用场景

  • 在无图形界面的服务器上临时查数据、看表结构,替代图形客户端
  • 巡检脚本里取指标(连接数、行数、复制延迟),结果直接送监控
  • 用 mysql < schema.sql 完成建库建表与初始化数据导入
  • 库表数量大的实例登录慢,用 -A 跳过补全信息预读加速
  • 用 --defaults-file 隔离生产与测试两套连接配置,避免手工拼参数
  • 单行字段很多时用 -E 竖排阅读,或 -B 输出后交给 awk 处理

基础用法

基础用法
mysql -h 127.0.0.1 -P 3306 -u root -p   # 交互登录,口令单独输入不留在历史里
mysql -uroot -p -e "SHOW DATABASES;"   # 非交互执行单条语句
mysql -uroot -p appdb < init.sql   # 批量执行脚本文件
mysql -uroot -p -B -e "SELECT id,name FROM appdb.orders LIMIT 5;"   # 制表符输出,可直接管道处理
mysql -uroot -p -E -e "SELECT * FROM appdb.orders WHERE id=1;"   # 竖排输出,宽表容易读
mysql -uroot -p -A appdb   # 大实例下跳过库表预读,登录更快

常用选项速查

选项作用使用建议
-h / -P主机与端口,默认 localhost 与 3306要明确走 TCP 就写 127.0.0.1
-u / -p账号与口令-p 与口令之间不能有空格,交互输入最安全
-D登录时直接指定库等价于登录后再 USE,脚本里省一步
-e执行语句后立即退出脚本与监控采集的首选方式
-B制表符输出,可配合 --skip-column-names 去表头便于 awk、grep 二次处理
-E竖排输出单行字段多、内容长时阅读友好
-A不预读库表信息库表数量大时登录明显加快
--defaults-file指定选项文件多环境隔离,配置文件权限设为 600

选项文件持久化

选项文件持久化
cat >> ~/.my.cnf <<'EOF'
[client]
host=127.0.0.1
user=dba
default-character-set=utf8mb4
prompt='\\u@\\h [\\d]> '
EOF
chmod 600 ~/.my.cnf   # 配置文件含连接信息,权限必须收紧
不要把明文口令写在命令行参数或脚本里:它同时残留在 shell 历史、进程列表与审计日志中。改用交互输入、权限 600 的选项文件,或客户端提供的加密登录路径。
-h localhost 走本地 socket,-h 127.0.0.1 走 TCP,两条路的来源记录匹配、加密方式与性能表现都不同;排查连接问题时先确认走的是哪条,否则会拿着错误的前提改配置。
脚本里执行 SQL 建议显式加 --default-character-set=utf8mb4 并检查退出码:客户端与库表字符集不一致是中文乱码的常见来源,而部分报错不会让客户端返回非零状态。

脚本化使用要点

  • 连接参数写进权限 600 的选项文件,脚本只传库名与语句,避免参数进入日志
  • 用 -e 加 -B 与 --skip-column-names 输出纯数据行,便于下游程序解析
  • 导入大文件前在脚本内 SET autocommit=0 并在末尾提交,可减少逐行提交开销
  • 批量导入或删除前先做一次备份,避免脚本写错条件后无法回退
  • 长脚本用 --force 时要清楚它会跳过错误继续执行,宁可不加也别误判成功
把导入文件和连接参数分开管理:脚本本身不含口令,通过 --defaults-extra-file 指向外部配置,既能被流水线复用,也不会把凭证提交进版本库。

易错点

  • -p 与口令之间多打了空格:客户端会把口令当成库名解析并再次索要口令,脚本里表现为连到错误的库或反复提示输入
  • 把口令写死在命令行或 CI 变量里并打印到日志:口令进入 shell 历史与进程列表,等于泄露,应用账号尤其危险
  • 批处理脚本不检查退出码:出现错误时客户端仍可能返回 0,后续建表、导数步骤带着错误继续跑
  • 用 SELECT * 拉大表且不加 LIMIT:结果集把客户端内存与实例 IO 同时打满,终端直接卡死
  • 依赖 ~/.my.cnf 却没设 600 权限:同机其他用户可直接读到连接凭证与主机信息
  • 在交互客户端里跑完修改却不提交、直接退出:事务挂着占住 undo 与锁,回来才发现数据并未落库

数据来源与参考

  • MySQL 8.0 Reference Manual: mysql — The MySQL Command-Line Client

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌