346 lines
12 KiB
Markdown
346 lines
12 KiB
Markdown
|
|
---
|
|||
|
|
tags: [MySQL, 客户端, CLI, 工具]
|
|||
|
|
create time: 2026-05-16T00:00
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# MySQL 客户端工具
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
本文件汇总 MySQL 生态中的各类客户端工具及其用法,从终端到图形界面,帮助你在不同场景下高效地操作数据库。
|
|||
|
|
|
|||
|
|
> [!TIP] 如何选择客户端?
|
|||
|
|
> - **日常排查** → `mysql` CLI 或 DataGrip / DBeaver
|
|||
|
|
> - **脚本自动化** → `mysql -N -s` 非交互式模式
|
|||
|
|
> - **结构设计与 ER 图** → MySQL Workbench
|
|||
|
|
> - **多库种混用** → DBeaver 社区版
|
|||
|
|
> - **Cluster 管理** → `mysqlsh` JS 模式
|
|||
|
|
|
|||
|
|
## mysql CLI 命令行客户端
|
|||
|
|
|
|||
|
|
`mysql` 是 MySQL 自带的交互式客户端,适合快速调试、脚本自动化和远程服务器操作。
|
|||
|
|
|
|||
|
|
### 基本连接
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 最简方式(本地,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 加密通道 |
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用 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` 启动时按以下顺序读取配置文件,后读到的覆盖前面的值:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看当前配置加载路径(从低优先级到高优先级)
|
|||
|
|
mysql --print-defaults
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
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)中声明默认参数,避免每次手动输入:
|
|||
|
|
> ```ini
|
|||
|
|
> [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` 加密登录文件:
|
|||
|
|
> ```bash
|
|||
|
|
> mysql_config_editor set --login-path=local --host=localhost --user=root --password
|
|||
|
|
> # 之后只需:
|
|||
|
|
> mysql --login-path=local
|
|||
|
|
> ```
|
|||
|
|
|
|||
|
|
### 常用快捷命令
|
|||
|
|
|
|||
|
|
在 `mysql>` 提示符下,以 `\` 开头的命令是**客户端内置指令**,不会发送到服务端:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
\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` 可自定义编辑器。
|
|||
|
|
|
|||
|
|
### 竖排输出示例
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
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 类型的大字段),横排输出会被截断或挤在一起。竖排模式下每个字段独占一行,可读性大幅提升。
|
|||
|
|
|
|||
|
|
### 非交互式执行
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 直接执行 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 工具组合,实现更强大的数据处理能力:
|
|||
|
|
> ```bash
|
|||
|
|
> # 只提取某列并去重计数
|
|||
|
|
> 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`。
|
|||
|
|
|
|||
|
|
### 启动与模式切换
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 默认进入 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 # 指定初始库
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 实用功能
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// ---- 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
|
|||
|
|
# ---- 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 | 原生应用体验流畅、快捷键优秀 | 付费 |
|
|||
|
|
|
|||
|
|
### 工具选择决策流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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 快速上手
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 在 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),一键插入常用查询骨架
|
|||
|
|
|
|||
|
|
## 其他命令行工具
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# ---- 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 进阶用法
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 只导结构,不导数据(适合迁移 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 定位故障时间线
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看所有事件(含二进制语句)
|
|||
|
|
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 架构与入门]] — 理解客户端与服务端通信基础
|