Browse Source
MDEV-16809 Allow full redo logging for ALTER TABLE
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).pull/829/merge
12 changed files with 291 additions and 103 deletions
-
37mysql-test/suite/mariabackup/innodb_log_optimize_ddl.result
-
47mysql-test/suite/mariabackup/innodb_log_optimize_ddl.test
-
14mysql-test/suite/sys_vars/r/sysvars_innodb.result
-
159storage/innobase/btr/btr0bulk.cc
-
10storage/innobase/buf/buf0flu.cc
-
8storage/innobase/handler/ha_innodb.cc
-
29storage/innobase/include/btr0bulk.h
-
7storage/innobase/include/buf0flu.h
-
15storage/innobase/include/page0cur.h
-
22storage/innobase/page/page0cur.cc
-
7storage/innobase/row/row0ftsort.cc
-
39storage/innobase/row/row0merge.cc
@ -0,0 +1,37 @@ |
|||
SET GLOBAL innodb_log_optimize_ddl=OFF; |
|||
CREATE TABLE tz(id BIGINT PRIMARY KEY, i INT) |
|||
ENGINE=InnoDB ROW_FORMAT=COMPRESSED; |
|||
INSERT INTO tz(id) select * from seq_1_to_10000; |
|||
CREATE TABLE tr(id BIGINT PRIMARY KEY, i INT) |
|||
ENGINE=InnoDB ROW_FORMAT=REDUNDANT; |
|||
INSERT INTO tr(id) select * from seq_1_to_10000; |
|||
CREATE TABLE td(id BIGINT PRIMARY KEY, i INT) |
|||
ENGINE=InnoDB; |
|||
INSERT INTO td(id) select * from seq_1_to_10000; |
|||
CREATE PROCEDURE a() |
|||
BEGIN |
|||
ALTER TABLE tz ADD INDEX(i); |
|||
ALTER TABLE tr ADD INDEX(i); |
|||
ALTER TABLE td ADD INDEX(i); |
|||
END // |
|||
call a(); |
|||
# shutdown server |
|||
# remove datadir |
|||
# xtrabackup move back |
|||
# restart server |
|||
DROP PROCEDURE a; |
|||
CHECK TABLE tz,tr,td; |
|||
Table Op Msg_type Msg_text |
|||
test.tz check status OK |
|||
test.tr check status OK |
|||
test.td check status OK |
|||
SELECT COUNT(*) FROM tz; |
|||
COUNT(*) |
|||
10000 |
|||
SELECT COUNT(*) FROM tr; |
|||
COUNT(*) |
|||
10000 |
|||
SELECT COUNT(*) FROM td; |
|||
COUNT(*) |
|||
10000 |
|||
DROP TABLE tz,tr,td; |
@ -0,0 +1,47 @@ |
|||
# see unsupported_redo.test for the opposite (default) case |
|||
--source include/have_innodb.inc |
|||
--source include/have_sequence.inc |
|||
|
|||
SET GLOBAL innodb_log_optimize_ddl=OFF; |
|||
|
|||
CREATE TABLE tz(id BIGINT PRIMARY KEY, i INT) |
|||
ENGINE=InnoDB ROW_FORMAT=COMPRESSED; |
|||
INSERT INTO tz(id) select * from seq_1_to_10000; |
|||
CREATE TABLE tr(id BIGINT PRIMARY KEY, i INT) |
|||
ENGINE=InnoDB ROW_FORMAT=REDUNDANT; |
|||
INSERT INTO tr(id) select * from seq_1_to_10000; |
|||
CREATE TABLE td(id BIGINT PRIMARY KEY, i INT) |
|||
ENGINE=InnoDB; |
|||
INSERT INTO td(id) select * from seq_1_to_10000; |
|||
|
|||
DELIMITER //; |
|||
CREATE PROCEDURE a() |
|||
BEGIN |
|||
ALTER TABLE tz ADD INDEX(i); |
|||
ALTER TABLE tr ADD INDEX(i); |
|||
ALTER TABLE td ADD INDEX(i); |
|||
END // |
|||
DELIMITER ;// |
|||
|
|||
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; |
|||
|
|||
send call a(); |
|||
|
|||
--disable_result_log |
|||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; |
|||
--enable_result_log |
|||
exec $XTRABACKUP --prepare --target-dir=$targetdir; |
|||
|
|||
reap; |
|||
|
|||
-- source include/restart_and_restore.inc |
|||
--rmdir $targetdir |
|||
|
|||
DROP PROCEDURE a; |
|||
|
|||
CHECK TABLE tz,tr,td; |
|||
SELECT COUNT(*) FROM tz; |
|||
SELECT COUNT(*) FROM tr; |
|||
SELECT COUNT(*) FROM td; |
|||
|
|||
DROP TABLE tz,tr,td; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue