Files
cs-note/hhs/MySQL/01-入门基础/03-客户端工具.md
T
2026-05-24 11:42:38 +08:00

346 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 架构与入门]] — 理解客户端与服务端通信基础