MySQL Shell,交互式客户端和脚本工具,官方推荐的现代命令行工具,用于替代传统的 mysql
命令行客户端。它提供了增强的功能、脚本支持以及现代化的 API。
一、MySQL Shell 介绍
- 官方现代工具: MySQL Shell 是 Oracle 官方开发和维护的下一代 MySQL 命令行客户端。
- 多语言支持:
- SQL 模式: 执行标准的 SQL 语句(兼容传统的
mysql
客户端功能)。 - JavaScript 模式: 使用 JavaScript 编写脚本,利用强大的
AdminAPI
管理 MySQL InnoDB Cluster、InnoDB ReplicaSet 等,并调用X DevAPI
。 - Python 模式: 使用 Python 编写脚本,同样可以调用
AdminAPI
和X DevAPI
。 - 模式切换非常方便 (
\sql
,\js
,\py
)。
- SQL 模式: 执行标准的 SQL 语句(兼容传统的
- 核心功能:
- 交互式查询: 执行 SQL、JavaScript 或 Python 代码。
- 脚本执行: 运行预先写好的
.sql
,.js
或.py
脚本文件。 - AdminAPI: 核心亮点! 用于简化部署、管理和监控:
- MySQL InnoDB Cluster (高可用集群,基于 Group Replication)
- MySQL InnoDB ReplicaSet (异步复制管理)
- 执行集群操作:创建、配置、添加/移除节点、切换主节点、检查状态、故障恢复等。
- X DevAPI: 用于开发和执行使用 MySQL 文档存储(NoSQL)或关系型数据的应用程序。支持 CRUD 操作、关系表操作、事务等。
- 报表生成: 内置
util
对象提供有用的报表功能(如util.checkForServerUpgrade()
检查升级兼容性,util.exportJson()
,util.importJson()
等)。 - 代码自动补全: 提供上下文相关的代码补全(按
Tab
键),提高效率。 - 语法高亮: 提高代码可读性。
- 批量导入/导出: 提供高效的数据导入导出工具 (
util.exportTable()
,util.importTable()
)。 - 连接管理: 支持多种连接方式(经典 MySQL 协议、X 协议),支持 URI 连接字符串,支持保存命名会话。
- 输出格式化: 支持表格、JSON、制表符分隔等多种输出格式 (
--result-format
)。
- 目标用户:
- 数据库管理员 (DBA): 管理 MySQL 高可用架构 (InnoDB Cluster/ReplicaSet) 的首选工具。
- 开发者: 进行数据库交互、调试、编写数据库脚本(特别是使用 JavaScript/Python 的开发者)。
- DevOps 工程师: 自动化数据库部署和管理任务。
- 任何需要比传统
mysql
客户端更强大、更现代化功能的用户。
总结优势: 功能整合(AdminAPI, X DevAPI)、多语言脚本、现代化交互、强大的管理能力(尤其集群)、高效的导入导出。
二、MySQL Shell 安装
安装方法因操作系统而异:
-
Linux (基于 APT - Debian/Ubuntu):
# 添加 MySQL APT 仓库 (如果尚未添加) sudo apt update sudo apt install wget wget https://dev.mysql.com/get/mysql-apt-config_latest.deb sudo dpkg -i mysql-apt-config_latest.deb # 在配置界面选择 OK 即可 sudo apt update # 安装 MySQL Shell sudo apt install mysql-shell
-
Linux (基于 YUM/DNF - RHEL/CentOS/Oracle Linux/Rocky Linux):
# 添加 MySQL YUM 仓库 (如果尚未添加) sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm # 替换 el9 为你的主版本号,如 el7, el8 # 安装 MySQL Shell sudo yum install mysql-shell # 或者 sudo dnf install mysql-shell (较新系统)
-
macOS (使用 Homebrew):
brew install mysql-shell
-
Windows:
- 访问 MySQL 官方网站下载页面: https://dev.mysql.com/downloads/shell/
- 选择适用于 Windows 的安装程序 (通常是
.msi
文件)。 - 下载后双击运行安装程序,按照向导提示完成安装。通常会将
mysqlsh.exe
添加到系统路径中。 - 或者使用
winget
(Windows 包管理器):winget install MySQL.MySQL.Shell
-
通用方法 (二进制 Tarball / Zip):
- 同样在上述下载页面,选择适用于你平台的 Tarball (Linux/macOS) 或 Zip (Windows) 压缩包。
- 解压到目标目录。
- 将解压目录下的
bin
子目录添加到你的系统PATH
环境变量中,以便可以直接运行mysqlsh
(或mysqlsh.exe
)。
验证安装:
打开终端或命令提示符,输入:
mysqlsh --version
如果成功安装,会显示 MySQL Shell 的版本信息 (例如 mysqlsh Ver 8.0.36 for Linux on x86_64
)。
三、MySQL Shell 基本使用
-
启动 MySQL Shell:
mysqlsh
这会进入交互式 Shell 环境,默认模式通常是 JavaScript (
JS>
)。 -
连接到 MySQL 服务器:
- URI 方式 (推荐):
例如,连接本地 MySQL (mysqlsh user@host:port # 或在 Shell 内: \connect user@host:port
127.0.0.1:3306
) 上的 root 用户:
系统会提示输入密码。注意:密码直接在命令行输入可能不安全(会被mysqlsh root@localhost # 或指定端口 mysqlsh root@127.0.0.1:3307
ps
等命令看到)。 更安全的方式是只输入mysqlsh
或\connect
后按提示输入密码。- 使用
--password
或-p
参数在连接字符串中指定密码 (不推荐,不安全):mysqlsh user:password@host:port
- 使用
- 经典方式: 使用类似传统
mysql
的参数:mysqlsh --user=user --host=host --port=port
- 同样会提示输入密码,或者使用
--password
/-p
(也需谨慎)。
- 同样会提示输入密码,或者使用
- URI 方式 (推荐):
-
模式切换:
\sql
: 切换到 SQL 模式 (SQL>
)。在此模式下可以直接执行 SQL 语句。\js
: 切换到 JavaScript 模式 (JS>
) (默认)。\py
: 切换到 Python 模式 (Py>
)。
-
执行命令:
- 交互式执行:
- 在 SQL 模式下 (
SQL>
),输入 SQL 语句并按回车执行。例如:SQL> USE mydatabase; SQL> SELECT * FROM mytable;
- 在 JavaScript 模式 (
JS>
) 下,可以输入 JS 代码或调用 API。例如:JS> session.runSql("SHOW DATABASES;"); // 在 JS 中执行 SQL JS> dba.getCluster().status(); // 调用 AdminAPI 检查集群状态
- Python 模式 (
Py>
) 类似。
- 在 SQL 模式下 (
- 执行脚本文件:
mysqlsh --file=myscript.js # 执行 JavaScript 文件 mysqlsh --file=myscript.py # 执行 Python 文件 mysqlsh --file=myscript.sql # 执行 SQL 文件 (会在默认模式下执行 SQL 语句) # 或者在 Shell 内: JS> \source myscript.js SQL> \source myscript.sql
- 执行单条命令/脚本 (非交互式):
mysqlsh -e "session.runSql('SELECT NOW();')" user@host # JS 命令 mysqlsh --sql -e "SELECT NOW();" user@host # SQL 命令 (需要 --sql 参数) mysqlsh --sqlc -e "SELECT NOW();" user@host # SQL 命令,输出格式类似传统 mysql (--sqlc)
- 交互式执行:
-
使用 AdminAPI (核心 - 通常在 JS/Py 模式下):
- 获取 dba 对象:
JS> var dba = dba.getDba(); // 或者直接用 dba
- 创建 InnoDB Cluster:
JS> dba.createCluster('myCluster');
- 获取已存在的 Cluster 对象:
JS> var myCluster = dba.getCluster('myCluster'); // 或 dba.getCluster()
- 向集群添加实例:
JS> myCluster.addInstance('user@newhost:3306');
- 检查集群状态:
JS> myCluster.status(); JS> myCluster.describe(); // 更详细配置
- 管理 ReplicaSet:
JS> dba.createReplicaSet('myReplicaSet'); JS> var myReplicaSet = dba.getReplicaSet('myReplicaSet'); JS> myReplicaSet.addInstance('user@newhost:3306'); JS> myReplicaSet.status();
- 获取 dba 对象:
-
输出格式化:
- 在交互式 Shell 中,结果默认以漂亮的表格或 JSON 格式显示。
- 使用
--result-format
选项或在 Shell 内用\option
设置:mysqlsh --result-format=json/table/vertical/csv/ndjson/tabbed JS> \option --result-format=table
-
帮助和文档:
\?
或\help
: 显示 Shell 内置命令帮助。\help AdminAPI
: 显示 AdminAPI 相关帮助。\help dba
: 显示dba
对象的帮助。\help util
: 显示util
对象(实用工具)的帮助。\show
: 显示可用对象及其方法 (在 JS/Py 模式下)。
-
退出 MySQL Shell:
\quit
或者按
Ctrl+D
(Linux/macOS) /Ctrl+Z
然后回车 (Windows)。
一个简单示例流程 (创建集群 - 需多实例支持):
# 1. 启动 Shell 并连接到一个将成为集群种子节点的 MySQL 实例 (已配置好 Group Replication 前提条件)
mysqlsh root@primaryhost:3306
# 输入密码
# 2. 切换到 JS 模式 (如果默认不是)
JS> \js
# 3. 检查实例是否满足创建集群条件
JS> dba.checkInstanceConfiguration('root@primaryhost:3306')
# 根据输出修复任何报告的问题 (可能需要运行 dba.configureInstance())
# 4. 创建集群
JS> var myCluster = dba.createCluster('prodCluster')
# 5. 添加第二个实例
JS> myCluster.addInstance('root@secondaryhost1:3306')
# 输入实例密码
# 6. 添加第三个实例
JS> myCluster.addInstance('root@secondaryhost2:3306')
# 输入实例密码
# 7. 检查集群状态
JS> myCluster.status()
重要提示:
- 使用 AdminAPI 管理 InnoDB Cluster 或 ReplicaSet 之前,请确保目标 MySQL 实例已正确配置(满足 Group Replication 或异步复制要求),通常需要使用
dba.configureInstance()
或dba.configureReplicaSetInstance()
进行配置。 - 官方文档:https://dev.mysql.com/doc/mysql-shell/8.0/en/