--- 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 架构与入门]] — 理解客户端与服务端通信基础