MySQL 8.4 常用 CLI 命令与工具详解
详解 MySQL 8.4 常用的命令行客户端与运维工具(mysql、mysqladmin、mysqlshow、mysqldump、mysqlimport、mysqlcheck、mysqlbinlog、mysqlslap、mysqlsh),每个工具给出完整命令、真实输出与参数说明。所有命令均在真实 MySQL 8.4 服务器环境实测,并以实际输出为准。
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) | ✅ 内置 |
mysqlsh | MySQL 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-transaction | InnoDB 一致性快照备份,不锁表,在线备份首选 |
--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-8locale,可能出现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 平台开发