跳到主要内容

多兼容模式

Halo 数据库支持 Oracle、MySQL、PostgreSQL 三种兼容模式。其中:

  • Oracle 模式:兼容 Oracle 语法、函数、视图、Package 等
  • MySQL 模式:兼容 MySQL 语法、数据类型等
  • PostgreSQL 模式:原生兼容 PostgreSQL 协议和语法,无需额外配置

各模式可在同一实例中同时运行,互不干扰。

多模式配置总述​

Halo 通过 cluster_net_services 参数开启兼容模式,支持单实例多模式同时运行,各模式使用独立端口:

参数说明
cluster_net_services指定各兼容模式的监听端口,格式为 ':端口:模式名',多模式以英文逗号分隔

开启 Oracle 兼容模式​

1. 修改配置文件

编辑 $PGDATA/postgresql.conf,将 cluster_net_services 设置为 Oracle 模式:

cluster_net_services = ':1521:oracle'

2. 重启数据库并创建扩展

# 重启数据库
pg_ctl restart

# 创建 oracle 数据库
psql -c "create database oracle;"

# 连接 oracle 数据库并创建扩展
hsql -d oracle -p 1521 -c "create extension aux_oracle cascade;"

注意:采用 Oracle 模式时,目标数据库必须创建 aux_oracle 扩展才能使用 Oracle 语法。

3. 连接示例

# 使用 hsql
hsql -d oracle -p 1521

# 或使用 psql
psql -h 127.0.0.1 -p 1521 -U halo -d oracle

开启 MySQL 兼容模式​

1. 修改配置文件

# 开启 MySQL 模式并指定其监听端口
cluster_net_services = ':3306:mysql'

# 指定 MySQL 模式的默认租户库(mysql 客户端默认连接的库)
mysql.default_tenant = 'mysql'

说明:cluster_net_services 用于开启 MySQL 模式并指定监听端口;mysql.default_tenant 指定 MySQL 模式的默认租户库。两者均为启动参数,修改后需 pg_ctl restart 重启生效。

2. 重启数据库并创建扩展

MySQL 兼容语法运行在一个数据库中,因此需要新建一个数据库,并在其中安装 MySQL 扩展。本节示例将该数据库命名为 mysql:

# 重启数据库
pg_ctl restart

# 创建数据库(示例命名为 mysql)
psql -c "create database mysql;"

# 连接 mysql 数据库并安装 MySQL 扩展(aux_mysql 会顺带安装 plmyssql)
psql -d mysql -c "create extension aux_mysql cascade;"

3. 创建 MySQL 模式的用户

使用 hsql 连接到 mysql 数据库,创建供 MySQL 客户端登录使用的用户。密码加密方式需设为 mysql_native_password,否则 MySQL 客户端无法登录:

hsql -h /var/run/halo -p 1921 -U halo -d mysql
mysql=# SET password_encryption='mysql_native_password';
SET
mysql=# CREATE USER mysqltest SUPERUSER PASSWORD 'Halo@123456';
CREATE ROLE

说明:hsql 是 Halo 提供的命令行工具,连接 mysql 数据库时提示符为 mysql=#。使用前请将 Halo 安装目录的 bin 加入 PATH。

4. 连接示例(使用 mysql 客户端)

使用标准 MySQL 客户端连接 Halo 数据库的 MySQL 兼容端口:

mysql -h 127.0.0.1 -P 3306 -u mysqltest -D mysql -p

连接成功后,可执行 MySQL 协议下的 SQL:

mysql> SELECT VERSION();
+------------+
| version |
+------------+
| 5.7.32-log |
+------------+

开启 PostgreSQL 兼容模式​

PostgreSQL 模式是 Halo 的原生兼容模式,无需任何额外配置即可使用 PostgreSQL 协议和语法。客户端用标准 PostgreSQL 协议(psql、JDBC 等)直接连接即可。

默认端口直接连接

Halo 安装后默认即以 PostgreSQL 模式运行,使用默认端口连接到用户创建的数据库即可:

psql -h 127.0.0.1 -p 1921 -U halo -d postgres

说明:请连接用户自行创建的业务数据库(如 postgres)。业务数据请勿直接写入群集初始化时创建的管理库。

通过 cluster_net_services 指定独立端口(多模式并存场景)

在多模式并存场景下,可为 PostgreSQL 模式显式指定一个独立端口(避免与其他模式混淆),配置方式与 Oracle、MySQL 模式相同,详见多模式同时运行。

说明:PostgreSQL 模式无需创建任何扩展(区别于 Oracle 的 aux_oracle、MySQL 的 aux_mysql)。

多模式同时运行​

通过 cluster_net_services 可在一个实例中同时开启多种兼容模式。该参数的每一项格式为 :端口:模式名,多项以英文逗号分隔;其中 oracle、mysql、postgresql 为模式标识,表示该端口监听哪种兼容协议:

# 格式::端口:模式名,多项以逗号分隔
cluster_net_services = ':1521:oracle,:3306:mysql,:5432:postgresql'

# MySQL 模式默认连接的业务库名称(此处 'mysql' 为数据库名,由用户创建)
mysql.default_tenant = 'mysql'

重启后,各模式使用对应端口和客户端连接:

# Oracle 模式(1521)
hsql -d oracle -p 1521

# MySQL 模式(3306)
mysql -h 127.0.0.1 -P 3306 -u mysqltest -D mysql -p

# PostgreSQL 模式(5432 或默认 1921)
psql -h 127.0.0.1 -p 5432 -d postgres

注意:Oracle 和 MySQL 模式下的数据库都需要分别创建对应扩展(aux_oracle / aux_mysql)后才能使用兼容语法;PostgreSQL 模式无需扩展。