GreatSQL 8.0.32-27 GA (2025-3-10)

https://www.518cn.com   发布时间:2025-03-18 22:40   作者:网络
摘要:GreatSQL 8.0.32-27 GA (2025-3-10) 版本信息 发布时间:2025年3月10日 版本号:8.0.32-27, Revision aa66a385910 下载链接:https://gitee.com/GreatSQL/GreatSQL/releases/tag/Great

GreatSQL 8.0.32-27 GA (2025-3-10)

版本信息

  • 发布时间:2025年3月10日

  • 版本号:8.0.32-27, Revision aa66a385910

  • 下载链接:https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.32-27

  • 用户手册:https://greatsql.cn/docs/8.0.32-27/

改进提升

在GreatSQL 8.0.32-27版本中新增高性能并行查询引擎Turbo,升级Rapid引擎内核版本,优化MGR大事务压缩传输机制,完善greatdb_ha plugin,InnoDB Page支持Zstd压缩,完善Oracle兼容特性,完善安全性等,并修复了几个可能导致crash或丢数据的bug。

高可用

  • 优化了MGR大事务传输时压缩超过限制的处理机制。

在MGR中有大事务超过group_replication_compression_threshold阈值时会进行LZ4压缩,但由于LZ4自身限制,可能导致压缩失败报错,事务执行失败,报告类似下面的错误

[GCS] Gcs_packet's payload is too big. Only packets smaller than 2113929216 bytes can be compressed. Payload size is 2197817290

GreatSQL对此机制进行调整优化,实现以下两点目标:

  1. 当事务大小超过group_replication_compression_threshold阈值则启动压缩。

  2. 但当事务大小超过LZ4压缩限制时不再报错,改成继续使用原始未压缩的事务数据进行传输,即类似设置group_replication_compression_threshold=0(不启用压缩)时的效果。

  • 新增状态变量Rpl_data_speed显示当前Binlog限速的状态,可以通过执行SHOW GLOBAL STATUS LIKE 'Rpl_data_speed'查看,例如
greatsql> SHOW GLOBAL STATUS LIKE 'Rpl%spee%';
 ---------------- ------------------ 
| Variable_name  | Value            |
 ---------------- ------------------ 
| Rpl_data_speed | async_rpl=100.00 |
 ---------------- ------------------ 

表示当前的Binlog读取限速为100KB/s,更多详细用法请参考:Binlog 读取限速 https://greatsql.cn/docs/8.0.32-27/5-enhance/5-2-ha-binlog-speed-limit.html

  • 在greatdb_ha plugin中,增加对参数greatdb_ha_port相应的TCP端口进行防御,避免用户端发送非法指令后可能导致crash的风险。
  • 修复了启用greatdb_ha plugin时,可能因为Linux系统函数FD_SET中当遇到文件描述符超过1024时导致未定义行为而引发crash的问题。
  • 修复了greatdb_ha plugin中启用VIP功能后,可能存在内存泄漏风险的问题。
  • 修复了在主备两套MGR集群间部署主从复制后,当备用集群主节点意外宕机时,可能无法退出进程的问题。
  • 修复了在主备两套MGR集群间部署主从复制后,当备用集群主节点执行kill -19操作杀掉mysqld进程,在故障恢复后,Slave节点上的sql_thread线程可能长时间未能退出的问题。

高性能

  • 新增高性能并行查询引擎Turbo,它通过内嵌DuckDB,使GreatSQL具备多线程并发的向量化查询功能,在实现指数级提升加速SQL查询速度的同时,保持对GreatSQL生态系统的兼容性。相较于Rapid引擎,Turbo引擎不需要将数据加载到引擎中,而是在查询过程中,直接并行抽取数据供Turbo引擎使用。

首先安装Turbo引擎

greatsql> INSTALL PLUGIN turbo SONAME 'turbo.so';

就可以直接利用Turbo引擎大幅提升SQL查询效率

greatsql> SELECT /*  SET_VAR(turbo_enable=ON) SET_VAR(turbo_cost_threshold=0)*/ * FROM t1;

