您现在的位置是:首页 > 文章详情

openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库

日期:2025-04-07点击:19


关于作者:

严少安。数据库领域从业者。公众号「少安事务所」主理人。Oracle ACE,持有 MySQL OCP 5.6/5.7/8.0 认证。PostgreSQL ACE,持有 PGCM、HCM(Halo Database Administrator Certified Master) 认证,openHalo 贡献者。墨天轮 MVP,ITPUB 专家博主。


作者案:

MySQL 和 PostgreSQL 都是非常成熟的开源数据库产品,各自都有着非常成熟的生态体系。PostgreSQL 在可扩展性上优势明显,且采用 PostgreSQL 开源协议,而 MySQL 采用双轨并行的开源许可,局限性大,这是诸多数国产数据库厂商选择基于 PostgreSQL 进行二次开发或者再自研的根本原因。放眼全球,我们很难找到能将 MySQL 和 PostgreSQL 各自优势融为一体的开源数据库产品。openHalo 横空出世,宛如一把“倚天剑”,斩断了 PostgreSQL 与 MySQL 之间的兼容壁垒。

本文是全网第一篇全面介绍 openHalo 数据库的文章,全文共分为三部分,什么是 openHalo,如何编译安装 openHalo,以及 openHalo 的常规用法。建议收藏、推荐、转发。


正文开始。

01. 前言

2024 年 4 月,NextGres 在 PGConf 大张旗鼓的介绍着他们的产品规划,夸下海口要在年底正式推出基于 PostgreSQL 兼容 MySQL 和 SQL Server 的开源项目。一年过去了,NextGres 不但一再跳票,而且当我们“开盒” NextGres 的代码仓库时,发现那里已经停更好久,荒草萋萋。

同一时期,杭州的某个办公楼内,数十位工程师正紧锣密鼓的帮助诸多客户做 POC (Proof of concept,概念验证) 测试,将 MySQL 数据库平滑迁移到 HaloDB 数据库

好消息!好消息!!好消息!!!

openHalo 真的来了!

2025 年 4 月 1 日,历经多年精心打磨,HaloDB(MySQL 兼容模式)宣布开源,项目名称为 openHalo。我也在第一时间点星⭐、Fork(复刻),并进行深度测试和体验。

