MariaDB 10.1.1:Galera 支持

MariaDB 10.1 服务器现在通过最新的 10.1.1 版本“Galera ready”了。它包含 wsrep(写集复制)补丁,使服务器能够加载 wsrep 提供程序 (galera) 库并与之交互,以提供多主同步复制支持。该补丁在服务器和存储引擎内部实现了钩子,用于在集群中的发送节点和接收节点上分别填充和应用写集。wsrep 补丁还添加了一些系统和状态变量(以 wsrep 为前缀),可用于配置和监控作为 Galera 集群节点运行的服务器。

MariaDB 10.1.1:RBR 的触发器

有时候用户提出的要求初看之下似乎毫无意义。但当你开始深入询问时,你会意识到用户是对的,你是错的,而且这实际上是一个完全合乎逻辑且有效的用例。

我曾有过这样的时刻,当时我听到一个请求,希望在基于行的复制(RBR)中让触发器在从库上工作。真的吗?在 RBR 中,触发器所做的所有更改都以行事件的形式从主库复制到从库。如果触发器在从库上再次触发,它们会进行两次更改。而且,假设从库上只有触发器(为什么?),在基于语句的复制中,触发器会在从库上正常运行,不是吗?…

MariaDB 10.1.1:engine_condition_pushdown 标志已弃用

让我先讲一个小故事。你坐在客厅壁炉旁的家里,需要图书馆里的一本书……呃,不,对不起,时代错了。你在建造一个机械臂,它可以帮你打开啤酒或冲咖啡,或为你提供任何你选择的其他饮料……同时你还在建造下一个机械臂。所以,你一只手拿着电烙铁,另一只手拿着 Arduino,让你小弟弟从地窖里拿来一盒特定的电阻器(你突然用完了)。问题是——你弟弟太小了,分不清电阻器和防毒面具。…

MariaDB 10.1.1:系统变量及其元数据

我认为如果我说 MariaDB 或 MySQL 服务器知道的系统变量信息远不止它们的值,应该不会有人感到惊讶。确实,每个变量可以是会话或全局变量,只读或可写,它有相关的帮助文本(在 mysqld –help –verbose 中打印),某些变量只接受来自给定字符串集合的值(自 MariaDB 10.1.0 起,此允许值集合也在 mysqld –help –verbose 中打印),数值变量有有效值的上下范围边界(这些边界从未在任何地方打印),等等。我一直认为没有办法查询这些信息有点浪费。…

MariaDB 10.1.1:清理 InnoDB 表空间中未使用的空间

引言

例如,当你删除行时,这些行只是被标记为已删除,并未真正从索引中物理删除,产生的空闲空间也不会返回给操作系统以便后续重用。清除线程将物理删除索引键和行,但产生的空闲空间仍然不会返回给操作系统,并且此操作可能导致页上出现空洞。如果你的行是变长行,这可能导致空闲空间无法用于新行的情况(如果这些新行比旧行更大)。用户可以使用OPTIMIZE TABLE 或 ALTER TABLE <table> …

MariaDB 10.1.1:监控 InnoDB 在线 DDL 的进度和临时内存使用情况

引言

在线 DDL 是 MariaDB 10.0 中的新功能。在线 DDL 按以下 4 个任务顺序处理。

  1. InnoDB::ha_prepare_inplace_alter_table(..)
  2. InnoDB::ha_inplace_alter_table(..)
  3. InnoDB::ha_commit_inplace_alter_table(..)
  4. mysql_rename_table(..)

InnoDB 存储引擎在阶段 1 为事务日志分配临时内存缓冲区,在此阶段的行更改会被记录。此缓冲区的大小最初是 sort_buffer_size,并且可以增长到 innodb_online_alter_log_max 大小。在阶段 2 中,处理 ALTER 语句的线程会将旧表的行复制到新更改的表中。之后 MariaDB 将对目标表施加独占锁,并将行日志缓冲区应用到新更改的表中。…

MariaDB 10.1.1:插件的 FLUSH 和 SHOW

在 MariaDB 和 MySQL 中最流行的插件类型之一是 INFORMATION_SCHEMA 插件类型。INFORMATION_SCHEMA 插件向 INFORMATION_SCHEMA 添加新表。有很多 INFORMATION_SCHEMA 插件,因为它们可以用来向用户显示任何东西,并且非常易于编写。

MariaDB 10.1.1 带有九个 INFORMATION_SCHEMA 插件

  • Feedback — 显示匿名的服务器使用信息,并可选择将其发送到配置的 URL。
  • Locales — 列出编译到服务器中的区域设置,由 Roberto Spadim 实现
  • METADATA_LOCK_INFO — 列出服务器中的元数据锁。

MariaDB 10.1.1:复合语句

有时候需要有条件地执行某些 SQL 语句。如果你从你的 PHP(或 Java 或其他任何)应用程序中执行,这很简单。但是如果只有纯 SQL 呢?MariaDB 和 MySQL 在 mysql_fix_privilege_tables.sql 脚本(由 mysql_upgrade 工具应用)中使用了两种技术。

  1. 创建一个包含 IF 语句的存储过程,调用一次然后删除它。这要求用户拥有 CREATE ROUTINE 权限,并且 mysql.proc 表必须存在且可用(这并非必然——我们是从 mysql_upgrade 执行的,对吧?)。
  2. 使用动态 SQL,例如
    SET @str = IF (@have_csv = ‘YES’,
    ‘CREATE TABLE IF NOT EXISTS general_log (
    event_time TIMESTAMP(6) NOT NULL,
    user_host MEDIUMTEXT NOT NULL,
    thread_id BIGINT(21) UNSIGNED NOT NULL,
    server_id INTEGER UNSIGNED NOT NULL,
    command_type VARCHAR(64) NOT NULL,
    argument MEDIUMTEXT NOT NULL
    ) engine=CSV CHARACTER SET utf8 comment="通用日志"‘,
    ‘SET @dummy = 0’);