MySQL 8.4 常用 CLI 命令与工具详解

详解 MySQL 8.4 常用的命令行客户端与运维工具(mysql、mysqladmin、mysqlshow、mysqldump、mysqlimport、mysqlcheck、mysqlbinlog、mysqlslap、mysqlsh),每个工具给出完整命令、真实输出与参数说明。所有命令均在真实 MySQL 8.4 服务器环境实测,并以实际输出为准。

MySQLMySQL数据库参数调优2026/09/27

MySQL 8.4 常用 CLI 命令与工具详解

目标:详解 MySQL 8.4 常用的命令行客户端与运维工具(mysql、mysqladmin、mysqlshow、mysqldump、mysqlimport、mysqlcheck、mysqlbinlog、mysqlslap、mysqlsh),每个工具给出完整命令、真实输出与参数说明。所有命令均在真实服务器环境实测,并以实际输出为准。

环境信息

  • MySQL 服务器:MySQL 8.4.11,主机名 mysql-srv(内网 IP 10.0.0.8)
  • 服务器 OS:Oracle Linux Server 9.8
  • 测试客户端:Ubuntu 22.04.5 LTS 服务器,安装 mysql-client 8.4.11,通过内网连接 MySQL 服务器
  • 服务监听端口:3306(客户端与服务器之间需放行该端口)
  • 测试库:test_db.employees(含 5 条中文员工记录,utf8mb4)
  • 密码注入方式:环境变量 $MYSQL_ROOT_PASSWORD(文档命令中均以 ${MYSQL_ROOT_PASSWORD} 占位,禁止明文写入配置文件)

工具概览

工具主要用途MySQL 8.4 默认内置
mysql交互式/批处理 SQL 客户端✅ 内置
mysqladmin服务器管理(ping/status/processlist)✅ 内置
mysqlshMySQL Shell(SQL / JavaScript / Python 模式)✅ 内置
mysqldump逻辑备份(SQL 导出)✅ 内置
mysqlshow查看数据库/表/列信息❌ 默认未内置
mysqlimport文本文件批量导入(CSV/TSV)❌ 默认未内置
mysqlcheck表检查/分析/优化/修复❌ 默认未内置
mysqlbinlog二进制日志解析/回放❌ 默认未内置
mysqlslap压力测试与基准❌ 默认未内置

💡 说明:MySQL 8.4 默认安装只附带 mysql、mysqladmin、mysqldump、mysqlsh 等核心二进制;mysqlshow、mysqlimport、mysqlcheck、mysqlbinlog、mysqlslap 等需要额外安装(如 Ubuntu 上 apt install mysql-client 完整包,或 Oracle Linux 上 dnf install mysql-server)。本文档中缺失的工具在 Ubuntu 客户端服务器上实测。

前置条件

  • 已部署 MySQL 8.4(参考《MySQL 8.4 Docker Compose 部署指南》),服务运行正常
  • 具备 root 或管理权限账号
  • 客户端主机安装了对应工具集(缺失工具需先安装完整客户端包)

1. mysql 客户端

mysql 是最常用的 SQL 客户端,支持交互模式与 -e 非交互模式。

1.1 查看版本与基本连接

mysql --version
mysql -h127.0.0.1 -P3306 -uroot -p -e "SELECT 1"

执行结果:

mysql  Ver 8.4.11 for Linux on x86_64 (MySQL Community Server - GPL)

1.2 常用连接参数

参数说明
-h / --host服务器地址(默认 localhost,走 socket)
-P / --port端口(默认 3306)
-u / --user用户名
-p / --password[=xxx]密码(-p 后接密码会提示 insecure 警告,建议使用环境变量或登录文件)
-e / --execute非交互执行 SQL,适合脚本
-B / --batch批处理模式,结果制表符分隔,无边框
--silent静默模式,去掉结果表头边框
--default-character-set=utf8mb4指定客户端字符集(中文显示异常时常用)
--login-path=名称使用 mysql_config_editor 保存的登录路径,免密码登录

