12 KiB
tags, create time
| tags | create time | ||||
|---|---|---|---|---|---|
|
2026-05-16T00:00 |
MySQL 客户端工具
概述
本文件汇总 MySQL 生态中的各类客户端工具及其用法,从终端到图形界面,帮助你在不同场景下高效地操作数据库。
[!TIP] 如何选择客户端?
- 日常排查 →
mysqlCLI 或 DataGrip / DBeaver- 脚本自动化 →
mysql -N -s非交互式模式- 结构设计与 ER 图 → MySQL Workbench
- 多库种混用 → DBeaver 社区版
- Cluster 管理 →
mysqlshJS 模式
mysql CLI 命令行客户端
mysql 是 MySQL 自带的交互式客户端,适合快速调试、脚本自动化和远程服务器操作。
基本连接
# 最简方式(本地,root 无密码模式)
mysql
# 指定用户、主机、端口
mysql -u root -p -h 127.0.0.1 -P 3306
# 通过 Unix Socket 连接(更快,绕过 TCP 栈)
mysql -u root -S /var/run/mysqld/mysqld.sock
# SSH 隧道方式(连接远程服务器上的 MySQL)
# 另开终端执行 tunnel:
ssh -L 3306:127.0.0.1:3306 user@remote-server
# 然后本地直接连:
mysql -u root -p --protocol=TCP
[!NOTE] 三种连接通道对比
方式 延迟 适用场景 安全 TCP ( -h 127.0.0.1)~1ms 本地开发、负载均衡后端 明文传输 Unix Socket ( -S)<1μs 本机直连,性能最优 文件系统权限控制 SSH Tunnel ~10-50ms 跨机房、生产环境 SSH 加密通道
# 使用 SSL 连接生产环境(推荐)
mysql -u app_user -p --ssl-mode=VERIFY_IDENTITY \
--ssl-ca=/etc/mysql/ca.pem \
--ssl-cert=/etc/mysql/client-cert.pem \
--ssl-key=/etc/mysql/client-key.pem \
-h prod-db.example.com
# 压缩传输大结果集
mysql -u root -p --compress -h 192.168.1.10 -e "SELECT * FROM large_table;"
配置文件加载顺序
mysql 启动时按以下顺序读取配置文件,后读到的覆盖前面的值:
# 查看当前配置加载路径(从低优先级到高优先级)
mysql --print-defaults
mysql would have been started with the following arguments:
--socket=/var/run/mysqld/mysqld.sock --port=3306 --default-character-set=utf8mb4
[!IMPORTANT] 常见配置优化项
在
~/.my.cnf(仅自己可见,chmod 600)中声明默认参数,避免每次手动输入:[client] user = myuser host = 127.0.0.1 port = 3306 password = secret default-character-set = utf8mb4 [mysql] auto-rehash # 自动补全表名/列名(默认开启) column-widths = 120 # 加大显示宽度,避免截断
⚠️ 安全提醒:
password明文写入配置文件存在风险。生产环境中建议使用mysql_config_editor生成.mylogin.cnf加密登录文件:mysql_config_editor set --login-path=local --host=localhost --user=root --password # 之后只需: mysql --login-path=local
常用快捷命令
在 mysql> 提示符下,以 \ 开头的命令是客户端内置指令,不会发送到服务端:
\h -- 显示帮助
\? -- 同 \h
\G -- 竖排输出(长字段友好)
\t -- 切换 Tab / CSV 格式输出
\c -- 取消当前输入
\u db_name -- 切换数据库
\d new_delim -- 修改语句终止符(分号冲突时用)
\q -- 退出
\e -- 用 $EDITOR 编辑当前 SQL(打开 vi/nano)
\s -- 查看服务器状态(版本、字符集等)
\. filename -- 执行 SQL 脚本(与 source 等价)
pager less -- 设置分页输出(大结果集必备)
nopager -- 恢复默认
[!TIP] 实用技巧:
\e+ Enter 编辑当 SQL 较长时,直接敲
\e回车会打开$EDITOR指定的编辑器,写好 SQL 保存退出后自动执行。配合set editor=vim可自定义编辑器。
竖排输出示例
mysql> SELECT * FROM users WHERE id = 1\G
*************************** 1. row ***************************
id: 1
username: alice
email: alice@example.com
created_at: 2026-01-15 10:30:00
updated_at: 2026-05-10 14:22:00
profile_json: {"age": 28, "city": "Shanghai", "role": "admin"}
status: 1
1 row in set (0.00 sec)
[!EXAMPLE] 什么时候用
\G?当一个表的字段很多(如 JSON 类型的大字段),横排输出会被截断或挤在一起。竖排模式下每个字段独占一行,可读性大幅提升。
非交互式执行
# 直接执行 SQL 字符串
mysql -u root -p -e "SELECT COUNT(*) FROM users;"
# 从文件导入(常用于初始化建表)
mysql -u root -p db_name < init.sql
# 导出到文件(适合小数据量提取)
mysql -u root -p -e "SELECT * FROM users;" db_name > output.csv
# 静默模式(适合脚本解析输出)
mysql -s -N -e "SHOW DATABASES;"
# -s = silent(紧凑格式),-N = 不显示列名
[!TIP] 管道组合技巧
将 mysql 与其他 unix 工具组合,实现更强大的数据处理能力:
# 只提取某列并去重计数 mysql -N -u root -p -e "SELECT role FROM users;" db_name | sort | uniq -c | sort -rn # 实时观察查询变化(类似 watch) watch -n 1 "mysql -N -u root -p -e 'SELECT COUNT(*) FROM orders WHERE status=\"pending\";' app_db"
mysqlsh(MySQL Shell)
mysqlsh 是 Oracle 官方新一代管理工具,支持 SQL、JavaScript、Python 三种模式,内置丰富的 DBA API,是 InnoDB Cluster 管理的核心入口。
[!NOTE] mysql vs mysqlsh
mysql是最原始的客户端,专注纯 SQL 交互;而mysqlsh更像是一个「数据库开发平台」——它提供了面向对象的数据访问 API、结构化输出格式化,以及集群管理的完整工具链。建议在生产运维场景中优先使用mysqlsh。
启动与模式切换
# 默认进入 SQL 模式
mysqlsh
# JavaScript 模式(连接 Cluster 管理)
mysqlsh --js
dba.createCluster('myCluster')
# Python 模式
mysqlsh --py
# 一步直达指定实例(自动进入 SQL 模式)
mysqlsh root@192.168.1.10:3306
mysqlsh://root@prod-db:3306/app_db # 指定初始库
实用功能
// ---- JS 模式:Schema 级别的操作 ----
const schema = dba.getSchema('app_db');
schema.getTable('users').select().where('status = 1').limit(10).execute();
// ---- SQL 模式:结构化输出 ----
\output json // 输出切换为 JSON,便于后续处理
SELECT * FROM users LIMIT 5;
\output text // 切回文本
// ---- 元数据概览 ----
\status // 连接状态
\dba.status() // InnoDB Cluster 集群状态
\connect app_user@app-db // 切换连接
# ---- Python 模式:批量 CRUD ----
session = db.create_session("app_user@prod-db:3306/app_db")
result = session.sql("SELECT id, name FROM products WHERE price > 100").execute()
for row in result.fetch_all():
print(f"{row[0]}: {row[1]}")
[!TIP] mysqlsh 的隐藏技能
- 自动生成文档:
\status --json可直接喂给日志分析系统- 对象浏览器: tab 自动补全对
dba,session,schema全部生效- 代码片段: 输入
dba.后 tab 可查看所有可用方法(createCluster, cloneInstance, checkInstanceConfiguration 等)
图形界面工具对比
| 工具 | 类型 | 平台 | 特点 | 费用 |
|---|---|---|---|---|
| MySQL Workbench | 官方 GUI | Win/Mac/Linux | ER 图设计、迁移工具、执行计划可视化 | 免费 |
| DBeaver | 社区万能 | Win/Mac/Linux | 支持几乎所有数据库,插件丰富 | 社区版免费 |
| HeidiSQL | Windows 首选 | Windows | 轻量、启动快、批量操作方便 | 免费开源 |
| Navicat | 商业旗舰 | Win/Mac/Linux | 功能最全面、同步/备份/结构设计一体化 | 付费 |
| DataGrip | JetBrains | Win/Mac/Linux | IDE 集成好、代码补全强大 | 付费(JetBrains 全家桶) |
| TablePlus | 现代审美 | Mac/Win | 原生应用体验流畅、快捷键优秀 | 付费 |
工具选择决策流程
flowchart TD
A[开始选型] --> B{操作系统}
B -->|"macOS"| C["TablePlus / DataGrip"]
B -->|"Windows"| D{预算?}
B -->|"Linux / 跨平台"| E["DBeaver / DataGrip"]
D -->|"免费"| F["HeidiSQL"]
D -->|"付费"| G{"需要多库兼容?"}
G -->|"是"| H["Navicat"]
G -->|"仅 MySQL"| I["MySQL Workbench"]
C --> J["搭配 mysql CLI 完成全流程"]
F --> J
H --> J
I --> J
E --> J
DBeaver 快速上手
-- 在 DBeaver 中可以享受的功能:
-- 1. Ctrl+Space 智能代码补全
-- 2. Ctrl+Shift+F 格式化 SQL
-- 3. Ctrl+/ 单行注释,Ctrl+Shift+/ 块注释
-- 4. 右键表 -> Open Table Data 直接浏览数据
-- 5. EXPLAIN 分析器可视化展示执行计划
[!TIP] DBeaver 小技巧
- 选中某张表按 F5 刷新元数据(DDL 变更后必做)
- 右键查询结果 → Export 支持 Excel/CSV/JSON/SQL INSERT 多种格式
- 「SQL Editor」支持数据源模板(Template),一键插入常用查询骨架
其他命令行工具
# ---- mysqlimport ----
# 批量导入 CSV 数据到表中
mysqlimport -u root -p --local --fields-terminated-by=',' app_db data.csv
# ---- mysqldump ----
# 逻辑备份(后续章节详述)
mysqldump -u root -p --single-transaction --routines --triggers app_db > backup.sql
# ---- mysqlbinlog ----
# 解析 Binary Log
mysqlbinlog --start-datetime="2026-05-01 00:00:00" mysql-bin.000001 > decoded.sql
# ---- mysqlcheck ----
# 检查和修复表
mysqlcheck -u root -p --auto-repair --check --optimize app_db
# ---- perror ----
# 查看 MySQL 错误码含义
perror 1064
# 1064 = You have an error in your SQL syntax
mysqldump 进阶用法
# 只导结构,不导数据(适合迁移 schema)
mysqldump -u root -p --no-data app_db > schema.sql
# 只导数据,不导结构(适合增量同步)
mysqldump -u root -p --no-create-info app_db > data.sql
# 排除特定表(下划线前缀的配置表)
mysqldump -u root -p --ignore-table=app_db._config --ignore-table=app_db._history app_db > backup.sql
# 分库备份(循环所有库)
mysqldump -u root -p --all-databases --single-transaction --master-data=2 > all_dbs_$(date +%F).sql
# 按时间段还原(误删恢复利器)
mysqlbinlog --stop-datetime="2026-05-15 14:32:00" mysql-bin.000001 | mysql -u root -p
mysqlbinlog 定位故障时间线
# 查看所有事件(含二进制语句)
mysqlbinlog --force-read mysql-bin.000001 | grep -iE "BEGIN|COMMIT|DROP|TRUNCATE|ALTER"
# 只看到具体的 SQL(不含内部细节)
mysqlbinlog --base64-decode mysql-bin.000001 | grep -C 3 "DELETE FROM users"
# 按 pos 点精确恢复(精准到事务级别)
mysqlbinlog --start-position=154 --stop-position=892 mysql-bin.000001 | mysql -u root -p
[!IMPORTANT] 冷备份 vs 热备份
mysqldump --single-transaction:热备份,基于 MVCC 一致性快照,不影响线上写入(InnoDB 专属)mysqldump --lock-all-tables:冷备份,全局读锁,写请求全部阻塞(MyISAM 需此方式)mydumper:多线程逻辑备份工具,速度远胜 mysqldump,适合百 GB 级以上数据库
关联笔记
MySQL 系列
- hhs/MySQL/README — MySQL 知识库总目录
- hhs/MySQL/01-入门基础/02-安装与初始化 — 安装方法与初始化配置
- hhs/MySQL/07-高可用与分布式/34-备份与恢复 — mysqldump、xtrabackup 完整指南
- hhs/MySQL/07-高可用与分布式/29-Binary Log — binlog 原理与 mysqlbinlog 深入
- hhs/MySQL/08-工程实践/39-安全加固 — 账号权限、SSL、审计最佳实践
- hhs/MySQL/01-入门基础/01-MySQL 架构与入门 — 理解客户端与服务端通信基础