
作者:Frederic Descamps,MySQL 社区经理
原文:https://lefred.be/content/uplevel-the-mysql-rest-service/,July 28, 2025
爱可生开源社区翻译,本文约 3500 字,预计阅读需要 12 分钟。

MySQL REST 服务是下一代 JSON 文档存储解决方案,支持快速、安全地通过 HTTPS 访问存储在 MySQL、HeatWave、InnoDB Cluster、InnoDB ClusterSet 和 InnoDB ReplicaSet 中的数据。
MySQL REST 服务于 2023 年首次在 https://labs.mysql.com 上使用 MySQL Router 发布[1]。2025 年春季,它随 MySQL 9.3 一起 发布在 MySQL HeatWave 和标准 MySQL 社区包上[2]。始终使用 MySQL Router 作为 REST 服务的入口点。
上周,我们发布了新的实验版本 MySQL 9.4.0-labs-MRS13,其中不再需要 MySQL Router,因为 REST 服务现在直接在 MySQL 服务器上运行。这也是我一直以来倡导的做法,现在有一个新的组件来处理此功能。
在这篇文章中,我们将探讨如何利用这个新组件并在不需要 SQL 的情况下访问存储在 MySQL 中的数据。
安装
第一步是安装所需的软件包。由于我使用的是 Oracle Linux 9,因此我将使用相应的 RPM 包。我还将安装最新的 MySQL Shell[3] (9.4.0):
$ sudo dnf install mysql-community-client-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-community-client-plugins-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-community-common-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-community-icu-data-files-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-community-libs-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-community-libs-compat-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-community-server-9.4.0-13.labs_mrs_13.el9.x86_64.rpm \
mysql-shell-9.4.0-1.el9.x86_64.rpm
Last metadata expiration check: 0:19:26 ago on Sun 27 Jul 2025 06:25:16 PM UTC.
Dependencies resolved.
==========================================================================
Package Arch Version Size
==========================================================================
Installing:
mysql-community-client x86_64 9.4.0-13.labs_mrs_13.el9 4.1 M
mysql-community-client-plugins x86_64 9.4.0-13.labs_mrs_13.el9 1.5 M
mysql-community-common x86_64 9.4.0-13.labs_mrs_13.el9 597 k
mysql-community-icu-data-files x86_64 9.4.0-13.labs_mrs_13.el9 2.3 M
mysql-community-libs x86_64 9.4.0-13.labs_mrs_13.el9 1.5 M
mysql-community-libs-compat x86_64 9.4.0-13.labs_mrs_13.el9 1.4 M
mysql-community-server x86_64 9.4.0-13.labs_mrs_13.el9 105 M
mysql-shell x86_64 9.4.0-1.el9 96 M
Upgrading:
openssl x86_64 1:3.2.2-6.0.1.el9_5.1 ol9_baseos_latest 1.5 M
openssl-devel x86_64 1:3.2.2-6.0.1.el9_5.1 ol9_appstream 4.0 M
openssl-libs x86_64 1:3.2.2-6.0.1.el9_5.1 ol9_baseos_latest 2.1 M
Installing dependencies:
openssl-fips-provider x86_64 3.0.7-6.0.1.el9_5 ol9_baseos_latest 8.1 k
openssl-fips-provider-so x86_64 3.0.7-6.0.1.el9_5 ol9_baseos_latest 575 k
Transaction Summary
==========================================================================
Install 10 Packages
Upgrade 3 Packages
Total size: 220 M
Total download size: 8.2 M
Is this ok [y/N]: y
安装后,我们启动 mysqld :
$ sudo systemctl start mysqld
$ sudo grep password var/log/mysqld.log
2025-07-27T18:48:14.015136Z 6 [Note] [MY-010454] [Server] A temporary
password is generated for root@localhost: xxxxxxxx
我们连接到 MySQL 并更改生成的密码:
$ mysqlsh root@localhost
Please provide the password for 'root@localhost': ************
Save password for 'root@localhost'? [Y]es/[N]o/Ne[v]er (default No): no
Error during auto-completion cacheupdate: You must reset your password
usingALTERUSERstatementbefore executing this statement.
MySQL Shell 9.4.0
Copyright (c) 2016, 2025, Oracleand/or its affiliates.
Oracleis a registered trademark ofOracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type'\help'or'\?'forhelp; '\quit' to exit.
Creating a session to 'root@localhost'
Your MySQL connection id is 11
No default schema selected; type \use <schema> toset one.
MySQL localhost:3306 ssl SQL > setpassword='<YOUR PASSWORD>';
Query OK, 0 rows affected (0.0491 sec)
元数据 Schema
为了工作,MySQL REST 服务组件需要创建和填充元数据 Schema。
创建元数据是推荐的第一步,甚至在加载组件之前。
即使可以使用命令行客户端创建它,也只能使用最新的 MySQL Shell (mysqlsh),不要尝试使用旧的经典 MySQL 客户端,我建议使用 Visual Studio Code 的 MySQL Shell 来设置和配置 MySQL REST 服务。
在 VS Code 中使用 MySQL Shell
要创建服务、路径和身份验证,使用 Visual Studio Code 的 MySQL Shell 图形用户界面 (GUI) 会更加方便。如果您尚未安装该插件,请先安装,以下是创建您的第一个 REST 服务的第一步。
您需要与您的服务器建立标准的数据库连接:

