暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

升级 MySQL REST 服务

146

作者: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) 20162025Oracleand/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 <schematoset 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`@`%` |
+------------------------------------+
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,
        idid @KEY @SORTABLE,
        namename
    }
    AUTHENTICATION REQUIRED;

结论

得益于服务器上运行的组件,使用 MySQL REST 服务从未如此简单。它极大地简化了 SSL 证书的使用。

MySQL REST 服务是向渐进式 Web 应用程序 (PWA)、移动应用程序或寻求简化数据访问的个人提供 JSON 文档的理想选择。

在这篇文章中,我演示了如何提供对简单表的访问;但是,这种方法也适用于视图、存储过程和函数。

请测试并向我们发送您的反馈!

参考资料
[1] 

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 #翻译




《技术译文系列》

数据库只追求性能是不够的!
没有好的数据,人工智能就毫无用处
MySQL 和 MariaDB 版本管理的历史背景及差异
AI 如何与我的数据库对话?MySQL 和 Gemini


✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

文章转载自爱可生开源社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论