polardbxengine/mysql-test/suite/innodb/t/innodb_buffer_pool_load.test

239 lines
8.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_load_at_startup=ON
# and innodb_buffer_pool_dump_at_shutdown=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
--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,
# 329 (337 for index_free_pct) for 16k page size,
# 365 also for 16k page size, but with SCN and undo_ptr columns
# 662 for 8k page size & 1392 for 4k page size
--replace_result 83 {checked_valid} 163 {checked_valid} 329 {checked_valid} 337 {check_valid} 365 {checked_valid} 662 {checked_valid} 1392 {checked_valid}
--eval $check_cnt
--source include/shutdown_mysqld.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
--source include/start_mysqld.inc
# 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 /^Buffer pool\(s\) load completed.*|^Loading buffer pool\(s\) from.*|^Loaded .* pages.*/Buffer pool load completed or still running/
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,
# 329 (337 for index_free_pct) 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} 337 {checked_valid} 662 {checked_valid} 1392 {checked_valid}
--eval $check_cnt
call mtr.add_suppression("Error parsing");
--source include/shutdown_mysqld.inc
# 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
--source include/start_mysqld.inc
# 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
--source include/shutdown_mysqld.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
--source include/start_mysqld.inc
# 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 /^Buffer pool\(s\) load completed.*|^Loading buffer pool\(s\) from.*|^Loaded .* pages.*/Buffer pool load completed or still running/
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#22016556 INNODB LOOKS FOR BUFFER POOL FILE NAME IN '/' IF
--echo # INNODB_DATA_HOME_DIR IS EMPTY
--echo #
# Set different paths for --datadir
let $MYSQLD_DATADIR1 = $MYSQL_TMP_DIR/datadir1/data;
let $MYSQLD_BASEDIR= `select @@basedir`;
# Create custom datadir path
--mkdir $MYSQL_TMP_DIR/datadir1
let BOOTSTRAP_SQL=$MYSQL_TMP_DIR/boot.sql;
let $start_page_size=`SELECT variable_value FROM performance_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size'`;
# Create bootstrap file
write_file $BOOTSTRAP_SQL;
CREATE DATABASE test;
EOF
let NEW_CMD = $MYSQLD --no-defaults --innodb_dedicated_server=OFF --initialize-insecure --lc_messages_dir=$MYSQL_SHAREDIR --innodb-data-home-dir= --innodb_data_file_path=$MYSQL_TMP_DIR/datadir1/ibdata:16M:autoextend --datadir=$MYSQLD_DATADIR1 --innodb_log_file_size=15M --innodb_log_files_in_group=2 --init-file=$BOOTSTRAP_SQL --cluster-id=1 --cluster-start-index=1 --cluster-info='127.0.0.1:29223@1' </dev/null>>$MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 --innodb-page-size=$start_page_size;
# Run the bootstrap command
--exec $NEW_CMD
# Start the DB server
--replace_result $MYSQLD_DATADIR1 MYSQLD_DATADIR1 $MYSQL_TMP_DIR MYSQL_TMP_DIR
--let $restart_parameters="restart: --innodb-data-home-dir= --innodb_data_file_path=$MYSQL_TMP_DIR/datadir1/ibdata:16M:autoextend --datadir=$MYSQLD_DATADIR1 --innodb_log_file_size=15M --innodb_log_files_in_group=2"
--source include/restart_mysqld.inc
CREATE TABLE t1 (a int) ENGINE=innodb;
INSERT INTO t1 VALUES (1), (2), (3);
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
--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_dump_status';
--enable_warnings
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
--disable_warnings
--replace_regex /^Buffer pool\(s\) load completed.*|^Loading buffer pool\(s\) from.*|^Loaded .* pages.*/Buffer pool load completed or still running/
SELECT variable_value
FROM performance_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status';
--enable_warnings
DROP TABLE t1;
DROP DATABASE test;
let $restart_parameters=;
--source include/restart_mysqld.inc
# Remove residue files and data folder
--force-rmdir $MYSQL_TMP_DIR/datadir1/
--remove_file $BOOTSTRAP_SQL
--remove_file $MYSQLTEST_VARDIR/tmp/bootstrap.log