使用 Type_handler 向 MariaDB 添加新数据类型 – 第0部分

作者: Frédéric Descamps
原文链接:https://mariadb.org/adding-a-new-data-type-to-mariadb-with-type_handler-part-0/


欢迎来到这个关于扩展 MariaDB 的新系列。本系列将介绍如何使用 [Type_handler](https://www.linkedin.com/pulse/mariadbs-pluggable-data-type-framework-deep-dive-drrtuy-drrtuy-p6yke/)(类型处理器)添加新的数据类型。

整个系列的目标是创建一个新的插件数据类型 **MONEY**(货币类型),用于存储和显示带有货币符号的金额。

类似于:

MariaDB [test]> select * from t1;
+----+-------------+
| id | amount      |
+----+-------------+
|  1 | $2,000.00   |
|  2 | $100,000.56 |
+----+-------------+
2 rows in set (0.002 sec)

当然,最终目标是教会如何在 MariaDB 中添加数据类型 (data types),我们期待看到社区开发者们的创造力!

这是 第 0 部分 – 从 GitHub 仓库构建 MariaDB

我们将学习如何克隆源代码树并编译服务器。

开篇

在尝试使用自定义数据类型 (custom data type) 之前,你需要一个由自己构建的服务器,一个你能控制的服务器。

在本文中,我们将介绍使构建环境准备就绪的 5 个步骤。

我们将看到两种构建模式:

  • **Debug** 是开发的最佳模式。
  • **RelWithDebInfo** 是我们希望在优化时又不丢失调试符号 (debug symbols) 时所发布的模式。

MariaDB 的手册包含编译 MariaDB Server 的说明。在本系列中,我们将专注于为 Linux 构建它。如果你想为其他操作系统编译,请查阅相关文档。

步骤 1:克隆 MariaDB Server 源代码树

$ git clone https://github.com/MariaDB/server.git
$ cd server

在构建服务器之前,我们还需要一些工具和库。这些就是依赖项(dependencies)。

获取环境中所有依赖包的最佳方法是运行以下命令:

在 RPM 环境(Red Hat、CentOS、Fedora、Oracle Linux、Rocky Linux 等)中:

$ sudo dnf builddep mariadb-server

在 APT 环境(Debian、Ubuntu 等)中:

$ sudo apt-get build-dep mariadb-11.8

步骤 2:创建 out-of-source build(源外构建)

保持源目录树整洁,并让你能够轻松切换不同的构建模式。

$ mkdir -p ../build-mariadb-debug
$ mkdir -p ../build-mariadb-relwithdebinfo

构建类型(Build types)决定了 MariaDB 是为调试、发布性能,还是优化与调试信息混合而编译。

更多信息可在文档中找到。

可接受的值为:

  • Debug
  • Release
  • MinSizeRel
  • RelWithDebInfo

第 3 步:配置你的环境

配置真正的调试构建

我建议使用单独的构建目录(out-of-source 目录,即源码外目录),这样就不会污染源码目录。这允许你拥有多个构建目录,并且只需删除该目录即可从头开始重新构建。

对于最有利于内省(introspection)的配置,我建议使用:

$ cd ../build-mariadb-debug
$ cmake ../server -DCMAKE_BUILD_TYPE=Debug 

当你需要以下特性时,请使用此构建版本:

  • 对服务器行为具有最大可见性
  • 启用断言(assertions)
  • gdblldb 中轻松单步调试

如果缺少构建服务器所需的某些软件包,CMake 过程将停止并告知你缺少哪个包或库。

cmake 命令执行结束时,你将看到类似如下的输出:

-- The following OPTIONAL packages have been found:

* ZLIB(压缩库)
 * LibXml2(XML解析库)
 * Java(要求版本 >= 1.6)
   用于 CONNECT_JDBC 功能
 * JNI(Java本地接口)
   用于 CONNECT_JDBC 功能
 * Boost(要求版本 >= 1.40.0)
   用于 OQGraph 存储引擎
 * GSSAPI(通用安全服务应用程序接口)
 * BZip2(压缩库)
 * LZ4(要求版本 >= 1.6)
 * LibLZMA(LZMA压缩库)
 * LZO(压缩库)
 * Snappy(压缩库)
 * BISON(要求版本 >= 2.4)

-- 已找到以下推荐包:

 * OpenSSL(安全套接层库)

-- 已找到以下必需包:

 * Curses(终端控制库)
 * Threads(线程库)
 * CURL(网络传输库)

-- 以下功能已被禁用:

 * LIBWRAP,TCP 包装器支持
 * COLUMNSTORE,存储引擎
 * CONNECT_ODBC,CONNECT 存储引擎中的 ODBC 支持
 * CONNECT_MONGODB,CONNECT 存储引擎中的 MongoDB 支持
 * INNODB_EXTRA_DEBUG,额外的 InnoDB 调试检查
 * AWS_KEY_MANAGEMENT,AWS 加密密钥管理插件
 * EMBEDDED_SERVER,嵌入式 MariaDB 服务器库

-- 未找到以下可选包:

 * Judy(关联数组库)
   用于 OQGraph 存储引擎

-- 配置完成(52.2秒)
-- 生成完成(0.4秒)

## 配置一个类似生产环境的构建

为便于参考,我们现在配置一个更快的构建,同时保留符号信息:

$ cd ../build-mariadb-relwithdebinfo$ cmake ../server -DCMAKE_BUILD_TYPE=RelWithDebInfo


一旦基础功能正常工作,我会推荐大多数开发使用这个构建版本。

## 第4步:编译

在你想要使用的任意树(tree)中构建服务器:

$ cmake –build . –parallel


此命令将使用您机器的所有核心。如果您在日常使用的机器(如笔记本电脑)上进行编译,我建议限制用于编译的并行线程数:

$ cmake –build . –parallel 4


在 MariaDB Server 的源代码树中,还有几个用于构建服务器的**辅助脚本(helper scripts)**。大多数贡献者已经熟悉它们。这些脚本位于 `BUILD` 目录中。

请注意,你的构建目录的大小也会有所不同:

$ du -sh *9.9G build-mariadb-debug5.7G build-mariadb-relwithdebinfo3.6G server # the source tree


## 步骤 5:测试服务器

要测试刚刚编译好的服务器,最简单的方法是使用 **MTR**。

MTR(MariaDB/MySQL Test Run)是用于运行服务器回归测试套件的测试框架。它可以部署、初始化并启动服务器。当然,我们通常用它来自动化测试,但也可以用它来启动服务器,然后连接到服务器并手动测试各项功能。

无论如何,最终我们都需要为你的代码创建自动化测试。

$ ./mtr –start


> 我的同事 [Joro](https://www.linkedin.com/in/gkodinov/) 总是使用 `mtr 1st` 来测试服务器是否构建正确

如果你愿意,可以使用 `--vardir=<your-temp-data-dir>` 指定一个 **vardir**(临时数据目录)位置。

最后,`--start` 选项将让 MariaDB 服务器运行起来供我们使用。

> 也可以使用 `--start-and-exit`,但那样你需要发送 `shutdown` 命令,而不是简单的 `CTRL+C`

输出会提供用于连接 MariaDB 服务器的 socket(套接字)和端口。

=========================================================================

TEST                                      RESULT   TIME (ms) or COMMENT
-------------------------------------------------------------------------

worker[01] Using MTR_BUILD_THREAD 300, with reserved ports 19000..19029
worker[01] 
Started [mysqld.1 - pid: 88563, winpid: 88563]
worker[01] Using config for test innodb.innodb
worker[01] Port and socket path for server(s):
worker[01] mysqld.1  19000  /run/media/fred/DATA/vardir/tmp/mysqld.1.sock
worker[01] Waiting for server(s) to exit...

在另一个 shell 中,你可以使用 mariadb 客户端轻松连接:

$ client/mariadb -u root -S /run/media/fred/DATA/vardir/tmp/mysqld.1.sockWelcome to the MariaDB monitor. Commands end with ; or \g.Your MariaDB connection id is 3Server version: 13.0.1-MariaDB-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Help others discover MariaDB. Star it on GitHub: https://github.com/MariaDB/server

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

结论

我们现在已经拥有了开始开发新数据类型所需的一切,因为我们有一个独立的开发服务器,不会干扰系统安装。

很快将在本系列的下一部分中与您见面。