开启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_tenant和cluster_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_on 和 second_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 server或server closed the connection unexpectedly,无法进入数据库。因此,后续所有通过 psql 执行的数据库操作(建库、建 schema、授权、建用户等)都必须显式指定
-p 9001,通过该 PG 协议端口连接。database_compat_mode、second_listener_on、second_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)。