关于Turbo引擎更详细的使用方法请参考:Turbo引擎 https://greatsql.cn/docs/8.0.32-27/5-enhance/5-1-highperf-turbo-engine.html

  • 升级Rapid引擎内核到正式GA版本,新版本在存储格式稳定性、查询语义一致性等方面的重大突破,为用户提供了强有力的稳定性保证。注意,在新版本中采用新的文件存储格式,和之前的版本不兼容,因此无法从GreatSQL 8.0.32-25或8.0.32-26版本直接平滑升级到GreatSQL 8.0.32-27,需要先删除旧的Rapid引擎数据文件,再次执行全量导入数据,重新启动增量导入任务。详细升级方式请见下方:升级到 GreatSQL 8.0.32-27。
  • 在新版本的Rapid引擎中,最大可使用并行逻辑CPU核数上限为4个,如果需要获得更高并发性能,可以联系我们提供解决方案。
  • 修复了Rapid引擎中一次性删除大批量数据后,查看增量导入任务进度时,DELAY字段显示不准确的问题。
  • 修复了在存储过程中使用EXPLAIN查看Rapid表执行计划时,显示无法使用Rapid引擎实际上却可以使用的错误问题。
  • 修复Rapid引擎中未先完成一次全量导入任务,而是直接启动增量导入任务发生失败报错后,重启实例后无法正常启动的问题。正常地,正确的做法是先完成一次全量导入后,再启动增量导入任务。
  • 修复Rapid引擎参数rapid_worker_threads设置问题。当将其设置超过最大值后,再重新设置除默认值之外的其他合法值都会报错,需要重新装载Rapid引擎或重启数据库后才恢复正常。
  • 移除Rapid引擎参数rapid_hash_table_memory_limit,不再使用。
  • 读取Rapid表数据时,error log中不再打印类似下方的冗余信息。
[Note] [MY-011825] [InnoDB] thread 62 handle range count: 34 total rows: 2449266
[Note] [MY-011825] [InnoDB] thread 63 handle range count: 21 total rows: 1648443
[Note] [MY-011825] [InnoDB] total fetch rows count: 150000000
  • 修复Rapid引擎对表中存在虚拟列时的处理方案。在以前,当表中存在虚拟列时,执行ALTER TABLE ... SECONDARY_LOAD不会报错,但在执行SELECT ... /* SET_VAR(use_secondary_engine=FORCED) */ 时会报错不支持。在新版本中,当发现表中存在虚拟列时,执行ALTER TABLE ... SECONDARY_LOAD直接报告下面的错误表示不支持:
ERROR 3106 (HY000): 'Rapid engine' is not supported for generated columns.
  • 在使用Rapid引擎时,如果出现不支持的数据类型,返回的错误提示中增加更明确的错误,如下例所示
greatsql> CREATE TABLE t1 (
  id int unsigned not null primary key,
  c1 int unsigned not null,
  c2 decimal(65,30) DEFAULT NULL
) SECONDARY_ENGINE=rapid;
Query OK, 0 rows affected (0.02 sec)

-- 下面的报错信息中,明确提示 c2 列的数据类型不支持
greatsql> ALTER TABLE t1 SECONDARY_LOAD;
ERROR 3877 (HY000): The field c2 type is not supported

高兼容

  • TO_DATE 函数中新增支持INTERVAL 'n' DAY运算用法。例如
greatsql> SELECT TO_DATE('20250212','YYYYMMDD')   (INTERVAL '-1' DAY) AS LASTDAY FROM DUAL;
 --------------------- 
| LASTDAY             |
 --------------------- 
| 2025-02-11 00:00:00 |
 --------------------- 
  • 优化TO_NUMBER函数在大数据量时的执行效率,性能可提升数倍。
  • 修复了REF CURSOR在执行过程中表结构发生变化时可能导致报错的问题。
  • 优化动态游标内存管理机制,在动态游标END LOOP执行完后及时释放内存。
  • 修复了当源表为单行伪表时,MERGE INTO语句更新目标表失败,导致执行结果和在Oracle中不一致的问题。

高安全

  • 修复最后登录信息功能中由于未处理Binlog可能导致主从异常问题。
  • 修复审计日志入表功能中由于未处理Binlog可能导致主从异常问题。
  • 修复了审计日志入表功能中,安装和卸载SQL脚本中前后函数名不一致问题。
  • 修复了在设置sql_log_bin=ON的时候,本应该禁止修改审计日志表sys_audit.audit_log,却可以更新修改的问题。

其他

  • InnoDB Page压缩算法支持Zstd, 使得Page压缩率进一步得到提高,尤其是当表中有大量重复字符类型数据时。可以在创建新表时指定Page压缩算法,例如
