多兼容模式
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 模式无需扩展。