协会地址:上海市长宁区古北路620号图书馆楼309-313室
使用 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)
- 在
gdb或lldb中轻松单步调试
如果缺少构建服务器所需的某些软件包,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)]>
结论
我们现在已经拥有了开始开发新数据类型所需的一切,因为我们有一个独立的开发服务器,不会干扰系统安装。
很快将在本系列的下一部分中与您见面。







