Details
-
Task
-
Status: Closed (View Workflow)
-
Blocker
-
Resolution: Fixed
-
None
Description
Historically, InnoDB supported a buggy page checksum algorithm that did not compute a checksum over the full page. Later, well before MySQL 4.1 introduced .ibd files and the innodb_file_per_table option, the algorithm was corrected and the first 4 bytes of each page were redefined to be a checksum.
The original checksum was so slow that an option to disable page checksum was introduced for benchmarketing purposes.
The Intel Nehalem microarchitecture introduced the SSE4.2 instruction set extension, which includes instructions for faster computation of CRC-32C. In MySQL 5.6 (and MariaDB 10.0), innodb_checksum_algorithm=crc32 was implemented to make of that. As that option was changed to be the default in MySQL 5.7, a bug was found on big-endian platforms and some work-around code was added to weaken that checksum further. MariaDB disables that work-around by default since MDEV-17958.
Later, SIMD-accelerated CRC-32C has been implemented in MariaDB for POWER and ARM and also for IA-32/AMD64, making use of the pclmul instruction (carry-less multiplication).
Long story short, innodb_checksum_algorithm=crc32 is faster and more secure than the original checksum, called innodb_checksum_algorithm=innodb. It should have removed any need to configure innodb_checksum_algorithm=none.
The setting innodb_checksum_algorithm=crc32 is also the default in MariaDB Server 10.2, 10.3, 10.4. In MariaDB 10.5, MDEV-19534 made innodb_checksum_algorithm=full_crc32 the default. It is even faster and more secure.
The default settings do allow old data files to be read, no matter if a worse algorithm had been used. (The settings innodb_checksum_algorithm=strict_crc32 or innodb_checksum_algorithm=strict_full_crc32 would only allow CRC-32C checksums, which is why they are not the default.)
A valid reason for using innodb_checksum_algorithm=innodb could have been the ability to downgrade to MariaDB 5.5, but that version has already reached its end of life. Also, if it is really needed, data files can be converted with the innochecksum utility.
Because there is no good reason to allow data files to be written with insecure checksums, we will reject those option values:
- innodb_checksum_algorithm=none
- innodb_checksum_algorithm=innodb
- innodb_checksum_algorithm=strict_none
- innodb_checksum_algorithm=strict_innodb
Furthermore, the following innochecksum options will be removed:
- --strict-check or -C (we only support crc32), and strict check is the default unless --no-check or -n is specified
- --write or -w (we only support crc32)
Attachments
Issue Links
- blocks
-
MDEV-25106 Issue deprecation warnings for innodb_checksum_algorithm values none,innodb,strict_none,strict_innodb
- Closed
- causes
-
MDEV-29619 mariadb-backup option `innodb_checksum_algorithm` is documented in the wrong way
- Closed
- relates to
-
MDEV-27931 A page in innodb_checksum_algorithm=innodb is wrongly claimed to be corrupted
- Closed
-
MDEV-31473 Wrong information about innodb_checksum_algorithm in the information_schema.SYSTEM_VARIABLES
- Closed
-
MDEV-17958 Make bug-endian innodb_checksum_algorithm=crc32 optional
- Closed
-
MDEV-19534 Make innodb_checksum_algorithm=full_crc32 by default, and remove innodb_checksums
- Closed
-
MDEV-21568 sys_vars.innodb_checksum_algorithm_basic failed in buildbot with errno: 2000
- Closed
-
MDEV-25083 MariaBackup doesn't work if InnoDB runs with strict_none or strict_innodb
- Open