⚠️ 密码与特殊字符处理(避免踩坑):

  • 命令行 -p 密码含特殊字符(@、$、#、空格等):shell 中必须用引号包裹,否则被 shell 解释或报错。$ 必须用单引号防止变量展开:mysql -uroot -p'p@ss word';@ 在 mysql 直连(非 URI)时无需转义。
  • 环境变量代替明文:export MYSQL_PWD='p@ssword' 后省略 -p(MYSQL_PWD 会进入进程环境,用完 unset MYSQL_PWD)。
  • 登录文件免密码(推荐,无 insecure 警告):
    mysql_config_editor set --login-path=local --host=127.0.0.1 --port=3306 --user=root --password
    mysql --login-path=local -e "SELECT 1;"
    
  • 客户端配置文件:~/.my.cnf 的 [client] 段写 user/password,创建后 chmod 600 ~/.my.cnf 保护权限。
  • 若工具支持 mysql://user:pass@host:port/db 形式的 URI 连接,则密码中的 @、: 等必须 URL 编码(@→%40、:→%3A、/→%2F),否则报解析错误。

1.3 实际测试输出

# 单条 SQL 直接执行(脚本场景)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SELECT VERSION() AS ver, @@hostname AS host, @@port AS port;"
ver     host    port
8.4.11  mysql-srv    3306
# 垂直输出 \G(字段多时更易读)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SELECT id,name,dept,salary FROM test_db.employees WHERE dept=\"研发部\"\G"
*************************** 1. row ***************************
    id: 1
  name: 张三
  dept: 研发部
salary: 25000.00
*************************** 2. row ***************************
    id: 2
  name: 李四
  dept: 研发部
salary: 22000.00
# 查看服务器上的进程(排查慢查询/锁)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SHOW FULL PROCESSLIST;"
Id      User    Host    db      Command Time    State   Info
5       event_scheduler localhost       NULL    Daemon  1796    Waiting on empty queue  NULL
192     root    localhost       NULL    Query   0       init    SHOW FULL PROCESSLIST
# 批处理模式 -B(结果制表符分隔,便于 awk 处理)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -B -e "SELECT id,name FROM test_db.employees LIMIT 2;"

# 静默模式 --silent(去掉表头边框,仅输出数据)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" --silent -e "SELECT COUNT(*) FROM test_db.employees;"
5

💡 命令解释:-B 批处理模式输出制表符分隔数据、无 +---+ 边框,适合脚本解析;--silent 进一步去除表头;\G 将结果逐行垂直展示,适合字段多或需要核对完整值的场景;SHOW FULL PROCESSLIST 可查看全部连接(含 Info 列当前执行的 SQL)。

2. mysqladmin

服务器管理工具,用于健康检查、状态查看、进程列表、shutdown 等。

# 健康检查(服务器存活探测,脚本常用来判活)
mysqladmin -uroot -p"${MYSQL_ROOT_PASSWORD}" ping

# 运行状态一览(uptime/连接数/慢查询/每秒查询数)
mysqladmin -uroot -p"${MYSQL_ROOT_PASSWORD}" status

执行结果:

mysqld is alive
Uptime: 1797  Threads: 2  Questions: 43  Slow queries: 0  Opens: 176  Flush tables: 3  Open tables: 96  Queries per second avg: 0.023

💡 说明:ping 输出 mysqld is alive 表示服务器健康;status 中 Uptime 秒数、Threads 当前连接线程数、Slow queries 慢查询累计数、Queries per second avg 平均 QPS。其他常用子命令:processlist(进程列表)、extended-status(完整状态变量)、refresh(刷新)、shutdown(关闭服务器,需谨慎)。

3. mysqlshow

查看数据库、表、字段信息的轻量工具(默认未内置,需安装完整客户端)。

# 数据库列表
mysqlshow -uroot -p"${MYSQL_ROOT_PASSWORD}"

# 指定库的表列表
mysqlshow -uroot -p"${MYSQL_ROOT_PASSWORD}" test_db

# -l 附带每个表的行数
mysqlshow -uroot -p"${MYSQL_ROOT_PASSWORD}" -l test_db

# 表结构(字段/类型/键/默认值/权限)
mysqlshow -uroot -p"${MYSQL_ROOT_PASSWORD}" test_db employees

执行结果(节选):

+--------------------+
|     Databases      |
+--------------------+
| app_db             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+

Database: test_db
+------------------+
|      Tables      |
+------------------+
| employees        |
| employees_import |
+------------------+

Database: test_db  Table: employees
+--------+---------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field  | Type          | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+--------+---------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id     | int           |                    | NO   | PRI |         | auto_increment | select,insert,update,references |         |
| name   | varchar(50)   | utf8mb4_unicode_ci | NO   |     |         |                | select,insert,update,references |         |
| dept   | varchar(30)   | utf8mb4_unicode_ci | YES  |     |         |                | select,insert,update,references |         |
| salary | decimal(10,2) |                    | YES  |     |         |                | select,insert,update,references |         |
| hired  | date          |                    | YES  |     |         |                | select,insert,update,references |         |
+--------+---------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+

💡 命令解释:mysqlshow [库名 [表名]] 依次展示数据库、表、表字段详情;-l 显示每表行数。输出与 SHOW DATABASES / SHOW TABLES / DESCRIBE 等价,适合快速巡检。

4. mysqldump

最常用的逻辑备份工具,将数据导出为 SQL 文本,可跨版本/跨平台恢复。

4.1 基础用法

# 版本
mysqldump --version

# 仅导出表结构(--no-data),用于同步 DDL
mysqldump -uroot -p"${MYSQL_ROOT_PASSWORD}" --no-data --skip-comments test_db employees

# 全库导出 + gzip 压缩(含存储过程 --routines、触发器 --triggers)
mysqldump -uroot -p"${MYSQL_ROOT_PASSWORD}" --single-transaction --routines --triggers test_db | gzip > /tmp/backup/test_db.sql.gz
ls -lh /tmp/backup/

# 按条件导出(--where 只导指定部门)
mysqldump -uroot -p"${MYSQL_ROOT_PASSWORD}" --where="dept=\"市场部\"" test_db employees

执行结果(结构导出节选):

DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `dept` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `salary` decimal(10,2) DEFAULT NULL,
  `hired` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
total 4.0K
-rw-r--r-- 1 root root 1.1K Sep 27 01:29 test_db.sql.gz

4.2 常用参数

参数说明
--single-transactionInnoDB 一致性快照备份,不锁表,在线备份首选
--no-data只导出结构不导数据
--data-only只导数据不导结构
--where="条件"只导出满足条件的行
--routines / --triggers连带导出存储过程/触发器
--skip-comments去掉导出文件的注释(减小体积)
--default-character-set=utf8mb4指定导出字符集(中文数据必加)

💡 说明:--single-transaction 对 InnoDB 使用 MVCC 快照,导出过程中其他事务的写入不会混入,且全程不阻塞线上写入;MyISAM 表则仍需锁表。备份恢复:mysql -uroot -p... < backup.sql。

5. mysqlimport 与 LOAD DATA

mysqlimport 把文本文件批量导入表,等价于服务端的 LOAD DATA INFILE 语句。

5.1 注意点(真实环境踩坑记录)

  • 目标表名 = 文件名:mysqlimport 用文件名(去掉扩展名)作为目标表名,如 employees_import.csv 导入到 employees_import 表;文件名与表名不一致会报 Table 'xx' doesn't exist。
  • 默认分隔符是 Tab:CSV 逗号文件必须加 --fields-terminated-by=,。
  • local_infile 默认关闭:MySQL 8.0+ 默认 local_infile=OFF,mysqlimport --local 会报 ERROR 3948,需先 SET GLOBAL local_infile=ON;(用完再关)。

5.2 标准用法(ASCII 数据)

# 开启本地文件导入(用完恢复 OFF)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SET GLOBAL local_infile=ON;"

# CSV 文件(文件名=表名)
printf "11,Alice,Engineering,30000.00,2023-01-15\n12,Bob,Sales,18000.00,2023-07-01\n" > /tmp/employees_import.csv

# 导入:--local 客户端本地读文件,--delete 先清空表,--columns 指定列顺序
mysqlimport -uroot -p"${MYSQL_ROOT_PASSWORD}" -h10.0.0.8 --local --delete \
  --fields-terminated-by="," --columns=id,name,dept,salary,hired \
  test_db /tmp/employees_import.csv

# 验证
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SELECT * FROM test_db.employees_import;"

执行结果:

test_db.employees_import: Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
id      name    dept    salary  hired
11      Alice   Engineering     30000.00        2023-01-15
12      Bob     Sales   18000.00        2023-07-01
13      Cindy   Finance 22000.00        2024-05-20

5.3 中文数据导入(推荐 LOAD DATA LOCAL INFILE)

mysqlimport 在部分 locale 环境下对 UTF-8 中文处理不稳定(可能显示为 ?)。中文数据推荐使用 mysql 客户端的 LOAD DATA LOCAL INFILE,配合 CHARACTER SET utf8mb4 可精确控制文件编码:

cat > /tmp/emp_zh.csv <<EOF
8,周八,研发部,27000.00,2024-08-01
9,吴九,市场部,15000.00,2024-09-12
10,郑十,财务部,21000.00,2024-10-01
EOF

mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" --local-infile=1 -e \
  "LOAD DATA LOCAL INFILE '/tmp/emp_zh.csv' INTO TABLE test_db.employees_import \
   CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' (id,name,dept,salary,hired);"

# HEX 验证:E591A8E585AB = 周八,E7A094E58F91E983A8 = 研发部(UTF-8 正确)
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" --default-character-set=utf8mb4 \
  -e "SELECT id, HEX(name), name FROM test_db.employees_import;"

执行结果:

id      name_hex            name
8       E591A8E585AB        周八
9       E590B4E4B99D        吴九
10      E98391E58D81        郑十

💡 命令解释:LOAD DATA LOCAL INFILE 由客户端读取文件内容流式发送,不受服务端 secure_file_priv 路径限制;CHARACTER SET utf8mb4 指定源文件编码;FIELDS TERMINATED BY ',' 指定分隔符;(id,name,...) 指定列映射。HEX() 校验是判断中文是否正确存储的可靠手段。

6. mysqlcheck

表的健康检查/分析/优化/修复工具。

# 检查表(CHECK TABLE)
mysqlcheck -uroot -p"${MYSQL_ROOT_PASSWORD}" test_db employees

# 分析表(ANALYZE TABLE,更新统计信息,优化器用)
mysqlcheck -uroot -p"${MYSQL_ROOT_PASSWORD}" -a test_db employees

# 优化表(OPTIMIZE TABLE,回收碎片)
mysqlcheck -uroot -p"${MYSQL_ROOT_PASSWORD}" -o test_db employees

执行结果:

test_db.employees                                  OK
test_db.employees                                  OK
test_db.employees
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

💡 说明:-c/--check 检查、-a/--analyze 分析统计信息、-o/--optimize 优化。InnoDB 对 OPTIMIZE TABLE 会转为 recreate + analyze(输出中的 note 即此含义),这是正常行为。批量检查全部表:mysqlcheck -uroot -p... --all-databases。

7. mysqlbinlog

解析并回放二进制日志(binlog),用于增量备份恢复、主从排查、数据追查。

7.1 binlog 状态(真实环境实测)

MySQL 8.4 默认已开启 binlog(log_bin=ON、binlog_format=ROW):

mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SHOW VARIABLES LIKE 'log_bin'; SHOW VARIABLES LIKE 'binlog_format'; SHOW BINARY LOGS;"
log_bin        ON
binlog_format  ROW
Log_name        File_size       Encrypted
binlog.000001   2997082 No
binlog.000002   862     No
binlog.000003   181     No
binlog.000004   308163  No

⚠️ 注意:MySQL 8.4 默认安装未附带 mysqlbinlog,需在装有完整客户端的机器上执行;mysqlbinlog 支持 --read-from-remote-server 从远程服务器直接读取,无需拷文件。

7.2 远程读取并解码 ROW 事件

# ROW 格式事件解码为伪 SQL(-vv 显示列类型注释)
mysqlbinlog -h10.0.0.8 -uroot -p"${MYSQL_ROOT_PASSWORD}" \
  --read-from-remote-server --base64-output=decode-rows -vv binlog.000004

执行结果(节选):

### INSERT INTO `test_db`.`employees`
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='张三' /* VARSTRING(200) meta=200 nullable=0 is_null=0 */
###   @3='ç ”å‘部' /* VARSTRING(120) meta=120 nullable=1 is_null=0 */
###   @4=25000.00 /* DECIMAL(10,2) meta=2562 nullable=1 is_null=0 */
###   @5='2022:03:01' /* DATE meta=0 nullable=1 is_null=0 */
# at 1218
#260926 17:29:14 server id 1  end_log_pos 1249 CRC32 0xb6acc342         Xid = 14

💡 说明:--base64-output=decode-rows -vv 把 ROW 事件还原成可读的伪 SQL。UTF-8 中文在 ROW 事件里按字节显示(å¼ ä¸‰ 即 张三 的 latin1 显示,数据本身是正确的 UTF-8,可用 HEX 验证)。常用参数:--start-datetime/--stop-datetime 按时间范围读取、--start-position/--stop-position 按位点读取、--stop-never 持续跟踪(类似主从拉流)。回放:mysqlbinlog binlog.000004 | mysql -uroot -p...。

8. mysqlslap

MySQL 自带压测工具,可模拟多并发客户端执行自动生成的 SQL。

# 10 并发、20 条查询、读负载
mysqlslap -uroot -p"${MYSQL_ROOT_PASSWORD}" -h10.0.0.8 \
  --concurrency=10 --iterations=1 --number-of-queries=20 \
  --auto-generate-sql --auto-generate-sql-load-type=read

# 多档并发对比(1 / 10 / 50)
mysqlslap -uroot -p"${MYSQL_ROOT_PASSWORD}" -h10.0.0.8 \
  --concurrency=1,10,50 --iterations=1 --number-of-queries=20 --auto-generate-sql

执行结果:

Benchmark
        Average number of seconds to run all queries: 0.019 seconds
        Minimum number of seconds to run all queries: 0.019 seconds
        Maximum number of seconds to run all queries: 0.019 seconds
        Number of clients running queries: 10
        Average number of queries per client: 2

多档并发时输出多段 Benchmark(节选):

Number of clients running queries: 1   Average number of queries per client: 20
Number of clients running queries: 10  Average number of queries per client: 2
Number of clients running queries: 50  Average number of queries per client: 0

💡 命令解释:--concurrency 并发连接数(可用逗号分隔多档),--iterations 迭代轮数,--number-of-queries 总查询数,--auto-generate-sql 自动生成测试 SQL,--auto-generate-sql-load-type=read/write/mixed 指定读/写/混合负载。对比不同并发下的平均耗时即可评估吞吐瓶颈。

9. mysqlsh

MySQL Shell,新一代客户端,支持 SQL / JavaScript / Python 三种语言模式,常用于实例管理、AdminAPI(InnoDB Cluster)操作。

mysqlsh --version

# SQL 模式执行查询(--sql 指定 SQL 模式)
mysqlsh -uroot -p"${MYSQL_ROOT_PASSWORD}" --sql -e "SELECT VERSION() AS ver, NOW() AS now, @@port AS port;"

执行结果:

mysqlsh   Ver 8.4.10 for Linux on x86_64 - for MySQL 8.4.10 (MySQL Community Server (GPL))

ver     now     port
8.4.11  2026-09-27 01:33:18     3306

💡 说明:mysqlsh 默认进入 JavaScript 模式,--sql 切换 SQL 模式。MySQL 8.4 安装包内置 mysqlsh 8.4.10。Oracle Linux 服务器上如未安装 en_US.UTF-8 locale,可能出现 Cannot set LC_ALL to locale en_US.UTF-8 提示,不影响执行。

注意事项

  • 默认安装工具精简:MySQL 8.4 默认仅附带 mysql/mysqladmin/mysqldump/mysqlsh;mysqlshow/mysqlimport/mysqlcheck/mysqlbinlog/mysqlslap 需在客户端另行安装(Ubuntu:apt install mysql-client)。
  • 密码安全:命令行 -p"密码" 会提示 insecure 警告且可能被 ps 泄露,脚本中建议使用 --login-path 或环境变量;文档命令中的 ${MYSQL_ROOT_PASSWORD} 占位由环境变量注入。
  • local_infile 默认 OFF:mysqlimport --local 与 LOAD DATA LOCAL INFILE 需要先 SET GLOBAL local_infile=ON;,用后建议恢复 OFF(安全默认)。
  • mysqlimport 表名 = 文件名:文件名必须与目标表名一致,否则报 Table doesn't exist。
  • binlog 默认开启:MySQL 8.4 默认 log_bin=ON、binlog_format=ROW,磁盘空间需预留(binlog 会持续增长,可用 binlog_expire_logs_seconds 控制保留期)。
  • 中文显示问题:出现中文乱码/? 时,先用 HEX() 判断是存储问题还是客户端显示问题;显示问题通过 --default-character-set=utf8mb4 解决。

常见问题

问题 1:mysqlimport 报 ERROR 3948, Loading local data is disabled

原因: MySQL 8.0+ 默认关闭 local_infile,客户端本地文件导入被拒。

解决:

mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SET GLOBAL local_infile=ON;"
mysqlimport --local ...   # 重新导入
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SET GLOBAL local_infile=OFF;"  # 用后恢复

问题 2:mysqlimport 报 Table 'test_db.emp_en' doesn't exist

原因: mysqlimport 以文件名(去扩展名)作为目标表名,emp_en.csv 会找 emp_en 表。

解决: 将文件命名为 <表名>.csv,如 employees_import.csv 对应 employees_import 表。

问题 3:导入中文后显示为 ? 或乱码

原因: 文件编码与客户端/连接字符集不一致,或客户端 locale 非 UTF-8。

解决: 先用 HEX(name) 校验存储;若 HEX 为正确 UTF-8(如 E591A8E585AB=周八),则只是显示问题,连接加 --default-character-set=utf8mb4;若确实写坏,改用 LOAD DATA LOCAL INFILE ... CHARACTER SET utf8mb4 导入。

问题 4:binlog 占用磁盘持续增长

原因: binlog 默认开启且保留期未限制。

解决: 查看/调整保留期(秒):

SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
SET GLOBAL binlog_expire_logs_seconds = 604800;   -- 保留 7 天(重启后需配置到 my.cnf 生效)

参考链接


本文档由 www.quzuo.net 平台开发