分类档案: 通用
MariaDB 10.1 服务器现在通过最新的 10.1.1 版本“Galera ready”了。它包含 wsrep(写集复制)补丁,使服务器能够加载 wsrep 提供程序 (galera) 库并与之交互,以提供多主同步复制支持。该补丁在服务器和存储引擎内部实现了钩子,用于在集群中的发送节点和接收节点上分别填充和应用写集。wsrep 补丁还添加了一些系统和状态变量(以 wsrep 为前缀),可用于配置和监控作为 Galera 集群节点运行的服务器。
…
有时候用户提出的要求初看之下似乎毫无意义。但当你开始深入询问时,你会意识到用户是对的,你是错的,而且这实际上是一个完全合乎逻辑且有效的用例。
我曾有过这样的时刻,当时我听到一个请求,希望在基于行的复制(RBR)中让触发器在从库上工作。真的吗?在 RBR 中,触发器所做的所有更改都以行事件的形式从主库复制到从库。如果触发器在从库上再次触发,它们会进行两次更改。而且,假设从库上只有触发器(为什么?),在基于语句的复制中,触发器会在从库上正常运行,不是吗?…
让我先讲一个小故事。你坐在客厅壁炉旁的家里,需要图书馆里的一本书……呃,不,对不起,时代错了。你在建造一个机械臂,它可以帮你打开啤酒或冲咖啡,或为你提供任何你选择的其他饮料……同时你还在建造下一个机械臂。所以,你一只手拿着电烙铁,另一只手拿着 Arduino,让你小弟弟从地窖里拿来一盒特定的电阻器(你突然用完了)。问题是——你弟弟太小了,分不清电阻器和防毒面具。…
我认为如果我说 MariaDB 或 MySQL 服务器知道的系统变量信息远不止它们的值,应该不会有人感到惊讶。确实,每个变量可以是会话或全局变量,只读或可写,它有相关的帮助文本(在 mysqld –help –verbose 中打印),某些变量只接受来自给定字符串集合的值(自 MariaDB 10.1.0 起,此允许值集合也在 mysqld –help –verbose 中打印),数值变量有有效值的上下范围边界(这些边界从未在任何地方打印),等等。我一直认为没有办法查询这些信息有点浪费。…
引言
例如,当你删除行时,这些行只是被标记为已删除,并未真正从索引中物理删除,产生的空闲空间也不会返回给操作系统以便后续重用。清除线程将物理删除索引键和行,但产生的空闲空间仍然不会返回给操作系统,并且此操作可能导致页上出现空洞。如果你的行是变长行,这可能导致空闲空间无法用于新行的情况(如果这些新行比旧行更大)。用户可以使用OPTIMIZE TABLE 或 ALTER TABLE <table> …
引言
在线 DDL 是 MariaDB 10.0 中的新功能。在线 DDL 按以下 4 个任务顺序处理。
- InnoDB::ha_prepare_inplace_alter_table(..)
- InnoDB::ha_inplace_alter_table(..)
- InnoDB::ha_commit_inplace_alter_table(..)
- mysql_rename_table(..)
InnoDB 存储引擎在阶段 1 为事务日志分配临时内存缓冲区,在此阶段的行更改会被记录。此缓冲区的大小最初是 sort_buffer_size,并且可以增长到 innodb_online_alter_log_max 大小。在阶段 2 中,处理 ALTER 语句的线程会将旧表的行复制到新更改的表中。之后 MariaDB 将对目标表施加独占锁,并将行日志缓冲区应用到新更改的表中。…
在 MariaDB 和 MySQL 中最流行的插件类型之一是 INFORMATION_SCHEMA 插件类型。INFORMATION_SCHEMA 插件向 INFORMATION_SCHEMA 添加新表。有很多 INFORMATION_SCHEMA 插件,因为它们可以用来向用户显示任何东西,并且非常易于编写。
MariaDB 10.1.1 带有九个 INFORMATION_SCHEMA 插件
- Feedback — 显示匿名的服务器使用信息,并可选择将其发送到配置的 URL。
- Locales — 列出编译到服务器中的区域设置,由 Roberto Spadim 实现
- METADATA_LOCK_INFO — 列出服务器中的元数据锁。
…
有时候需要有条件地执行某些 SQL 语句。如果你从你的 PHP(或 Java 或其他任何)应用程序中执行,这很简单。但是如果只有纯 SQL 呢?MariaDB 和 MySQL 在 mysql_fix_privilege_tables.sql 脚本(由 mysql_upgrade 工具应用)中使用了两种技术。
- 创建一个包含 IF 语句的存储过程,调用一次然后删除它。这要求用户拥有 CREATE ROUTINE 权限,并且 mysql.proc 表必须存在且可用(这并非必然——我们是从 mysql_upgrade 执行的,对吧?)。
- 使用动态 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’);
…