• Marko Mäkelä's avatar
    MDEV-25105 Remove innodb_checksum_algorithm values none,innodb,... · 7a4fbb55
    Marko Mäkelä authored
    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 carry-less multiplication
    where available.
    
    Long story short, innodb_checksum_algorithm=crc32 is faster and more secure
    than the pre-MySQL 5.6 checksum, called innodb_checksum_algorithm=innodb.
    It should have removed any need to use innodb_checksum_algorithm=none.
    
    The setting innodb_checksum_algorithm=crc32 is the default in
    MySQL 5.7 and 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 in MariaDB do allow old data files to be read,
    no matter if a worse checksum algorithm had been used.
    (Unfortunately, before innodb_checksum_algorithm=full_crc32,
    the data files did not identify which checksum algorithm is being used.)
    
    The non-default settings innodb_checksum_algorithm=strict_crc32 or
    innodb_checksum_algorithm=strict_full_crc32 would only allow CRC-32C
    checksums. The incompatibility with old data files is why they are
    not the default.
    
    The newest server not to support innodb_checksum_algorithm=crc32
    were MySQL 5.5 and MariaDB 5.5. Both have reached their end of life.
    A valid reason for using innodb_checksum_algorithm=innodb could have
    been the ability to downgrade. If it is really needed, data files
    can be converted with an older version of 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,
    because only strict crc32 will be supported:
    
        innochecksum --strict-check=crc32
        innochecksum -C crc32
        innochecksum --write=crc32
        innochecksum -w crc32
    
    If a user wishes to convert a data file to use a different checksum
    (so that it might be used with the no-longer-supported
    MySQL 5.5 or MariaDB 5.5, which do not support IMPORT TABLESPACE
    nor system tablespace format changes that were made in MariaDB 10.3),
    then the innochecksum tool from MariaDB 10.2, 10.3, 10.4, 10.5 or
    MySQL 5.7 can be used.
    
    Reviewed by: Thirunarayanan Balathandayuthapani
    7a4fbb55
srv0srv.cc 63.3 KB