MariaDB 10.6.5稳定版GA发布于2021年11月8日。
新功能和改进
1)数据字典改进支持原子DDL(atomic DDL)
MariaDB 10.6使用新的数据字典,废弃了MyISAM系统表。MySQL库元信息存储在数据目录中mysql.ibd的innodb表空间文件中。
新的数据字典支持原子DDL(atomic DDL)功能,这意味着,当执行DDL时,数据字典更新、存储引擎操作和二进制日志中的写入被组合成一个要么完全执行、要么不执行的单个原子事务。这提供了更好的可靠性,未完成的DDL不会留下任何不完整的数据。
比如当对大表做alter table modify变更时,kill -9 mysqld进程,在MariaDB 10.6之前的版本会留下临时数据文件(例#sql-22a4_17.ibd),而在MariaDB 10.6版本里将直接回滚掉。
2) select for update增加nowait和skip locked行锁限制
select...for update 语句是业务上经常使用的加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所妨碍。借助for update子句,可以在应用程序层面上实现数据加锁保护操作。
MariaDB 10.6针对于select...for update新增nowait和skip locked行级锁的限制。
1)nowait表示不等待锁,若想获取被锁住的数据,则立即返回不可访问异常。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。
2)skip locked表示跳过等待锁,若想获取被锁住的数据,则不返回该数据。在对数据行进行加锁操作时,如果发现数据行被锁定,就跳过处理。这样for update就只针对未加锁的数据行进行处理加锁。
3)支持Invisible Index隐藏索引
MariaDB 10.6 支持了Invisible Index隐藏索引这个特性,可以把某个索引设置为对优化器不可见,但是引擎内部还是会维护这个索引,并且不可见属性的修改操只改了元数据,所以可以非常快。当我们发现某个索引不需要,想要去掉的话,可以先把索引设置为不可见,观察下业务的反应,如果一切正常,就可以 drop 掉;如果业务有受影响,那么说明这个索引删掉会有问题,就可以快速改回来。所以相对于 DROP/ADD 索引这种比较重的操作,Invisible Index就会显得非常灵活方便。
Invisible Index隐藏索引,另外一个好处是优化器选错索引。
优化器选择错误索引,MariaDB 10.6之前通常采用如下三种方法:
1)采用force index强制走某项索引,但是这可能导致一个问题,以后系统迁移或者索引名变更会导致问题。
2)改写sql语句,让mysql优化器进行再次判断,选择正确的索引。
3)直接删除索引本身,让优化器无法选择该索引。
在MariaDB 10.6版本,语法如下:
ALTER TABLE table_name ALTER {KEY|INDEX} [IF EXISTS] key_name [NOT] IGNORED; |
4)InnoDB 传统行格式COMPRESSED Row Format压缩技术功能废弃
InnoDB提供了两种压缩技术,一种是早期的行格式压缩COMPRESSED Row Format,它是在创建表时指定ROW_FORMAT=COMPRESS,并通过选项 KEY_BLOCK_SIZE 设置压缩比例。另一种是新的页压缩Page Compression,在支持Sparse file(稀疏文件)的EXT4/XFS文件系统上,通过使用Punch Hole(打洞)特性进行压缩。
官方推荐使用页压缩Page Compression,行格式压缩COMPRESSED Row Format废弃。
例,使用行格式压缩COMPRESSED Row Format创建表:
> create table t1(id int auto_increment primary key,name varchar(100)) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; ## 将会报错 ERROR 4047 (HY000): InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE. ## 如果你想继续使用该功能,设置: > set global innodb_read_only_compressed = 0; 即可创建成功。 |
使用Page Compression,从表空间文件中读取压缩页会立即解压缩,Innodb_Buffer_Pool缓冲池中只存储解压缩页。相比之下,使用COMPRESSED Row Format,解压缩页和压缩页都存储在Innodb_Buffer_Pool缓冲池中。这意味着COMPRESSED Row Format占用的内存空间比Page Compression要多。
使用Page Compression,页面在写入表空间文件之前被压缩。相反,使用COMPRESSED Row Format,页面在任何更改后都会立即重新压缩,这意味着COMPRESSED Row Format比Page Compression页面压缩更频繁地压缩数据。
开启Page Compression页面压缩,命令如下:
ALTER TABLE t1 PAGE_COMPRESSED=1; |
使用场景:针对交易流水日志表,可以采用Page Compression页面压缩技术。
5)新增Binlog文件过期清理参数binlog_expire_logs_seconds
使用新的参数binlog_expire_logs_seconds代替expire_logs_seconds,新参数的时间粒度是精确到秒,能够更加灵活的控制Binlog文件过期时间,默认值604800秒(7天)。
6)新增sys Schema
sys库结合了information_schema和performance_schema,现在用视图的方式,把一些优化和诊断信息汇总起来,更加直观,通过新的sys schema机制显著提升易用性。
使用:
1)查询当前锁的阻塞信息和事务的情况
> select * from sys.innodb_lock_waits; |
2)数据库中哪些SQL被频繁执行?
> select db,exec_count,query from sys.statement_analysis order by exec_count desc limit 10; |
3)MySQL自增长字段的最大值和当前已经使用到的值?
> select * from sys.schema_auto_increment_columns; |
4)MySQL有哪些冗余索引和无用索引?
> select * from sys.schema_redundant_indexes; > select * from sys.schema_unused_indexes; |
7)审计日志可去除记录select操作
在之前的版本里,审计日志会记录所有操作。在MariaDB 10.6版本里,记录事件可细分化。
比如我们想追溯某时刻谁误删除了数据这一需求,那么我们可以禁止记录select查询操作。
可通过下面的设置:
> set global server_audit_events = 'QUERY_DDL , QUERY_DML_NO_SELECT'; |
只会记录增删改、DDL操作。
8)TokuDB存储引擎废弃
TokuDB已无人维护,在MariaDB 10.6版本里已将其废弃删除,官方推荐用Facebook的MyRocks存储引擎代替之。
安装使用:
Shell > yum install MariaDB-rocksdb-engine -y MariaDB > INSTALL SONAME 'ha_rocksdb'; MariaDB > CREATE TABLE t1 ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(10) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=ROCKSDB; |
使用场景:针对监控日志表,比如把ZABBIX的监控采集数据表,替换为MyRocks存储引擎。
















