Skip to content

Commit 0f90728

Browse files
committed
MDEV-16809 Allow full redo logging for ALTER TABLE
Introduce the configuration option innodb_log_optimize_ddl for controlling whether native index creation or table-rebuild in InnoDB should keep optimizing the redo log (and writing MLOG_INDEX_LOAD records to ensure that concurrent backup would fail). By default, we have innodb_log_optimize_ddl=ON, that is, the default behaviour that was introduced in MariaDB 10.2.2 (with the merge of InnoDB from MySQL 5.7) will be unchanged. BtrBulk::m_trx: Replaces m_trx_id. We must be able to check for KILL QUERY even if !m_flush_observer (innodb_log_optimize_ddl=OFF). page_cur_insert_rec_write_log(): Declare globally, so that this can be called from PageBulk::insert(). row_merge_insert_index_tuples(): Remove the unused parameter trx_id. row_merge_build_indexes(): Enable or disable redo logging based on the innodb_log_optimize_ddl parameter. PageBulk::init(), PageBulk::insert(), PageBulk::finish(): Write redo log records if needed. For ROW_FORMAT=COMPRESSED, redo log will be written in PageBulk::compress() unless we called m_mtr.set_log_mode(MTR_LOG_NO_REDO).
1 parent 32eb582 commit 0f90728

File tree

12 files changed

+291
-103
lines changed

12 files changed

+291
-103
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
SET GLOBAL innodb_log_optimize_ddl=OFF;
2+
CREATE TABLE tz(id BIGINT PRIMARY KEY, i INT)
3+
ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
4+
INSERT INTO tz(id) select * from seq_1_to_10000;
5+
CREATE TABLE tr(id BIGINT PRIMARY KEY, i INT)
6+
ENGINE=InnoDB ROW_FORMAT=REDUNDANT;
7+
INSERT INTO tr(id) select * from seq_1_to_10000;
8+
CREATE TABLE td(id BIGINT PRIMARY KEY, i INT)
9+
ENGINE=InnoDB;
10+
INSERT INTO td(id) select * from seq_1_to_10000;
11+
CREATE PROCEDURE a()
12+
BEGIN
13+
ALTER TABLE tz ADD INDEX(i);
14+
ALTER TABLE tr ADD INDEX(i);
15+
ALTER TABLE td ADD INDEX(i);
16+
END //
17+
call a();
18+
# shutdown server
19+
# remove datadir
20+
# xtrabackup move back
21+
# restart server
22+
DROP PROCEDURE a;
23+
CHECK TABLE tz,tr,td;
24+
Table Op Msg_type Msg_text
25+
test.tz check status OK
26+
test.tr check status OK
27+
test.td check status OK
28+
SELECT COUNT(*) FROM tz;
29+
COUNT(*)
30+
10000
31+
SELECT COUNT(*) FROM tr;
32+
COUNT(*)
33+
10000
34+
SELECT COUNT(*) FROM td;
35+
COUNT(*)
36+
10000
37+
DROP TABLE tz,tr,td;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# see unsupported_redo.test for the opposite (default) case
2+
--source include/have_innodb.inc
3+
--source include/have_sequence.inc
4+
5+
SET GLOBAL innodb_log_optimize_ddl=OFF;
6+
7+
CREATE TABLE tz(id BIGINT PRIMARY KEY, i INT)
8+
ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
9+
INSERT INTO tz(id) select * from seq_1_to_10000;
10+
CREATE TABLE tr(id BIGINT PRIMARY KEY, i INT)
11+
ENGINE=InnoDB ROW_FORMAT=REDUNDANT;
12+
INSERT INTO tr(id) select * from seq_1_to_10000;
13+
CREATE TABLE td(id BIGINT PRIMARY KEY, i INT)
14+
ENGINE=InnoDB;
15+
INSERT INTO td(id) select * from seq_1_to_10000;
16+
17+
DELIMITER //;
18+
CREATE PROCEDURE a()
19+
BEGIN
20+
ALTER TABLE tz ADD INDEX(i);
21+
ALTER TABLE tr ADD INDEX(i);
22+
ALTER TABLE td ADD INDEX(i);
23+
END //
24+
DELIMITER ;//
25+
26+
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
27+
28+
send call a();
29+
30+
--disable_result_log
31+
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
32+
--enable_result_log
33+
exec $XTRABACKUP --prepare --target-dir=$targetdir;
34+
35+
reap;
36+
37+
-- source include/restart_and_restore.inc
38+
--rmdir $targetdir
39+
40+
DROP PROCEDURE a;
41+
42+
CHECK TABLE tz,tr,td;
43+
SELECT COUNT(*) FROM tz;
44+
SELECT COUNT(*) FROM tr;
45+
SELECT COUNT(*) FROM td;
46+
47+
DROP TABLE tz,tr,td;

mysql-test/suite/sys_vars/r/sysvars_innodb.result

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,6 +1798,20 @@ NUMERIC_BLOCK_SIZE NULL
17981798
ENUM_VALUE_LIST NULL
17991799
READ_ONLY YES
18001800
COMMAND_LINE_ARGUMENT REQUIRED
1801+
VARIABLE_NAME INNODB_LOG_OPTIMIZE_DDL
1802+
SESSION_VALUE NULL
1803+
GLOBAL_VALUE ON
1804+
GLOBAL_VALUE_ORIGIN COMPILE-TIME
1805+
DEFAULT_VALUE ON
1806+
VARIABLE_SCOPE GLOBAL
1807+
VARIABLE_TYPE BOOLEAN
1808+
VARIABLE_COMMENT Reduce redo logging when natively creating indexes or rebuilding tables. Setting this OFF avoids delay due to page flushing and allows concurrent backup.
1809+
NUMERIC_MIN_VALUE NULL
1810+
NUMERIC_MAX_VALUE NULL
1811+
NUMERIC_BLOCK_SIZE NULL
1812+
ENUM_VALUE_LIST OFF,ON
1813+
READ_ONLY NO
1814+
COMMAND_LINE_ARGUMENT OPTIONAL
18011815
VARIABLE_NAME INNODB_LOG_WRITE_AHEAD_SIZE
18021816
SESSION_VALUE NULL
18031817
GLOBAL_VALUE 8192

0 commit comments

Comments
 (0)