数据库内核月报 - 2017 / 06

MySQL · 社区新闻 · MariaDB 10.2 GA

简介

2017-5-23,MariaDB终于GA了,我们贡献的Flashback也作为正式功能发布了。当然还存在几个Bug,不过截止本文发稿之前已经提交了Fix,目前Flashback没有发现新的Bug。阿里云上我们也即将公开我们的Flashback用户接口。
MariaDB 10.2 将成为目前主要的稳定版本,然后官方承诺支持到2022年5月。

我们就来看下10.2发布了哪些新的特性和功能:

  • InnoDB 成为了默认引擎
    直到10.1版本,MariaDB还是以XtraDB作为默认引擎。考虑到截止10.2发布之前,MariaDB认为XtraDB还不足够稳定,因此不再作为默认引擎(当然开源社区也是有江湖的。。。。)。官方还写了一篇文章专门阐述为啥要用InnoDB而不用XtraDB了:https://mariadb.com/kb/en/mariadb/why-does-mariadb-102-use-innodb-instead-of-xtradb/

  • 语法和通用功能
    • MyRocks成为了可用引擎,然而还是Alpha版,只能尝尝鲜 (MDEV-9658)。
    • Window functions(窗口函数)已经可以使用了。
    • 增加了 SHOW CREATE USER 语法可以看创建用户的语句
    • 新的 CREATE USER 选项,支持资源限制(例如每小时的最大语句执行量,每小时最大更新量之类的)和TLS/SSL
    • 新的 ALTER USER 语法支持修改资源限制。
    • Recursive Common Table Expressions (MDEV-9864),可以利用CTE写复杂的分析语句了。
    • 支持 WITH 语句。 WITH 是CTE的一个语法,允许用户在一个查询中多次引用一个子查询表达式(MDEV-8308 & MDEV-9864) — 来自于 Galina Shalygina 的贡献
    • 支持 CHECK CONSTRAINT 语法 (MDEV-7563)
    • 支持表达式的默认值,之前MySQL字段默认值只能是常量或者时间戳,现在可以写各种表达式来计算默认值了 (MDEV-10134)
    • BLOB 和TEXT 字段支持默认值了。
    • 为虚拟计算列加了很多约束过滤条件,细节可以参照 https://mariadb.com/kb/en/mariadb/virtual-computed-columns/
    • DECIMAL 字段支持的精度从30位增加到了38位,兼容Oracle (MDEV-10138)。
    • List分区方式增加了一个DEFAULT选项,可以把没有匹配到的值全部塞到DEFAULT分区 (MDEV-8348)
    • Oracle风格的 EXECUTE IMMEDIATE 语句 (MDEV-10585)
    • PREPARE 目前能解析大部分表达式了,比如 PREPARE stmt FROM CONCAT(‘SELECT * FROM ‘, table_name); (MDEV-10866)
    • InnoDB 也能支持空间索引了!
    • 增加 ed25519 验证插件 (MDEV-12160)
    • 更友好的InnoDB崩溃恢复过程报告,之前信息实在是太多,做了简化 (MDEV-11027)
    • 优化了InnoDB启动和关闭过程代码流程。
    • 为 Windows, CentOS, RHEL, Fedora 发行版的包增加了AWS Key Management插件。
    • 原子写除了能支持FusionIO,也能自动识别宝存的SSD卡了。
  • 不向下兼容的改动
    • TokuDB从默认编译中剔除了,现在作为一个独立的引擎包 mariadb-plugin-tokudb,需要自行安装,默认是没有的
    • SQL_MODE 变化了;特别是,没有默认值的 NOT NULL 字段在插入时如果没有带一个值,不会再提供一个伪造的值进去了,直接报错。
    • 从老版本的MySQL服务器复制到MariaDB需要设置binlog_checksum为NONE,因为不兼容。
    • 新的保留字: RECURSIVE 和 ROWS。
  • 触发器
    • 同一个时间可以创建多个触发器了,这点跟Oracle一样了,之前每张表每种触发事件只能创建一个触发器 (MDEV-6112)。
    • CREATE TRIGGER 语句增加了 FOLLOWS/PRECEDES 子句,用以表示当前的触发器跟同类型的触发器执行顺序谁先谁后。
    • 触发器的执行都被计入了 Executed_triggers 状态变量 (MDEV-10915)
    • SHOW TRIGGERS and SHOW CREATE TRIGGER now include the date and time the trigger was created
  • 复制和Binlog
    • 支持DML闪回的Flashback工具已经可以用了(MDEV-10570) – 这就是我贡献的代码了。
    • 新变量 read_binlog_speed_limit 可以用以限制Slave从出库读取Binlog的速度 (MDEV-11064) — 这是腾讯互娱DBA团队的贡献。
    • 支持延迟复制,备库可以强制比主库延迟一段时间 (MDEV-7145)。
    • 提供Binlog中的Event压缩功能 (MDEV-11065) – 也是腾讯互娱DBA团队的贡献。
    • 默认Binlog格式修改为MIXED (MDEV-7635)。
    • replicate_annotate_row_events 默认值改为 ON (MDEV-7635)。
    • slave_net_timeout 默认值减小到 60 秒 (MDEV-7635)。
    • 默认 server_id 从0 修改为 1。
  • GeoJSON / JSON
    • JSON 函数支持(MDEV-9143)
    • 实现了ST_AsGeoJSON 和 ST_GeomFromGeoJSON 函数,因此空间特性可以用GeoJSON 格式导入导出(MDEV-11042)
  • Information Schema
    • 增加了一个插件可以报告所有用户的变量值,在 USER_VARIABLES 表中 (MDEV-7331)。之前经常会遇到问题就是客户说他的变量值不对,我们却无法验证,这个功能很好的解决了这个问题。
  • EXPLAIN
    • EXPLAIN FORMAT=JSON 现在会在 outer_ref_condition 列显示每次循环匹配时SELECT检查的条件 (MDEV-9652)。
    • EXPLAN FORMAT=JSON 现在会在 sort_key 列回显示filesort操作使用的排序规则 (commit 2078392)。
    • EXPLAIN 曾经错误的展示了优化器如何决定ORDER BY子句和DISTINCT操作。这是个长期存在的问题了,包括MySQL本身。在 MDEV-8646 这个Issue中解决了这个问题(MDEV-7982, MDEV-8857, MDEV-7885, MDEV-326中有Test Case)。
  • 优化点
    • 设置连接更快了,因为把THD创建的工作挪到了新创建的线程中,之前是管理所有连接的那个线程来统一创建THD (MDEV-6150)。
    • 条件下推到non-mergeable的视图和子表中 (MDEV-9197) — 还是 Galina Shalygina 贡献的代码
    • ANALYZE TABLE 的代码重构了,在收集引擎无关的统计信息时并不需要锁住整个表 (MDEV-7901)。
    • 内部 CRC32 函数在Power8下使用了优化过的实现 — MDEV-9872。
    • Table cache 可以自动分区来减少冲突 (MDEV-10296)。
  • 兼容性
    • NO PAD的校对字符集,就是说,在比较字符串时,不会再启动处理掉末尾的空格 (MDEV-9711) — 这是 Daniil Medvedev 贡献的代码。
    • MariaDB 目前可以用于启动高于 MySQL 5.7.6 版本的数据文件目录 (MDEV-11170)。
  • CONNECT引擎
    • CONNECT引擎支持ZIP压缩文件的表 (MDEV-11295)。
    • CONNECT引擎目前支持JDBC表类型 (MDEV-9765)。
  • 系统变量
    变量的改动如下:
    • 可以关闭死锁检测新变量 innodb_deadlock_detect,这个也是阿里提供的思路,淘宝很早就在使用这个功能。
    • aria_recover 重命名为 aria_recover_options (MDEV-8542)。
    • aria_recover 和 myisam_recover_options 的默认值修改为 BACKUP,QUICK。
    • 服务器版本可以随便伪造一个字串,因为有的应用会检查版本号 (MDEV-7780),我们也遇到过这种问题,一样的思路。
    • slave_parallel_workers 目前作为 slave_parallel_threads 的同义变量。
    • 新状态变量 com_alter_user, com_multi and com_show_create_user。
    • 新变量 innodb_tmpdir 可以设置一个目录来存储InnoDB临时表文件。
    • 新变量 read_binlog_speed_limit permits 可以限制Slave读取Binlog的速度 (MDEV-11064)。
    • innodb_log_files_in_group 目前可以设置为1 (MDEV-12061).
    • 线程池现在可以给有活跃事务的连接更高的优先级。这可以通过新的 thread_pool_prio_kickup_timer 和 thread_pool_priority 变量来控制 (MDEV-10297)。
    • group_concat_max_len 的默认值改为 1M (MDEV-7635)。
    • sql_mode 默认值改为STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION (MDEV-7635) (MariaDB 10.2.4 开始)。
    • innodb_compression_algorithm 默认值改为 zlib - 但是这并不意味着页面默认就会压缩 (MDEV-11838)。
    • innodb_log_compressed_pages 默认值改为ON (MDEV-7635)。
    • innodb_use_atomic_writes 和innodb_use_trim changed 默认值改为ON。
    • 没用的 innodb_api_* 变量被删除了 (MDEV-12050)。
  • 新的状态变量
    • innodb_have_punch_hole
    • innodb_pages0read
    • innodb_scrub_log
    • innodb_encryption_num_key_requests
  • 脚本
    • mysqlbinlog 增加了连续Binlog备份支持,利用–stop-never变量,可以一直等待新的日志 (MDEV-8713)。
    • mysql_zap 和 mysqlbug 被移除了 (MDEV-7376, MDEV-8654)。
  • 其他改动
    • 添加 OpenSSL 1.1 和 LibreSSL 的支持 (MDEV-10332)。
    • 在InnoDB持久化 AUTO_INCREMENT (MDEV-6076),这是从我们AliSQL中Port的功能。
    • 支持 COM_RESET_CONNECTION (MDEV-10340)。
    • “fast mutexes” 被移除了。因为这玩意并不比普通的mutex快,已经被默认关闭很多年了 (MDEV-8111)。
    • 旧的GPL客户端库已经去掉了,现在MariaDB Server使用了新的LGPL的Connector/C客户端链接库。
    • MariaDB 不再使用 jemalloc 编译。
    • TokuDB 现在是一个独立的引擎包,不再是MariaDb打包的默认组件 (因为TokuDb还需要Jemalloc)。

最新的MariaDB 10.2 GA就是这些改动了,希望对大家有帮助,也希望更多人参与MariaDb的开发,看到更多的人给MariaDB贡献代码!