循环冗余校验
SmartEDB运行时使用循环冗余检查(CRC32)算法来确保持久数据库页面、事务日志和保存的数据库映像的完整性。
如果您需要,可以通过C API更改CRC算法或禁用CRC检查。
目前,默认实现是MCO_RT_CRC32C。在Intel平台上,该算法可以利用SSE4指令集中的CRC32Q指令。不过,默认情况下,硬件加速仅适用于英特尔处理器,并且仅限于64位平台及GCC编译器。
系统会在运行时检查处理器是否支持CRC32Q指令。如果不支持,则会自动切换到软件版本的CRC32C算法,以确保正常运行。
您可以通过调用mco_runtime_setoption()函数设置运行时选项MCO_RT_CRC_ALGORITHM(默认为MCO_RT_CRC32C)来更改默认的CRC32算法或禁用CRC检查。为了向后兼容旧版本的SmartEDB,我们还提供了一些效率较低但稳定的计算算法。(详情请参阅“运行时选项”页面,了解所有可用的CRC算法。)
对于持久化数据库,您可以选择为每个页面添加一个4字节的CRC字段(通过启用MCO_DB_USE_CRC_CHECK或use_crc_check)。这虽然会增加一些空间(每页头增加4字节)和性能(通常约3%)开销,但能显著提高数据的可靠性。
对于事务日志,默认情况下CRC32是自动启用的,除非您指定了模式标志MCO_TRANSLOG_PIPE、MCO_TRANSLOG_DYNAMIC_PIPE或MCO_TRANSLOG_DUAL_OUT。即使在这些管道模式下,您仍然可以通过指定MCO_TRANSLOG_CRC标记(用于xSQL的CRC)来启用CRC检查。
当使用mco_db_save()保存或mco_db_load()加载数据库映像时,CRC完整性检查始终是强制执行的,以确保数据的完整性和安全性。
请注意,由于数据压缩已经实现了自己的CRC校验机制,因此CRC检查不能与数据压缩同时启用。