This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2026-05-21 12:20:51 +08:00

12 KiB
Raw Permalink Blame History

tags, create time
tags create time
MySQL
客户端
CLI
工具
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 自带的交互式客户端,适合快速调试、脚本自动化和远程服务器操作。

基本连接

# 最简方式(本地,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 系列