如您所见,我之前创建了一个具有所有权限的用户 fred ,但我不想使用 root 。
创建连接后,在左侧列表中右键单击该连接,并为 MySQL REST 服务配置实例。此操作还将生成我们之前讨论过的元数据 Schema:


我们可以在服务器的错误日志中看到元数据和其他插件的生成:

安装组件
一旦创建了元数据,您就可以加载存储在默认插件目录中的组件:
[root@mysql1 RPMS]# cd usr/lib64/mysql/plugin/
[root@mysql1 plugin]# ls -lh component_mysql_rest_service.so
-rwxr-xr-x. 1 root root 16M Jul 22 12:15 component_mysql_rest_service.so
像安装其他组件一样安装它:
SQL > install component "file://component_mysql_rest_service";
Query OK, 0 rows affected (0.1288 sec)
在错误日志中,我们可以看到以下条目:
2025-07-27T18:54:31.955831Z 11 [System] [MY-015162] [Server]
MySQL Rest Service Component: Starting...
2025-07-27T18:54:31.988013Z 0 [System] [MY-015162] [Server]
MySQL Rest Service Component: Disabling 'mysqlx' plugi
我们可以看到,默认情况下,MySQL REST 服务禁用了 X 插件并使用该端口。稍后我会再讨论这一点。
如果您看到以下消息每 30 秒重复出现一次,则表示 您已跳过元数据创建 :
2025-07-27T18:54:32.009698Z 13 [System] [MY-015162] [Server]
MySQL Rest Service Component: Metadata schema not detected, retrying in 30s...
如果是这种情况,您仍然可以从 MySQL Shell 轻松创建它:
SQL > configure rest metadata;
Query OK, 0 rows affected (1.9330 sec)
REST metadata updated successfully.
变量
该组件创建了几个全局变量:
SQL > select * from performance_schema.global_variables
where variable_name like 'compon%rest_service%';
+----------------------------------------------------------+--------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+----------------------------------------------------------+--------------------------------+
| component_mysql_rest_service.developer | |
| component_mysql_rest_service.http_port | 33060 |
| component_mysql_rest_service.ssl_cert | var/lib/mysql/server-cert.pem |
| component_mysql_rest_service.ssl_key | var/lib/mysql/server-key.pem |
| component_mysql_rest_service.tmp_router_plugin_directory | |
| component_mysql_rest_service.use_ssl | ON |
| component_mysql_rest_service.user | mysql_mrs_1 |
+----------------------------------------------------------+--------------------------------+
7 rows in set (0.0055 sec)
状态变量
还有一些专用的状态变量可用:
SQL > select * from performance_schema.global_status
where variable_name like 'compon%rest_service%';
+-----------------------------------------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+-----------------------------------------------+----------------+
| component_mysql_rest_service.http_port_source | xplugin |
| component_mysql_rest_service.ssl_cert_source | mysql |
| component_mysql_rest_service.ssl_key_source | mysql |
+-----------------------------------------------+----------------+
3 rows in set (0.0174 sec)
关于 X 协议
正如我之前所说,默认情况下,MySQL REST 服务组件使用 X 协议的端口(TCP/33060)并禁用 X 插件。
如果您想继续使用 X 协议,您可以使用变量 component_mysql_rest_service.http_port
为 REST 服务定义不同的端口。
SQL > install component "file://component_mysql_rest_service" SET GLOBAL
component_mysql_rest_service.http_port=33063;
如果服务器上禁用了 X 插件,则 MySQL REST 服务的端口将为 8543 。
对于本博客的其余部分,我将使用默认的 MySQL REST 服务端口(33060),它与 X 插件相同。
添加服务
我们在 Visual Studio Code 中使用 MySQL Shell 执行的所有操作都可以直接在 MySQL Shell 中执行。稍后我们将看到具体操作方法。
现在是时候创建我们的第一个服务了;建议每个应用程序都应该有其专用的服务:


