使用 CONNECT SE 创建远程服务器链接并访问数据

在这篇博客中,我们将了解如何创建远程服务器链接并使用它一次访问多个表。
上一篇博客中,我们了解了如何在 Docker 容器之间建立远程连接。
我们当时的做法是指定连接字符串只引用单个表。
但如果我们需要的表更多呢?如果我们甚至需要整个数据库呢?

解决方案是使用 CREATE SERVER 语句链接到远程数据库。
如此获得的链接可以传递给存储引擎 (SE) 的 CREATE TABLE 语句,以建立连接,其中使用表发现功能,存储引擎将自动识别表字段并创建表。
让我们看看如何操作。

接着上一篇博客,让我们在名为 mariadb-remote 的远程容器中启动 mariadb 客户端。

$ docker exec -it mariadb-remote mariadb -uanel -panel web_users

我们还创建了 mariadb-local 容器;让我们登录到 mariadb 客户端,我们在那里创建了名为 test 的数据库。


$ docker exec -it mariadb-local mariadb -ulocal_user -plocal_user_pw test

— 在 mariadb-local 上创建服务器链接

注意:你需要拥有 SUPERFEDERATED ADMIN (MariaDB 10.5.2+ 版本)以及 SELECT 权限。

MariaDB [test]> CREATE SERVER link_remote1
                FOREIGN DATA WRAPPER `mariadb`
                OPTIONS (
                USER 'anel',
                PASSWORD 'anel',
                HOST 'mariadb-remote',
                DATABASE 'web_users'
                );

注意,我们将数据库指定为服务器链接的参数,因此我们可以使用定义的链接作为连接字符串来访问特定数据库中的所有表。

上一个查询的结果是 mysql.servers 表中的记录。

MariaDB [test]> select * from mysql.servers;
+--------------+----------------+-----------+----------+----------+------+--------+---------+-------+
| Server_name  | Host           | Db        | Username | Password | Port | Socket | Wrapper | Owner |
+--------------+----------------+-----------+----------+----------+------+--------+---------+-------+
| link_remote1 | mariadb-remote | web_users | anel     | anel     |    0 |        | mariadb |       |
+--------------+----------------+-----------+----------+----------+------+--------+---------+-------+
1 row in set (0.000 sec)

要删除远程服务器链接,请使用 DROP SERVER link_remote1 语句。

让我们尝试使用服务器链接创建一个表。

MariaDB [test]> CREATE TABLE test.my_local_webusers
ENGINE = CONNECT
TABLE_TYPE=MYSQL
CONNECTION 'link_remote1/webusers';
Query OK, 0 rows affected (0.031 sec)

注意,我们可以省略连接字符串中的表名 webusers。在这种情况下,我们需要指定要创建的远程表的名称。

MariaDB [test]> CREATE TABLE webusers ENGINE = CONNECT TABLE_TYPE=MYSQL CONNECTION 'link_remote1';

验证结果

MariaDB [test]> select * from my_local_webusers;
+----+---------------+-----------+-------------------+----------------+---------------+--------------+-----------------+-----------------+-----------------+-----------------------+---------------+-----------------+----------------------------------------+----------------------------------+
| id | name          | username  | email             | address_street | address_suite | address_city | address_zipcode | address_geo_lat | address_geo_lng | phone                 | website       | company_name    | company_catchPhrase                    | company_bs                       |
+----+---------------+-----------+-------------------+----------------+---------------+--------------+-----------------+-----------------+-----------------+-----------------------+---------------+-----------------+----------------------------------------+----------------------------------+
|  1 | Leanne Graham | Bret      | Sincere@april.biz | Kulas Light    | Apt. 556      | Gwenborough  | 92998-3874      | -37.3159        | 81.1496         | 1-770-736-8031 x56442 | hildegard.org | Romaguera-Crona | Multi-layered client-server neural-net | harness real-time e-markets      |
|  2 | Ervin Howell  | Antonette | Shanna@melissa.tv | Victor Plains  | Suite 879     | Wisokyburgh  | 90566-7771      | -43.9509        | -34.4618        | 010-692-6593 x09125   | anastasia.net | Deckow-Crist    | Proactive didactic contingency         | synergize scalable supply-chains |
+----+---------------+-----------+-------------------+----------------+---------------+--------------+-----------------+-----------------+-----------------+-----------------------+---------------+-----------------+----------------------------------------+----------------------------------+
2 rows in set (0.002 sec)

结论与未来工作

在这篇博客中,我们学习了如何应用 CREATE SERVER 语句并使用 CONNECT SE 访问数据。你可以尝试使用其他存储引擎,例如 SPIDER 或 FEDERATEDX,进行同样的操作。

欢迎反馈

如果你在本次功能预览中遇到任何问题,或者设计上、边缘情况的表现与预期不符,请通过在 MDEV 项目中提交 JIRA 错误报告/功能请求来告知我们。欢迎在 Zulip 上讨论。