引言
如果你还在用传统的 mysql 命令行客户端,那你可能已经错失了许多效率工具。MySQL Shell(以下简称 mysqlsh)自 MySQL 8.0 起成为官方力推的客户端,它不仅仅是 SQL 终端——更是一个集成了 InnoDB Cluster 管理、 逻辑备份、 文档存储(Document Store) 等多功能于一体的瑞士军刀。
其中最让开发者眼前一亮的功能,就是它原生支持将查询结果以 JSON 格式 输出。这个特性在对接 Python/Node.js 脚本、ELK 日志系统、API 网关等场景下极为实用——无需在应用层再做格式转换,一条命令搞定。
本文将从以下维度展开:
MySQL Shell 是什么
全平台安装指南(Linux / macOS / Windows)
基础使用与三种语言模式
JSON 格式输出深度实战(重点)
实用技巧与最佳实践
一、MySQL Shell 是什么?
MySQL Shell 是 Oracle 官方推出的高级命令行脚本化 shell,用于 MySQL 数据库管理。与传统的 mysql 客户端相比,它拥有以下显著优势:
简言之: 如果你在 2024 年后还在管理 MySQL,MySQL Shell 就是标配1 。
二、全平台安装指南
2.1 下载 MySQL Shell
MySQL Shell 的安装包独立于 MySQL Server,所有平台均从官方下载页面获取:
🔗 官方下载地址: https://dev.mysql.com/downloads/shell/
选择适合你操作系统的版本:
版本建议:截至 2026 年 7 月,最新版本为 MySQL Shell 9.7.x,同时 8.0.x LTS 版本依然广泛使用。建议与你的 MySQL Server 主版本号保持一致。
2.2 Linux 下安装(通用二进制包)
这是最通用、最灵活的方式,适用于所有 Linux 发行版。
# 1. 下载安装包(以 8.0.x 为例,请替换为实际版本)
wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.46-linux-glibc2.12-x86_64bit.tar.gz
# 2. 解压到 /usr/local/
sudo tar -zxvf mysql-shell-8.0.46-linux-glibc2.12-x86_64bit.tar.gz -C /usr/local/
# 3. 创建软链接(方便版本管理)
cd /usr/local/
sudo ln -s mysql-shell-8.0.46-linux-glibc2.12-x86_64bit mysql-shell
# 4. 配置环境变量
echo 'export PATH=$PATH:/usr/local/mysql-shell/bin' >> ~/.bashrc
source ~/.bashrc
# 5. 验证安装
mysqlsh --version
# 输出:mysqlsh Ver 8.0.46 for Linux on x86_64 - for MySQL 8.0.462.3 Linux 下安装(包管理器)
RHEL / CentOS / Fedora:
# 添加 MySQL Yum 仓库
sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 安装 MySQL Shell
sudo yum install mysql-shellUbuntu / Debian:
# 添加 MySQL APT 仓库
wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb
sudo apt update
# 安装 MySQL Shell
sudo apt install mysql-shell2.4 macOS 下安装
# Homebrew 一键安装(推荐)
brew install mysql-shell
# 或者下载 .dmg 安装包
# https://dev.mysql.com/downloads/shell/2.5 Windows 下安装
方法一:MySQL Installer(推荐)
运行安装程序,在组件选择界面勾选 MySQL Shell
一路 Next 完成安装
方法二:ZIP 绿色版
下载
mysql-shell-8.0.xx-winx64.zip解压到
C:\mysql-shell将
C:\mysql-shell\bin添加到系统环境变量PATH中打开 PowerShell 或 CMD 验证:
mysqlsh --version
三、基础使用入门
3.1 启动与三种语言模式
直接运行 mysqlsh 进入交互模式,默认使用 JavaScript 模式:
mysqlsh你会看到如下提示:
MySQL Shell 8.0.46
Copyright (c) 2016, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '?' for help; '\quit' to exit.
MySQL JS >在交互模式下,你可以随时切换语言:
也可以在启动时直接指定模式:
mysqlsh --sql # 以 SQL 模式启动
mysqlsh --js # 以 JavaScript 模式启动
mysqlsh --py # 以 Python 模式启动3.2 连接 MySQL 实例
以下是几种常见的连接方式:
# 方式一:经典 TCP 连接(SQL 模式)
mysqlsh --sql -u root -p -h localhost -P 3306
# 方式二:URI 方式【推荐】
mysqlsh --sql root@localhost:3306
# 方式三:Socket 连接(Linux)
mysqlsh --sql -u root -S /var/run/mysqld/mysqld.sock
# 方式四:X Protocol 连接(支持文档存储)
mysqlsh --js root@localhost:33060提示:端口
3306是经典 MySQL 协议端口,33060是 X Protocol 端口。如果不需要文档存储功能,用 3306 即可。
3.3 常用命令速查
进入交互模式后,以下命令能帮你快速上手:
3.4 批处理模式
除了交互模式,MySQL Shell 也支持非交互的批处理场景:
# 执行一段 SQL 并退出
echo "SELECT VERSION(); SHOW DATABASES;" | mysqlsh --sql -u root -p
# 执行一个 SQL 文件
mysqlsh --sql -u root -p --file /path/to/script.sql
# 执行 Python 脚本
mysqlsh --py -u root -p --file /path/to/backup_script.py四、JSON 格式输出深度实战
这是本文的核心内容。MySQL Shell 提供了 多种 JSON 输出格式,可通过命令行参数或配置选项设置。
4.1 --result-format 参数一览
4.2 命令行方式指定 JSON 输出
这是最直接、最常用的方式——启动时通过 --result-format 参数指定格式:
# ⭐ 以美化 JSON 格式输出(最常用)
mysqlsh --sql --result-format=json -u root -p
# 以紧凑 JSON 格式输出(每行一条记录)
mysqlsh --sql --result-format=ndjson -u root -p
# 以 JSON 数组格式输出
mysqlsh --sql --result-format=json/array -u root -p⚠️ 注意:输入密码后,输入 SQL 语句并按回车,结果即以 JSON 格式展示。按
Ctrl+D或输入\quit退出。
4.3 实战演示:三种 JSON 格式对比
假设我们有一个 employees 表,包含如下数据:
CREATE DATABASE demo;
USE demo;
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
department VARCHAR(30),
salary DECIMAL(10,2)
);
INSERT INTO employees (name, department, salary) VALUES
('张三', '技术部', 25000.00),
('李四', '产品部', 22000.00),
('王五', '技术部', 28000.00);🔹 格式一: json(美化 JSON,即 json/pretty)
mysqlsh --sql --result-format=json -u root -p -e "SELECT * FROM demo.employees;"输出效果:
{
"id": 1,
"name": "张三",
"department": "技术部",
"salary": 25000.00
}
{
"id": 2,
"name": "李四",
"department": "产品部",
"salary": 22000.00
}
{
"id": 3,
"name": "王五",
"department": "技术部",
"salary": 28000.00
}💡 每条记录作为一个独立的 JSON 对象,缩进美观,适合日志输出和人工调试。
🔹 格式二: ndjson(紧凑 JSON,json/raw)
mysqlsh --sql --result-format=ndjson -u root -p -e "SELECT * FROM demo.employees;"输出效果:
{"id":1,"name":"张三","department":"技术部","salary":25000.00}
{"id":2,"name":"李四","department":"产品部","salary":22000.00}
{"id":3,"name":"王五","department":"技术部","salary":28000.00}💡 每行一条 JSON 记录,极度紧凑。适合 Shell 管道流式处理(如
jq逐行解析)或写入 日志采集系统(ELK / Fluentd) 。
🔹 格式三: json/array(JSON 数组)
mysqlsh --sql --result-format=json/array -u root -p -e "SELECT * FROM demo.employees;"输出效果:
[
{"id":1,"name":"张三","department":"技术部","salary":25000.00},
{"id":2,"name":"李四","department":"产品部","salary":22000.00},
{"id":3,"name":"王五","department":"技术部","salary":28000.00}
]💡 标准 JSON 数组格式,可直接被 Python
json.loads()或 JavaScriptJSON.parse()解析。这是 API 对接场景的最佳选择。
4.4 交互模式下动态切换 JSON 格式
进入交互模式后,你也可以动态切换输出格式:
-- 进入 SQL 交互模式
mysqlsh --sql -u root -p
-- 设置为美化 JSON
\option --persist resultFormat json
-- 执行查询
SELECT * FROM demo.employees;
-- 切换为 JSON 数组格式
\option resultFormat json/array
-- 再次查询
SELECT * FROM demo.employees;
-- 切换回表格格式
\option resultFormat table或者用 shell.options.set() 方法(JS/Py 模式):
// JS 模式
shell.options.set('resultFormat', 'json/array');
session.runSql("SELECT * FROM demo.employees");4.5 进阶:管道 + jq 优雅处理 JSON 输出
将 MySQL Shell 的 JSON 输出与 jq 结合,可以实现强大的数据处理流水线:
# 示例1:查询并以 JSON 数组输出,用 jq 提取 name 字段
mysqlsh --sql --result-format=json/array -u root -p --no-password \
-e "SELECT * FROM demo.employees;" 2>/dev/null | \
jq '.[] | .name'
# 输出:
# "张三"
# "李四"
# "王五"
# 示例2:过滤高薪员工并格式化输出
mysqlsh --sql --result-format=json/array -u root -p \
-e "SELECT * FROM demo.employees;" 2>/dev/null | \
jq '.[] | select(.salary > 23000) | {姓名: .name, 薪资: .salary}'
# 输出:
# {"姓名":"张三","薪资":25000}
# {"姓名":"王五","薪资":28000}
# 示例3:导出为 JSON 文件
mysqlsh --sql --result-format=json/array -u root -p \
-e "SELECT * FROM demo.employees;" 2>/dev/null \
> employees_export.json⚠️ 注意:
2>/dev/null用于过滤掉 MySQL Shell 的欢迎信息和查询状态信息(如 "3 rows in set"),只保留纯 JSON 数据。--no-password表示不交互输入密码(需在.my.cnf中预设)。
4.6 Python 调用示例
import subprocess
import json
def mysql_query_to_json(sql: str, user: str, password: str, database: str):
"""通过 mysqlsh 执行 SQL 并返回 Python 字典列表"""
cmd = [
"mysqlsh", "--sql",
"--result-format=json/array",
"-u", user,
f"--password={password}",
"-D", database,
"--execute", sql
]
result = subprocess.run(
cmd,
capture_output=True,
text=True
)
# 过滤掉非 JSON 行(欢迎信息等)
lines = result.stdout.strip().split("\n")
json_lines = [l for l in lines if l.startswith("[") or l.startswith("{")]
json_str = "\n".join(json_lines)
return json.loads(json_str)
# 使用示例
data = mysql_query_to_json(
sql="SELECT name, salary FROM employees WHERE department='技术部'",
user="root",
password="your_password",
database="demo"
)
for row in data:
print(f"员工: {row['name']}, 薪资: {row['salary']}")4.7 Shell 脚本集成示例
#!/bin/bash
# mysql_backup_json.sh - 以 JSON 格式导出全表数据
USER="root"
PASSWORD="your_password"
DATABASE="demo"
OUTPUT_DIR="./backups"
mkdir -p "$OUTPUT_DIR"
# 获取所有表名
TABLES=$(mysqlsh --sql -u "$USER" --password="$PASSWORD" -D "$DATABASE" \
--result-format=json/array \
-e "SHOW TABLES;" 2>/dev/null | jq -r '.[] | keys[0] as $k | .[$k]')
for table in $TABLES; do
echo "正在导出表: $table ..."
mysqlsh --sql -u "$USER" --password="$PASSWORD" -D "$DATABASE" \
--result-format=json/array \
-e "SELECT * FROM \`$table\`;" 2>/dev/null \
> "${OUTPUT_DIR}/${table}_$(date +%Y%m%d).json"
done
echo "✅ 所有表已导出至: $OUTPUT_DIR"五、总结与展望
核心回顾
何时使用哪种 JSON 格式?
人工调试 + 日志 → --result-format=json (美化输出)
流式管道 + ELK → --result-format=ndjson (逐行紧凑)
API 对接 + 编程 → --result-format=json/array (标准数组)未来展望
随着 MySQL 9.7 LTS 的发布和 MySQL 8.0 进入 EoL(2026年4月),MySQL Shell 的功能还在持续增强——包括更好的 JSON 文档存储支持、增强的并行导入导出功能等。可以预见, MySQL Shell 将成为 MySQL 生态中越来越不可替代的核心工具。
如果你还没有从传统 mysql 客户端切换到 mysqlsh,现在就是最好的时机。
参考资料: