MariaDB Catalogs 预览版容器现已可用

我们在 MariaDB Catalogs 上取得了重大进展,虽然仍有工作要做,但我们很高兴为社区提供一种便捷的方式来试用我们的预览版本。您不再需要自己编译源代码——只需使用我们的预构建容器,现在已在我们官方的 quay.io 开发注册中心提供。
代码已在 Github 上公开发布,与官方 MariaDB Server 位于不同的仓库(直到该功能作为官方 MariaDB Server 版本的一部分发布)
文档可在 Knowledge Base(知识库)上获取。有关 Catalogs 的分步指南,请继续阅读!
🚀 如何下载
docker pull quay.io/mariadb-foundation/mariadb-devel:mariadb-catalogs-preview
此镜像基于 Ubuntu 24.04,包含手动安装的 MariaDB 包。请注意,未配置任何更新仓库——这严格来说是一个预览版本。
底层的 MariaDB 版本仍为 11.0,因此可能缺少更高版本中引入的功能。
🛠️ 如何开始使用
此镜像基于我们在 Docker Hub 上的官方 Docker 镜像构建,增加了一个初始化变量:MARIADB_CATALOGS
,该变量接受一个逗号分隔的 Catalog 名称列表(无空格)。
要运行此镜像,请挂载数据目录的卷并初始化您想要的 Catalogs
docker run \
-v ./datadir:/var/lib/mysql \
-e MARIADB_CATALOGS=cat1,cat2 \
-e MARIADB_ROOT_PASSWORD=1234 \
--name mariadb-with-catalogs \
--rm \
-it quay.io/mariadb-foundation/mariadb-devel:mariadb-catalogs-preview
初始化后,您的数据目录结构将如下所示
$ sudo tree -d
.
├── #rocksdb
├── cat1
│ ├── mysql
│ ├── performance_schema
│ └── sys
├── cat2
│ ├── mysql
│ ├── performance_schema
│ └── sys
└── def
├── mysql
├── performance_schema
└── sys
每个 Catalog(例如,cat1
, cat2
)都有自己的 mysql
, performance_schema
和 sys
数据库。
🔌 如何连接
在此设置下,我们传统 Dockerhub
镜像提供的所有默认初始化参数将在 def
Catalog 上生效。这意味着带有密码 1234
的传统 root
用户(如上例命令所示)将位于 def
Catalog 中。
最简单的连接方式是通过已安装在容器中的 mariadb
客户端。这将便于进行管理操作。
docker exec -it mariadb-with-catalogs mariadb -u root --password=1234
您将看到如下形式的提示符
MariaDB [def.(none)]>
您现在已连接到 def
Catalog,该 Catalog 包含所有 Catalogs 的元数据。在此处创建的用户在其他 Catalogs 中将不可见。
我们可以使用以下命令列出所有可用的 Catalogs
MariaDB [def.(none)]> show catalogs;
+---------+-----------------+
| Catalog | Comment |
+---------+-----------------+
| cat1 | |
| cat2 | |
| def | default catalog |
+---------+-----------------+
较新的客户端(例如容器中已有的客户端)支持一个特定的 Catalog 标志。我们可以使用它以其 root
用户的身份连接到单独的 Catalog
docker exec -it mariadb-with-catalogs mariadb --catalog cat1 -u root
对于较旧的客户端,我们可以使用数据库名称来指定 Catalog
docker exec -it mariadb-with-catalogs mariadb -u root cat1.mysql
def
Catalog 中的 root
用户与其他 Catalog 的 root 用户相比具有特殊权限。它能够切换 Catalog 并在每个 Catalog 内进行操作。
MariaDB [def.(none)]> use catalog cat1;
Query OK, 0 rows affected (0.000 sec)
MariaDB [cat1.(none)]> create user foo;
Query OK, 0 rows affected (0.020 sec)
MariaDB [cat1.(none)]> select user, host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| foo | % |
| root | 127.0.0.1 |
| root | ::1 |
| mariadb.sys | localhost |
| root | localhost |
+-------------+-----------+
5 rows in set (0.001 sec)
💾 表和存储引擎
此预览版本支持多种存储引擎,所有引擎都支持 Catalogs,包括
- RocksDB
- InnoDB
- Connect
- MyISAM
- Aria
# Within a catalog, you can run:
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
CREATE TABLE t2 (a INT) ENGINE=RocksDB;
SHOW TABLES;
🧑💼 管理 Catalogs
Catalogs 主要用于 SaaS 提供商轻松创建多租户系统。这意味着 MariaDB Server 应支持相应的 SQL 命令来正确自动化此过程。
首先,初始部署通过 mariadb-install-db
脚本处理。该脚本将创建通过命令行参数 --catalogs=cat1,cat2,cat3
传入的所有 Catalogs。容器镜像在幕后也通过 MARIADB_CATALOGS
环境变量执行此操作。
随后,随着更多租户加入系统,我们需要能够创建更多 Catalogs。这通过 [CREATE | DROP] CATALOG
命令完成。让我们看看
MariaDB [def.(none)]> create catalog cat3;
Query OK, 1 row affected (0.380 sec)
MariaDB [cat1.(none)]> use catalog cat3;
Query OK, 0 rows affected (0.000 sec)
MariaDB [cat3.(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.000 sec)
您会注意到创建 Catalog 比其他命令花费更多时间。这是因为它实际上是在“引导”一个新的服务器模式。区别在于此 Catalog 默认没有创建任何用户。因此系统管理员现在还需要为 cat3
创建用户;
MariaDB [cat3.(none)]> select user, host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| mariadb.sys | localhost |
+-------------+-----------+
1 row in set (0.000 sec)
同样,我们可以删除新添加的 Catalog
MariaDB [cat3.(none)]> drop catalog cat3;
ERROR 4201 (HY000): Current catalog 'cat3' cannot be dropped
MariaDB [cat3.(none)]> use catalog cat2;
Query OK, 0 rows affected (0.000 sec)
MariaDB [cat2.(none)]> drop catalog cat3;
Query OK, 0 rows affected (0.241 sec)
注意,只要有用户连接到该 Catalog,我们就无法删除它。
📈 状态变量
Catalogs 的一个重要方面是监控服务器状态。在 MariaDB 中已经有全局和会话级别的变量,然而随着另一个层级(Catalogs)的引入,global 现在实际上指的是当前 Catalog 的状态。对于服务器范围的变量,现在有一个“server”级别的变量,而 global 现在是“catalog”级别的同义词。这保留了应用程序的向后兼容性。
并非所有状态变量都已支持,但我们可以测试一些,例如 Acl_users
。我们将连接到两个不同的 Catalogs 并检查其值
MariaDB [cat1.(none)]> show global status like 'Acl_users';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Acl_users | 5 |
+---------------+-------+
1 row in set (0.000 sec)
MariaDB [cat1.(none)]> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
| 5 |
+----------+
1 row in set (0.001 sec)
现在如果我们对之前创建了额外用户的 cat2 执行相同的操作
MariaDB [cat2.(none)]> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.000 sec)
MariaDB [cat2.(none)]> show global status like 'Acl_users';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Acl_users | 6 |
+---------------+-------+
1 row in set (0.000 sec)
请记住,这仍然是正在开发中的代码,因此此处可能存在我们尚未妥善处理的边缘情况。
文档
虽然本文重点介绍了 MariaDB Catalogs 中的大部分可用功能,但完整的文档可在 MariaDB KnowledgeBase(知识库)上获取。
最后一点说明
Catalogs 是一个大型项目,涉及相当多的开发工作。如果没有 IONOS 等赞助商的支持以及通过 NlNet 提供的结构性资金,这个项目是不可能实现的。我们鼓励社区通过测试、错误报告以及对 Github 公共仓库的潜在 PR 来做出贡献