如您所见,我已启用并发布了它。我们还可以选择将其链接到一个或多个身份验证应用程序;我们稍后会讨论这一点。

为了测试,我们创建一个模式和一个示例表 fred.t1
。
然后我们将模式和表添加到 REST 服务:





在讨论身份验证之前,我将删除表 t1
所需的身份验证以测试服务:

请注意消失的小锁图标:

现在,我们可以使用浏览器来测试我们的服务。请注意,该组件使用与 MySQL 服务器相同的证书,默认情况下是自签名的:

始终可以使用命令行中的 MySQL Shell 与 MySQL REST 服务进行交互,如前所述:

验证
目前,有四家供应商可提供该组件的身份验证方法:

MRS 是默认的身份验证方式,其身份验证针对 MRS REST 服务特定的帐户进行。应用程序使用 SCRAM(加盐质询响应身份验证机制)对用户进行安全身份验证。
使用 MySQL Internal 时 ,身份验证由 MRS 针对 MySQL 服务器用户帐户进行处理。应用程序将凭据(用户名和密码)以明文形式作为 JSON 请求负载的一部分发送到 MySQL Router,以对用户进行身份验证。
建议对仅 HTTPS 的 REST 服务使用此身份验证方法,并且最适合未公开的应用程序。其他方法使用外部方法。更多信息请查看手册[4]。
MRS
之前我们在配置服务的时候创建了默认的 REST 身份验证应用和专用用户:

此身份验证应用程序不易与 curl 一起使用。
但是我们可以为我们的 REST 服务使用 SDK。让我们创建它,然后尝试使用 MRS 身份验证应用进行身份验证。
SDK
我们首先将我们服务的 SDK 转储到磁盘上:

我们注意使用正确的 REST 服务 URL,但是在使用 SDK 时我们可以覆盖它,并且由于我将用 Python 编写示例,因此我选择 Python 作为 API 语言:

我将文件夹重命名为 sdk 并在我的 Python 代码中使用它,请注意必须使用 异步 调用:
from sdk.my_service import *
my_service = MyService(verify_tls_cert=False)
asyncdef main():
await my_service.authenticate(
user="fred_rest",
password="<STRONG PASSWOR>",
app="MRS",
)
records = await my_service.fred.t1.find()
for record in records:
print(record.name)
asyncio.run(main())
我们可以测试一下:
$ python test.py
uncle scott
lefred
miguel
MySQL Internal
要使用 MySQL 内部身份验证测试服务,我们需要在 MySQL 中创建一个用户,并确保在请求期间使用身份验证应用程序的名称并与其匹配(稍后您将看到一个示例)。
无需任何特殊权限即可创建用户,因为数据访问权限已授予 MySQL REST 服务用户!
SQL > create user miguel identified by'< A STRONG PASSWORD >';
Query OK, 0 rows affected (0.0260 sec)
SQL > show grants for miguel;
+------------------------------------+
| Grants for miguel@% |
+------------------------------------+
| GRANT US AGEON *.* TO `miguel`@`%` |
+------------------------------------+
1 row inset (0.0009 sec)
我们有两个选择:
使用 cookie(不推荐) 使用 JWT 令牌(推荐)
Cookie
我正在使用 curl 执行身份验证来创建 cookie:
$ curl -c cookie.txt -k -X POST -H "Content-Type: application/json" \
-d '{"username": "miguel",
"password": "< STRONG PASSWORD>",
"sessionType: "cookie",
"authApp": "MySQL" }' \
https://192.168.57.2:33060/myService/authentication/login
然后我像这样使用 cookie:
$ curl -s -b cookie.txt -k -X GET https://192.168.57.2:33060/myService/fred/t1 | jq
{
"items": [
{
"id": 1,
"name": "uncle scott",
"links": [
{
"rel": "self",
"href": "/myService/fred/t1/1"
}
],
"createdAt": "2025-07-27 19:35:36.000000",
"_metadata": {
"etag": "AEA213DBFACE1BE77A9A220610B090060ECAABDC7D7F567C6AD59BE3178AD969"
}
},
{
"id": 2,
"name": "lefred",
"links": [
{
"rel": "self",
"href": "/myService/fred/t1/2"
}
],
"createdAt": "2025-07-27 19:35:42.000000",
"_metadata": {
"etag": "2D8A0EC85F5F58C485E6172149E8C37738FD5FF2DA264151A32F948F222111D0"
}
},
{
"id": 3,
"name": "miguel",
"links": [
{
"rel": "self",
"href": "/myService/fred/t1/3"
}
],
"createdAt": "2025-07-27 19:35:48.000000",
"_metadata": {
"etag": "FCEE36AB938B1F08921C058F1ED6752F333C0BED697E799159E489D2FB405737"
}
}
],
"limit": 25,
"offset": 0,
"hasMore": false,
"count": 3,
"links": [
{
"rel": "self",
"href": "/myService/fred/t1/"
}
]
}
如前所述,在身份验证期间,使用有效的 authApp 名称至关重要:

