#Want to skip this test from daily Valgrind execution --source include/no_valgrind_without_big.inc # # 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 --source include/have_innodb.inc # include/restart_mysqld.inc does not work in embedded mode --source include/not_embedded.inc --source include/have_sequence.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; SELECT PAGE_NUMBER FROM information_schema.innodb_buffer_page_lru WHERE table_name = '`test`.`ib_bp_test`'; SELECT SPACE INTO @space FROM information_schema.innodb_buffer_page_lru WHERE table_name = '`test`.`ib_bp_test`' AND PAGE_NUMBER=3; let SPACE=`SELECT @space`; INSERT INTO ib_bp_test SELECT NULL, REPEAT('b', 64), REPEAT('c', 256) FROM seq_1_to_16382; SELECT COUNT(*) FROM information_schema.innodb_buffer_page_lru WHERE table_name = '`test`.`ib_bp_test`'; # 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 information_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 # Complete purge (and change buffer merge). SET GLOBAL innodb_fast_shutdown=0; --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 SELECT PAGE_NUMBER FROM information_schema.innodb_buffer_page_lru WHERE table_name = '`test`.`ib_bp_test`'; # Load the table so that entries in the I_S table do not appear as NULL select count(*) from ib_bp_test LIMIT 0; # 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 information_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 information_schema.global_status WHERE LOWER(variable_name) = 'innodb_buffer_pool_load_status'; --enable_warnings SELECT COUNT(*) FROM information_schema.innodb_buffer_page_lru WHERE table_name = '`test`.`ib_bp_test`'; # 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("InnoDB: 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 information_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 information_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 information_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;