--echo # --echo # Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY --echo # Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST --echo # PAGE OF SYSTEM TABLESPACE --echo # --source include/innodb_page_size.inc --source include/have_debug.inc --source include/not_embedded.inc --disable_query_log call mtr.add_suppression("InnoDB: Data file .* uses page size .* but the innodb_page_size start-up parameter is"); call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS"); call mtr.add_suppression("InnoDB: New log files created"); call mtr.add_suppression("InnoDB: Cannot create doublewrite buffer: the first file in innodb_data_file_path must be at least (3|6|12)M\\."); call mtr.add_suppression("InnoDB: Database creation was aborted"); call mtr.add_suppression("Plugin 'InnoDB' (init function returned error|registration as a STORAGE ENGINE failed)"); call mtr.add_suppression("InnoDB: A bad Space ID was found in datafile"); call mtr.add_suppression("InnoDB: Checksum mismatch in datafile: "); call mtr.add_suppression("InnoDB: Inconsistent tablespace ID in .*t1\\.ibd"); call mtr.add_suppression("InnoDB: Header page consists of zero bytes in datafile:"); --enable_query_log let INNODB_PAGE_SIZE=`select @@innodb_page_size`; let MYSQLD_DATADIR=`select @@datadir`; let ALGO=`select @@innodb_checksum_algorithm`; let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; show variables like 'innodb_doublewrite'; show variables like 'innodb_fil_make_page_dirty_debug'; show variables like 'innodb_saved_page_number_debug'; create table t1 (f1 int primary key, f2 blob) engine=innodb; start transaction; insert into t1 values(1, repeat('#',12)); insert into t1 values(2, repeat('+',12)); insert into t1 values(3, repeat('/',12)); insert into t1 values(4, repeat('-',12)); insert into t1 values(5, repeat('.',12)); commit work; --echo # Test Begin: Test if recovery works if 1st page and 2nd page --echo # of system tablespace is full of zeroes. # Slow shutdown and restart to make sure ibuf merge is finished SET GLOBAL innodb_fast_shutdown = 0; let $shutdown_timeout=; let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; --source include/restart_mysqld.inc --source ../include/no_checkpoint_start.inc begin; insert into t1 values (6, repeat('%', 400)); --echo # Make the first page dirty for system tablespace set global innodb_saved_page_number_debug = 0; set global innodb_fil_make_page_dirty_debug = 0; --echo # Make the second page dirty for system tablespace set global innodb_saved_page_number_debug = 1; set global innodb_fil_make_page_dirty_debug = 0; set global innodb_buf_flush_list_now = 1; --let CLEANUP_IF_CHECKPOINT=drop table t1, unexpected_checkpoint; --source ../include/no_checkpoint_end.inc --echo # Make the 1st page (page_no=0) and 2nd page (page_no=1) --echo # of the system tablespace all zeroes. perl; use IO::Handle; my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; open(FILE, "+<", $fname) or die; FILE->autoflush(1); binmode FILE; print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); close FILE; EOF let $restart_parameters=; --source include/start_mysqld.inc let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile; --source include/search_pattern_in_file.inc let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=0, page number=1\]; --source include/search_pattern_in_file.inc check table t1; select f1, f2 from t1; --echo # Test End --echo # --------------------------------------------------------------- --echo # Test Begin: Test if recovery works if 1st page of --echo # system tablespace is corrupted and 2nd page as corrupted. let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; --source include/restart_mysqld.inc --source ../include/no_checkpoint_start.inc begin; insert into t1 values (6, repeat('%', 400)); --echo # Make the first page dirty for system tablespace set global innodb_saved_page_number_debug = 0; set global innodb_fil_make_page_dirty_debug = 0; --echo # Make the second page dirty for system tablespace set global innodb_saved_page_number_debug = 1; set global innodb_fil_make_page_dirty_debug = 0; set global innodb_buf_flush_list_now = 1; --source ../include/no_checkpoint_end.inc --echo # Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace. perl; use IO::Handle; my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; open(FILE, "+<", $fname) or die; FILE->autoflush(1); binmode FILE; print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); close FILE; EOF let $restart_parameters=; --source include/start_mysqld.inc let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile; --source include/search_pattern_in_file.inc let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=0, page number=1\]; --source include/search_pattern_in_file.inc check table t1; select f1, f2 from t1; drop table t1; let $shutdown_timeout=; --echo # Test End --echo # --------------------------------------------------------------- --echo # --echo # MDEV-12600 crash during install_db with innodb_page_size=32K --echo # and ibdata1=3M --echo # let bugdir= $MYSQLTEST_VARDIR/tmp/doublewrite; --mkdir $bugdir let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE engine = 'innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); --let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir --let $ibp=$ibp --innodb-undo-tablespaces=0 --let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend --let $restart_parameters= $ibp --source include/restart_mysqld.inc eval $check_no_innodb; --let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot create doublewrite buffer --source include/search_pattern_in_file.inc --let $restart_parameters= --source include/restart_mysqld.inc --remove_file $bugdir/ibdata1 --remove_file $bugdir/ibdata2 --remove_file $bugdir/ib_logfile0 --rmdir $bugdir