mirror of
https://github.com/MariaDB/server.git
synced 2025-11-30 05:23:50 +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
90 lines
3.9 KiB
Plaintext
90 lines
3.9 KiB
Plaintext
SET GLOBAL innodb_compression_level=0;
|
|
SELECT @@innodb_compression_level;
|
|
@@innodb_compression_level
|
|
0
|
|
CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1;
|
|
INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200));
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
INSERT INTO t1 SELECT * from t1;
|
|
# stop the server
|
|
|
|
Variables (--variable-name=value)
|
|
and boolean options {FALSE|TRUE} Value (after reading options)
|
|
--------------------------------- ----------------------------------------
|
|
verbose TRUE
|
|
debug FALSE
|
|
count FALSE
|
|
start-page 0
|
|
end-page 0
|
|
page 0
|
|
no-check FALSE
|
|
allow-mismatches 0
|
|
page-type-summary FALSE
|
|
page-type-dump MYSQLTEST_VARDIR/tmp/dump.txt
|
|
per-page-details FALSE
|
|
log (No default value)
|
|
leaf FALSE
|
|
merge 0
|
|
[1]:# check the both short and long options for "help"
|
|
[2]:# Run the innochecksum when file isn't provided.
|
|
# It will print the innochecksum usage similar to --help option.
|
|
innochecksum Ver #.#.#
|
|
Copyright (c) YEAR, YEAR , Oracle, MariaDB Corporation Ab and others.
|
|
|
|
InnoDB offline file checksum utility.
|
|
Usage: innochecksum [-c] [-s <start page>] [-e <end page>] [-p <page>] [-i] [-v] [-a <allow mismatches>] [-n] [-S] [-D <page type dump>] [-l <log>] [-l] [-m <merge pages>] <filename or [-]>
|
|
See https://mariadb.com/kb/en/library/innochecksum/ for usage hints.
|
|
-?, --help Displays this help and exits.
|
|
-I, --info Synonym for --help.
|
|
-V, --version Displays version information and exits.
|
|
-v, --verbose Verbose (prints progress every 5 seconds).
|
|
https://mariadb.com/kb/en/library/creating-a-trace-file/
|
|
-c, --count Print the count of pages in the file and exits.
|
|
-s, --start-page=# Start on this page number (0 based).
|
|
-e, --end-page=# End at this page number (0 based).
|
|
-p, --page=# Check only this page (0 based).
|
|
-n, --no-check Ignore the checksum verification.
|
|
-a, --allow-mismatches=#
|
|
Maximum checksum mismatch allowed.
|
|
-S, --page-type-summary
|
|
Display a count of each page type in a tablespace.
|
|
-D, --page-type-dump=name
|
|
Dump the page type info for each page in a tablespace.
|
|
-i, --per-page-details
|
|
Print out per-page detail information.
|
|
-l, --log=name log output.
|
|
-f, --leaf Examine leaf index pages
|
|
-m, --merge=# leaf page count if merge given number of consecutive
|
|
pages
|
|
|
|
Variables (--variable-name=value)
|
|
and boolean options {FALSE|TRUE} Value (after reading options)
|
|
--------------------------------- ----------------------------------------
|
|
verbose FALSE
|
|
count FALSE
|
|
start-page 0
|
|
end-page 0
|
|
page 0
|
|
no-check FALSE
|
|
allow-mismatches 0
|
|
page-type-summary FALSE
|
|
page-type-dump (No default value)
|
|
per-page-details FALSE
|
|
log (No default value)
|
|
leaf FALSE
|
|
merge 0
|
|
[3]:# check the both short and long options for "count" and exit
|
|
Number of pages:#
|
|
Number of pages:#
|
|
[4]:# Print the version of innochecksum and exit
|
|
innochecksum Ver #.#.## Restart the DB server
|
|
DROP TABLE t1;
|