mirror of
https://github.com/MariaDB/server.git
synced 2025-07-21 21:22:27 +03:00
While MariaDB Server 10.2 is not really guaranteed to be compatible with Percona XtraBackup 2.4 (for example, the MySQL 5.7 undo log format change that could be present in XtraBackup, but was reverted from MariaDB in MDEV-12289), we do not want to disrupt users who have deployed xtrabackup and MariaDB Server 10.2 in their environments. With this change, MariaDB 10.2 will continue to use the backup-unsafe TRUNCATE TABLE code, so that neither the undo log nor the redo log formats will change in an incompatible way. Undo tablespace truncation will keep using the redo log only. Recovery or backup with old code will fail to shrink the undo tablespace files, but the contents will be recovered just fine. In the MariaDB Server 10.2 series only, we introduce the configuration parameter innodb_unsafe_truncate and make it ON by default. To allow MariaDB Backup (mariabackup) to work properly with TRUNCATE TABLE operations, use loose_innodb_unsafe_truncate=OFF. MariaDB Server 10.3.10 and later releases will always use the backup-safe TRUNCATE TABLE, and this parameter will not be added there. recv_recovery_rollback_active(): Skip row_mysql_drop_garbage_tables() unless innodb_unsafe_truncate=OFF. It is too unsafe to drop orphan tables if RENAME operations are not transactional within InnoDB. LOG_HEADER_FORMAT_10_3: Replaces LOG_HEADER_FORMAT_CURRENT. log_init(), log_group_file_header_flush(), srv_prepare_to_delete_redo_log_files(), innobase_start_or_create_for_mysql(): Choose the redo log format and subformat based on the value of innodb_unsafe_truncate.
89 lines
3.4 KiB
Plaintext
89 lines
3.4 KiB
Plaintext
#
|
|
# Bug #23070734 CONCURRENT TRUNCATE TABLES CAUSE STALLS
|
|
#
|
|
SET @ahi= @@global.innodb_adaptive_hash_index;
|
|
SET GLOBAL innodb_adaptive_hash_index=OFF;
|
|
SET GLOBAL innodb_adaptive_hash_index=ON;
|
|
Test_1 :- Check if DDL operations are possible on
|
|
table being truncated. Also check if
|
|
DDL operations on other tables succeed.
|
|
create table t1 (f1 int,f2 int,key(f2),f3 int) engine=innodb;
|
|
create index idx1 on t1(f3);
|
|
create table t2 (f1 int,f2 int,key(f2),f3 int) engine=innodb;
|
|
create table t3 (f1 int,f2 int,key(f2)) engine=innodb;
|
|
insert into t1 values (10,20,30),(30,40,50),(50,60,70);
|
|
insert into t1 select * from t1;
|
|
insert into t1 select * from t1;
|
|
insert into t1 select * from t1;
|
|
insert into t2 values (10,20,30),(30,40,50),(50,60,70);
|
|
insert into t2 select * from t2;
|
|
insert into t2 select * from t2;
|
|
insert into t2 select * from t2;
|
|
insert into t3 values (10,20),(30,40),(50,50);
|
|
insert into t3 select * from t3;
|
|
insert into t3 select * from t3;
|
|
SET session lock_wait_timeout = 1;
|
|
connect con1,localhost,root,,;
|
|
SET DEBUG_SYNC= 'buffer_pool_scan SIGNAL started WAIT_FOR finish_scan';
|
|
truncate table t1;
|
|
connection default;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR started';
|
|
Check Analyze table. Gives lock time out error.
|
|
analyze table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze Error Lock wait timeout exceeded; try restarting transaction
|
|
test.t1 analyze status Operation failed
|
|
Check if we can turn off auto recalculation.
|
|
alter table t1 STATS_AUTO_RECALC=0;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
Check if we can turn off persistent stats on the table
|
|
alter table t1 STATS_PERSISTENT=0;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
Check if DML is possible on table being truncated
|
|
insert into t1 values (10,89,99);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
Check if DDL is possible on table being truncated
|
|
alter table t1 add column f4 int;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
check if table can be created with the same name
|
|
create table t1 (bd int) engine=innodb;
|
|
Got one of the listed errors
|
|
check if index can be created on table being truncated
|
|
create index idx1 on t1(f1);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
Check if DROP of table is possible during truncate
|
|
drop table t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
Check if select is possible during truncate
|
|
select * from t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
select * from t2 where t2.f1=t1.f1;
|
|
ERROR 42S22: Unknown column 't1.f1' in 'where clause'
|
|
Check concurrent truncate operation on table;
|
|
truncate table t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
Check concurrent selects and inserts on the other table
|
|
insert into t3 values (10,20),(30,40),(50,50);
|
|
select * from t3 where f1=40;
|
|
f1 f2
|
|
Concurrent truncate on other tables
|
|
truncate table t2;
|
|
Concurrent alters on the other tables
|
|
alter table t2 add column f4 int;
|
|
check if index can be created on the other table
|
|
create index idx1 on t2(f3);
|
|
Check if we can turn off persistent stats off entire instance
|
|
SET GLOBAL innodb_stats_persistent=off;
|
|
connect con2,localhost,root,,;
|
|
set global innodb_adaptive_hash_index=off;
|
|
connection default;
|
|
SET DEBUG_SYNC= 'now SIGNAL finish_scan';
|
|
connection con1;
|
|
disconnect con1;
|
|
connection con2;
|
|
disconnect con2;
|
|
connection default;
|
|
SET DEBUG_SYNC= 'RESET';
|
|
SET GLOBAL innodb_adaptive_hash_index=@ahi;
|
|
drop table t1,t2,t3;
|