JWT 令牌
使用 JSON Web Token 是针对 MRS 进行身份验证的 首选方法。 您应该选择 JWT 方法而不是 Cookie 。
让我们看看如何使用它:
$ response=$(curl -s -k -X POST -d '{"username": "miguel",
"password": "<STRONG PASSWORD>",
"authApp": "MySQL", "sessionType": "bearer" }' https://192.168.57.2:33060/myService/authentication/login)
$ echo "Authorization: Bearer $(echo $response| jq -r .accessToken)" > tmp/session.dat
$ curl -s -k -X GET -H "$(cat tmp/session.dat)" https://192.168.57.2:33060/myService/fred/t1/1 | jq
{
"id": 1,
"name": "uncle scott",
"links": [
{
"rel": "self",
"href": "/myService/fred/t1/1"
}
],
"createdAt": "2025-07-27 19:35:36.000000",
"_metadata": {
"etag": "AEA213DBFACE1BE77A9A220610B090060ECAABDC7D7F567C6AD59BE3178AD969"
命令行
当然,也可以使用命令行上的 MySQL Shell 来配置和部署所有内容,例如,可以使用它来编写部署脚本。
如果您想查看当前命令,可以从 Visual Studio Code 中导出它们:



这将是生成的 SQL 文件的内容:
CREATE OR REPLACE REST SERVICE myService
PUBLISHED
AUTHENTICATION
VALIDATION "/fred/t1"
OPTIONS {
"http": {
"allowedOrigin": "auto"
},
"headers": {
"Access-Control-Allow-Headers":
"Content-Type, Authorization,
X-Requested-With, Origin, X-Auth-Token",
"Access-Control-Allow-Methods": "GET, POST,
PUT, DELETE, OPTIONS",
"Access-Control-Allow-Credentials": "true"
},
"logging": {
"request": {
"body": true,
"headers": true
},
"response": {
"body": true,
"headers": true
},
"exceptions": true
},
"includeLinksInResults": false,
"returnInternalErrorDetails": true
}
ADD AUTH APP `MRS` IF EXISTS
ADD AUTH APP `MySQL` IF EXISTS;
CREATE OR REPLACE REST SCHEMA /fred ON SERVICE myService
FROM `fred`
AUTHENTICATIONNOT REQUIRED;
CREATE OR REPLACE REST VIEW /t1
ON SERVICE myService SCHEMA /fred
AS fred.t1 CLASS MyServiceFredT1 {
createdAt: created_at,
id: id @KEY @SORTABLE,
name: name
}
AUTHENTICATION REQUIRED;
结论
得益于服务器上运行的组件,使用 MySQL REST 服务从未如此简单。它极大地简化了 SSL 证书的使用。
MySQL REST 服务是向渐进式 Web 应用程序 (PWA)、移动应用程序或寻求简化数据访问的个人提供 JSON 文档的理想选择。
在这篇文章中,我演示了如何提供对简单表的访问;但是,这种方法也适用于视图、存储过程和函数。
请测试并向我们发送您的反馈!
MySQL REST 服务介绍: https://blogs.oracle.com/mysql/post/introducing-the-mysql-rest-service
[2]发布新闻: https://blogs.oracle.com/mysql/post/announcing-general-availability-of-the-new-heatwave-rest-service
[3]下载地址: https://dev.mysql.com/downloads/shell/
[4]外部使用方法: https://dev.mysql.com/doc/dev/mysql-rest-service/latest/#authentication-management
本文关键字:#MySQL #REST #JSON #VSCode #翻译

《技术译文系列》

✨ Github:https://github.com/actiontech/sqle
📚 文档:https://actiontech.github.io/sqle-docs/
💻 官网:https://opensource.actionsky.com/sqle/
👥 微信群:请添加小助手加入 ActionOpenSource
🔗 商业支持:https://www.actionsky.com/sqle




