mirror of
https://github.com/MariaDB/server.git
synced 2025-11-28 17:36:30 +03:00
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
95 lines
3.4 KiB
Plaintext
95 lines
3.4 KiB
Plaintext
#************************************************************
|
|
# WL6045:Improve Innochecksum
|
|
#************************************************************
|
|
--source include/innodb_page_size_small.inc
|
|
--source include/have_debug.inc
|
|
# Avoid CrashReporter popup on Mac.
|
|
--source include/not_crashrep.inc
|
|
|
|
--source include/not_embedded.inc
|
|
-- source include/big_test.inc
|
|
|
|
--disable_query_log
|
|
# This warning occurs due to small buffer pool size(i.e. 8MB). It doesn't occur
|
|
# with --mysqld=--innodb_buffer_pool_size=10MB
|
|
call mtr.add_suppression("\\[Warning\\] InnoDB: Difficult to find free blocks in the buffer pool.*");
|
|
--enable_query_log
|
|
let MYSQLD_BASEDIR= `SELECT @@basedir`;
|
|
let MYSQLD_DATADIR= `SELECT @@datadir`;
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err;
|
|
let $restart_noprint=2;
|
|
|
|
SET GLOBAL innodb_compression_level=0;
|
|
SELECT @@innodb_compression_level;
|
|
|
|
CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1;
|
|
INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200));
|
|
let $i=10;
|
|
while ($i > 0) {
|
|
INSERT INTO t1 SELECT * from t1;
|
|
dec $i;
|
|
}
|
|
|
|
--echo # stop the server
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
# Page_type_dump for t1
|
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
--exec $INNOCHECKSUM -v --page-type-dump $MYSQLTEST_VARDIR/tmp/dump.txt $MYSQLD_DATADIR/test/t1.ibd
|
|
--file_exists $MYSQLTEST_VARDIR/tmp/dump.txt
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/dump.txt
|
|
|
|
--echo [1]:# check the both short and long options for "help"
|
|
--exec $INNOCHECKSUM --help $MYSQLD_DATADIR/test/t1.ibd > $MYSQLTEST_VARDIR/tmp/help_output_long.txt
|
|
--exec $INNOCHECKSUM -I $MYSQLD_DATADIR/test/t1.ibd > $MYSQLTEST_VARDIR/tmp/help_output_short.txt
|
|
--diff_files $MYSQLTEST_VARDIR/tmp/help_output_long.txt $MYSQLTEST_VARDIR/tmp/help_output_short.txt
|
|
|
|
--echo [2]:# Run the innochecksum when file isn't provided.
|
|
--echo # It will print the innochecksum usage similar to --help option.
|
|
--error 1
|
|
--exec $INNOCHECKSUM > $MYSQLTEST_VARDIR/tmp/usage.txt
|
|
--diff_files $MYSQLTEST_VARDIR/tmp/help_output_long.txt $MYSQLTEST_VARDIR/tmp/usage.txt
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/usage.txt
|
|
|
|
perl;
|
|
use strict;
|
|
use warnings;
|
|
use File::Copy;
|
|
my $dir = $ENV{'MYSQLTEST_VARDIR'};
|
|
my $file= 'help_output_long.txt';
|
|
# open file in write mode
|
|
open IN_FILE,"<", "$dir/tmp/$file" or die $!;
|
|
open OUT_FILE, ">", "$dir/tmp/tmpfile" or die $!;
|
|
while(<IN_FILE>) {
|
|
unless ($_=~ /^debug.*$/ || $_=~ /\-#, \-\-debug.*$/ || $_=~ /http:.*html/) {
|
|
$_=~ s/^\S*innochecksum.+Ver.+[0-9]*\.[0-9]*\.[0-9]*.+$/innochecksum Ver #.#.#/g;
|
|
$_=~ s/(Copyright\s\(c\))\s([0-9]*),\s([0-9]*)(.*)/$1 YEAR, YEAR $4/g;
|
|
$_=~ s/Usage:.*\[-c/Usage: innochecksum [-c/g;
|
|
print OUT_FILE $_;
|
|
}
|
|
}
|
|
close(IN_FILE);
|
|
close(OUT_FILE);
|
|
# move the new content from tmp file to the orginal file.
|
|
move ("$dir/tmp/tmpfile", "$dir/tmp/$file");
|
|
EOF
|
|
|
|
--cat_file $MYSQLTEST_VARDIR/tmp/help_output_long.txt
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/help_output_long.txt
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/help_output_short.txt
|
|
|
|
--echo [3]:# check the both short and long options for "count" and exit
|
|
--replace_regex /[0-9]+/#/
|
|
--exec $INNOCHECKSUM --count $MYSQLD_DATADIR/test/t1.ibd
|
|
--replace_regex /[0-9]+/#/
|
|
--exec $INNOCHECKSUM -c $MYSQLD_DATADIR/test/t1.ibd
|
|
|
|
--echo [4]:# Print the version of innochecksum and exit
|
|
--replace_regex /.*innochecksum.*Ver.*[0-9]*.[0-9]*.[0-9]*.*/innochecksum Ver #.#.#/
|
|
--exec $INNOCHECKSUM -V $MYSQLD_DATADIR/test/t1.ibd
|
|
|
|
--echo # Restart the DB server
|
|
--source include/start_mysqld.inc
|
|
|
|
DROP TABLE t1;
|