mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Follow-up to MDEV-13407 innodb.drop_table_background failed in buildbot with "Tablespace for table exists"
The InnoDB background DROP TABLE queue is something that we should really remove, but are unable to until we remove dict_operation_lock so that DDL and DML operations can be combined in a single transaction. Because the queue is not persistent, it is not crash-safe. We should in some way ensure that the deferred-dropped tables will be dropped after server restart. The existence of two separate transactions complicates the error handling of CREATE TABLE...SELECT. We should really not break locks in DROP TABLE. Our solution to these problems is to rename the table to a temporary name, and to drop such-named tables on InnoDB startup. Also, the queue will use table IDs instead of names from now on. check-testcase.test: Ignore #sql-ib*.ibd files, because tables may enter the background DROP TABLE queue shortly before the test finishes. innodb.drop_table_background: Test CREATE...SELECT and the creation of tables whose file name starts with #sql-ib. innodb.alter_crash: Adjust the recovery, now that the #sql-ib tables will be dropped on InnoDB startup. row_mysql_drop_garbage_tables(): New function, to drop all #sql-ib tables on InnoDB startup. row_drop_table_for_mysql_in_background(): Remove an unnecessary and misplaced call to log_buffer_flush_to_disk(). (The call should have been after the transaction commit. We do not care about flushing the redo log here, because the table would be dropped again at server startup.) Remove the entry from the list after the table no longer exists. If server shutdown has been initiated, empty the list without actually dropping any tables. They will be dropped again on startup. row_drop_table_for_mysql(): Do not call lock_remove_all_on_table(). Instead, if locks exist, defer the DROP TABLE until they do not exist. If the table name does not start with #sql-ib, rename it to that prefix before adding it to the background DROP TABLE queue.
This commit is contained in:
@@ -44,10 +44,9 @@ SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit';
|
||||
ALTER TABLE t1 ADD PRIMARY KEY (f2, f1);
|
||||
ERROR HY000: Lost connection to MySQL server during query
|
||||
# Restart mysqld after the crash and reconnect.
|
||||
# Manual *.frm recovery begin.
|
||||
# Manual recovery end
|
||||
FLUSH TABLES;
|
||||
# Drop the orphaned original table.
|
||||
SELECT * FROM information_schema.innodb_sys_tables
|
||||
WHERE table_id = ID;
|
||||
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
|
||||
# Files in datadir after manual recovery.
|
||||
t1.frm
|
||||
t1.ibd
|
||||
@@ -83,11 +82,9 @@ SET DEBUG_DBUG='+d,innodb_alter_commit_crash_before_commit';
|
||||
ALTER TABLE t2 ADD PRIMARY KEY (f2, f1);
|
||||
ERROR HY000: Lost connection to MySQL server during query
|
||||
# Startup the server after the crash
|
||||
# Read and remember the temporary table name
|
||||
# Manual *.frm recovery begin. The dictionary was not updated
|
||||
# and the files were not renamed. The rebuilt table
|
||||
# was left behind on purpose, to faciliate data recovery.
|
||||
# Manual recovery end
|
||||
SELECT * FROM information_schema.innodb_sys_tables
|
||||
WHERE name LIKE 'test/#sql-ib%';
|
||||
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
|
||||
# Drop the orphaned rebuilt table.
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
@@ -123,10 +120,10 @@ SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit';
|
||||
ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE;
|
||||
ERROR HY000: Lost connection to MySQL server during query
|
||||
# Restart mysqld after the crash and reconnect.
|
||||
# Manual *.frm recovery begin.
|
||||
# Manual recovery end
|
||||
SELECT * FROM information_schema.innodb_sys_tables
|
||||
WHERE table_id = ID;
|
||||
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
|
||||
FLUSH TABLES;
|
||||
# Drop the orphaned original table.
|
||||
# Files in datadir after manual recovery.
|
||||
t1.frm
|
||||
t1.ibd
|
||||
|
Reference in New Issue
Block a user