Aria 存储引擎
Contents
Aria 存储引擎从 MariaDB 5.1 开始默认编译,并且在启动 MariaDB 时需要“使用”。
从 MariaDB 10.4 开始,所有 系统表 都是 Aria。
此外,内部磁盘上的表格使用 Aria 表格格式而不是 MyISAM 表格格式。这应该会加速一些 GROUP BY 和 DISTINCT 查询,因为 Aria 具有比 MyISAM 更好的缓存。
在 CREATE TABLE 和 ALTER TABLE 中,Aria 表格的以下选项:
TRANSACTIONAL= 0
: 如果为 Aria 表格设置了|
1TRANSACTIONAL
表格选项,则该表格将是崩溃安全的。这是通过将表格的任何更改记录到 Aria 的事务日志中并在语句结束时同步这些写入来实现的。这将略微减慢写入和更新速度。但是,好处是如果服务器在语句结束之前崩溃,则所有非持久性更改将回滚到语句开始时的状态。这还需要每行和键存储事务 ID(以允许并发插入和选择)多达 6 个字节。- 对于分区表不支持
TRANSACTIONAL=1
。 - Aria 表格的
TRANSACTIONAL
表格选项默认值取决于表格的ROW_FORMAT
表格选项的值。有关更多详细信息,请参见下文。 - 如果为 Aria 表格设置了
TRANSACTIONAL
表格选项,则该表格实际上不支持事务。有关更多信息,请参见 MDEV-21364。在此上下文中,“事务”只是指“崩溃安全”。
- 对于分区表不支持
PAGE_CHECKSUM= 0
: 如果索引和数据应使用页面校验和以获得额外的安全性。|
1TABLE_CHECKSUM= 0
: 与 MySQL 5.1 中的|
1CHECKSUM
相同ROW_FORMAT=PAGE
: 表格的 行格式。|
FIXED|
DYNAMIC- 默认值为
PAGE
。 - 要模拟 MyISAM,请设置
ROW_FORMAT=FIXED
或ROW_FORMAT=DYNAMIC
- 默认值为
TRANSACTIONAL
和 ROW_FORMAT
表格选项的交互如下:
- 如果设置了
TRANSACTIONAL=1
,则仅支持PAGE
行格式。如果将ROW_FORMAT
设置为其他某个值,则 Aria 将发出警告,但仍将强制行格式为PAGE
。 - 如果设置了
TRANSACTIONAL=0
,则该表格将不具备崩溃安全性,并且支持任何行格式。 - 如果未设置
TRANSACTIONAL
的任何值,则支持任何行格式。如果设置了ROW_FORMAT
,则表格将使用该行格式。否则,表格将使用默认的PAGE
行格式。在这种情况下,如果表格使用了PAGE
行格式,则它将是崩溃安全的。如果它使用其他某些行格式,则它将不具备崩溃安全性。
其他一些改进包括:
- CHECKSUM TABLE 现在忽略空字段中的值。这使得
CHECKSUM TABLE
更快,并修复了某些情况下,相同的表定义可能会根据 行格式 给出不同的校验和值的情况。缺点是该值现在与其他 MySQL 安装不同。新的校验和计算对所有使用默认计算方式和内部计算校验和的 MyISAM 表格引擎都是固定的。注意:具有内部校验和的旧 MyISAM 表格将返回与之前相同的校验和。要根据新规则进行计算以修复它们,您必须执行ALTER TABLE
。您可以使用选项--old
以 mariadbdmysqld 或在执行CHECKSUM TABLE ... EXTENDED;
时将系统变量 '@@old
' 设置为1
来使用旧的计算校验和的方法。 - 在启动时,Aria 将检查 Aria 日志,并在服务器未正确关闭时自动从最后一个检查点恢复表格。请参见Aria 日志文件
Aria 的启动选项
有关完整列表,请参见Aria 系统变量。
在正常操作中,您需要考虑的唯一变量是:
- aria-pagecache-buffer-size
- 这是所有索引和数据页面缓存的位置。这个值越大,Aria 就越快。
- aria-block-size
- 默认值 8192 对于大多数情况来说应该是可以的。更高的值唯一的问题在于,在块中查找打包键需要更长时间,因为必须搜索大约 8192/2 才能找到每个键。我们计划通过在页面末尾添加一个字典来解决这个问题,以便在开始扫描之前能够在块内进行二进制搜索。在完成此操作并且即使您没有击中磁盘,关键查找也需要太长时间时,您应该考虑将其缩小。
- 可以尝试的可能值为
2048
、4096
或8192
- 请注意,您不能更改此值而不进行转储、删除旧表格并删除所有日志文件,然后恢复您的 Aria 表格。(这是唯一需要转储和加载的选项)
- aria-log-purge-type
- 如果要保留事务日志的副本(作为额外备份),请将其设置为 "
at_flush
"。日志将保留直到您执行 FLUSH ENGINE LOGS。
- 如果要保留事务日志的副本(作为额外备份),请将其设置为 "
Aria 日志文件
aria_log_control
文件是一个非常短的日志文件(52 字节),其中包含与日志记录和检查点相关的所有 Aria 表格的当前状态。特别地,它包含以下信息:
Aria 文件版本:1 块大小:8192 maria_uuid:ee948482-6cb7-11ed-accb-3c7c3ff16468 last_checkpoint_lsn:(1,0x235a) last_log_number:1 trid:28 recovery_failures:0
uuid
是每个系统的唯一标识符。所有创建的 Aria 文件都将在其 .MAI 标头中拥有此标识符的副本。这主要用于检查是否有人在 MariaDB 服务器之间复制了 Aria 文件。last_checkpoint_lsn
和last_log_number
是有关当前 aria_log 文件的信息。trid
是迄今为止看到的最高事务编号。用于恢复。
aria_log.*
文件包含更改 Aria 文件(包括创建表、删除表、插入等)的所有操作的日志。这是一个“正常”的 WAL(预写式日志),类似于 InnoDB 日志文件,只是 aria_logs 包含了重做和撤销。当旧的 aria_log 文件不再需要时,它们会自动删除(最后一个检查点或任何正在运行的事务不再需要引用旧数据)。
缺少有效 ID
错误 Missing valid id at start of file. File is not a valid aria control file
意味着某些东西覆盖了文件中至少前 4 个字节。这可能是由于文件系统(硬件或软件)的问题,或者是一个 bug,其中 MariaDB 内部的线程写入了错误的文件描述符(在这种情况下,您应该 报告此 bug,并附上控制文件的副本以进行协助)。
在关机的情况下,如果出现损坏的日志文件,则应该能够通过删除所有 aria_log 文件来修复该问题。 如果控制文件损坏,则必须删除 aria_control_file 和所有 aria_log.* 文件。 这样做的效果是,在打开 Aria 表格时,服务器将认为它已从另一个系统移动,并自动检查和修复它。如果没有问题,表格将被打开,并可以像往常一样使用。也请参见 什么时候可以安全地删除旧日志文件。