(https://www.openhalo.org/)

要了解 openHalo 需要先回忆下 PostgreSQL 和 MySQL 数据库的相关背景。

02. 简要回顾 PostgreSQL 和 MySQL 的发展史

现在的 PostgreSQL,起源可以追溯到 1986 年,当时是加州大学伯克利分校(Berkeley) POSTGRES 项目的一部分。1994 年更名为 Postgres95,开始支持 SQL 语言。1996 年完全开源,由 PGDG (PostgreSQL Global Development Group) 全球开发小组驱动。1997 年,PostgreSQL 6.0 问世,并开始被广泛应用于生产环境。2017 年,PostgreSQL 10 版本发布,更改了发版模型,还做出了许多重要变更,比如将 xlog 改为 wal,支持逻辑复制等。按照目前的发版模型,PGDG 每年发布一个主要版本,在主要版本首次发布后会为其提供 5 年的支持,最新可用版本为 17.4, 16.8, 15.12, 14.17, 13.20,计划将在今年 9 月发布 PostgreSQL 18。

PosgreSQL 历经近 40 年的发展,汇聚了 700+ 贡献者,凝聚 70+ 本地用户组,共 59,000+ 次提交,超过 1,700,000+ 行 C 语言代码。PostgreSQL 已从一个科研项目发展成如今世界上最先进的开源关系型数据库。根据 DB-Engines 排行榜信息,PostgreSQL 近十年受关注度增速惊人,荣获 2017、2018、2020、2023 四年全球最流行数据库。2025 年 4 月最新榜单数据显示,PostgreSQL 排名第四,667.25 分。

虽然 MySQL 仍位列榜单第二,但得分跌已破 1000 大关,同比下降超过 100 分。好在 MySQL 生态成熟且保有量巨大,我们仍可以说 MySQL 是全球最受欢迎的开源数据库

1995 年,MySQL 由瑞典公司 MySQL AB (Michael Widenius 等)开发,定位轻量级、高性能,早期侧重于快速读写,第一个版本仅适用于 Solaris 系统。次年,MySQL 的 Linux 二进制包发布。1998 年,MySQL 第一个 Windows 版本发布,适用于 Windows 95 和 NT,个人用户和中小企业可以在本地 PC 使用 MySQL + PHP 快速完成建站。2001 年,MySQL 3.23 发布,默认使用 MyISAM 存储引擎。2002 年,MySQL 吉祥物海豚提名 Sakila。2003 年,MySQL 4.0 发布,引入 InnoDB 存储引擎,它支持符合 ACID 标准的事务功能。2006 年,开发 InnoDB 存储引擎的 Innobase Oy 公司被 Oracle 公司收购。2008 年,MySQL 被 Sun Microsystems 收购。2009 年,Oracle 宣布收购 Sun 公司,这一事件引发社区对开源性的担忧,Michael 发布 MariaDB(MySQL 的分支)开源项目。

2010 年,MySQL 5.5 发布,默认存储引擎切换为 InnoDB,进而广泛应用于联机交易处理场景。2012 年,MySQL 5.6 发布,采用 GTID (全局事务ID)。2015 年,MySQL 5.7 发布,SQL 支持、查询性能、安全性等全方位增强改进,时至今日 MySQL 5.7 的保有量依旧巨大。2018 年,MySQL 8.0 GA,高可用架构显著增强,基于 Paxos 协议的 MGR 组复制,实现多主集群方案可用于生产环境。今年,MySQL 迎来 30 周年,回顾过往,MySQL 以其轻量、易上手、高性能、支持事务等优势在互联网红利时代收获了大批拥趸,在某大型国有商业银行,数以万计的 MySQL 实例正平稳地运行着。

但是,凡事都有两面性,由于 MySQL 8.0 新特性引入机制和版本管理存在强烈冲突,导致 Bug 频出,甚至出现更新小版本之后性能不升反降的情况,很多用户在选择小版本时无所适从,这是不争的事实。船大难掉,Oracle 终于意识到需要作出改变,2024 年 4 月,MySQL 8.4.0 LTS 发布,这是 MySQL 变更发版模型后的第一个长期支持版本。可惜的是,我们并没有从 MySQL “创新版本”中看到什么特别惊艳的新特性,联机分析处理、机器学习、数据湖、向量存储、AI 等功能都只是实现在甲骨文云 OCI (Oracle Cloud Infrastructure,云基础设施) 的 HeatWave 版本中。社区用户只能望梅止渴或另谋出路。

我们欣喜的看到,过去十年国产数据库(云)厂商发布了上百款自研或基于 PostgreSQL、MySQL 的数据库产品,比如 TiDBOceanBasePolarDBKingBaseIvorySQLYashanDB、GreatSQL、RisingWave、GoldenDB 等。这些产品不但乘势国内信创浪潮,成功完成某国际流行商业数据库替换任务,解决数据库“卡脖子”难题,为企业降本增效。更有优秀产品“出海”,开拓国际市场,让全球的开发者共建中国公司主导的开源数据库项目。

03. HaloDB 简史

openHalo 项目开源自 HaloDB 的 MySQL 兼容版本,openHalo 并非一蹴而就,而是易景科技多年打磨的结晶,并在生产环境中历经实战考验。我们先来了解一下“羲和(Halo)数据库”简史。

2012 年,当时部分创始团队成员面临将一个现有业务应用系统从 Oracle 以及 Db2 移植至其它数据库的需求和挑战。 为尽可能的降低移植风险和成本,团队成员开始深入研究数据库技术并写下了第一行数据库代码(用来兼容 Oracle 的 SYSDATE 关键字)。

2013 至 2018 年,团队成员陆续完成了多个金融系统数据库移植项目,从中积累了更丰富的数据库移植经验,对数据库技术有了更深入的理解和研究,并将数据库作为最主要的技术研究方向。

2019 至 2020 年,利用自身的行业经验和技术,结合自主研发的数据库产品(羲和数据库前身),成功完成了保险行业首个核心业务系统 Oracle 数据库的替换工作,获得了行内外及监管机构的一致好评。

2021 年,本着解决当前数据库产品的问题的初心并出于自身的爱好,现创始团队成立易景科技,投身于数据库事业的星辰大海中。从成立之初,我们便专注于新一代统一数据库产品的研发,致力于数据库领域的技术研究和突破,立志成为中国,乃至世界领先的数据库技术公司。

2022 年,发布 1.0.14 长期支持版,该版本更新并增强了众多的功能,包括 GB18030 的支持,增强的 PL/SQL 功能。其中最大的更新是从协议层支持了 MySQL,成为国内首个支持多协议的数据库,也是全球唯一一个完整支持 MySQL 协议的非 MySQL 衍生的数据库。

2023 年,成为首批通过 GB18030-2022 实现级别 3 的数据库产品。(openHalo 也已实现 GB18030-2022)

2024 年,发布 1.0.16 长期支持版,该版本支持同一个集群内可以同时支持 PostgreSQL / MySQL / Oracle 等运行模式,进一步帮助用户降低使用成本。

2025 年,开源 MySQL 全栈兼容技术,开源项目名为 openHalo。

04. 什么是 openHalo

让我们再次见证 openHalo 开源时刻。3 月 31 日,digoal 德哥发布了开源预告:特大新闻, Oracle强劲对手宣布开源!,截至发稿阅读量已达 3.5 万。

4 月 1 日,openHalo 代码正式开源,直播回放如下。


openHalo 是一款基于 PostgreSQL 的开源数据库,通过在内核层面实现 MySQL 协议和语法的兼容,为用户提供了一个同时具备 PostgreSQL 强大功能和 MySQL 简洁易用性的数据库解决方案。2025 年 4 月 1 日,openHalo 正式发布并开源,填补了国际上 PostgreSQL 兼容 MySQL 的空白。

openHalo 的核心设计目标:

1. 内核级兼容

openHalo 直接在 PostgreSQL 内核中实现 MySQL 协议和语法,避免了扩展插件或应用层兼容的性能损耗。运行一个数据库,可以同时提供 PostgreSQL 和 MySQL 两种模式。

2. 功能完整性

完整支持 MySQL 协议,支持 MySQL 的核心特性,如数据类型、SQL 语法、客户端类库等,MySQL 生态工具可直接作用于 openHalo 数据库。

3. 高性能

利用 PostgreSQL 的优化器和存储引擎,提供比 MySQL 更高的性能,尤其在处理复杂 SQL 方面。

4. 平滑迁移

MySQL 应用可以平滑迁移到 openHalo,显著降低迁移成本。从 MySQL 转向 openHalo 的学习成本也降低很多。

PostgreSQL 优良的扩展插件模块设计为兼容异构数据库提供了极大便利,PG 社区除了文章开头提及的 Nextgres 项目,还有另外一种方案。基于 PostgreSQL 的 Citus 集群通过 mysql_fdw 扩展实现 MySQL 兼容,支持数据分片,突破单机性能局限。但这种方案劣势也很明显,要求在 PostgreSQL 侧创建分片表,并映射到 MySQL 中的表,用户在 Citus 主节点上运行查询,该方案性能损耗大,功能覆盖有限。

如果你对源码感兴趣,可以先从这几个入口进行了解。欢迎全球的开发者参与共建 openHalo 开源项目。

src/backend/commands/mysql
src/backend/executor/mys_*.c
src/backend/parser/mysql
src/backend/utils/ddsm/mysm
src/include/nodes/mysql

openHalo 作为 PostgreSQL 的分支产品,当前版本为 1.0.14.10,最初基于 PostgreSQL 14.10 版本进行开发,翻阅源代码时发现,这一版 openHalo 的源代码也合并了一些 PostgreSQL 14.10 以上版本中的安全补丁,印证着易景科技对产品负责,对客户负责的态度。

05. 在 OpenCloudOS 9.2 上安装 openHalo 数据库

接下来进入到实操篇。

5.1. 准备操作系统 OpenCloudOS 9.2

操作系统这里选择 OpenCloudOS 9.2。

开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立、全面开放、安全稳定、高性能的操作系统及生态。OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯在操作系统和内核层面超过 10 年的技术积累,在云原生、稳定性、性能、硬件支持等方面均有坚实支撑,可以平等全面地支持所有硬件平台。

OpenCloudOS 9.2 基于 Linux Kernel 6.6,包含诸多新特性,支持国密、国产化平台和硬件。

[shawnyan@oc9 ~]$ hostnamectl
 Static hostname: oc9.shawnyan.cn
Operating System: OpenCloudOS 9.2                 
          Kernel: Linux 6.6.80-29.oc9.x86_64
    Architecture: x86-64            
[shawnyan@oc9 ~]$ 

下面介绍如何在 OC 系统上编译部署 openHalo 数据库。

5.2. 安装依赖和 MySQL 客户端

1. 在 OC 系统上安装数据库所需依赖包。
dnf install readline-devel uuid-devel perl-FindBin libicu-devel
2. 安装 MySQL 客户端,用于访问 openHalo 的 MySQL 监听。

注意:建议安装 MySQL 8.0 客户端,而不要使用 9.0 以上版本,避免连接时可能出现错误。

dnf install mysql
3. 查看客户端版本。
[shawnyan@oc9 ~]$ mysql --version
mysql  Ver 8.0.41 for Linux on x86_64 (Source distribution)

5.3. 编译安装 openHalo

1. 下载源代码。

openHalo 的源代码在 GitHub 上维护,用户可直接从仓库克隆(Clone)或下载压缩包。

https://github.com/HaloTech-Co-Ltd/openHalo

我在 GitCode 做了镜像,下载网速快了不少。

git clone https://gitcode.com/breeze915/openHalo
2. 编译安装。

我使用的是个人开发环境,并非标准生成环境部署,所以直接在个人用户下进行编译、安装。

进入到源码路径,配置、编译、安装。

./configure --prefix=/home/shawnyan/openhalo-1.0 --enable-debug --with-uuid=ossp --with-icu --with-extra-version="-ShawnYan"
make && make install
cd contrib
make && make install
3. 设定环境变量。

在 .bashrc 文件中加入 openHalo 相关环境变量。

vi ~/.bashrc
# 加入下面内容
export HALO_HOME=/home/shawnyan/openhalo-1.0
export PGDATA=/home/shawnyan/data
export PGHOST=localhost
export PATH=$HALO_HOME/bin:$PATH

使环境变量生效。

source ~/.bashrc
4. 初始化数据目录。

执行 initdb 命令,对数据目录进行初始化。

预期输出。

[shawnyan@oc9 ~]$ initdb
The files belonging to this database system will be owned by user "shawnyan".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /home/shawnyan/data ... ok
...

Success. You can now start the database server using:

    pg_ctl -D /home/shawnyan/data -l logfile start

[shawnyan@oc9 ~]$ 

到此,openHalo 编译安装已完成,并成功进行初始化。查看家目录下的文件。

[shawnyan@oc9 ~]$ ls
data  openHalo  openhalo-1.0

在启动数据库之前,我们需要先修改配置文件。

5.4. 修改 openHalo 配置文件

1. 修改  postgresql.conf  配置文件,启用 MySQL 相关配置。
  • database_compat_mode :开启 MySQL 兼容模式。
  • mysql.listener_on :启用 MySQL 监听端口。
  • mysql.port :设定 MySQL 监听端口号。
  • mysql.halo_mysql_version :自定义 MySQL 模式中的版本号。

查看配置文件中 mysql 相关配置。

[shawnyan@oc9 ~]$ grep -i mysql data/postgresql.conf
mysql.listener_on = true                     # (enable MySQL listener; change requires restart)
mysql.port = 3307                              # (second_port is for MySQL mode; change requires restart)
mysql.halo_mysql_version = '5.7.99-shawnyan'        # (change requires restart)
#mysql.ci_collation = true                      # (change requires restart)
#mysql.explicit_defaults_for_timestamp = false  # (change requires restart)
#mysql.auto_rollback_tx_on_error = false        # (change requires restart)
#mysql.halo_mysql_ci_collation = 0              # (change requires restart)
#mysql.column_name_case_control = 0             # (change requires restart)
#mysql.max_allowed_packet = 536870912B          # (512MB, change requires restart)
#mysql.support_multiple_table_update = true     # (change requires restart)
#password_encryption = scram-sha-256 # scram-sha-256 or md5 or mysql_native_password
database_compat_mode = 'mysql'         # database compat mode, values can be:
                                        # mysql (MySQL mode)
[shawnyan@oc9 ~]$ 
2. 推荐一个更优雅的方式,新建一个  openhalo.mysql.conf ,并在  postgresql.conf  中引用该文件。
[shawnyan@oc9 ~]$ cp ~/data/postgresql.conf ~/data/postgresql.conf.org
[shawnyan@oc9 ~]$ echo"include 'openhalo.mysql.conf'" >> ~/data/postgresql.conf
[shawnyan@oc9 ~]$ tail -n1 data/postgresql.conf 
include 'openhalo.mysql.conf'
[shawnyan@oc9 ~]$ 
[shawnyan@oc9 ~]$ cat << EOF > ~/data/openhalo.mysql.conf
database_compat_mode = 'mysql'
mysql.listener_on = true
mysql.port = 3307
mysql.halo_mysql_version = '5.7.99-shawnyan'
EOF
[shawnyan@oc9 ~]$ cat ~/data/openhalo.mysql.conf 
database_compat_mode = 'mysql'
mysql.listener_on = true
mysql.port = 3307
mysql.halo_mysql_version = '5.7.99-shawnyan'
[shawnyan@oc9 ~]$ 
3. 修改监听地址。

默认情况下,只监听本地地址 localhost,UNIX 套接字文件存放在 /var/run/openhalo 目录下。我们将监听地址修改为所有,UNIX 套接字文件存放于数据目录下。

比对修改前后配置文件变化。

[shawnyan@oc9 ~]$ diff data/postgresql.conf data/postgresql.conf.org
59c59
< listen_addresses = '*'  # what IP address(es) to listen on;
---
#listen_addresses = 'localhost'  # what IP address(es) to listen on;
66c66
< unix_socket_directories = '/home/shawnyan/data' # comma-separated list of directories
---
> unix_socket_directories = '/var/run/openhalo' # comma-separated list of directories
820d819
< include 'openhalo.mysql.conf'

这里只是方便演示修改几个必要参数,其他配置项这里不多做说明。

5.5. 启动 openHalo

与 PostgreSQL 启动方式一致,通过 pg_ctl 拉起 openHalo 数据库。

[shawnyan@oc9 ~]$ pg_ctl start
waiting for server to start....2025-04-01 20:31:14.825 CST [22034] LOG:  redirecting log output to logging collector process
2025-04-01 20:31:14.825 CST [22034] HINT:  Future log output will appear in directory "diag".
 done
server started

连接到 openHalo 数据库,查看版本信息。

[shawnyan@oc9 ~]$ psql
psql (1.0.14.10-ShawnYan)
Type "help" for help.

halo0root=# select version();
                                                                     version                                                                      
--------------------------------------------------------------------------------------------------------------------------------------------------
 openHalo 1.0.14.10-ShawnYan on x86_64-pc-linux-gnu, compiled by gcc (Tencent Compiler 12.3.1.3) 12.3.1 20230912 (OpenCloudOS 12.3.1.3-1), 64-bit
(1 row)

查看数据库。

halo0root=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 halo0root | shawnyan | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | shawnyan | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/shawnyan          +
           |          |          |             |             | shawnyan=CTc/shawnyan
 template1 | shawnyan | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/shawnyan          +
           |          |          |             |             | shawnyan=CTc/shawnyan
(3 rows)

到此,openHalo 在 OC 系统上的安装已经完成,接下来我们一起来了解 openHalo 的 MySQL 模式。

06. openHalo 的 MySQL 模式

6.1. 初始化 MySQL 模式

通过 psql 客户端连接到 openHalo,创建 aux_mysql 扩展,初始化 MySQL 模式。

[shawnyan@oc9 ~]$ psql
psql (1.0.14.10-ShawnYan)
Type "help"forhelp.

halo0root=# CREATE EXTENSION aux_mysql CASCADE;
NOTICE:  installing required extension "uuid-ossp"
CREATE EXTENSION
halo0root=# \dx
                            List of installed extensions
   Name    | Version |   Schema   |                   Description                   
-----------+---------+------------+-------------------------------------------------
 aux_mysql | 1.4     | public     | MySQL Supplementary Extension
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
 uuid-ossp | 1.1     | public     | generate universally unique identifiers (UUIDs)
(3 rows)

通过 MySQL 客户端连接到 openHalo,并查看版本信息。

[shawnyan@oc9 ~]$ mysql -h 127.1 -P 3307 -u shawnyan
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.7.32-log MySQL Server (GPL)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select version();
+-----------------+
| version         |
+-----------------+
| 5.7.99-shawnyan |
+-----------------+
1 row inset (0.00 sec)

mysql> select name,setting,boot_val from pg_settings where name ~ 'mysql_version';
+--------------------------+-----------------+------------+
| name                     | setting         | boot_val   |
+--------------------------+-----------------+------------+
| mysql.halo_mysql_version | 5.7.99-shawnyan | 5.7.32-log |
+--------------------------+-----------------+------------+
1 row inset (0.00 sec)

6.2. openHalo (MySQL 模式)的常规用法

1. 创建数据库,并查看数据库。
mysql> create database mydb;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mys_sys            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows inset (0.00 sec)
2. 创建测试表,插入数据,并查看表数据。
mysql> use mydb
Database changed
mysql> create table hello_openhalo ( a varchar(50) );
Query OK, 0 rows affected (0.00 sec)

mysql> insert hello_openhalo select 'Hello, openHalo!';
Query OK, 1 row affected (0.00 sec)

mysql> select * from hello_openhalo;
+------------------+
| a                |
+------------------+
| Hello, openHalo! |
+------------------+
1 row inset (0.00 sec)
3. 创建字段带有时间戳默认值的表

创建一张测试表,其中一个字段指定默认值为 unix_timestamp(),这在 MySQL 中会报错,但是在 MariaDB 和 openHalo 中是支持的。

  • MySQL
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.32    |
+-----------+
1 row in set (0.00 sec)

mysql> CREATE TABLE t (
    -> id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ct bigint(20) DEFAULT unix_timestamp()
    -> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unix_timestamp()
)'
 at line 3
  • openHalo
mysql> select version();
+-----------------+
| version         |
+-----------------+
| 5.7.99-shawnyan |
+-----------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE t (
    -> id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ct bigint(20) DEFAULT unix_timestamp()
    -> );
Query OK, 0 rows affected (0.00 sec)

openHalo 对 MySQL 的兼容不是完全照搬 MySQL 的实现,而是去其糟粕,留其精华,不会将 MySQL 中未修复的遗留 Bug 也兼容过来。

4. 创建带有枚举和 JSON 数据类型的表

枚举类型是由若干个值构成的有序集合,在 PostgreSQL 中需要先声明类型,再进行使用。

create type enum_type as enum ('hi''openHalo''good');
create table t1 ( name text, enum_col enum_type );

而在 openHalo 的 MySQL 模式中,已经兼容 MySQL 的语法,openHalo 会自动处理好枚举类型的创建。

mysql> CREATE TABLE IF NOT EXISTS t1 (
    -> id BIGINT NOT NULL,
    -> decimal_col DECIMAL(10, 2),
    -> datetime_col DATETIME,
    -> varchar_col VARCHAR(1000),
    -> blob_col BLOB,
    -> text_col TEXT,
    -> enum_col ENUM('value1''value2''value3'),
    -> json_col JSON
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` bigint NOT NULL,
  `decimal_col` decimal DEFAULT NULL,
  `datetime_col` datetime(6) DEFAULT NULL,
  `varchar_col` varchar(1000) DEFAULT NULL case_insensitive,
  `blob_col` blob DEFAULT NULL,
  `text_col` text DEFAULT NULL case_insensitive,
  `enum_col` enum_t1_enum_col DEFAULT NULL,
  `json_col` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row inset (0.00 sec)

mysql> SELECT typname, enumsortorder, enumlabel FROM pg_enum 
    -> JOIN pg_type ON pg_enum.enumtypid = pg_type.oid 
    -> WHERE pg_type.typname = 'enum_t1_enum_col';
+------------------+---------------+-----------+
| typname          | enumsortorder | enumlabel |
+------------------+---------------+-----------+
| enum_t1_enum_col |             1 | value1    |
| enum_t1_enum_col |             2 | value2    |
| enum_t1_enum_col |             3 | value3    |
+------------------+---------------+-----------+
3 rows inset (0.00 sec)

在 MySQL 客户端就可以直接查看 openHalo 的内置系统表,确认枚举类型包括的值有哪些。

JSON 数据类型也是支持的,后面再开新篇幅测试 JSON 相关的函数。

MySQL 社区版从 9.0 开始支持向量数据类型,但尚不成熟。在 PostgreSQL 中,相关功能可由 pg_vector 扩展进行辅助,这里不做展开。

6.3. 使用 Python 连接 openHalo 数据库

前面已经介绍了使用 MySQL 客户端连接到 openHalo 数据库。这里再列举两种方法。

通过 PyMySQL 连接到 openHalo。PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,用于在 Python 程序中连接和操作 MySQL 数据库,需要安装 python3 和 python3-PyMySQL 依赖。

简单写一段代码,连接 openHalo,并查看数据库版本。

#!/usr/bin/python3

import pymysql

conn = pymysql.connect(host='127.1', port=3307, user='shawnyan')

print("PyMySQL Client Version : ", pymysql.VERSION_STRING)

with conn.cursor() as cursor:
    cursor.execute("SELECT version()")
    print("MySQL Server Version : %s " % cursor.fetchone())

conn.close()

运行 Python 脚本,输出如下。

[shawnyan@oc9 ~]$ ./conn_mydb.py 
PyMySQL Client Version :  1.1.1
MySQL Server Version : 5.7.99-shawnyan 

6.4. 使用通用数据库管理桌面软件(DBCS)连接 openHalo

一些常用的图形化数据库管理工具对信创操作系统支持很弱,甚至无法使用,此时,你可以尝试使用 DBCS 工具。

通用数据库管理桌面软件(DBCS),是一款强大、易用的数据库桌面端管理工具,支持管理 20 多种国内外主流数据库,支持运行于 X86\ARM\龙芯\申威 等 CPU 架构,支持部署在信创、Windows、Linux、macOS 操作系统,是数据库运维、管理、开发人员或者学习者的“屠龙刀”。

DBCS 需要 JAVA 运行环境,我们先在 OC 系统上安装 Kona JDK 11

dnf install java-11-konajdk-devel

DBCS 的安装过程非常简单,且不需要 sudo 权限。下载 DBCS 安装包,上传服务器,并解压缩、安装。

[shawnyan@oc9 ~]$ ls -h dbcs_linux*
dbcs_linux_2025-03-21.tar.gz

dbcs_linux:
dbcs.desktop  dbcs.jar  etc  install.sh  lib  logs  readme.txt  start_dbcs.sh  upgrade  upgrade.desktop  upgrade.sh  wsqltmp

执行 start_dbcs.sh,启动 DBCS。使用 DBCS 分别连接 openHalo 的 PG 端口和 MySQL 监听端口,并执行 SQL 查询。

效果如下图。

6.5. 注意事项:openHalo 的密码认证

PostgreSQL 中的密码认证支持 scram-sha-256 和 md5 两种算法,以及 password 明文密码。从安全性考虑,推荐使用 scram-sha-256 密码验证机制,并开启 SSL 加密连接。

MySQL 5.7 默认认证插件为 mysql_native_password,从 MySQL 8.0 开始默认认证插件替换为安全更高、性能更好的 caching_sha2_password

从 PostgreSQL 或 MySQL 迁移到 openHalo 时,需要注意密码加密算法的选择,openHalo 默认为 scram-sha-256,目前 MySQL 模式只支持 mysql_native_password

halo0root=# show password_encryption;
 password_encryption
---------------------
 scram-sha-256
(1 row)

使用 psql 连接到 openHalo,以 mysql_native_password 密码加密方式创建用户。

halo0root=# set password_encryption='mysql_native_password';
SET
halo0root=# create user mytest superuser password 'mytest';
CREATE ROLE
halo0root=# select * from pg_shadow where usename = 'mytest';
-[ RECORD 1 ]+---------------------------------------------------------------
usename      | mytest
usesysid     | 20793
usecreatedb  | f
usesuper     | t
userepl      | f
usebypassrls | f
passwd       | mysql_native_password:58f4612c3598d20a3c51a37d7b2643bf15806832
valuntil     |
useconfig    |

在配置文件 pg_hba.conf 中添加访问许可,并重载配置。

echo "host  all  all  samenet  md5" >> $PGDATA/pg_hba.conf
pg_ctl reload

使用 MySQL 客户端以用户 mytest 连接 openHalo。

[shawnyan@oc9 ~]$ mysql -h 192.168.43.90 -P 3307 -u mytest -p mydb -e 'table hello_openhalo;'
Enter password:
+------------------+
| a                |
+------------------+
| Hello, openHalo! |
+------------------+

openHalo 的用法和注意事项就先介绍到这里。

未来与展望

openHalo 的设计理念以及行动力是值得称赞的,也标志着开源数据库正提速迈进“深度融合时代”。openHalo 刚刚开源,尚有很多不足之处,比如对 MySQL 的存储过程、分区表等功能的兼容性不足,官方文档尚不完善,欢迎各界大佬来“Halo 吐槽群”畅聊。当前版本的 openHalo 基于 PostgreSQL 14,希望下一个大版本可以升级到基于 PostgreSQL 16-18。openHalo 在 PostgreSQL 和 MySQL 融合方面还可以做出更多探索,比如 MySQL 模式下直接调用 DuckDB,提速数据分析。最后,期待有更多人了解 openHalo,使用 openHalo,共同参与 openHalo 开源项目。


Have a nice day ~ ☕


🌻 往期精彩 ▼

-- / END / --

👉 这里可以找到我

  • 微信公众号: @少安事务所
  • ITPUB: @少安事务所
  • TiDB 专栏: @ShawnYan
  • PGFans:  @严少安
  • 墨天轮: @严少安

👉 这里有得聊

如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。 关注微信公众号:少安事务所,后台回复[群],即可看到入口。

如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~


本文分享自微信公众号 - 少安事务所(mysqloffice)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

原文链接:https://my.oschina.net/mysqloffice/blog/18100166
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章