This is a read-only copy of the MariaDB Knowledgebase generated on 2024-12-22. For the latest, interactive version please visit https://mariadb.com/kb/.

Aria 存储引擎

Aria 存储引擎从 MariaDB 5.1 开始默认编译,并且在启动 MariaDB 时需要“使用”。

MariaDB 10.4 开始,所有 系统表 都是 Aria。

此外,内部磁盘上的表格使用 Aria 表格格式而不是 MyISAM 表格格式。这应该会加速一些 GROUP BYDISTINCT 查询,因为 Aria 具有比 MyISAM 更好的缓存。

注意:Aria 存储引擎以前称为 Maria(有关重命名的详细信息,请参见Aria 名称),并且在以前版本的 MariaDB 中,该引擎仍然被称为 Maria。

CREATE TABLEALTER TABLE 中,Aria 表格的以下选项:

  • TRANSACTIONAL= 0 | 1 如果为 Aria 表格设置了 TRANSACTIONAL 表格选项,则该表格将是崩溃安全的。这是通过将表格的任何更改记录到 Aria 的事务日志中并在语句结束时同步这些写入来实现的。这将略微减慢写入和更新速度。但是,好处是如果服务器在语句结束之前崩溃,则所有非持久性更改将回滚到语句开始时的状态。这还需要每行和键存储事务 ID(以允许并发插入和选择)多达 6 个字节。
    • 对于分区表不支持 TRANSACTIONAL=1
    • Aria 表格的 TRANSACTIONAL 表格选项默认值取决于表格的 ROW_FORMAT 表格选项的值。有关更多详细信息,请参见下文。
    • 如果为 Aria 表格设置了 TRANSACTIONAL 表格选项,则该表格实际上不支持事务。有关更多信息,请参见 MDEV-21364。在此上下文中,“事务”只是指“崩溃安全”。
  • PAGE_CHECKSUM= 0 | 1 如果索引和数据应使用页面校验和以获得额外的安全性。
  • TABLE_CHECKSUM= 0 | 1 与 MySQL 5.1 中的 CHECKSUM 相同
  • ROW_FORMAT=PAGE | FIXED | DYNAMIC 表格的 行格式
    • 默认值为 PAGE
    • 要模拟 MyISAM,请设置 ROW_FORMAT=FIXEDROW_FORMAT=DYNAMIC

TRANSACTIONALROW_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 才能找到每个键。我们计划通过在页面末尾添加一个字典来解决这个问题,以便在开始扫描之前能够在块内进行二进制搜索。在完成此操作并且即使您没有击中磁盘,关键查找也需要太长时间时,您应该考虑将其缩小。
    • 可以尝试的可能值为 204840968192
    • 请注意,您不能更改此值而不进行转储、删除旧表格并删除所有日志文件,然后恢复您的 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_lsnlast_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 表格时,服务器将认为它已从另一个系统移动,并自动检查和修复它。如果没有问题,表格将被打开,并可以像往常一样使用。也请参见 什么时候可以安全地删除旧日志文件

另请参阅

Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.