207 lines
6.1 KiB
Plaintext
207 lines
6.1 KiB
Plaintext
#
|
|
# Test for the functionality of InnoDB Buffer Pool dump/load.
|
|
#
|
|
|
|
# This case checks buffer pool dump/load works as expected
|
|
# with innodb_buffer_pool_dump_now=ON
|
|
# and innodb_buffer_pool_load_now=ON
|
|
|
|
# Skip this test from daily Valgrind execution
|
|
--source include/no_valgrind_without_big.inc
|
|
|
|
# Skip this test if page size is too big since buffer pool may not be
|
|
# large enough, especially if using multiple undo tablespaces.
|
|
--source include/have_innodb_max_16k.inc
|
|
|
|
# Skip this test if the test run is initialized with a non-default
|
|
# number of undo tablespaces.
|
|
--source include/have_innodb_default_undo_tablespaces.inc
|
|
|
|
--let $file = `SELECT CONCAT(@@datadir, @@global.innodb_buffer_pool_filename)`
|
|
|
|
--error 0,1
|
|
--remove_file $file
|
|
|
|
# Dump the whole buffer pool because if only a portion of it is dumped, we
|
|
# cannot be sure how many of the ib_bp_test's pages will end up in the dump.
|
|
SET GLOBAL innodb_buffer_pool_dump_pct=100;
|
|
|
|
# Create a table and populate it with some data
|
|
CREATE TABLE ib_bp_test
|
|
(a INT AUTO_INCREMENT, b VARCHAR(64), c TEXT, PRIMARY KEY (a), KEY (b, c(128)))
|
|
ENGINE=INNODB;
|
|
|
|
let $check_cnt =
|
|
SELECT COUNT(*) FROM information_schema.innodb_buffer_page_lru
|
|
WHERE table_name LIKE '%ib_bp_test%';
|
|
|
|
--let SPACE = `SELECT space FROM information_schema.innodb_tables WHERE name LIKE '%ib_bp_test%'`
|
|
|
|
# See that we have a small number of pages in the LRU
|
|
--eval $check_cnt
|
|
|
|
# Here we end up with 16382 rows in the table
|
|
--disable_query_log
|
|
INSERT INTO ib_bp_test (b, c) VALUES (REPEAT('b', 64), REPEAT('c', 256));
|
|
INSERT INTO ib_bp_test (b, c) VALUES (REPEAT('B', 64), REPEAT('C', 256));
|
|
let $i=12;
|
|
while ($i)
|
|
{
|
|
--eval INSERT INTO ib_bp_test (b, c) VALUES ($i, $i * $i);
|
|
INSERT INTO ib_bp_test (b, c) SELECT b, c FROM ib_bp_test;
|
|
dec $i;
|
|
}
|
|
--enable_query_log
|
|
|
|
# Accept 83 for 64k page size, 163 for 32k page size, 329 for 16k page size,
|
|
# 662 for 8k page size & 1392 for 4k page size
|
|
--replace_result 83 {checked_valid} 163 {checked_valid} 329 {checked_valid} 662 {checked_valid} 1392 {checked_valid}
|
|
--eval $check_cnt
|
|
|
|
# Dump
|
|
SET GLOBAL innodb_buffer_pool_dump_now = ON;
|
|
|
|
# Wait for the dump to complete
|
|
--disable_warnings
|
|
let $wait_condition =
|
|
SELECT SUBSTR(variable_value, 1, 33) = 'Buffer pool(s) dump completed at '
|
|
FROM performance_schema.global_status
|
|
WHERE LOWER(variable_name) = 'innodb_buffer_pool_dump_status';
|
|
--enable_warnings
|
|
--source include/wait_condition.inc
|
|
|
|
# Confirm the file has been created
|
|
--file_exists $file
|
|
|
|
# Add some garbage records to the dump file
|
|
--let IBDUMPFILE = $file
|
|
perl;
|
|
my $fn = $ENV{'IBDUMPFILE'};
|
|
open(my $fh, '>>', $fn) || die "perl open($fn): $!";
|
|
print $fh "123456,0\n";
|
|
print $fh "0,123456\n";
|
|
print $fh "123456,123456\n";
|
|
close($fh);
|
|
EOF
|
|
|
|
--move_file $file $file.now
|
|
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
# Make sure no dump after shutdown
|
|
--error 1
|
|
--file_exists $file
|
|
|
|
--source include/start_mysqld.inc
|
|
|
|
--move_file $file.now $file
|
|
|
|
# See that we have no pages in the LRU
|
|
--eval $check_cnt
|
|
|
|
# Load the table so that entries in the I_S table do not appear as NULL
|
|
select count(*) from ib_bp_test where a = 1;
|
|
|
|
# Load
|
|
SET GLOBAL innodb_buffer_pool_load_now = ON;
|
|
|
|
# Wait for the load to complete
|
|
--disable_warnings
|
|
let $wait_condition =
|
|
SELECT SUBSTR(variable_value, 1, 33) = 'Buffer pool(s) load completed at '
|
|
FROM performance_schema.global_status
|
|
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
|
|
--enable_warnings
|
|
--source include/wait_condition.inc
|
|
|
|
# Show the status, interesting if the above timed out
|
|
--disable_warnings
|
|
--replace_regex /[0-9]{6}[[:space:]]+[0-9]{1,2}:[0-9]{2}:[0-9]{2}/TIMESTAMP_NOW/
|
|
SELECT variable_value
|
|
FROM performance_schema.global_status
|
|
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
|
|
--enable_warnings
|
|
|
|
# Accept 83 for 64k page size, 163 for 32k page size, 329 for 16k page size,
|
|
# 662 for 8k page size & 1392 for 4k page size
|
|
--replace_result 83 {checked_valid} 163 {checked_valid} 329 {checked_valid} 662 {checked_valid} 1392 {checked_valid}
|
|
--eval $check_cnt
|
|
|
|
# Add some total garbage to the dump file
|
|
--let IBDUMPFILE = $file
|
|
perl;
|
|
my $fn = $ENV{'IBDUMPFILE'};
|
|
open(my $fh, '>>', $fn) || die "perl open($fn): $!";
|
|
print $fh "abcdefg\n";
|
|
close($fh);
|
|
EOF
|
|
|
|
call mtr.add_suppression("Error parsing");
|
|
|
|
# Load
|
|
SET GLOBAL innodb_buffer_pool_load_now = ON;
|
|
|
|
# Wait for the load to fail
|
|
--disable_warnings
|
|
let $wait_condition =
|
|
SELECT SUBSTR(variable_value, 1, 13) = 'Error parsing'
|
|
FROM performance_schema.global_status
|
|
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
|
|
--enable_warnings
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # Re-write some valid pages to the dump file, make sure the space
|
|
--echo # should be valid but all the page no should be out of bound of the file
|
|
--let IBDUMPFILE = $file
|
|
perl;
|
|
my $fn = $ENV{'IBDUMPFILE'};
|
|
my $space = $ENV{'SPACE'};
|
|
open(my $fh, '>', $fn) || die "perl open($fn): $!";
|
|
print $fh "$space,10000\n";
|
|
print $fh "$space,10001\n";
|
|
print $fh "$space,10002\n";
|
|
close($fh);
|
|
EOF
|
|
|
|
# We force the restart so that the table would be closed
|
|
--source include/restart_mysqld.inc
|
|
|
|
# Load directly, without accessing the table first
|
|
SET GLOBAL innodb_buffer_pool_load_now = ON;
|
|
|
|
# Wait for the load to complete
|
|
--disable_warnings
|
|
let $wait_condition =
|
|
SELECT SUBSTR(variable_value, 1, 33) = 'Buffer pool(s) load completed at '
|
|
FROM performance_schema.global_status
|
|
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
|
|
--enable_warnings
|
|
--source include/wait_condition.inc
|
|
|
|
# Show the status, interesting if the above timed out
|
|
--disable_warnings
|
|
--replace_regex /[0-9]{6}[[:space:]]+[0-9]{1,2}:[0-9]{2}:[0-9]{2}/TIMESTAMP_NOW/
|
|
SELECT variable_value
|
|
FROM performance_schema.global_status
|
|
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
|
|
--enable_warnings
|
|
|
|
DROP TABLE ib_bp_test;
|
|
SET GLOBAL innodb_buffer_pool_dump_pct=default;
|
|
|
|
--echo #
|
|
--echo # Bug#21371070 [ERROR] INNODB: CANNOT ALLOCATE 0 BYTES: SUCCESS
|
|
--echo #
|
|
|
|
--let $file = `SELECT CONCAT(@@datadir, @@global.innodb_buffer_pool_filename)`
|
|
|
|
# Remove the buffer pool file that exists already
|
|
--error 0,1
|
|
--remove_file $file
|
|
|
|
# Create an empty buffer pool file
|
|
write_file $file;
|
|
EOF
|
|
|
|
SET GLOBAL innodb_buffer_pool_load_now = ON;
|