前倾回顾
前面介绍了“光环”数据库的基本情况和安装办法。
- 哈喽,国产数据库!Halo DB!
- 三步走,Halo DB 安装指引
以及 HaloDB 的 Oracle 兼容模式:
- HaloDB 的 Oracle 兼容模式
HaloDB是基于原生PG打造的新一代高性能安全自主可控全场景通用型统一数据库。
业内首次创造性的提出插件式内核架构设计,通过配置的方式,适配不同的应用场景,打造全场景覆盖的能力,满足企业大部分数据存储处理需求。从而消除数据孤岛,降低系统复杂度,保护企业既有投资,降低企业成本。同时支持x86、arm等异构平台之间的混合部署。
本文将介绍如何开启 HaloDB 的 MySQL 兼容模式,以及基础使用方法。
HaloDB 的 MySQL 兼容模式
Halo 数据库兼容 MySQL 协议,可以直接使用 MySQL 客户端连接到 Halo 数据库。
Halo 的 MySQL 兼容模式有两种类型的用户,一种是 MySQL 用户,另一种是 Halo 用户。
MySQL 用户专门提供给业务系统使用,且只能以标准 MySQL 客户端方式连接到 Halo 的业务服务端口。
MySQL 用户一般只建议用于 DML(业务相关的增删查改) 操作。
以下列举 MySQL 兼容能力(部分):
- 支持 MySQL 协议
- 支持 MySQL 的基本数据类型
- 支持 MySQL 引号使用方式
- 支持 REPLACE INTO
- 支持 INSERT IGNORE
- 支持 UPDATE … ON DUPLICATE KEY
- 支持 INSERT … VALUE
- 支持 LIMIT 操作
- 支持 UPDATE … [ORDER BY] … LIMIT
- 支持 DELETE … [ORDER BY] … LIMIT
- 支持 ORDER BY 按指定列顺序排序
- 支持 SET 类型
- 支持符号
- 支持使用变量
- 支持枚举类型
等等。
清单很长,这里就不再列举了,详情可留言,带你进《HaloDB产品吐槽群》。
开启 HaloDB 的 MySQL 兼容模式
修改配置文件
如需开启 MySQL 兼容模式,需要先对数据库配置文件 postgresql.conf 进行调整。
#database_compat_mode = 'postgresql' --> database_compat_mode = 'mysql'
#standard_parserengine_auxiliary = 'on' --> standard_parserengine_auxiliary = 'on'
#second_listener_on = false --> second_listener_on = 1
#second_port = 3307 --> second_port = 3306
其中,
- database_compat_mode
该参数表示:
该参数为枚举类型,表示数据库运行模式。
默认值为 postgresql,其它可取值包括 oracle 、 mysql 、 sybase 、 sqlserver 、 db2 等。
- standard_parserengine_auxiliary
该参数表示:
是否需要标准编译引擎协同。默认值 on.
- second_listener_on
该参数表示:
为了使用 Halo 的 MySQL 模式,需要开启第二监听。
- second_port
该参数表示:
Halo 的 MySQL 模式监听的端口,建议配置为 3306。
重启 Halo 数据库
pg_ctl restart
创建 MySQL 扩展
针对需要启用 MySQL 解析引擎的数据库创建 MySQL 扩展:
注: 采用 mysql 模式情况下,mysql 的数据库即 schema,只需要在 halo0root 库下创建 schema 就可以。
create extension aux_mysql;
查看已安装的扩展:
shawnyan=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+--------------------+-------------------------------
aux_init | 1.0 | information_schema | Init Supplementary Extension
aux_mysql | 1.4 | public | MySQL Supplementary Extension
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(3 rows)
测试 HaloDB 的 MySQL 兼容模式
- 创建 application 用户
set password_encryption='mysql_native_password';
CREATE USER sbtest SUPERUSER PASSWORD 'sbtest';
shawnyan=# \du sbtest
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
sbtest | Superuser | {}
- 创建 application 库
create schema sbtest;
shawnyan=# \dn sbtest
List of schemas
Name | Owner
--------+-------
sbtest | halo
(1 row)
- 使用 mysql 客户端连接到 halo 数据库
[halo@centos7 halo]$ mysql -usbtest -h192.168.195.128 -P3307 s2
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 8.0.30 MySQL Server (GPL)
Copyright (c) 2000, 2024, 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' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------------+
| database |
+--------------------------+
| dbms_alert |
| dbms_assert |
| dbms_obfuscation_toolkit |
| dbms_output |
| dbms_pipe |
| dbms_random |
| dbms_utility |
| information_schema |
| mysql |
| oracle |
| performance_schema |
| s1 |
| s2 |
| sys |
| utl_file |
| utl_i18n |
+--------------------------+
16 rows in set (0.00 sec)
mysql> use s2
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table t(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert t select 1;
Query OK, 1 row affected (0.00 sec)
mysql> table t;
ERROR 1105 ( ): Unsupport statement/command! Please retry on Halo tool with corresponging Halo statement/command.
mysql> select * from t;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
- 查看 mysql 相关参数
halo0root=# select name,setting from pg_settings where name like '%mysql%';
name | setting
---------------------------------------+------------
mysql.ci_collation | on
mysql.column_name_case_control | 0
mysql.customized_case_column_names | aaabbb
mysql.explicit_defaults_for_timestamp | off
mysql.halo_mysql_version | 8.0.99-log
(5 rows)
- 跨库查询能力
halo 的 mysql 模式支持跨库查询,举例如下:
- 创建模式 s1 和 s2
CREATE SCHEMA s1 AUTHORIZATION sbtest;
CREATE SCHEMA s2 AUTHORIZATION sbtest;
查验:
halo0root=# \dn s*
List of schemas
Name | Owner
------+--------
s1 | sbtest
s2 | sbtest
sys | halo
(3 rows)
- 在 s1 下创建表 t1,在 s2 下创建表 t2
CREATE TABLE s1.t1 ( id int, name varchar(20));
CREATE TABLE s2.t2 ( id int, name varchar(20));
查验:
halo0root=# SET SEARCH_PATH TO s1, s2;
SET
halo0root=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+-------
mysql | dual | view | halo
mysql | proc | view | halo
mysql | proc_type | table | halo
mysql | user | table | halo
s1 | t1 | table | halo
s2 | t2 | table | halo
(6 rows)
- 使用 mysql 客户端连接 halo,并分别对表 t1, t2 写入数据
insert s1.t1 select 1, 't1';
insert s2.t2 select 1, 't2';
查验:
mysql> select * from s1.t1;
+----+------+
| id | name |
+----+------+
| 1 | t1 |
+----+------+
1 row in set (0.00 sec)
mysql> select * from s2.t2;
+----+------+
| id | name |
+----+------+
| 1 | t2 |
+----+------+
1 row in set (0.00 sec)
- 执行跨库查询语句
当前连接的是 s1 库,关联查询 s2 库中的表
mysql> select * from t1 join s2.t2 t2 where t1.id = t2.id;
+----+------+----+------+
| id | name | id | name |
+----+------+----+------+
| 1 | t1 | 1 | t2 |
+----+------+----+------+
1 row in set (0.00 sec)
总结
到此,我们介绍了如何开启 HaloDB 的 MySQL 兼容模式,并做了一些基础功能验证。
如果你也对这款“光环”数据库感兴趣,欢迎转发、留言。
🌻 往期精彩 ▼
- 哈喽,国产数据库!Halo DB!
- 从 PG 技术峰会南京站汲取的那些干货
- PG 扩展推荐:pgpasswd & PG 密碼長度
- 即将告别PG 12,建议升级到PG 16.3版本
- PG Style! 盘点几个常用的 Postgres 环境变量
- 后 EL 7 时代,PG 16 如何在 CentOS 7 上运行
– / END / –
如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)