mirror of
https://github.com/MariaDB/server.git
synced 2025-08-30 11:22:14 +03:00
trx_sys_t::undo_log_nonempty: Set to true if there are undo logs to rollback and purge. The algorithm for re-creating the undo tablespace when trx_sys_t::undo_log_nonempty is disabled: 1) trx_sys_t::reset_page(): Reset the TRX_SYS page and assign all rollback segment slots from 1..127 to FIL_NULL 2) Free the rollback segment header page of system tablespace for the slots 1..127 3) Update the binlog and WSREP information in system tablespace rollback segment header Step (1), (2) and Step (3) should happen atomically within a single mini-transaction. 4) srv_undo_delete_old_tablespaces(): Delete the old undo tablespaces present in the undo log directory 5) Make checkpoint to get rid of old undo log tablespaces redo logs 6) Assign new start space id for the undo log tablespaces 7) Re-create the specified undo log tablespaces. InnoDB uses same mtr for this one and step (6) 8) Make checkpoint again, so that server or mariabackup can read the undo log tablespace page0 before applying the redo logs srv_undo_tablespaces_reinit(): Recreate the undo log tablespaces. It does reset trx_sys page, delete the old undo tablespaces, update the binlog offset, write set replication checkpoint in system rollback segment page trx_rseg_update_binlog_offset(): Added 2 new parameters to pass binlog file name and binlog offset trx_rseg_array_init(): Return error if the rollback segment slot points to non-existent tablespace srv_undo_tablespaces_init(): Added new parameter mtr to initialize all undo tablespaces trx_assign_rseg_low(): Allow the transaction to use the rollback segment slots(1..127) even if InnoDB failed to change to the requested innodb_undo_tablespaces=0 srv_start(): Override the user specified value of innodb_undo_tablespaces variable with already existing actual undo tablespaces wf_incremental_process(): Detects whether TRX_SYS page has been modified since last backup. If it is then incremental backup fails and throws the information about taking full backup again xb_assign_undo_space_start(): Removed the function. Because undo001 has first undo space id value in page0 Added test case to test the scenario during startup and mariabackup incremental process too. Reviewed-by : Marko Mäkelä Tested-by : Matthias Leich
220 lines
8.2 KiB
Plaintext
220 lines
8.2 KiB
Plaintext
--echo # Testcase for the following bugs
|
|
--echo # Bug#16691130 - ASSERT WHEN INNODB_LOG_GROUP_HOME_DIR DOES NOT EXIST
|
|
--echo # Bug#16418661 - CHANGING NAME IN FOR INNODB_DATA_FILE_PATH SHOULD NOT SUCCEED WITH LOG FILES
|
|
|
|
--source include/have_innodb.inc
|
|
--source include/no_valgrind_without_big.inc
|
|
|
|
--disable_query_log
|
|
call mtr.add_suppression("InnoDB: Could not create undo tablespace.*undo002");
|
|
call mtr.add_suppression("InnoDB: InnoDB Database creation was aborted");
|
|
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
|
|
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
|
call mtr.add_suppression("InnoDB: Operating system error number \d+ in a file operation");
|
|
call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified");
|
|
call mtr.add_suppression("InnoDB: File /path/to/non-existent/ib_logfile101 was not found");
|
|
call mtr.add_suppression("InnoDB: Cannot create .path.to.non-existent.ib_logfile101");
|
|
call mtr.add_suppression("InnoDB: The data file '.*ibdata1' was not found but one of the other data files '.*ibdata2' exists");
|
|
call mtr.add_suppression("InnoDB: Tablespace size stored in header is \d+ pages, but the sum of data file sizes is \d+ pages");
|
|
call mtr.add_suppression("InnoDB: Cannot start InnoDB. The tail of the system tablespace is missing");
|
|
call mtr.add_suppression("InnoDB: undo tablespace '.*undo001' exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\.");
|
|
call mtr.add_suppression("");
|
|
call mtr.add_suppression("");
|
|
--enable_query_log
|
|
|
|
let bugdir= $MYSQLTEST_VARDIR/tmp/log_file;
|
|
--mkdir $bugdir
|
|
|
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
|
WHERE engine = 'innodb'
|
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|
|
|
let $check_yes_innodb=SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
|
|
WHERE engine='innodb'
|
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|
|
|
--let $ibp=--innodb-log-group-home-dir=$bugdir
|
|
--let $ibp=$ibp --innodb-data-home-dir=$bugdir --innodb-undo-directory=$bugdir
|
|
--let $ibp=$ibp --innodb-undo-logs=20 --innodb-undo-tablespaces=3
|
|
--let $ibp=$ibp --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
|
|
|
--echo # Start mysqld without the possibility to create innodb_undo_tablespaces
|
|
--let $restart_parameters= $ibp
|
|
--mkdir $bugdir/undo002
|
|
--source include/restart_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
let SEARCH_PATTERN=\[ERROR\] InnoDB: Could not create undo tablespace '.*undo002';
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
--echo # Remove undo001,undo002,ibdata1,ibdata2,ib_logfile101
|
|
--remove_file $bugdir/undo001
|
|
--rmdir $bugdir/undo002
|
|
--remove_file $bugdir/ibdata1
|
|
--remove_file $bugdir/ibdata2
|
|
--remove_file $bugdir/ib_logfile101
|
|
--list_files $bugdir
|
|
|
|
--echo # Start mysqld with non existent innodb_log_group_home_dir
|
|
--let $restart_parameters= $ibp --innodb_log_group_home_dir=/path/to/non-existent/
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=Cannot create /path/to/non-existent/ib_logfile101;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
--list_files $bugdir
|
|
|
|
--echo # Successfully let InnoDB create tablespaces
|
|
--let $restart_parameters= $ibp
|
|
--source include/start_mysqld.inc
|
|
eval $check_yes_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
--echo # Backup tmp/logfile/*
|
|
--copy_file $bugdir/ibdata1 $bugdir/bak_ibdata1
|
|
--copy_file $bugdir/ibdata2 $bugdir/bak_ibdata2
|
|
--copy_file $bugdir/ib_logfile0 $bugdir/bak_ib_logfile0
|
|
--copy_file $bugdir/undo001 $bugdir/bak_undo001
|
|
--copy_file $bugdir/undo002 $bugdir/bak_undo002
|
|
--copy_file $bugdir/undo003 $bugdir/bak_undo003
|
|
|
|
--echo # 1. With ibdata2, Without ibdata1
|
|
--remove_file $bugdir/ibdata1
|
|
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=The data file '.*ibdata1' was not found but one of the other data files '.*ibdata2' exists;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 2. With ibdata1, without ibdata2
|
|
--remove_file $bugdir/ibdata2
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=InnoDB: Tablespace size stored in header is \d+ pages, but the sum of data file sizes is \d+ pages;
|
|
--source include/search_pattern_in_file.inc
|
|
let SEARCH_PATTERN=InnoDB: Cannot start InnoDB. The tail of the system tablespace is missing;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 3. Without ibdata1 & ibdata2
|
|
--remove_file $bugdir/ibdata1
|
|
--remove_file $bugdir/ibdata2
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=InnoDB: undo tablespace .*undo001.* exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\.;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 4. Without ibdata*, ib_logfile* and with undo00*
|
|
--remove_files_wildcard $bugdir ibdata*
|
|
--remove_files_wildcard $bugdir ib_logfile*
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 5. Without ibdata*,ib_logfile* files & Without undo002
|
|
--remove_files_wildcard $bugdir ibdata*
|
|
--remove_files_wildcard $bugdir ib_logfile*
|
|
--remove_file $bugdir/undo002
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 6. Without ibdata*,ib_logfile* files & Without undo001, undo002
|
|
# and with undo003
|
|
--remove_files_wildcard $bugdir ibdata*
|
|
--remove_files_wildcard $bugdir ib_logfile*
|
|
--remove_file $bugdir/undo001
|
|
--remove_file $bugdir/undo002
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=undo tablespace .*undo003.* exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\.;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 7. With ibdata files & Without undo002
|
|
--remove_file $bugdir/undo002
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=InnoDB: Failed to open the undo tablespace;
|
|
--source include/search_pattern_in_file.inc
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 8. With ibdata files & Without undo001, undo002
|
|
--remove_file $bugdir/undo001
|
|
--remove_file $bugdir/undo002
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=InnoDB: Failed to open the undo tablespace;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 9. Without ibdata*, without undo*
|
|
--remove_files_wildcard $bugdir ibdata*
|
|
--remove_files_wildcard $bugdir undo00*
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
let SEARCH_PATTERN=redo log file .*ib_logfile0.* exists\. Creating system tablespace with existing redo log file is not recommended\. Please delete redo log file before creating new system tablespace\.;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# clean up & Restore
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 10. With ibdata*, without ib_logfile0
|
|
--remove_file $bugdir/ib_logfile0
|
|
|
|
--source include/start_mysqld.inc
|
|
eval $check_no_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
--source ../include/log_file_cleanup.inc
|
|
|
|
--echo # 11. With ibdata*
|
|
--list_files $bugdir
|
|
--source include/start_mysqld.inc
|
|
eval $check_yes_innodb;
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
--let $restart_parameters=
|
|
--source include/start_mysqld.inc
|
|
|
|
--echo # Cleanup
|
|
--list_files $bugdir
|
|
--remove_files_wildcard $bugdir
|
|
--rmdir $bugdir
|