跳到主要内容
版本:1.0.16

开启MySQL模式

方式一:cluster_net_services(推荐)

Halo 16 通过 cluster_net_services 参数支持在同一实例中同时运行多种兼容模式,推荐使用此方式。

修改配置文件

编辑 $PGDATA/postgresql.conf,设置以下参数:

# 开启 MySQL 模式
cluster_net_services = ':3306:mysql'

# 指定 MySQL 模式的默认租户库(即 mysql 客户端默认连接的库)
# 注意:该库必须在下方“创建扩展”步骤中安装 aux_mysql 扩展,
# 否则 mysql 客户端连接时会报错 Unknown database。
mysql.default_tenant = 'mysql'

重要: mysql.default_tenant 指定的默认租户库、以及所有需要通过 mysql 协议访问的库,都必须在该库内执行 create extension aux_mysql cascade; 安装扩展。未安装扩展的库无法被 mysql 客户端访问。mysql.default_tenantcluster_net_services 均为启动参数,修改后需 pg_ctl restart 重启数据库才能生效。

重启数据库并创建扩展

# 重启数据库(让上面的参数生效)
pg_ctl restart

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

# 在 mysql 库内创建 MySQL 扩展(aux_mysql 会顺带安装 plmyssql)
psql -d mysql -c "create extension aux_mysql cascade;"

创建 MySQL 模式的用户

psql
-- 设置密码加密方式
SET password_encryption='mysql_native_password';

-- 创建 MySQL 用户
CREATE USER mysqltest SUPERUSER PASSWORD '123456';

连接测试

使用 mysql 客户端连接时,需注意以下要点:

  • 必须通过 IP 地址(-h 127.0.0.1 或远程 IP)走 TCP。MySQL 兼容服务监听的是 cluster_net_services 中配置的 TCP 端口(本例为 3306),不监听 Unix socket;使用 localhost 会报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
  • 指定库名的选项是大写 -D,小写 -d 无效,会报错 mysql: unknown option '-d'
  • 目标库必须已安装 aux_mysql 扩展。未安装扩展的库无法通过 mysql 协议访问,会报错 Unknown database模式 "mysql" 不存在

连接数据库有两种写法:

写法一:用户@库名(推荐,最通用)

直接指定要连接的库,不受 mysql.default_tenant 影响,可连接任意已安装 aux_mysql 扩展的库。日常使用建议统一采用此写法,无需关心 default_tenant 的取值。

# 连接任意已安装 aux_mysql 扩展的库,将 dbname 替换为目标库即可
mysql -h 127.0.0.1 -P 3306 -u 'mysqltest@dbname' -p

写法二:-D 库名(仅用于默认租户库)

-D 库名 的查找范围是 mysql.default_tenant 指向的那个库,因此只能用于连接默认租户库本身。当 mysql.default_tenant = ''(未指定默认租户)时此写法不可用,会报错 auth failed: do not specify or config database for current user,此时必须改用写法一。

# 当 mysql.default_tenant = 'mysql' 时,连接默认租户库 mysql
mysql -h 127.0.0.1 -P 3306 -D mysql -u mysqltest -p

提示: mysql.default_tenant 是启动参数,修改后需 pg_ctl restart 重启才生效。由于 -D 库名 的行为依赖该参数,反复修改 default_tenant 容易导致连接表现不一致(如之前能连的库突然报 Unknown database)。为避免困惑,建议固定使用写法一(用户@库名)连接目标库。

方式二:database_compat_mode

Halo14 通过 database_compat_mode 参数结合 second_listener_onsecond_port 开启 MySQL 模式。该方式在 Halo 16 中仍然支持,但一次只能设置一种兼容模式。

修改配置文件

编辑 $PGDATA/postgresql.conf,设置以下参数:

# 1. 数据库运行模式设置为 mysql
database_compat_mode = 'mysql'

# 2. 开启 MySQL 第二监听服务
second_listener_on = true

# 3. 指定 MySQL 服务的监听端口,建议设置为 3306
second_port = 3306

重要:关于 psql 连接端口(务必注意)

在方式二下,将 database_compat_mode 设置为 mysql 并重启后,实例的原生端口(默认 1921)会被切换为 MySQL 协议。此时直接使用 psql(默认连接 1921)会报错 expected authentication request from serverserver closed the connection unexpectedly,无法进入数据库。

因此,后续所有通过 psql 执行的数据库操作(建库、建 schema、授权、建用户等)都必须显式指定 -p 9001,通过该 PG 协议端口连接。database_compat_modesecond_listener_onsecond_port 均为启动参数,修改后需 pg_ctl restart 重启才生效。

重启数据库并创建扩展

# 重启数据库(让上面的参数生效)
pg_ctl restart

# 创建数据库(必须通过 -p 9001 走 PG 协议端口)
psql -p 9001 -c "create database test;"

# 创建 schema 并授权
psql -p 9001 -d test -c "create schema test;"
psql -p 9001 -d test -c "GRANT ALL PRIVILEGES ON SCHEMA test TO halo1;"

创建 MySQL 模式的用户

psql -p 9001
-- 设置密码加密方式
SET password_encryption='mysql_native_password';

-- 创建用户
CREATE USER halo1 WITH PASSWORD 'halo1';

-- 授权
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO halo1;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO halo1;
ALTER USER halo1 LOGIN;
ALTER USER halo1 CREATEDB;
ALTER USER halo1 SUPERUSER;

连接测试

# 本地用户无需密码
mysql -h 127.0.0.1 -P 3306 -u halo1 -D test

# 远程用户需要密码
mysql -h xxx.xxx.xxx.xxx -P 3306 -u halo1 -D test -p

注意:

  • 采用 MySQL 模式时,MySQL 的数据库即 schema,只需要在 halo0root 库下创建 schema 即可。
  • 创建新的表之后,需要对目标用户进行授权,否则目标用户将无权访问该表。
  • 此方式下整个实例只能运行一种兼容模式,无法同时开启 Oracle 和 MySQL 等多种模式。
  • 如需在 Halo 16 中同时使用 Oracle、MySQL 等多种模式,请使用方式一(cluster_net_services)。