greatsql> CREATE TABLE `t1_zstd` (
  `id` int NOT NULL,
  `c1` varchar(20) NOT NULL,
  `c2` varchar(30) NOT NULL,
  `c3` datetime NOT NULL,
  `c4` varchar(30) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_c3` (`c3`)
) ENGINE=InnoDB COMPRESSION='zstd';

也可以执行ALTER TABLE修改表的Page压缩算法,例如

greatsql> ALTER TABLE t1 COMPRESSION='zstd';

更多关于InnoDB Page压缩的使用方法请参考:InnoDB Page压缩 https://greatsql.cn/docs/8.0.32-27/5-enhance/5-5-innodb-page-compression.html

缺陷修复

  • 修复了特定情况下,执行EXPLAIN FORMAT=TREE可能导致crash的问题

    • 详见:Issue#IAL5KK https://gitee.com/GreatSQL/GreatSQL/issues/IAL5KK
  • 合并了MySQL 8.0.38中的bug fix,对应bug id:

    • 36204344:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-38.html

    • 36356279:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-38.html

  • 合并了针对特定情况下执行ALTER TABLE可能导致丢失一行数据的问题,合并了Percona团队提交的bug fix,对应的bug id:

    • 113812 https://bugs.mysql.com/bug.php?id=113812

    • 115511 https://bugs.mysql.com/bug.php?id=115511

    • 115608 https://bugs.mysql.com/bug.php?id=115608

注意事项

升级/降级到 GreatSQL 8.0.32-27

升级到 GreatSQL 8.0.32-27

  • 如果旧版本是GreatSQL 8.0.32-25或8.0.32-26,并且没有使用Rapid引擎,则可以直接在原来的datadir基础上,修改basedir后,原地(in-place)启动 GreatSQL 8.0.32-27 后会完成自动升级。
  • 如果旧版本是 GreatSQL 8.0.32-25或8.0.32-26,并且已启用Rapid引擎,这种情况下无法原地升级,需要卸载所有Rapid引擎表,删除Rapid数据文件,之后才可以直接在原来的datadir基础上,修改basedir后,原地(in-place)启动GreatSQL 8.0.32-27后会完成自动升级。新版本实例启动后,对所有Rapid引擎表执行ALTER TABLE SECONDARY_LOAD完成全量数据导入,再执行SELECT START_SECONDARY_ENGINE_INCREMENT_LOAD_TASK()启动增量导入任务,完成Rapid引擎表升级工作。下面是一个升级参考过程:
  1. 查询并记录所有Rapid引擎表

可以执行下面的SQL,查询当前有哪些表使用了Rapid引擎:

greatsql> SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE CREATE_OPTIONS LIKE '%Rapid%';
 -------------- ---------------- ------------ 
| TABLE_SCHEMA | TABLE_NAME     | TABLE_ROWS |
 -------------- ---------------- ------------ 
| tpch100g     | customer       |   14854987 |
| tpch100g     | lineitem       |  582868392 |
| tpch100g     | nation         |         25 |
| tpch100g     | orders         |  148492582 |
| tpch100g     | part           |   19943155 |
| tpch100g     | partsupp       |   79832625 |
| tpch100g     | region         |          5 |
| tpch100g     | supplier       |     989416 |
 -------------- ---------------- ------------ 
  1. 正常停止GreatSQL实例进程

在停止GreatSQL实例进程前,先修改innodb_fast_shutdown=0后再执行SHUTDOWN停止实例

greatsql> SET GLOBAL innodb_fast_shutdown=0;
greatsql> SHUTDOWN;
  1. 删除旧的Rapid引擎数据文件
cd /data/GreatSQL && rm -f duckdb*
  1. 修改my.cnf配置文件中的basedir参数,指向GreatSQL 8.0.32-27新版本
#my.cnf
[mysqld]
basedir=/usr/local/GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64

并确保参数upgrade不是设置为NONE

  1. 启动GreatSQL 8.0.32-27新版本实例
systemctl start greatsql
  1. 重新安装Rapid引擎
greatsql> INSTALL PLUGIN rapid SONAME 'ha_rapid.so';
  1. 对Rapid引擎表做一次全量数据导入
greatsql> ALTER TABLE test.t1 SECONDARY_LOAD;

小贴士:由于在升级前没有去掉该表的SECONDARY_ENGINE=rapid属性,所以无需重新设置。如果在升级前卸载所有Rapid引擎表,则需要重新设置。

  1. 再次启动增量导入任务
greatsql> SELECT START_SECONDARY_ENGINE_INCREMENT_LOAD_TASK('test', 't1');

这就完成Rapid引擎表的升级操作了。

  • 如果旧版本是GreatSQL 8.0.32-24、8.0.25-*、5.7.36-39等系列版本,则可以直接在原来的datadir基础上,修改basedir后,原地(in-place)启动GreatSQL 8.0.32-27 后会完成自动升级。
  • 如果是MySQL 8.0.(<= 8.0.32 版本)、Percona Server 8.0.(<= 8.0.32 版本)等系列版本,则可以直接在原来的datadir基础上,修改basedir后,原地(in-place)启动 GreatSQL 8.0.32-27后会完成自动升级。
  • 如果是MySQL 8.0.(> 8.0.32 版本)、Percona Server 8.0.(> 8.0.32 版本)等系列版本,则需要利用逻辑备份方式导出数据,再导入的方式完成升级,不支持原地(in-place)升级到 GreatSQL 8.0.32-27。
  • 如果是MySQL 5.7.(>= 5.7.23 版本)、Percona Server 5.7.(<= 5.7.23 版本)等系列版本,则可以直接在原来的datadir基础上,修改basedir后,原地(in-place)启动 GreatSQL 8.0.32-27后会完成自动升级。

在以上几个原地升级场景中,务必保证my.cnf中参数upgrade不能设置为NONE,可以设置为默认的AUTOFORCE。例如:

#my.cnf
[mysqld]
upgrade = AUTO

更多迁移升级方案请参考:迁移升级 https://greatsql.cn/docs/8.0.32-27/7-migrate-and-upgrade/0-migrate-and-upgrade.html

降级到 GreatSQL 8.0.32-27

如果是要从 MySQL/Percona 8.0.32 之后的版本降级到 GreatSQL 8.0.32-27 版本,则需要采取逻辑备份 逻辑导入方式完成降级操作,并且在逻辑备份导入完成后的首次重启时,务必设置 upgrade = FORCE 强制升级所有数据表,包括系统表。

降级过程操作大致如下所示:

  1. 在高版本中逻辑备份全量数据
mysqldump -S/data/MySQL/mysql.sock -A --triggers --routines --events --single-transaction > /data/backup/fulldump.sql
  1. 在GreatSQL 8.0.32-27版本环境中导入逻辑备份文件,完成逻辑恢复
mysql -S/data/GreatSQL/mysql.sock -f < /data/backup/fulldump.sql
  1. 修改my.cnf,确保设置upgrade=FORCE
#my.cnf
[mysqld]
upgrade = FORCE
  1. 重启GreatSQL,降级完成
systemctl restart greatsql

重启过程中,可以看到日志有类似下面的强制升级过程

[Note] [MY-013387] [Server] Upgrading system table data.
[Note] [MY-013385] [Server] Upgrading the sys schema.
[Note] [MY-013400] [Server] Upgrade of help tables started.
[Note] [MY-013400] [Server] Upgrade of help tables completed.
[Note] [MY-013394] [Server] Checking 'mysql' schema.
[Note] [MY-013394] [Server] Checking 'sys' schema.
[System] [MY-013381] [Server] Server upgrade from '80032' to '80032' completed.

如果不设置 upgrade = FORCE 强制升级所有表,有可能发生系统表 mysql.procs_priv 损坏错误,在创建用户时可能会报告类似下面的错误:

greatsql> create user tpch identified by 'tpch';
ERROR 1728 (HY000): Cannot load from mysql.procs_priv. The table is probably corrupted

GreatSQL vs MySQL

1.主要特性 GreatSQL 8.0.32-27 MySQL 8.0.32
开源
ACID 完整性
MVCC 特性
支持行锁
Crash 自动修复
表分区(Partitioning)
视图(Views)
子查询(Subqueries)
触发器(Triggers)
存储程序(Stored Programs)
外键(Foreign Keys)
窗口函数(Window Functions)
通用表表达式 CTE
地理信息(GIS)
基于 GTID 的复制
组复制(MGR)
MyRocks 引擎
支持龙芯架构
2. 性能提升扩展 GreatSQL 8.0.32-27 MySQL 8.0.32
Rapid 引擎 仅云上HeatWave
Turbo 引擎
NUMA 亲和性优化
非阻塞式 DDL
无主键表导入优化
InnoDB 并行查询 仅主键扫描
并行 LOAD DATA
InnoDB 事务 ReadView 无锁优化
InnoDB 事务大锁拆分优化
InnoDB Page压缩支持Zstd
InnoDB 资源组
自定义 InnoDB 页大小
Contention-Aware Transaction Scheduling
InnoDB Mutexes 拆分优化
MEMORY 引擎优化
InnoDB Flushing 优化
并行 Doublewrite Buffer
InnoDB 快速索引创建优化
VARCHAR/BLOB/JSON 类型存储单列压缩
数据字典中存储单列压缩信息
3. 面向开发者提升改进 GreatSQL 8.0.32-27 MySQL 8.0.32
X API
JSON
NoSQL Socket-Level接口
InnoDB 全文搜索改进
更多 Hash/Digest 函数
Oracle 兼容-数据类型
Oracle 兼容-函数
Oracle 兼容-SQL语法
Oracle 兼容-存储程序
4. 基础特性提升改进 GreatSQL 8.0.32-27 MySQL 8.0.32
MGR 提升-地理标签
MGR 提升-仲裁节点
MGR 提升-读写节点绑定VIP
MGR 提升-快速单主模式
MGR 提升-智能选主机制
MGR 提升-全新流控算法
MGR 提升-网络分区异常处理
MGR 提升-节点异常退出处理
MGR 提升-节点磁盘满处理
MGR 提升-自动选择 donor 节点
MGR 提升-大事务压缩优化
Clone 增量备份
Clone 备份压缩
Binlog 读取限速
information_schema 表数量 95 65
全局性能和状态指标 853 434
优化器直方图(Histograms)
Per-Table 性能指标
Per-Index 性能指标
Per-User 性能指标
Per-Client 性能指标
Per-Thread 性能指标
全局查询相应耗时统计
SHOW INNODB ENGINE STATUS 增强
回滚段信息增强
临时表信息增强
用户统计信息增强
Slow log 信息增强
5.安全性提升 GreatSQL 8.0.32-27 MySQL 8.0.32
国密支持
备份加密
审计 仅企业版
数据脱敏
最后登录记录
SQL Roles
SHA-2 密码Hashing
密码轮换策略
PAM 认证插件 仅企业版
Keyring 存储在文件中
Keyring 存储在Hashicorp Vault中 仅企业版
InnoDB 数据加密
InnoDB 日志加密
InnoDB 各种表空间文件加密
二进制日志加密
临时文件加密
强制加密
6. 运维便利性提升 GreatSQL 8.0.32-27 MySQL 8.0.32
DDL 原子性
数据字典存储 InnoDB 表
快速 DDL
SET PERSIST
不可见索引
线程池(Threadpool) 仅企业版
备份锁
SHOW GRANTS 扩展
表损坏动作扩展
杀掉不活跃事务
START TRANSACTION WITH CONSISTENT SNAPSHOT 扩展

GreatSQL 8.0.32-27 基于 Percona Server for MySQL 8.0.32 版本,它在 MySQL 8.0.32 基础上做了大量的改进和提升以及众多新特性,详情请见:Percona Server for MySQL feature comparison,这其中包括线程池、审计、数据脱敏等 MySQL 企业版才有的特性,以及 performance_schema 提升、information_schema 提升、性能和可扩展性提升、用户统计增强、PROCESSLIST 增强、Slow Log 增强等大量改进和提升,这里不一一重复列出。

GreatSQL Release Notes

GreatSQL 8.0

  • Changes in GreatSQL 8.0.32-26 (2024-08-05)
  • Changes in GreatSQL 8.0.32-25 (2023-12-28)
  • Changes in GreatSQL 8.0.32-24 (2023-6-5)
  • Changes in GreatSQL 8.0.25-17 (2023-3-13)
  • Changes in GreatSQL 8.0.25-16 (2022-5-16)
  • Changes in GreatSQL 8.0.25-15 (2021-8-26)

GreatSQL 5.7

  • Changes in GreatSQL 5.7.36-39 (2022-4-7)

相关文章

最新评论