polardbxengine/mysql-test/suite/innodb_undo/t/undo_settings.test

457 lines
16 KiB
Plaintext

--echo # This test changes undo related settings both at runtime, between restarts,
--echo # and also after crashes.
--echo # Note that innodb_undo_tablespaces is now fixed at 2 so only
--echo # innodb_rollback_segments is tested here.
--source include/have_innodb_default_undo_tablespaces.inc
SET DEFAULT_STORAGE_ENGINE=InnoDB;
let MYSQLD_DATADIR=`select @@datadir`;
let PAGE_SIZE=`select @@innodb_page_size`;
let ORIG_ROLLBACK_SEGMENTS=`select @@innodb_rollback_segments`;
SET GLOBAL innodb_monitor_enable='module_buffer_page';
SET GLOBAL innodb_monitor_enable='trx_rseg_current_size';
--echo #
--echo # Create tables and check the default values.
--echo #
CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd';
CREATE TABLE t1 (a INT, b TEXT) TABLESPACE=`ts1`;
CREATE TABLE t2 (a INT, b TEXT) TABLESPACE=`innodb_system`;
CREATE TABLE t3 (a INT, b TEXT) TABLESPACE=`innodb_file_per_table`;
connect (con1,localhost,root);
--echo # Connection 1
INSERT INTO t1 VALUES (1, repeat('a',15));
INSERT INTO t2 VALUES (1, repeat('a',15));
INSERT INTO t3 VALUES (1, repeat('a',15));
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
connect (con2,localhost,root);
--echo # Connection 2
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
XA START 'x1';
INSERT INTO t1 VALUES (101, repeat('x1 ',5));
INSERT INTO t2 VALUES (101, repeat('x1 ',5));
INSERT INTO t3 VALUES (101, repeat('x1 ',5));
connection default;
--echo # Connection default
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
--echo #
--echo # Change number of UNDO tablespaces from 2 to 3 while online.
--echo #
CREATE UNDO TABLESPACE `undo_003` ADD DATAFILE 'undo_003.ibu';
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
connection con1;
--echo # Connection 1
BEGIN;
INSERT INTO t1 VALUES (2, repeat('b',15));
INSERT INTO t2 VALUES (2, repeat('b',15));
INSERT INTO t3 VALUES (2, repeat('b',15));
connection con2;
--echo # Connection 2
XA END 'x1';
XA PREPARE 'x1';
XA COMMIT 'x1';
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
XA START 'x2';
INSERT INTO t1 VALUES (102, repeat('x2 ',5));
INSERT INTO t2 VALUES (102, repeat('x2 ',5));
INSERT INTO t3 VALUES (102, repeat('x2 ',5));
XA END 'x2';
connection default;
--echo # Connection default
--echo #
--echo # Change number of UNDO tablespaces from 3 to 4 while online.
--echo # Change number of Rollback Segments from 1 to 4 while online.
--echo #
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SET GLOBAL innodb_rollback_segments=4;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
CREATE UNDO TABLESPACE `undo_004` ADD DATAFILE 'undo_004.ibu';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
connection con1;
--echo # Connection 1
COMMIT;
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
INSERT INTO t1 VALUES (3, repeat('c',15));
INSERT INTO t2 VALUES (3, repeat('c',15));
INSERT INTO t3 VALUES (3, repeat('c',15));
connection con2;
--echo # Connection 2
XA PREPARE 'x2';
XA COMMIT 'x2';
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
XA START 'x3';
INSERT INTO t1 VALUES (103, repeat('x3 ',5));
INSERT INTO t2 VALUES (103, repeat('x3 ',5));
INSERT INTO t3 VALUES (103, repeat('x3 ',5));
XA END 'x3';
XA PREPARE 'x3';
XA COMMIT 'x3';
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
connection default;
--echo # Connection default
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Change number of active UNDO tablespaces from 4 to 2 while online.
--echo # Change number of Rollback Segments from 4 to 2 while online.
--echo #
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SET GLOBAL innodb_rollback_segments=2;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
ALTER UNDO TABLESPACE `undo_003` SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE `undo_004` SET INACTIVE;
let $inactive_undo_space = undo_004;
source include/wait_until_undo_space_is_empty.inc;
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
INSERT INTO t1 VALUES (4, repeat('d',15));
INSERT INTO t2 VALUES (4, repeat('d',15));
INSERT INTO t3 VALUES (4, repeat('d',15));
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Change number of UNDO tablespaces from 2 to 5 while online.
--echo # Change number of Rollback Segments from 2 to 5 while online.
--echo #
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SET GLOBAL innodb_rollback_segments=5;
ALTER UNDO TABLESPACE `undo_003` SET ACTIVE;
ALTER UNDO TABLESPACE `undo_004` SET ACTIVE;
CREATE UNDO TABLESPACE `undo_005` ADD DATAFILE 'undo_005.ibu';
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
connection con1;
--echo # Connection 1
INSERT INTO t1 VALUES (5, repeat('e',15));
INSERT INTO t2 VALUES (5, repeat('e',15));
INSERT INTO t3 VALUES (5, repeat('e',15));
connection default;
--echo # Connection default
disconnect con1;
disconnect con2;
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Shutdown mysqld cleanly.
--echo # Delete one of the implicit UNDO tablespaces.
--echo # Change number of Rollback Segments from 5 to 6 while offline.
--echo # Restart mysqld with these larger settings.
--echo #
--source include/shutdown_mysqld.inc
--remove_file $MYSQLD_DATADIR/undo_001
let $restart_parameters = restart: --innodb_rollback_segments=6;
--source include/start_mysqld.inc
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
--echo #
--echo # Shutdown mysqld cleanly.
--echo # Change number of Rollback Segments from 6 to 4 while offline.
--echo # Restart mysqld with these smaller settings.
--echo #
ALTER UNDO TABLESPACE `undo_003` SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
--source include/shutdown_mysqld.inc
let $restart_parameters = restart: --innodb_rollback_segments=4;
--source include/start_mysqld.inc
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
--echo #
--echo # Kill and restart mysqld with one less active undo tablespace
--echo # and less rollback segments=2.
--echo #
ALTER UNDO TABLESPACE `undo_004` SET INACTIVE;
let $inactive_undo_space = undo_004;
source include/wait_until_undo_space_is_empty.inc;
connect (con1,localhost,root);
--echo # Connection 1
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
BEGIN;
INSERT INTO t1 VALUES (6, repeat('f',15));
INSERT INTO t2 VALUES (6, repeat('f',15));
INSERT INTO t3 VALUES (6, repeat('f',15));
--echo # Connection default
connection default;
let $restart_parameters = restart: --innodb_rollback_segments=2;
--source include/kill_and_restart_mysqld.inc
disconnect con1;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Kill and restart mysqld with more undo tablespaces=6 and more rollback segments=7.
--echo #
connect (con1,localhost,root);
--echo # Connection 1
BEGIN;
INSERT INTO t1 VALUES (7, repeat('g',15));
INSERT INTO t2 VALUES (7, repeat('g',15));
INSERT INTO t3 VALUES (7, repeat('g',15));
connection default;
--echo # Connection default
ALTER UNDO TABLESPACE `undo_003` SET ACTIVE;
ALTER UNDO TABLESPACE `undo_004` SET ACTIVE;
CREATE UNDO TABLESPACE `undo_006` ADD DATAFILE 'undo_006.ibu';
SHOW WARNINGS;
let $restart_parameters = restart: --innodb_rollback_segments=7;
--source include/kill_and_restart_mysqld.inc
disconnect con1;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Restart mysqld in read-only mode with more rollback segments=8.
--echo #
connect (con1,localhost,root);
--echo # Connection 1
INSERT INTO t1 VALUES (8, repeat('h',15));
INSERT INTO t2 VALUES (8, repeat('h',15));
INSERT INTO t3 VALUES (8, repeat('h',15));
connection default;
--echo # Connection default
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
let $restart_parameters = restart: --innodb_read_only --innodb_rollback_segments=8;
--source include/restart_mysqld.inc
disconnect con1;
--error ER_READ_ONLY_MODE
CREATE UNDO TABLESPACE `undo_007` ADD DATAFILE 'undo_007.ibu';
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
SET GLOBAL innodb_rollback_segments=8;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SET GLOBAL innodb_rollback_segments=3;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Restart mysqld in force_recovery mode with more rollback segments=8.
--echo #
let $restart_parameters = restart: --innodb_force_recovery=1 --innodb_rollback_segments=8;
--source include/restart_mysqld.inc
--error ER_INNODB_READ_ONLY
CREATE UNDO TABLESPACE `undo_007` ADD DATAFILE 'undo_007.ibu';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SET GLOBAL innodb_rollback_segments=8;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SET GLOBAL innodb_rollback_segments=3;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Use SET PERSIST to change rollback segments=11
--echo # and make some undo logs that must be rolled back on restart.
--echo #
let $restart_parameters = restart: --innodb_rollback_segments=8;
--source include/restart_mysqld.inc
BEGIN;
INSERT INTO t1 VALUES (9, repeat('i',15));
INSERT INTO t2 VALUES (9, repeat('i',15));
INSERT INTO t3 VALUES (9, repeat('i',15));
SET PERSIST innodb_rollback_segments=11;
SHOW VARIABLES LIKE 'innodb_rollback_segments';
INSERT INTO t1 VALUES (10, repeat('j',15));
INSERT INTO t2 VALUES (10, repeat('j',15));
INSERT INTO t3 VALUES (10, repeat('j',15));
--echo #
--echo # Restart in normal mode with default undo tablespaces and rollback segments.
--echo # The persisted settings will be set just after startup.
--echo #
let $restart_parameters = restart;
--source include/restart_mysqld.inc
SHOW VARIABLES LIKE 'innodb_rollback_segments';
SHOW GLOBAL STATUS LIKE '%undo%';
SELECT NAME, ROW_FORMAT, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE name LIKE '%undo%' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Directory listing of UNDO tablespace files
--list_files $MYSQLD_DATADIR undo_0*
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
INSERT INTO t1 VALUES (11, repeat('k',15));
INSERT INTO t2 VALUES (11, repeat('k',15));
INSERT INTO t3 VALUES (11, repeat('k',15));
SELECT * FROM t1 ORDER BY a;
SELECT COUNT(*) FROM t2;
SELECT COUNT(*) FROM t3;
--echo #
--echo # Cleanup
--echo #
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLESPACE ts1;
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
ALTER UNDO TABLESPACE undo_004 SET INACTIVE;
ALTER UNDO TABLESPACE undo_005 SET INACTIVE;
ALTER UNDO TABLESPACE undo_006 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
let $inactive_undo_space = undo_004;
source include/wait_until_undo_space_is_empty.inc;
let $inactive_undo_space = undo_005;
source include/wait_until_undo_space_is_empty.inc;
let $inactive_undo_space = undo_006;
source include/wait_until_undo_space_is_empty.inc;
DROP UNDO TABLESPACE undo_003;
DROP UNDO TABLESPACE undo_004;
DROP UNDO TABLESPACE undo_005;
DROP UNDO TABLESPACE undo_006;
SET PERSIST innodb_rollback_segments=default;
SET GLOBAL innodb_fast_shutdown=0;
--source include/shutdown_mysqld.inc
--remove_files_wildcard $MYSQLD_DATADIR undo_0*
let $restart_parameters = restart: --innodb_rollback_segments=$ORIG_ROLLBACK_SEGMENTS;
--source include/start_mysqld.inc
--disable_query_log
call mtr.add_suppression("Skip re-populating collations and character sets tables in InnoDB read-only mode");
call mtr.add_suppression("\\[Warning\\].*Cannot set innodb_rollback_segments to [8,3] when in read-only mode");
call mtr.add_suppression("\\[Warning\\].*Cannot set innodb_rollback_segments to [8,3] when in innodb_force_recovery > 0");
call mtr.add_suppression("\\[Warning\\].*Skip updating information_schema metadata in InnoDB read-only mode");
call mtr.add_suppression("\\[Warning\\].*Skipped updating resource group metadata in InnoDB read only mode.");
call mtr.add_suppression("\\[Warning\\].*Doublewrite page .* could not be restored. File name unknown for tablespace ID");
--enable_query_log