1
0
mirror of https://github.com/MariaDB/server.git synced 2025-09-03 20:43:11 +03:00

MDEV-13564 Mariabackup does not work with TRUNCATE

Implement undo tablespace truncation via normal redo logging.

Implement TRUNCATE TABLE as a combination of RENAME to #sql-ib name,
CREATE, and DROP.

Note: Orphan #sql-ib*.ibd may be left behind if MariaDB Server 10.2
is killed before the DROP operation is committed. If MariaDB Server 10.2
is killed during TRUNCATE, it is also possible that the old table
was renamed to #sql-ib*.ibd but the data dictionary will refer to the
table using the original name.

In MariaDB Server 10.3, RENAME inside InnoDB is transactional,
and #sql-* tables will be dropped on startup. So, this new TRUNCATE
will be fully crash-safe in 10.3.

ha_mroonga::wrapper_truncate(): Pass table options to the underlying
storage engine, now that ha_innobase::truncate() will need them.

rpl_slave_state::truncate_state_table(): Before truncating
mysql.gtid_slave_pos, evict any cached table handles from
the table definition cache, so that there will be no stale
references to the old table after truncating.

== TRUNCATE TABLE ==

WL#6501 in MySQL 5.7 introduced separate log files for implementing
atomic and crash-safe TRUNCATE TABLE, instead of using the InnoDB
undo and redo log. Some convoluted logic was added to the InnoDB
crash recovery, and some extra synchronization (including a redo log
checkpoint) was introduced to make this work. This synchronization
has caused performance problems and race conditions, and the extra
log files cannot be copied or applied by external backup programs.

In order to support crash-upgrade from MariaDB 10.2, we will keep
the logic for parsing and applying the extra log files, but we will
no longer generate those files in TRUNCATE TABLE.

A prerequisite for crash-safe TRUNCATE is a crash-safe RENAME TABLE
(with full redo and undo logging and proper rollback). This will
be implemented in MDEV-14717.

ha_innobase::truncate(): Invoke RENAME, create(), delete_table().
Because RENAME cannot be fully rolled back before MariaDB 10.3
due to missing undo logging, add some explicit rename-back in
case the operation fails.

ha_innobase::delete(): Introduce a variant that takes sqlcom as
a parameter. In TRUNCATE TABLE, we do not want to touch any
FOREIGN KEY constraints.

ha_innobase::create(): Add the parameters file_per_table, trx.
In TRUNCATE, the new table must be created in the same transaction
that renames the old table.

create_table_info_t::create_table_info_t(): Add the parameters
file_per_table, trx.

row_drop_table_for_mysql(): Replace a bool parameter with sqlcom.

row_drop_table_after_create_fail(): New function, wrapping
row_drop_table_for_mysql().

dict_truncate_index_tree_in_mem(), fil_truncate_tablespace(),
fil_prepare_for_truncate(), fil_reinit_space_header_for_table(),
row_truncate_table_for_mysql(), TruncateLogger,
row_truncate_prepare(), row_truncate_rollback(),
row_truncate_complete(), row_truncate_fts(),
row_truncate_update_system_tables(),
row_truncate_foreign_key_checks(), row_truncate_sanity_checks():
Remove.

row_upd_check_references_constraints(): Remove a check for
TRUNCATE, now that the table is no longer truncated in place.

The new test innodb.truncate_foreign uses DEBUG_SYNC to cover some
race-condition like scenarios. The test innodb-innodb.truncate does
not use any synchronization.

We add a redo log subformat to indicate backup-friendly format.
MariaDB 10.4 will remove support for the old TRUNCATE logging,
so crash-upgrade from old 10.2 or 10.3 to 10.4 will involve
limitations.

== Undo tablespace truncation ==

MySQL 5.7 implements undo tablespace truncation. It is only
possible when innodb_undo_tablespaces is set to at least 2.
The logging is implemented similar to the WL#6501 TRUNCATE,
that is, using separate log files and a redo log checkpoint.

We can simply implement undo tablespace truncation within
a single mini-transaction that reinitializes the undo log
tablespace file. Unfortunately, due to the redo log format
of some operations, currently, the total redo log written by
undo tablespace truncation will be more than the combined size
of the truncated undo tablespace. It should be acceptable
to have a little more than 1 megabyte of log in a single
mini-transaction. This will be fixed in MDEV-17138 in
MariaDB Server 10.4.

recv_sys_t: Add truncated_undo_spaces[] to remember for which undo
tablespaces a MLOG_FILE_CREATE2 record was seen.

namespace undo: Remove some unnecessary declarations.

fil_space_t::is_being_truncated: Document that this flag now
only applies to undo tablespaces. Remove some references.

fil_space_t::is_stopping(): Do not refer to is_being_truncated.
This check is for tablespaces of tables. Potentially used
tablespaces are never truncated any more.

buf_dblwr_process(): Suppress the out-of-bounds warning
for undo tablespaces.

fil_truncate_log(): Write a MLOG_FILE_CREATE2 with a nonzero
page number (new size of the tablespace in pages) to inform
crash recovery that the undo tablespace size has been reduced.

fil_op_write_log(): Relax assertions, so that MLOG_FILE_CREATE2
can be written for undo tablespaces (without .ibd file suffix)
for a nonzero page number.

os_file_truncate(): Add the parameter allow_shrink=false
so that undo tablespaces can actually be shrunk using this function.

fil_name_parse(): For undo tablespace truncation,
buffer MLOG_FILE_CREATE2 in truncated_undo_spaces[].

recv_read_in_area(): Avoid reading pages for which no redo log
records remain buffered, after recv_addr_trim() removed them.

trx_rseg_header_create(): Add a FIXME comment that we could write
much less redo log.

trx_undo_truncate_tablespace(): Reinitialize the undo tablespace
in a single mini-transaction, which will be flushed to the redo log
before the file size is trimmed.

recv_addr_trim(): Discard any redo logs for pages that were
logged after the new end of a file, before the truncation LSN.
If the rec_list becomes empty, reduce n_addrs. After removing
any affected records, actually truncate the file.

recv_apply_hashed_log_recs(): Invoke recv_addr_trim() right before
applying any log records. The undo tablespace files must be open
at this point.

buf_flush_or_remove_pages(), buf_flush_dirty_pages(),
buf_LRU_flush_or_remove_pages(): Add a parameter for specifying
the number of the first page to flush or remove (default 0).

trx_purge_initiate_truncate(): Remove the log checkpoints, the
extra logging, and some unnecessary crash points. Merge the code
from trx_undo_truncate_tablespace(). First, flush all to-be-discarded
pages (beyond the new end of the file), then trim the space->size
to make the page allocation deterministic. At the only remaining
crash injection point, flush the redo log, so that the recovery
can be tested.
This commit is contained in:
Marko Mäkelä
2018-08-28 13:43:06 +03:00
parent 59950df533
commit 055a3334ad
83 changed files with 907 additions and 6947 deletions

View File

@@ -4188,6 +4188,7 @@ reread_log_header:
byte MY_ALIGNED(OS_FILE_LOG_BLOCK_SIZE) log_hdr[OS_FILE_LOG_BLOCK_SIZE];
memset(log_hdr, 0, sizeof log_hdr);
mach_write_to_4(LOG_HEADER_FORMAT + log_hdr, log_sys->log.format);
mach_write_to_4(LOG_HEADER_SUBFORMAT + log_hdr, 1);
mach_write_to_8(LOG_HEADER_START_LSN + log_hdr, checkpoint_lsn_start);
strcpy(reinterpret_cast<char*>(LOG_HEADER_CREATOR + log_hdr),
"Backup " MYSQL_SERVER_VERSION);

View File

@@ -191,22 +191,18 @@ connection default;
COMMIT;
connect truncate,localhost,root,,;
REPLACE INTO t1(pk, y) SELECT pk,y FROM t1;
SET DEBUG_SYNC='row_trunc_before_dict_lock SIGNAL commit WAIT_FOR release';
TRUNCATE TABLE t1;
connection prevent_purge;
SET DEBUG_SYNC='now WAIT_FOR commit';
COMMIT;
SET DEBUG_SYNC='now SIGNAL purge_start';
disconnect prevent_purge;
connection default;
SET DEBUG_SYNC='now WAIT_FOR purge_start';
InnoDB 1 transactions not purged
SET DEBUG_SYNC='now SIGNAL release';
InnoDB 0 transactions not purged
SET GLOBAL debug_dbug=@old_dbug;
connection truncate;
disconnect truncate;
connection default;
InnoDB 0 transactions not purged
DROP TABLE t1, t2;
set debug_sync=reset;
SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;

View File

@@ -240,21 +240,16 @@ COMMIT;
connect(truncate,localhost,root,,);
REPLACE INTO t1(pk, y) SELECT pk,y FROM t1;
SET DEBUG_SYNC='row_trunc_before_dict_lock SIGNAL commit WAIT_FOR release';
send TRUNCATE TABLE t1;
connection prevent_purge;
SET DEBUG_SYNC='now WAIT_FOR commit';
COMMIT;
SET DEBUG_SYNC='now SIGNAL purge_start';
disconnect prevent_purge;
connection default;
SET DEBUG_SYNC='now WAIT_FOR purge_start';
let $wait_all_purged=1;
--source ../../innodb/include/wait_all_purged.inc
let $wait_all_purged=0;
SET DEBUG_SYNC='now SIGNAL release';
SET GLOBAL debug_dbug=@old_dbug;
connection truncate;
@@ -262,7 +257,6 @@ reap;
disconnect truncate;
connection default;
--source ../../innodb/include/wait_all_purged.inc
DROP TABLE t1, t2;
--source include/wait_until_count_sessions.inc

View File

@@ -1,416 +0,0 @@
#
# WL#6501: make truncate table atomic
#
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/big_test.inc
# Valgrind would complain about memory leaks when we crash on purpose.
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
# suppress expected warnings.
call mtr.add_suppression("The file '.*' already exists though the corresponding table did not exist in the InnoDB data dictionary");
call mtr.add_suppression("Cannot create file '.*'");
call mtr.add_suppression("InnoDB: Error number 17 means 'File exists'");
################################################################################
#
# Will test following scenarios:
# 1. Hit crash point while writing redo log.
# 2. Hit crash point on completion of redo log write.
# 3. Hit crash point while dropping indexes.
# 4. Hit crash point on completing drop of all indexes before creation of index
# is commenced.
# 5. Hit crash point while creating indexes.
# 6. Hit crash point after data is updated to system-table and in-memory dict.
# 7. Hit crash point before/after log checkpoint is done.
#
################################################################################
#-----------------------------------------------------------------------------
#
# create test-bed
#
let $per_table = `select @@innodb_file_per_table`;
eval set global innodb_file_per_table = on;
let $WL6501_TMP_DIR = `select @@tmpdir`;
let $WL6501_DATA_DIR = `select @@datadir`;
let SEARCH_FILE = $MYSQLTEST_VARDIR/log/my_restart.err;
#-----------------------------------------------------------------------------
#
# 1. Hit crash point while writing redo log.
#
--echo "1. Hit crash point while writing redo log."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine=innodb row_format=$wl6501_row_fmt
key_block_size=$wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_while_writing_redo_log";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# 2. Hit crash point on completion of redo log write.
#
--echo "2. Hit crash point on completion of redo log write."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_after_redo_log_write_complete";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# 3. Hit crash point while dropping indexes.
#
--echo "3. Hit crash point while dropping indexes."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_drop_of_clust_index";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#
#
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_drop_of_uniq_index";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
#
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#
#
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_drop_of_sec_index";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# 4. Hit crash point on completing drop of all indexes before creation of index
# is commenced.
#
--echo "4. Hit crash point on completing drop of all indexes before creation"
--echo " of index is commenced."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_drop_reinit_done_create_to_start";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# 5. Hit crash point while creating indexes.
#
--echo "5. Hit crash point while creating indexes."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_create_of_clust_index";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#
#
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_create_of_uniq_index";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#
#
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_create_of_sec_index";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# 6. Hit crash point after data is updated to system-table and in-memory dict.
#
--echo "6. Hit crash point after data is updated to system-table and"
--echo " in-memory dict."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_updating_dict_sys_info";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# 7. Hit crash point before/after log checkpoint is done.
#
--echo "7. Hit crash point before/after log checkpoint is done."
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_before_log_removal";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t where f < 2.5;
drop table t;
#
#
use test;
eval set global innodb_file_per_table = $wl6501_file_per_table;
SET innodb_strict_mode=OFF;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_after_truncate_done";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
select * from t;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
select * from t where f < 2.5;
drop table t;
#-----------------------------------------------------------------------------
#
# remove test-bed
#
eval set global innodb_file_per_table = $per_table;

View File

@@ -1,98 +0,0 @@
#
# WL#6501: make truncate table atomic
#
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/big_test.inc
# Valgrind would complain about memory leaks when we crash on purpose.
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
# suppress expected warnings
call mtr.add_suppression("does not exist in the InnoDB internal");
################################################################################
#
# Will test following scenarios:
# 1. Hit crash point on completing drop of all indexes before creation of index
# is commenced.
# 2. Hit crash point after data is updated to system-table and in-memory dict.
#
################################################################################
#-----------------------------------------------------------------------------
#
# create test-bed
#
let $per_table = `select @@innodb_file_per_table`;
eval set global innodb_file_per_table = on;
let $WL6501_TMP_DIR = `select @@tmpdir`;
let $WL6501_DATA_DIR = `select @@datadir`;
let SEARCH_FILE = $MYSQLTEST_VARDIR/log/my_restart.err;
#-----------------------------------------------------------------------------
#
# 1. Hit crash point on completing drop of all indexes before creation of index
# is commenced.
#
--echo "1. Hit crash point on completing drop of all indexes before creation"
--echo " of index is commenced."
eval set global innodb_file_per_table = $wl6501_file_per_table;
set innodb_strict_mode=off;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_drop_reinit_done_create_to_start";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
#-----------------------------------------------------------------------------
#
# 2. Hit crash point after data is updated to system-table and in-memory dict.
#
--echo "2. Hit crash point after data is updated to system-table and"
--echo " in-memory dict."
eval set global innodb_file_per_table = $wl6501_file_per_table;
set innodb_strict_mode=off;
--disable_warnings
eval create $wl6501_temp table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = $wl6501_row_fmt
key_block_size = $wl6501_kbs;
--enable_warnings
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
check table t;
#
set session debug = "+d,ib_trunc_crash_on_updating_dict_sys_info";
--source include/expect_crash.inc
--error 2013
truncate table t;
#
--source include/start_mysqld.inc
check table t;
#-----------------------------------------------------------------------------
#
# remove test-bed
#
eval set global innodb_file_per_table = $per_table;

View File

@@ -0,0 +1,8 @@
CREATE TABLE t (a SERIAL) ENGINE=InnoDB;
connect dml,localhost,root;
select * from t;
a
connection default;
TRUNCATE TABLE t;
disconnect dml;
DROP TABLE t;

View File

@@ -1,88 +0,0 @@
#
# 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;

View File

@@ -0,0 +1,58 @@
CREATE TABLE parent (a INT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO parent SET a=1;
CREATE TABLE child (a INT PRIMARY KEY, FOREIGN KEY (a) REFERENCES parent(a)
ON UPDATE CASCADE)
ENGINE=InnoDB;
INSERT INTO child SET a=1;
TRUNCATE TABLE parent;
ERROR 42000: Cannot truncate a table referenced in a foreign key constraint (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `test`.`parent` (`a`))
TRUNCATE TABLE child;
INSERT INTO child SET a=1;
UPDATE parent SET a=2;
SELECT * FROM child;
a
2
connect dml,localhost,root;
SET DEBUG_SYNC='foreign_constraint_update_cascade SIGNAL fk WAIT_FOR go';
UPDATE parent SET a=3;
connection default;
SET DEBUG_SYNC='now WAIT_FOR fk';
SET lock_wait_timeout=1;
TRUNCATE TABLE child;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SET DEBUG_SYNC='now SIGNAL go';
connection dml;
SELECT * FROM child;
a
3
SET DEBUG_SYNC='foreign_constraint_check_for_update SIGNAL fk WAIT_FOR go';
DELETE FROM parent;
connection default;
SET DEBUG_SYNC='now WAIT_FOR fk';
TRUNCATE TABLE child;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SET DEBUG_SYNC='now SIGNAL go';
connection dml;
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `parent` (`a`) ON UPDATE CASCADE)
SELECT * FROM child;
a
3
INSERT INTO parent SET a=5;
SET DEBUG_SYNC='foreign_constraint_check_for_ins SIGNAL fk WAIT_FOR go';
INSERT INTO child SET a=5;
connection default;
SET DEBUG_SYNC='now WAIT_FOR fk';
SET foreign_key_checks=0;
TRUNCATE TABLE parent;
SET DEBUG_SYNC='now SIGNAL go';
connection dml;
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `parent` (`a`) ON UPDATE CASCADE)
SELECT * FROM parent;
a
SELECT * FROM child;
a
3
disconnect dml;
connection default;
SET DEBUG_SYNC = RESET;
DROP TABLE child, parent;

View File

@@ -1,114 +0,0 @@
SET @save_dbug = @@SESSION.debug_dbug;
call mtr.add_suppression("InnoDB: Flagged corruption of .* in table `test`\\.`t` in TRUNCATE TABLE");
# 1. Error in assigning undo logs for truncate action
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100), INDEX ck(c))
ENGINE = InnoDB;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
check table t;
Table Op Msg_type Msg_text
test.t check status OK
SET debug_dbug = '+d,ib_err_trunc_assigning_undo_log';
truncate table t;
ERROR HY000: Got error 168 "Unknown (generic) error from engine" from storage engine InnoDB
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
# 2. Error while preparing for truncate
SET debug_dbug = '+d,ib_err_trunc_preparing_for_truncate';
truncate table t;
ERROR HY000: Got error 168 "Unknown (generic) error from engine" from storage engine InnoDB
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
# 3. Error while dropping/creating indexes
SET debug_dbug = '+d,ib_err_trunc_drop_index';
truncate table t;
ERROR HY000: Got error 168 "Unknown (generic) error from engine" from storage engine InnoDB
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check Warning InnoDB: Index PRIMARY is marked as corrupted
test.t check error Corrupt
select * from t;
Got one of the listed errors
drop table t;
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100), INDEX ck(c))
ENGINE = InnoDB;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
check table t;
Table Op Msg_type Msg_text
test.t check status OK
SET debug_dbug = '+d,ib_err_trunc_create_index';
truncate table t;
ERROR HY000: Got error 168 "Unknown (generic) error from engine" from storage engine InnoDB
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check Warning InnoDB: Index PRIMARY is marked as corrupted
test.t check error Corrupt
select * from t;
Got one of the listed errors
drop table t;
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100), INDEX ck(c))
ENGINE = InnoDB;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
check table t;
Table Op Msg_type Msg_text
test.t check status OK
SET debug_dbug = '+d,ib_err_trunc_temp_recreate_index';
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
drop table t;
# 4. Error while completing truncate of table involving FTS
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100),
FULLTEXT INDEX(c)) ENGINE = InnoDB;
insert into t values (1, 1.1, 'mysql is now oracle company'),
(2, 2.2, 'innodb is part of mysql'),
(3, 3.3, 'innodb is default storage engine of mysql');
check table t;
Table Op Msg_type Msg_text
test.t check status OK
SET debug_dbug = '+d,ib_err_trunc_temp_recreate_index';
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
drop table t;
# 5. Error while updating sys-tables
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100),
FULLTEXT INDEX(c)) ENGINE = InnoDB;
insert into t values (1, 1.1, 'mysql is now oracle company'),
(2, 2.2, 'innodb is part of mysql'),
(3, 3.3, 'innodb is default storage engine of mysql');
check table t;
Table Op Msg_type Msg_text
test.t check status OK
SET debug_dbug = '+d,ib_err_trunc_temp_recreate_index';
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t order by i;
i f c
drop table t;

View File

@@ -0,0 +1,17 @@
call mtr.add_suppression("InnoDB: Operating system error number ");
call mtr.add_suppression("InnoDB: (The error means|If you are|Cannot open datafile) ");
call mtr.add_suppression("InnoDB: Ignoring tablespace for `test`\.`t`");
call mtr.add_suppression("InnoDB: Table test/t .* does not exist");
CREATE TABLE t (a SERIAL) ENGINE=InnoDB;
INSERT INTO t() VALUES();
SHOW CREATE TABLE t;
Table Create Table
t CREATE TABLE `t` (
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
UNIQUE KEY `a` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
SELECT * FROM t;
ERROR 42S02: Table 'test.t' doesn't exist in engine
TRUNCATE TABLE t;
ERROR 42S02: Table 'test.t' doesn't exist in engine
DROP TABLE t;

View File

@@ -1,29 +0,0 @@
#
# Bug #23070734 CONCURRENT TRUNCATE TABLES CAUSE STALLS
#
create table t1 (f1 int ,f2 int,key(f2)) engine=innodb;
begin;
insert into t1 values (10,45),(20,78),(30,88),(40,23),(50,78),(60,11),(70,56),(80,90);
delete from t1;
connect con2,localhost,root,,;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
connection default;
SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
commit;
connect con1,localhost,root,,;
SET DEBUG_SYNC= 'buffer_pool_scan SIGNAL started WAIT_FOR finish_scan';
truncate table t1;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR started';
COMMIT;
disconnect con2;
connection default;
InnoDB 0 transactions not purged
SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
SET DEBUG_SYNC = 'now SIGNAL finish_scan';
connection con1;
disconnect con1;
connection default;
SET DEBUG_SYNC = 'RESET';
drop table t1;

View File

@@ -1,12 +0,0 @@
SET GLOBAL innodb_stats_persistent= ON;
CREATE TABLE t1 (t TEXT) ENGINE=InnoDB STATS_PERSISTENT=1;
connect con1,localhost,root,,test;
SET DEBUG_SYNC='ib_trunc_table_trunc_completing SIGNAL committed WAIT_FOR ever';
TRUNCATE TABLE t1;
connection default;
SET DEBUG_SYNC='now WAIT_FOR committed';
disconnect con1;
SELECT COUNT(*) FROM t1;
COUNT(*)
0
DROP TABLE t1;

View File

@@ -0,0 +1,17 @@
--source include/have_innodb.inc
CREATE TABLE t (a SERIAL) ENGINE=InnoDB;
connect (dml,localhost,root);
# At the end of this statement, close_thread_tables()
# should add the open table handle to the table definition cache (tdc).
select * from t;
connection default;
# This should purge the handle from the tdc;
# otherwise ha_innobase::truncate() would hang,
# waiting for the reference count to drop to 0.
TRUNCATE TABLE t;
disconnect dml;
DROP TABLE t;

View File

@@ -1,127 +0,0 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
--source include/count_sessions.inc
--echo #
--echo # Bug #23070734 CONCURRENT TRUNCATE TABLES CAUSE STALLS
--echo #
SET @ahi= @@global.innodb_adaptive_hash_index;
# Ensure that there is no adaptive hash index on any system tables,
# or any other tables than the ones that we are creating below.
SET GLOBAL innodb_adaptive_hash_index=OFF;
SET GLOBAL innodb_adaptive_hash_index=ON;
--echo Test_1 :- Check if DDL operations are possible on
--echo table being truncated. Also check if
--echo 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';
send truncate table t1;
connection default;
SET DEBUG_SYNC= 'now WAIT_FOR started';
--echo Check Analyze table. Gives lock time out error.
analyze table t1;
--echo Check if we can turn off auto recalculation.
--error ER_LOCK_WAIT_TIMEOUT
alter table t1 STATS_AUTO_RECALC=0;
--echo Check if we can turn off persistent stats on the table
--error ER_LOCK_WAIT_TIMEOUT
alter table t1 STATS_PERSISTENT=0;
--echo Check if DML is possible on table being truncated
--error ER_LOCK_WAIT_TIMEOUT
insert into t1 values (10,89,99);
--echo Check if DDL is possible on table being truncated
--error ER_LOCK_WAIT_TIMEOUT
alter table t1 add column f4 int;
--echo check if table can be created with the same name
--error ER_TABLE_EXISTS_ERROR,ER_LOCK_WAIT_TIMEOUT
create table t1 (bd int) engine=innodb;
--echo check if index can be created on table being truncated
--error ER_LOCK_WAIT_TIMEOUT
create index idx1 on t1(f1);
--echo Check if DROP of table is possible during truncate
--error ER_LOCK_WAIT_TIMEOUT
drop table t1;
--echo Check if select is possible during truncate
--error ER_LOCK_WAIT_TIMEOUT
select * from t1;
--error ER_BAD_FIELD_ERROR
select * from t2 where t2.f1=t1.f1;
--echo Check concurrent truncate operation on table;
--error ER_LOCK_WAIT_TIMEOUT
truncate table t1;
--echo 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;
--echo Concurrent truncate on other tables
truncate table t2;
--echo Concurrent alters on the other tables
alter table t2 add column f4 int;
--echo check if index can be created on the other table
create index idx1 on t2(f3);
--echo Check if we can turn off persistent stats off entire instance
SET GLOBAL innodb_stats_persistent=off;
connect (con2,localhost,root,,);
send set global innodb_adaptive_hash_index=off;
connection default;
SET DEBUG_SYNC= 'now SIGNAL finish_scan';
connection con1;
reap;
disconnect con1;
connection con2;
reap;
disconnect con2;
connection default;
SET DEBUG_SYNC= 'RESET';
SET GLOBAL innodb_adaptive_hash_index=@ahi;
drop table t1,t2,t3;
--source include/wait_until_count_sessions.inc

View File

@@ -0,0 +1,68 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
CREATE TABLE parent (a INT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO parent SET a=1;
CREATE TABLE child (a INT PRIMARY KEY, FOREIGN KEY (a) REFERENCES parent(a)
ON UPDATE CASCADE)
ENGINE=InnoDB;
INSERT INTO child SET a=1;
--error ER_TRUNCATE_ILLEGAL_FK
TRUNCATE TABLE parent;
TRUNCATE TABLE child;
INSERT INTO child SET a=1;
UPDATE parent SET a=2;
SELECT * FROM child;
connect (dml,localhost,root);
SET DEBUG_SYNC='foreign_constraint_update_cascade SIGNAL fk WAIT_FOR go';
send UPDATE parent SET a=3;
connection default;
SET DEBUG_SYNC='now WAIT_FOR fk';
SET lock_wait_timeout=1;
--error ER_LOCK_WAIT_TIMEOUT
TRUNCATE TABLE child;
SET DEBUG_SYNC='now SIGNAL go';
connection dml;
reap;
SELECT * FROM child;
SET DEBUG_SYNC='foreign_constraint_check_for_update SIGNAL fk WAIT_FOR go';
send DELETE FROM parent;
connection default;
SET DEBUG_SYNC='now WAIT_FOR fk';
--error ER_LOCK_WAIT_TIMEOUT
TRUNCATE TABLE child;
SET DEBUG_SYNC='now SIGNAL go';
connection dml;
--error ER_ROW_IS_REFERENCED_2
reap;
SELECT * FROM child;
INSERT INTO parent SET a=5;
SET DEBUG_SYNC='foreign_constraint_check_for_ins SIGNAL fk WAIT_FOR go';
send INSERT INTO child SET a=5;
connection default;
SET DEBUG_SYNC='now WAIT_FOR fk';
SET foreign_key_checks=0;
TRUNCATE TABLE parent;
SET DEBUG_SYNC='now SIGNAL go';
connection dml;
--error ER_NO_REFERENCED_ROW_2
reap;
SELECT * FROM parent;
SELECT * FROM child;
disconnect dml;
connection default;
SET DEBUG_SYNC = RESET;
DROP TABLE child, parent;

View File

@@ -1,97 +0,0 @@
# This test is based on innodb_zip.wl6501_error_1 in MySQL 5.7.
--source include/have_innodb.inc
--source include/innodb_row_format.inc
--source include/have_debug.inc
SET @save_dbug = @@SESSION.debug_dbug;
call mtr.add_suppression("InnoDB: Flagged corruption of .* in table `test`\\.`t` in TRUNCATE TABLE");
--echo # 1. Error in assigning undo logs for truncate action
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100), INDEX ck(c))
ENGINE = InnoDB;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
check table t;
#
SET debug_dbug = '+d,ib_err_trunc_assigning_undo_log';
--error ER_GET_ERRNO
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
select * from t;
--echo # 2. Error while preparing for truncate
SET debug_dbug = '+d,ib_err_trunc_preparing_for_truncate';
--error ER_GET_ERRNO
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
select * from t;
--echo # 3. Error while dropping/creating indexes
SET debug_dbug = '+d,ib_err_trunc_drop_index';
--error ER_GET_ERRNO
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
--error ER_TABLE_CORRUPT,ER_GET_ERRNO
select * from t;
drop table t;
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100), INDEX ck(c))
ENGINE = InnoDB;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
check table t;
SET debug_dbug = '+d,ib_err_trunc_create_index';
--error ER_GET_ERRNO
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
--error ER_TABLE_CORRUPT,ER_GET_ERRNO
select * from t;
drop table t;
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100), INDEX ck(c))
ENGINE = InnoDB;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
check table t;
SET debug_dbug = '+d,ib_err_trunc_temp_recreate_index';
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
select * from t;
drop table t;
--echo # 4. Error while completing truncate of table involving FTS
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100),
FULLTEXT INDEX(c)) ENGINE = InnoDB;
insert into t values (1, 1.1, 'mysql is now oracle company'),
(2, 2.2, 'innodb is part of mysql'),
(3, 3.3, 'innodb is default storage engine of mysql');
check table t;
SET debug_dbug = '+d,ib_err_trunc_temp_recreate_index';
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
select * from t;
drop table t;
--echo # 5. Error while updating sys-tables
CREATE TABLE t (i int PRIMARY KEY, f float UNIQUE, c char(100),
FULLTEXT INDEX(c)) ENGINE = InnoDB;
insert into t values (1, 1.1, 'mysql is now oracle company'),
(2, 2.2, 'innodb is part of mysql'),
(3, 3.3, 'innodb is default storage engine of mysql');
check table t;
SET debug_dbug = '+d,ib_err_trunc_temp_recreate_index';
truncate table t;
SET debug_dbug = @save_dbug;
check table t;
select * from t order by i;
drop table t;

View File

@@ -0,0 +1,22 @@
--source include/have_innodb.inc
--source include/not_embedded.inc
call mtr.add_suppression("InnoDB: Operating system error number ");
call mtr.add_suppression("InnoDB: (The error means|If you are|Cannot open datafile) ");
call mtr.add_suppression("InnoDB: Ignoring tablespace for `test`\.`t`");
call mtr.add_suppression("InnoDB: Table test/t .* does not exist");
CREATE TABLE t (a SERIAL) ENGINE=InnoDB;
INSERT INTO t() VALUES();
SHOW CREATE TABLE t;
let $datadir=`select @@datadir`;
--source include/shutdown_mysqld.inc
--remove_file $datadir/test/t.ibd
--source include/start_mysqld.inc
--error ER_NO_SUCH_TABLE_IN_ENGINE
SELECT * FROM t;
--error ER_NO_SUCH_TABLE_IN_ENGINE
TRUNCATE TABLE t;
DROP TABLE t;

View File

@@ -1,3 +0,0 @@
--innodb-purge-threads=1
--innodb-purge-batch-size=1
--innodb-stats-persistent=OFF

View File

@@ -1,49 +0,0 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
--source include/count_sessions.inc
--echo #
--echo # Bug #23070734 CONCURRENT TRUNCATE TABLES CAUSE STALLS
--echo #
create table t1 (f1 int ,f2 int,key(f2)) engine=innodb;
begin;
insert into t1 values (10,45),(20,78),(30,88),(40,23),(50,78),(60,11),(70,56),(80,90);
delete from t1;
connect (con2,localhost,root,,);
# Stop the purge thread
START TRANSACTION WITH CONSISTENT SNAPSHOT;
connection default;
# Ensure that the history list length will actually be decremented by purge.
SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
commit;
connect (con1,localhost,root,,);
SET DEBUG_SYNC= 'buffer_pool_scan SIGNAL started WAIT_FOR finish_scan';
send truncate table t1;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR started';
# Allow purge to proceed, by discarding our read view.
COMMIT;
disconnect con2;
connection default;
--source include/wait_all_purged.inc
SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
SET DEBUG_SYNC = 'now SIGNAL finish_scan';
connection con1;
reap;
disconnect con1;
connection default;
SET DEBUG_SYNC = 'RESET';
drop table t1;
--source include/wait_until_count_sessions.inc

View File

@@ -1,16 +0,0 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
SET GLOBAL innodb_stats_persistent= ON;
CREATE TABLE t1 (t TEXT) ENGINE=InnoDB STATS_PERSISTENT=1;
--connect (con1,localhost,root,,test)
SET DEBUG_SYNC='ib_trunc_table_trunc_completing SIGNAL committed WAIT_FOR ever';
--send
TRUNCATE TABLE t1;
--connection default
SET DEBUG_SYNC='now WAIT_FOR committed';
--source include/restart_mysqld.inc
--disconnect con1
SELECT COUNT(*) FROM t1;
DROP TABLE t1;

View File

@@ -1,31 +0,0 @@
#
# Bug#25053705 - INVALID I/O ON TABLE AFTER TRUNCATE
#
CREATE TABLE t1 (a INT, d INT, b VARCHAR(198), c CHAR(158), FULLTEXT fts1(c,b),
FULLTEXT fts2(c));
TRUNCATE TABLE t1;
INSERT INTO t1 (a,d,b,c) VALUES (
'79795','6',repeat('uololoaroolccaaruolraloouuoocorrcorurlu','1'),
repeat('orouculcaocuocloooolooloooaorlroclouulrrucclulalouaulrluorooaclllluuorc
cuullucocraloracurooulrooauuar','1'));
CREATE TABLE t2 (a INT, d INT, b VARCHAR(198), c CHAR(158), FULLTEXT fts1(c,b));
INSERT INTO t2 VALUES (1, 1, repeat('uololoaroolccaaruolraloouuoocorrcorurlu','1'),
repeat('orouculcaocuocloooolooloooaorlroclouulrrucclulalouaulrluorooaclllluuorccuullucocraloracurooulrooauuar','1'));
create procedure insert_t2(IN total int)
begin
declare i int default 1;
while (i <= total) DO
insert into t2 select * from t2;
set i = i + 1;
end while;
end|
CALL insert_t2(15);
SET @save_dbug = @@SESSION.DEBUG_DBUG;
SET DEBUG_DBUG = '+d,innodb_invalid_read_after_truncate';
INSERT INTO t1 (a,d,b,c) VALUES (
'7795','6',repeat('uololoaroolccaaruolraloouuoocorrcorurlu','1'),
repeat('orouculcaocuocloooolooloooaorlroclouulrrucclulalouaulrluorooaclllluuorc
cuullucocraloracurooulrooauuar','1'));
SET DEBUG_DBUG = @save_dbug;
DROP PROCEDURE insert_t2;
DROP TABLE t1,t2;

View File

@@ -1 +0,0 @@
--innodb-random-read-ahead=1

View File

@@ -1,50 +0,0 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--echo #
--echo # Bug#25053705 - INVALID I/O ON TABLE AFTER TRUNCATE
--echo #
CREATE TABLE t1 (a INT, d INT, b VARCHAR(198), c CHAR(158), FULLTEXT fts1(c,b),
FULLTEXT fts2(c));
TRUNCATE TABLE t1;
INSERT INTO t1 (a,d,b,c) VALUES (
'79795','6',repeat('uololoaroolccaaruolraloouuoocorrcorurlu','1'),
repeat('orouculcaocuocloooolooloooaorlroclouulrrucclulalouaulrluorooaclllluuorc
cuullucocraloracurooulrooauuar','1'));
# The following CREATE TABLE and INSERTs are used to remove the pages related to table t1
# from the buffer pool.
CREATE TABLE t2 (a INT, d INT, b VARCHAR(198), c CHAR(158), FULLTEXT fts1(c,b));
INSERT INTO t2 VALUES (1, 1, repeat('uololoaroolccaaruolraloouuoocorrcorurlu','1'),
repeat('orouculcaocuocloooolooloooaorlroclouulrrucclulalouaulrluorooaclllluuorccuullucocraloracurooulrooauuar','1'));
delimiter |;
create procedure insert_t2(IN total int)
begin
declare i int default 1;
while (i <= total) DO
insert into t2 select * from t2;
set i = i + 1;
end while;
end|
delimiter ;|
CALL insert_t2(15);
SET @save_dbug = @@SESSION.DEBUG_DBUG;
SET DEBUG_DBUG = '+d,innodb_invalid_read_after_truncate';
INSERT INTO t1 (a,d,b,c) VALUES (
'7795','6',repeat('uololoaroolccaaruolraloouuoocorrcorurlu','1'),
repeat('orouculcaocuocloooolooloooaorlroclouulrrucclulalouaulrluorooaclllluuorc
cuullucocraloracurooulrooauuar','1'));
SET DEBUG_DBUG = @save_dbug;
DROP PROCEDURE insert_t2;
DROP TABLE t1,t2;

View File

@@ -1,8 +0,0 @@
begin;
update t1 set c = 'MariaDB';
update t1 set c = 'InnoDB';
eval set global debug_dbug = '+d,$SEARCH_PATTERN';
commit;
--source include/shutdown_mysqld.inc
--source include/search_pattern_in_file.inc
--source include/start_mysqld.inc

View File

@@ -1,3 +1,4 @@
call mtr.add_suppression("InnoDB: The transaction log size is too large");
SET GLOBAL innodb_fast_shutdown=0;
create table t1(keyc int primary key, c1 char(100)) engine = innodb;
begin;

View File

@@ -1,3 +1,4 @@
call mtr.add_suppression("InnoDB: The transaction log size is too large");
SET GLOBAL innodb_fast_shutdown=0;
create table t1(keyc int primary key, c char(100)) engine = innodb;
create table t2(keyc int primary key, c char(100)) engine = innodb;

View File

@@ -1,15 +1,15 @@
SET GLOBAL innodb_undo_logs = 4;
SET GLOBAL innodb_undo_log_truncate = 1;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
create table t1(keyc int primary key, c char(100)) engine = innodb;
begin;
commit;
begin;
update t1 set c = 'MariaDB';
update t1 set c = 'InnoDB';
set global debug_dbug = '+d,ib_undo_trunc_before_truncate';
set global debug_dbug = '+d,ib_undo_trunc';
commit;
FOUND 1 /ib_undo_trunc_before_truncate/ in mysqld.1.err
begin;
update t1 set c = 'MariaDB';
update t1 set c = 'InnoDB';
set global debug_dbug = '+d,ib_undo_trunc_before_ddl_log_end';
commit;
FOUND 1 /ib_undo_trunc_before_ddl_log_end/ in mysqld.1.err
call mtr.add_suppression("InnoDB: The transaction log size is too large");
SET GLOBAL innodb_fast_shutdown=0;
FOUND 1 /ib_undo_trunc/ in mysqld.1.err
drop table t1;

View File

@@ -9,6 +9,7 @@
# The test is restarting the server to force undo truncation.
--source include/not_embedded.inc
call mtr.add_suppression("InnoDB: The transaction log size is too large");
SET GLOBAL innodb_fast_shutdown=0;
--let $restart_parameters=--innodb_undo_tablespaces=2 --innodb_undo_logs=4
--source include/restart_mysqld.inc

View File

@@ -9,6 +9,7 @@
--source include/have_innodb_max_16k.inc
--source include/have_undo_tablespaces.inc
call mtr.add_suppression("InnoDB: The transaction log size is too large");
SET GLOBAL innodb_fast_shutdown=0;
--let $restart_parameters=--innodb_undo_tablespaces=2 --innodb_undo_logs=4
--source include/restart_mysqld.inc

View File

@@ -2,10 +2,10 @@
# WL#6965: Truncate UNDO logs.
#
# With larger innodb_page_size, the undo log tablespaces do not grow enough.
--source include/innodb_page_size_small.inc
--source include/have_innodb.inc
--source include/have_debug.inc
# With larger innodb_page_size, the undo log tablespaces do not grow enough.
--source include/have_innodb_max_16k.inc
--source include/have_undo_tablespaces.inc
# Valgrind would complain about memory leaks when we crash on purpose.
@@ -15,15 +15,9 @@
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
--disable_query_log
# FIXME: The doublewrite buffer should not issue these warnings.
# FIXME: Maybe buf_dblwr_process() should empty the buffer at the end?
call mtr.add_suppression("InnoDB: A copy of page.*in the doublewrite buffer slot.*is not within space bounds");
FLUSH TABLES;
--enable_query_log
--let $restart_parameters=--innodb-undo-logs=4 --innodb-undo-tablespaces=2 --innodb-undo-log-truncate=1 --innodb-max-undo-log-size=10485760 --innodb-purge-rseg-truncate-frequency=1 --innodb-fast-shutdown=0
--source include/restart_mysqld.inc
SET GLOBAL innodb_undo_logs = 4;
SET GLOBAL innodb_undo_log_truncate = 1;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err;
@@ -38,13 +32,19 @@ while ($i) {
--enable_query_log
commit;
let SEARCH_PATTERN = ib_undo_trunc_before_truncate;
--source include/truncate_recover.inc
let SEARCH_PATTERN = ib_undo_trunc;
begin;
update t1 set c = 'MariaDB';
update t1 set c = 'InnoDB';
eval set global debug_dbug = '+d,$SEARCH_PATTERN';
commit;
# FIXME: remove this work-around, and generate less log!
call mtr.add_suppression("InnoDB: The transaction log size is too large");
SET GLOBAL innodb_fast_shutdown=0;
--source include/shutdown_mysqld.inc
--source include/search_pattern_in_file.inc
# FIXME: remove this work-around, and generate less log!
--let $restart_parameters= --innodb-buffer-pool-size=16m
--source include/start_mysqld.inc
let SEARCH_PATTERN = ib_undo_trunc_before_ddl_log_end;
--source include/truncate_recover.inc
let SEARCH_PATTERN = ib_undo_trunc_trunc_done;
let $restart_parameters=
--source include/truncate_recover.inc
drop table t1;

View File

@@ -1,112 +0,0 @@
#
# load tables with some significant amount of data and then truncate it.
#
#-----------------------------------------------------------------------------
#
# create test-bed
#
let $per_table = `select @@innodb_file_per_table`;
let $format = `select @@innodb_file_format`;
let $WL6501_TMP_DIR = `select @@tmpdir`;
let $WL6501_DATA_DIR = `select @@datadir`;
set innodb_strict_mode=OFF;
#-----------------------------------------------------------------------------
#
# create procedure to load data
#
delimiter |;
create procedure populate()
begin
declare i int default 1;
while (i <= 5000) do
insert into t1 values (i, 'a', 'b');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
create procedure populate_small()
begin
declare i int default 10001;
while (i <= 12000) do
insert into t1 values (i, 'c', 'd');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
delimiter ;|
#-----------------------------------------------------------------------------
#
# create and load the tables.
#
eval set global innodb_file_per_table = $wl6501_file_per_table;
--replace_regex /[0-9]+/NUMBER/
eval create table t1
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=$wl6501_row_fmt
key_block_size=$wl6501_kbs;
eval create table t2
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=$wl6501_row_fmt
key_block_size=$wl6501_kbs;
eval create temporary table t3
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=$wl6501_row_fmt
key_block_size=$wl6501_kbs;
#
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
begin;
call populate();
commit;
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
#
truncate table t1;
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
#
call populate_small();
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
#
truncate table t2;
truncate table t3;
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
#
call populate_small();
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
#
drop table t1;
drop table t2;
drop table t3;
#-----------------------------------------------------------------------------
#
# drop the procedure
#
drop procedure populate;
drop procedure populate_small;
#-----------------------------------------------------------------------------
#
# remove test-bed
#
eval set global innodb_file_format = $format;
eval set global innodb_file_per_table = $per_table;

View File

@@ -418,12 +418,12 @@ ALTER TABLE t7_restart TRUNCATE PARTITION p1;
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Space_Type Page_Size Zip_Size Formats_Permitted Path
test/t4_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t4_restart.ibd
test/t5_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t5_restart.ibd
test/t6_restart#p#p0 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p0.ibd
test/t6_restart#p#p1 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p1.ibd
test/t6_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p2.ibd
test/t7_restart#p#p0#sp#s0 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p0#sp#s0.ibd
test/t7_restart#p#p0#sp#s1 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p0#sp#s1.ibd
test/t5_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t5_restart.ibd
test/t6_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p2.ibd
test/t7_restart#p#p1#sp#s2 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p1#sp#s2.ibd
test/t7_restart#p#p1#sp#s3 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p1#sp#s3.ibd
INSERT INTO t5_restart VALUES (1000000000, 'MySQL', 'InnoDB', '2011-11-11', 'Read this after reboot');
@@ -521,12 +521,12 @@ innodb_file_per_table ON
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Space_Type Page_Size Zip_Size Formats_Permitted Path
test/t4_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t4_restart.ibd
test/t5_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t5_restart.ibd
test/t6_restart#p#p0 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p0.ibd
test/t6_restart#p#p1 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p1.ibd
test/t6_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p2.ibd
test/t7_restart#p#p0#sp#s0 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p0#sp#s0.ibd
test/t7_restart#p#p0#sp#s1 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p0#sp#s1.ibd
test/t5_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t5_restart.ibd
test/t6_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p2.ibd
test/t7_restart#p#p1#sp#s2 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p1#sp#s2.ibd
test/t7_restart#p#p1#sp#s3 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p1#sp#s3.ibd
SELECT count(*) FROM t5_restart;
@@ -621,12 +621,12 @@ RENAME TABLE t7_restart TO t77_restart;
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Space_Type Page_Size Zip_Size Formats_Permitted Path
test/t4_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t4_restart.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd
test/t66_restart#p#p0 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p0.ibd
test/t66_restart#p#p1 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p1.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p2.ibd
test/t77_restart#p#p0#sp#s0 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s0.ibd
test/t77_restart#p#p0#sp#s1 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s1.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p2.ibd
test/t77_restart#p#p1#sp#s2 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p1#sp#s2.ibd
test/t77_restart#p#p1#sp#s3 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p1#sp#s3.ibd
INSERT INTO t55_restart (SELECT 0, c2, c3, c4, c5 FROM t55_restart);
@@ -717,12 +717,12 @@ innodb_file_per_table ON
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Space_Type Page_Size Zip_Size Formats_Permitted Path
test/t4_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t4_restart.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd
test/t66_restart#p#p0 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p0.ibd
test/t66_restart#p#p1 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p1.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p2.ibd
test/t77_restart#p#p0#sp#s0 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s0.ibd
test/t77_restart#p#p0#sp#s1 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s1.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p2.ibd
test/t77_restart#p#p1#sp#s2 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p1#sp#s2.ibd
test/t77_restart#p#p1#sp#s3 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p1#sp#s3.ibd
INSERT INTO t55_restart (SELECT 0, c2, c3, c4, c5 FROM t55_restart);
@@ -848,12 +848,12 @@ t77_restart#p#p1#sp#s3.ibd
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Space_Type Page_Size Zip_Size Formats_Permitted Path
test/t4_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t4_restart.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t55_restart.ibd
test/t66_restart#p#p0 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p0.ibd
test/t66_restart#p#p1 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p1.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p2.ibd
test/t77_restart#p#p0#sp#s0 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p0#sp#s0.ibd
test/t77_restart#p#p0#sp#s1 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p0#sp#s1.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t55_restart.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p2.ibd
test/t77_restart#p#p1#sp#s2 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p1#sp#s2.ibd
test/t77_restart#p#p1#sp#s3 Single DEFAULT DEFAULT Dynamic MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p1#sp#s3.ibd
INSERT INTO t4_restart (SELECT 0, c2, c3, c4, c5 FROM t4_restart);
@@ -983,12 +983,12 @@ t77_restart.par
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Space_Type Page_Size Zip_Size Formats_Permitted Path
test/t4_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t4_restart.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t55_restart.ibd
test/t66_restart#p#p0 Single DEFAULT DEFAULT Compressed MYSQLD_DATADIR/test/t66_restart#p#p0.ibd
test/t66_restart#p#p1 Single DEFAULT DEFAULT Compressed MYSQLD_DATADIR/test/t66_restart#p#p1.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQLD_DATADIR/test/t66_restart#p#p2.ibd
test/t77_restart#p#p0#sp#s0 Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t77_restart#p#p0#sp#s0.ibd
test/t77_restart#p#p0#sp#s1 Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t77_restart#p#p0#sp#s1.ibd
test/t55_restart Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t55_restart.ibd
test/t66_restart#p#p2 Single DEFAULT DEFAULT Compressed MYSQLD_DATADIR/test/t66_restart#p#p2.ibd
test/t77_restart#p#p1#sp#s2 Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t77_restart#p#p1#sp#s2.ibd
test/t77_restart#p#p1#sp#s3 Single DEFAULT DEFAULT Dynamic MYSQLD_DATADIR/test/t77_restart#p#p1#sp#s3.ibd
INSERT INTO t4_restart (SELECT 0, c2, c3, c4, c5 FROM t4_restart);

File diff suppressed because it is too large Load Diff

View File

@@ -1,462 +0,0 @@
call mtr.add_suppression("The file '.*' already exists though the corresponding table did not exist in the InnoDB data dictionary");
call mtr.add_suppression("Cannot create file '.*'");
call mtr.add_suppression("InnoDB: Error number 17 means 'File exists'");
set global innodb_file_per_table = on;
"1. Hit crash point while writing redo log."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine=innodb row_format=compressed
key_block_size=16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_while_writing_redo_log";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"2. Hit crash point on completion of redo log write."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_after_redo_log_write_complete";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"3. Hit crash point while dropping indexes."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_clust_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_uniq_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_sec_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"4. Hit crash point on completing drop of all indexes before creation"
" of index is commenced."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_drop_reinit_done_create_to_start";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"5. Hit crash point while creating indexes."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_clust_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_uniq_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_sec_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"6. Hit crash point after data is updated to system-table and"
" in-memory dict."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_updating_dict_sys_info";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"7. Hit crash point before/after log checkpoint is done."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_before_log_removal";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 16;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_after_truncate_done";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
set global innodb_file_per_table = 1;

View File

@@ -1,519 +0,0 @@
call mtr.add_suppression("The file '.*' already exists though the corresponding table did not exist in the InnoDB data dictionary");
call mtr.add_suppression("Cannot create file '.*'");
call mtr.add_suppression("InnoDB: Error number 17 means 'File exists'");
set global innodb_file_per_table = on;
"1. Hit crash point while writing redo log."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine=innodb row_format=compressed
key_block_size=4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_while_writing_redo_log";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"2. Hit crash point on completion of redo log write."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_after_redo_log_write_complete";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"3. Hit crash point while dropping indexes."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_clust_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_uniq_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_sec_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"4. Hit crash point on completing drop of all indexes before creation"
" of index is commenced."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_drop_reinit_done_create_to_start";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"5. Hit crash point while creating indexes."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_clust_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_uniq_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_sec_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"6. Hit crash point after data is updated to system-table and"
" in-memory dict."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_updating_dict_sys_info";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"7. Hit crash point before/after log checkpoint is done."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_before_log_removal";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_after_truncate_done";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
set global innodb_file_per_table = 1;
call mtr.add_suppression("does not exist in the InnoDB internal");
set global innodb_file_per_table = on;
"1. Hit crash point on completing drop of all indexes before creation"
" of index is commenced."
set global innodb_file_per_table = 1;
set innodb_strict_mode=off;
create temporary table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_drop_reinit_done_create_to_start";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check Error Table 'test.t' doesn't exist
test.t check status Operation failed
"2. Hit crash point after data is updated to system-table and"
" in-memory dict."
set global innodb_file_per_table = 1;
set innodb_strict_mode=off;
create temporary table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 4;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_updating_dict_sys_info";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check Error Table 'test.t' doesn't exist
test.t check status Operation failed
set global innodb_file_per_table = 1;

View File

@@ -1,462 +0,0 @@
call mtr.add_suppression("The file '.*' already exists though the corresponding table did not exist in the InnoDB data dictionary");
call mtr.add_suppression("Cannot create file '.*'");
call mtr.add_suppression("InnoDB: Error number 17 means 'File exists'");
set global innodb_file_per_table = on;
"1. Hit crash point while writing redo log."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine=innodb row_format=compressed
key_block_size=8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_while_writing_redo_log";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"2. Hit crash point on completion of redo log write."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_after_redo_log_write_complete";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"3. Hit crash point while dropping indexes."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_clust_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_uniq_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_drop_of_sec_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"4. Hit crash point on completing drop of all indexes before creation"
" of index is commenced."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_drop_reinit_done_create_to_start";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"5. Hit crash point while creating indexes."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_clust_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_uniq_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_create_of_sec_index";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"6. Hit crash point after data is updated to system-table and"
" in-memory dict."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_on_updating_dict_sys_info";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
"7. Hit crash point before/after log checkpoint is done."
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_before_log_removal";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
use test;
set global innodb_file_per_table = 1;
SET innodb_strict_mode=OFF;
create table t (
i int, f float, c char,
primary key pk(i), unique findex(f), index ck(c))
engine = innodb row_format = compressed
key_block_size = 8;
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
check table t;
Table Op Msg_type Msg_text
test.t check status OK
set session debug = "+d,ib_trunc_crash_after_truncate_done";
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
truncate table t;
ERROR HY000: Lost connection to MySQL server during query
check table t;
Table Op Msg_type Msg_text
test.t check status OK
select * from t;
i f c
insert into t values (1, 1.1, 'a'), (2, 2.2, 'b'), (3, 3.3, 'c');
select * from t;
i f c
1 1.1 a
2 2.2 b
3 3.3 c
select * from t where f < 2.5;
i f c
1 1.1 a
2 2.2 b
drop table t;
set global innodb_file_per_table = 1;

View File

@@ -1,345 +0,0 @@
set innodb_strict_mode=OFF;
create procedure populate()
begin
declare i int default 1;
while (i <= 5000) do
insert into t1 values (i, 'a', 'b');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
create procedure populate_small()
begin
declare i int default 10001;
while (i <= 12000) do
insert into t1 values (i, 'c', 'd');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
set global innodb_file_per_table = 1;
create table tNUMBER
(i int, cNUMBER char(NUMBER), cNUMBER char(NUMBER),
index cNUMBER_idx(cNUMBER))
engine=innodb row_format=compact
key_block_size=NUMBER;
Warnings:
Warning NUMBER InnoDB: ignoring KEY_BLOCK_SIZE=NUMBER unless ROW_FORMAT=COMPRESSED.
create table t2
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=compact
key_block_size=16;
Warnings:
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=16 unless ROW_FORMAT=COMPRESSED.
create temporary table t3
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=compact
key_block_size=16;
Warnings:
Warning 1478 InnoDB: KEY_BLOCK_SIZE is ignored for TEMPORARY TABLE.
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=16.
select count(*) from t1;
count(*)
0
select count(*) from t2;
count(*)
0
select count(*) from t3;
count(*)
0
begin;
call populate();
commit;
select count(*) from t1;
count(*)
5000
select count(*) from t2;
count(*)
5000
select count(*) from t3;
count(*)
5000
truncate table t1;
select count(*) from t1;
count(*)
0
select count(*) from t2;
count(*)
5000
select count(*) from t3;
count(*)
5000
call populate_small();
select count(*) from t1;
count(*)
2000
select count(*) from t2;
count(*)
7000
select count(*) from t3;
count(*)
7000
truncate table t2;
truncate table t3;
select count(*) from t1;
count(*)
2000
select count(*) from t2;
count(*)
0
select count(*) from t3;
count(*)
0
call populate_small();
select count(*) from t1;
count(*)
4000
select count(*) from t2;
count(*)
2000
select count(*) from t3;
count(*)
2000
drop table t1;
drop table t2;
drop table t3;
drop procedure populate;
drop procedure populate_small;
set global innodb_file_format = Barracuda;
Warnings:
Warning 131 Using innodb_file_format is deprecated and the parameter may be removed in future releases. See https://mariadb.com/kb/en/library/xtradbinnodb-file-format/
set global innodb_file_per_table = 1;
set innodb_strict_mode=OFF;
create procedure populate()
begin
declare i int default 1;
while (i <= 5000) do
insert into t1 values (i, 'a', 'b');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
create procedure populate_small()
begin
declare i int default 10001;
while (i <= 12000) do
insert into t1 values (i, 'c', 'd');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
set global innodb_file_per_table = 1;
create table tNUMBER
(i int, cNUMBER char(NUMBER), cNUMBER char(NUMBER),
index cNUMBER_idx(cNUMBER))
engine=innodb row_format=compressed
key_block_size=NUMBER;
create table t2
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=compressed
key_block_size=16;
create temporary table t3
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=compressed
key_block_size=16;
Warnings:
Warning 1478 InnoDB: KEY_BLOCK_SIZE is ignored for TEMPORARY TABLE.
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=16.
Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED is ignored for TEMPORARY TABLE.
Warning 1478 InnoDB: assuming ROW_FORMAT=DYNAMIC.
select count(*) from t1;
count(*)
0
select count(*) from t2;
count(*)
0
select count(*) from t3;
count(*)
0
begin;
call populate();
commit;
select count(*) from t1;
count(*)
5000
select count(*) from t2;
count(*)
5000
select count(*) from t3;
count(*)
5000
truncate table t1;
select count(*) from t1;
count(*)
0
select count(*) from t2;
count(*)
5000
select count(*) from t3;
count(*)
5000
call populate_small();
select count(*) from t1;
count(*)
2000
select count(*) from t2;
count(*)
7000
select count(*) from t3;
count(*)
7000
truncate table t2;
truncate table t3;
select count(*) from t1;
count(*)
2000
select count(*) from t2;
count(*)
0
select count(*) from t3;
count(*)
0
call populate_small();
select count(*) from t1;
count(*)
4000
select count(*) from t2;
count(*)
2000
select count(*) from t3;
count(*)
2000
drop table t1;
drop table t2;
drop table t3;
drop procedure populate;
drop procedure populate_small;
set global innodb_file_format = Barracuda;
Warnings:
Warning 131 Using innodb_file_format is deprecated and the parameter may be removed in future releases. See https://mariadb.com/kb/en/library/xtradbinnodb-file-format/
set global innodb_file_per_table = 1;
set innodb_strict_mode=OFF;
create procedure populate()
begin
declare i int default 1;
while (i <= 5000) do
insert into t1 values (i, 'a', 'b');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
create procedure populate_small()
begin
declare i int default 10001;
while (i <= 12000) do
insert into t1 values (i, 'c', 'd');
insert into t2 values (i, 'a', 'b');
insert into t3 values (i, 'a', 'b');
set i = i + 1;
end while;
end|
set global innodb_file_per_table = 0;
create table tNUMBER
(i int, cNUMBER char(NUMBER), cNUMBER char(NUMBER),
index cNUMBER_idx(cNUMBER))
engine=innodb row_format=compact
key_block_size=NUMBER;
Warnings:
Warning NUMBER InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
Warning NUMBER InnoDB: ignoring KEY_BLOCK_SIZE=NUMBER.
create table t2
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=compact
key_block_size=16;
Warnings:
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=16.
create temporary table t3
(i int, c1 char(100), c2 char(100),
index c1_idx(c1))
engine=innodb row_format=compact
key_block_size=16;
Warnings:
Warning 1478 InnoDB: KEY_BLOCK_SIZE is ignored for TEMPORARY TABLE.
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=16.
select count(*) from t1;
count(*)
0
select count(*) from t2;
count(*)
0
select count(*) from t3;
count(*)
0
begin;
call populate();
commit;
select count(*) from t1;
count(*)
5000
select count(*) from t2;
count(*)
5000
select count(*) from t3;
count(*)
5000
truncate table t1;
select count(*) from t1;
count(*)
0
select count(*) from t2;
count(*)
5000
select count(*) from t3;
count(*)
5000
call populate_small();
select count(*) from t1;
count(*)
2000
select count(*) from t2;
count(*)
7000
select count(*) from t3;
count(*)
7000
truncate table t2;
truncate table t3;
select count(*) from t1;
count(*)
2000
select count(*) from t2;
count(*)
0
select count(*) from t3;
count(*)
0
call populate_small();
select count(*) from t1;
count(*)
4000
select count(*) from t2;
count(*)
2000
select count(*) from t3;
count(*)
2000
drop table t1;
drop table t2;
drop table t3;
drop procedure populate;
drop procedure populate_small;
set global innodb_file_format = Barracuda;
Warnings:
Warning 131 Using innodb_file_format is deprecated and the parameter may be removed in future releases. See https://mariadb.com/kb/en/library/xtradbinnodb-file-format/
set global innodb_file_per_table = 1;

View File

@@ -1,451 +0,0 @@
####################################################################
# TC to check truncate table statement atomicity for single #
# tablespace #
# Sceanrio covered: #
# 1. Debug points added for worklog #
# 2. Table with differnt row types #
# 3. Transactional statement. #
####################################################################
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/big_test.inc
--source include/have_innodb_16k.inc
# Valgrind would result in a "long semaphore wait" inside InnoDB
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
#-----------------------------------------------------------------------
--disable_query_log
let $MYSQL_DATA_DIR= `select @@datadir`;
let $data_directory = data directory='$MYSQL_TMP_DIR/alt_dir';
let $innodb_file_per_table_orig=`select @@innodb_file_per_table`;
call mtr.add_suppression("InnoDB.*table did not exist in the InnoDB data dictionary.*");
call mtr.add_suppression("InnoDB: A page in the doublewrite buffer is not within space bounds.*");
call mtr.add_suppression("InnoDB: Cannot create file.*");
call mtr.add_suppression("InnoDB: Error number 17 means 'File exists'.*");
call mtr.add_suppression("InnoDB: A page in the doublewrite buffer is not within space bounds");
call mtr.add_suppression("InnoDB: Error: table .* does not exist in the InnoDB internal");
--enable_query_log
#-----------------------------------------------------------------------
set global innodb_file_per_table=on;
--echo # Verify that 'TRUNCATE TABLE' statement works fine and the size
--echo # of .ibd file is equal to the initial size after truncation.
#-----------------------------------------------------------------------
drop table if exists t1,t2,t3,t4,t6;
let $cnt = 6;
while ($cnt) {
# table with basic data type + primary ,secondary,composite,prefix index
create table t1(c1 int not null,
c2 int not null,
c3 char(255) not null,
c4 text(500) not null,
c5 blob(500) not null,
c6 varchar(500) not null,
c7 varchar(500) not null,
c8 datetime,
c9 decimal(5,3),
primary key (c1),
index (c3,c4(50),c5(50)),
index (c2))
engine=innodb row_format=redundant;
create table t2(c1 int not null,
c2 int not null,
c3 char(255) not null,
c4 text(500) not null,
c5 blob(500) not null,
c6 varchar(500) not null,
c7 varchar(500) not null,
c8 datetime,
c9 decimal(5,3),
primary key (c1),
index (c3,c4(50),c5(50)),
index (c2))
engine=innodb row_format=compact;
# with row type , key block size = 4K
create table t3(c1 int not null,
c2 int not null,
c3 char(255) not null,
c4 text(500) not null,
c5 blob(500) not null,
c6 varchar(500) not null,
c7 varchar(500) not null,
c8 datetime,
c9 decimal(5,3),
primary key (c1),
index (c3,c4(50),c5(50)),
index (c2))
engine=innodb row_format=compressed key_block_size=4;
create table t4(c1 int not null,
c2 int not null,
c3 char(255) not null,
c4 text(500) not null,
c5 blob(500) not null,
c6 varchar(500) not null,
c7 varchar(500) not null,
c8 datetime,
c9 decimal(5,3),
primary key (c1),
index (c3,c4(50),c5(50)),
index (c2))
engine=innodb row_format=dynamic;
create temporary table t5(c1 int not null,
c2 int not null,
c3 char(255) not null,
c4 text(500) not null,
c5 blob(500) not null,
c6 varchar(500) not null,
c7 varchar(500) not null,
c8 datetime,
c9 decimal(5,3),
primary key (c1),
index (c3,c4(50),c5(50)),
index (c2))
engine=innodb;
create table t6 ( a int ) engine = innodb;
insert into t6 values (50),(100),(150);
--disable_query_log
--disable_result_log
let $n=5;
# load created tables.
while ($n)
{
start transaction;
eval insert ignore into t1 values(
$n, $n,
repeat(concat(' tc3_',$n), 42),
repeat(concat(' tc4_',$n), 300),
repeat(concat(' tc5_',$n), 300),
repeat(concat(' tc6_',$n), 300),
repeat(concat(' tc7_',$n), 300),
now(), (100.55+$n));
eval insert ignore into t2 values(
$n, $n,
repeat(concat(' tc3_',$n), 42),
repeat(concat(' tc4_',$n), 300),
repeat(concat(' tc5_',$n), 300),
repeat(concat(' tc6_',$n), 300),
repeat(concat(' tc7_',$n), 300),
now(), (100.55+$n));
eval insert ignore into t3 values(
$n, $n,
repeat(concat(' tc3_',$n), 42),
repeat(concat(' tc4_',$n), 300),
repeat(concat(' tc5_',$n), 300),
repeat(concat(' tc6_',$n), 300),
repeat(concat(' tc7_',$n), 300),
now(), (100.55+$n));
eval insert ignore into t4 values(
$n, $n,
repeat(concat(' tc3_',$n), 42),
repeat(concat(' tc4_',$n), 300),
repeat(concat(' tc5_',$n), 300),
repeat(concat(' tc6_',$n), 300),
repeat(concat(' tc7_',$n), 300),
now(), (100.55+$n));
eval insert ignore into t5 values(
$n, $n,
repeat(concat(' tc3_',$n), 42),
repeat(concat(' tc4_',$n), 300),
repeat(concat(' tc5_',$n), 300),
repeat(concat(' tc6_',$n), 300),
repeat(concat(' tc7_',$n), 300),
now(), (100.55+$n));
if ($n <= 3)
{
commit;
}
if ($n > 3)
{
rollback;
}
dec $n;
}
# validate loading of the tables.
--enable_result_log
--enable_query_log
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
select count(*) from t4;
select count(*) from t5;
select count(*) from t6;
# set the debug crash point and exercise them.
if ($cnt == 6)
{
set session debug="+d,ib_trunc_crash_during_drop_index_temp_table";
--echo "---debug ib_trunc_crash_during_drop_index_temp_table point---"
}
if ($cnt == 5)
{
set session debug="+d,ib_trunc_crash_drop_reinit_done_create_to_start";
--echo "---debug ib_trunc_crash_drop_reinit_done_create_to_start---"
}
if ($cnt >= 5) {
--echo # Write file to make mysql-test-run.pl expect crash and restart
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Run the crashing query
--error 2013
truncate table t5;
--source include/wait_until_disconnected.inc
--enable_reconnect
--echo # Restart the MySQL server
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc
--disable_reconnect
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
select count(*) from t4;
--error ER_NO_SUCH_TABLE
select count(*) from t5;
select count(*) from t6;
}
# set the debug crash point and exercise them.
if ($cnt == 6)
{
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
}
if ($cnt == 5)
{
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
}
if ($cnt == 4)
{
set session debug="+d,ib_trunc_crash_before_log_removal";
--echo "---debug ib_trunc_crash_before_log_removal point---"
}
if ($cnt == 3)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 2)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 1)
{
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
}
--echo # Write file to make mysql-test-run.pl expect crash and restart
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Run the crashing query
--error 2013
truncate table t1;
--source include/wait_until_disconnected.inc
--enable_reconnect
--echo # Restart the MySQL server
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc
--disable_reconnect
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
select count(*) from t4;
--error ER_NO_SUCH_TABLE
select count(*) from t5;
select count(*) from t6;
if ($cnt == 6)
{
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
}
if ($cnt == 5)
{
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
}
if ($cnt == 4)
{
set session debug="+d,ib_trunc_crash_before_log_removal";
--echo "---debug ib_trunc_crash_before_log_removal point---"
}
if ($cnt == 3)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 2)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 1)
{
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
}
--echo # Write file to make mysql-test-run.pl expect crash and restart
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Run the crashing query
--error 2013
truncate table t2;
--source include/wait_until_disconnected.inc
--enable_reconnect
--echo # Restart the MySQL server
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc
--disable_reconnect
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
select count(*) from t4;
--error ER_NO_SUCH_TABLE
select count(*) from t5;
select count(*) from t6;
if ($cnt == 6)
{
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
}
if ($cnt == 5)
{
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
}
if ($cnt == 4)
{
set session debug="+d,ib_trunc_crash_before_log_removal";
--echo "---debug ib_trunc_crash_before_log_removal point---"
}
if ($cnt == 3)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 2)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 1)
{
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
}
--echo # Write file to make mysql-test-run.pl expect crash and restart
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Run the crashing query
--error 2013
truncate table t3;
--source include/wait_until_disconnected.inc
--enable_reconnect
--echo # Restart the MySQL server
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc
--disable_reconnect
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
select count(*) from t4;
--error ER_NO_SUCH_TABLE
select count(*) from t5;
select count(*) from t6;
if ($cnt == 6)
{
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
}
if ($cnt == 5)
{
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
}
if ($cnt == 4)
{
set session debug="+d,ib_trunc_crash_before_log_removal";
--echo "---debug ib_trunc_crash_before_log_removal point---"
}
if ($cnt == 3)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 2)
{
set session debug="+d,ib_trunc_crash_after_truncate_done";
--echo "---debug ib_trunc_crash_after_truncate_done point---"
}
if ($cnt == 1)
{
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
}
--echo # Write file to make mysql-test-run.pl expect crash and restart
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Run the crashing query
--error 2013
truncate table t4;
--source include/wait_until_disconnected.inc
--enable_reconnect
--echo # Restart the MySQL server
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc
--disable_reconnect
select count(*) from t1;
select count(*) from t2;
select count(*) from t3;
select count(*) from t4;
--error ER_NO_SUCH_TABLE
select count(*) from t5;
select count(*) from t6;
drop table t1, t2, t3, t4, t6;
dec $cnt;
--disable_query_log
eval set global innodb_file_per_table=$innodb_file_per_table_orig;
--enable_query_log
}

View File

@@ -1,25 +0,0 @@
#
# WL#6501: make truncate table atomic
#
# TC tries to hit crash point during truncate of
# compressed non-temp table residing in single tablespace
# with page-size=16k
--source include/have_innodb.inc
--source include/have_innodb_16k.inc
--source include/have_debug.inc
--source include/big_test.inc
# Valgrind would complain about memory leaks when we crash on purpose.
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
let $wl6501_file_per_table = 1;
let $wl6501_row_fmt = compressed;
let $wl6501_kbs = 16;
--source suite/innodb/include/innodb_wl6501_crash.inc

View File

@@ -1,27 +0,0 @@
#
# WL#6501: make truncate table atomic
#
# TC tries to hit crash point during truncate of
# compressed non-temp table residing in single tablespace.
# with page-size=4k
--source include/have_innodb.inc
--source include/have_innodb_4k.inc
--source include/have_debug.inc
--source include/big_test.inc
# Valgrind would complain about memory leaks when we crash on purpose.
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
let $wl6501_file_per_table = 1;
let $wl6501_row_fmt = compressed;
let $wl6501_kbs = 4;
--source suite/innodb/include/innodb_wl6501_crash.inc
let $wl6501_temp = temporary;
--source suite/innodb/include/innodb_wl6501_crash_temp.inc

View File

@@ -1,25 +0,0 @@
#
# WL#6501: make truncate table atomic
#
# TC tries to hit crash point during truncate of
# compressed non-temp table residing in single tablespace.
# with page-size=8k
--source include/have_innodb.inc
--source include/have_innodb_8k.inc
--source include/have_debug.inc
--source include/big_test.inc
# Valgrind would complain about memory leaks when we crash on purpose.
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
let $wl6501_file_per_table = 1;
let $wl6501_row_fmt = compressed;
let $wl6501_kbs = 8;
--source suite/innodb/include/innodb_wl6501_crash.inc

View File

@@ -1,37 +0,0 @@
#
# WL#6501: make truncate table atomic
#
# load table with some significiant amount of data
# and then try truncate
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/big_test.inc
--source include/have_innodb_16k.inc
# Valgrind would complain about memory leaks when we crash on purpose.
--source include/not_valgrind.inc
# Embedded server does not support crashing
--source include/not_embedded.inc
# Avoid CrashReporter popup on Mac
--source include/not_crashrep.inc
# Single-Tablespace/Non-Compressed
let $wl6501_file_per_table = 1;
let $wl6501_row_fmt = compact;
let $wl6501_kbs = 16;
--source suite/innodb_zip/include/innodb_wl6501_scale.inc
# Single-Tablespace/Compressed
let $wl6501_file_per_table = 1;
let $wl6501_row_fmt = compressed;
let $wl6501_kbs = 16;
--source suite/innodb_zip/include/innodb_wl6501_scale.inc
# System-Tablespace/Non-Compressed
let $wl6501_file_per_table = 0;
let $wl6501_row_fmt = compact;
let $wl6501_kbs = 16;
--source suite/innodb_zip/include/innodb_wl6501_scale.inc

View File

@@ -7,7 +7,6 @@ CREATE TABLE t1 ENGINE=InnoDB SELECT 1;
--let after_load_tablespaces=TRUNCATE test.t1
--disable_result_log
--error 1
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events;
--enable_result_log

View File

@@ -402,6 +402,8 @@ rpl_slave_state::truncate_state_table(THD *thd)
NULL, TL_WRITE);
if (!(err= open_and_lock_tables(thd, &tlist, FALSE, 0)))
{
tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED, "mysql",
rpl_gtid_slave_state_table_name.str, false);
err= tlist.table->file->ha_truncate();
if (err)

View File

@@ -563,7 +563,8 @@ buf_dblwr_process()
is scheduled for truncation or was truncated
and we have parsed an MLOG_TRUNCATE record. */
if (!srv_is_tablespace_truncated(space_id)
&& !srv_was_tablespace_truncated(space)) {
&& !srv_was_tablespace_truncated(space)
&& !srv_is_undo_tablespace(space_id)) {
ib::warn() << "A copy of page " << page_id
<< " in the doublewrite buffer slot "
<< page_no_dblwr

View File

@@ -560,13 +560,15 @@ the list as they age towards the tail of the LRU.
@param[in] id tablespace identifier
@param[in] observer flush observer (to check for interrupt),
or NULL if the files should not be written to
@return whether all dirty pages were freed */
@param[in] first first page to be flushed or evicted
@return whether all matching dirty pages were removed */
static MY_ATTRIBUTE((warn_unused_result))
bool
buf_flush_or_remove_pages(
buf_pool_t* buf_pool,
ulint id,
FlushObserver* observer)
FlushObserver* observer,
ulint first)
{
buf_page_t* prev;
buf_page_t* bpage;
@@ -607,6 +609,8 @@ rescan:
} else if (id != bpage->id.space()) {
/* Skip this block, because it is for a
different tablespace. */
} else if (bpage->id.page_no() < first) {
/* Skip this block, because it is below the limit. */
} else if (!buf_flush_or_remove_page(
buf_pool, bpage, observer != NULL)) {
@@ -670,18 +674,20 @@ the tail of the LRU list.
@param[in] id tablespace identifier
@param[in] observer flush observer,
or NULL if the files should not be written to
*/
@param[in] first first page to be flushed or evicted */
static
void
buf_flush_dirty_pages(
buf_pool_t* buf_pool,
ulint id,
FlushObserver* observer)
FlushObserver* observer,
ulint first)
{
for (;;) {
buf_pool_mutex_enter(buf_pool);
bool freed = buf_flush_or_remove_pages(buf_pool, id, observer);
bool freed = buf_flush_or_remove_pages(buf_pool, id, observer,
first);
buf_pool_mutex_exit(buf_pool);
@@ -696,20 +702,24 @@ buf_flush_dirty_pages(
}
ut_ad((observer && observer->is_interrupted())
|| first
|| buf_pool_get_dirty_pages_count(buf_pool, id, observer) == 0);
}
/** Empty the flush list for all pages belonging to a tablespace.
@param[in] id tablespace identifier
@param[in] observer flush observer,
or NULL if nothing is to be written */
void buf_LRU_flush_or_remove_pages(ulint id, FlushObserver* observer)
or NULL if nothing is to be written
@param[in] first first page to be flushed or evicted */
void buf_LRU_flush_or_remove_pages(ulint id, FlushObserver* observer,
ulint first)
{
/* Pages in the system tablespace must never be discarded. */
ut_ad(id || observer);
for (ulint i = 0; i < srv_buf_pool_instances; i++) {
buf_flush_dirty_pages(buf_pool_from_array(i), id, observer);
buf_flush_dirty_pages(buf_pool_from_array(i), id, observer,
first);
}
if (observer && !observer->is_interrupted()) {

View File

@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2017, MariaDB Corporation.
Copyright (c) 2015, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -176,17 +176,6 @@ buf_read_page_low(
dst = ((buf_block_t*) bpage)->frame;
}
DBUG_EXECUTE_IF(
"innodb_invalid_read_after_truncate",
if (fil_space_t* space = fil_space_acquire(page_id.space())) {
if (!strcmp(space->name, "test/t1")
&& page_id.page_no() == space->size - 1) {
type = 0;
sync = true;
}
fil_space_release(space);
});
IORequest request(type | IORequest::READ);
*err = fil_io(
@@ -332,19 +321,6 @@ buf_read_ahead_random(
that is, reside near the start of the LRU list. */
for (i = low; i < high; i++) {
DBUG_EXECUTE_IF(
"innodb_invalid_read_after_truncate",
if (fil_space_t* space = fil_space_acquire(
page_id.space())) {
bool skip = !strcmp(space->name, "test/t1");
fil_space_release(space);
if (skip) {
high = space->size;
buf_pool_mutex_exit(buf_pool);
goto read_ahead;
}
});
const buf_page_t* bpage = buf_page_hash_get(
buf_pool, page_id_t(page_id.space(), i));

View File

@@ -1161,73 +1161,6 @@ dict_recreate_index_tree(
return(FIL_NULL);
}
/*******************************************************************//**
Truncates the index tree but don't update SYSTEM TABLES.
@return DB_SUCCESS or error */
dberr_t
dict_truncate_index_tree_in_mem(
/*============================*/
dict_index_t* index) /*!< in/out: index */
{
mtr_t mtr;
bool truncate;
ulint space = index->space;
ut_ad(mutex_own(&dict_sys->mutex));
ut_ad(dict_table_is_temporary(index->table));
ulint type = index->type;
ulint root_page_no = index->page;
if (root_page_no == FIL_NULL) {
/* The tree has been freed. */
ib::warn() << "Trying to TRUNCATE a missing index of table "
<< index->table->name << "!";
truncate = false;
} else {
truncate = true;
}
bool found;
const page_size_t page_size(fil_space_get_page_size(space,
&found));
if (!found) {
/* It is a single table tablespace and the .ibd file is
missing: do nothing */
ib::warn()
<< "Trying to TRUNCATE a missing .ibd file of table "
<< index->table->name << "!";
}
/* If table to truncate resides in its on own tablespace that will
be re-created on truncate then we can ignore freeing of existing
tablespace objects. */
if (truncate) {
btr_free(page_id_t(space, root_page_no), page_size);
}
mtr_start(&mtr);
mtr_set_log_mode(&mtr, MTR_LOG_NO_REDO);
root_page_no = btr_create(
type, space, page_size, index->id, index, NULL, &mtr);
DBUG_EXECUTE_IF("ib_err_trunc_temp_recreate_index",
root_page_no = FIL_NULL;);
index->page = root_page_no;
mtr_commit(&mtr);
return(index->page == FIL_NULL ? DB_ERROR : DB_SUCCESS);
}
/*********************************************************************//**
Creates a table create graph.
@return own: table create node */
@@ -1677,16 +1610,11 @@ dict_create_or_check_foreign_constraint_tables(void)
/* Check which incomplete table definition to drop. */
if (sys_foreign_err == DB_CORRUPTION) {
ib::warn() << "Dropping incompletely created"
" SYS_FOREIGN table.";
row_drop_table_for_mysql("SYS_FOREIGN", trx, TRUE, TRUE);
row_drop_table_after_create_fail("SYS_FOREIGN", trx);
}
if (sys_foreign_cols_err == DB_CORRUPTION) {
ib::warn() << "Dropping incompletely created"
" SYS_FOREIGN_COLS table.";
row_drop_table_for_mysql("SYS_FOREIGN_COLS", trx, TRUE, TRUE);
row_drop_table_after_create_fail("SYS_FOREIGN_COLS", trx);
}
ib::info() << "Creating foreign key constraint system tables.";
@@ -1738,8 +1666,8 @@ dict_create_or_check_foreign_constraint_tables(void)
ut_ad(err == DB_OUT_OF_FILE_SPACE
|| err == DB_TOO_MANY_CONCURRENT_TRXS);
row_drop_table_for_mysql("SYS_FOREIGN", trx, TRUE, TRUE);
row_drop_table_for_mysql("SYS_FOREIGN_COLS", trx, TRUE, TRUE);
row_drop_table_after_create_fail("SYS_FOREIGN", trx);
row_drop_table_after_create_fail("SYS_FOREIGN_COLS", trx);
if (err == DB_OUT_OF_FILE_SPACE) {
err = DB_MUST_GET_MORE_FILE_SPACE;
@@ -1807,9 +1735,7 @@ dict_create_or_check_sys_virtual()
/* Check which incomplete table definition to drop. */
if (err == DB_CORRUPTION) {
ib::warn() << "Dropping incompletely created"
" SYS_VIRTUAL table.";
row_drop_table_for_mysql("SYS_VIRTUAL", trx, false, TRUE);
row_drop_table_after_create_fail("SYS_VIRTUAL", trx);
}
ib::info() << "Creating sys_virtual system tables.";
@@ -1843,7 +1769,7 @@ dict_create_or_check_sys_virtual()
ut_ad(err == DB_OUT_OF_FILE_SPACE
|| err == DB_TOO_MANY_CONCURRENT_TRXS);
row_drop_table_for_mysql("SYS_VIRTUAL", trx, false, TRUE);
row_drop_table_after_create_fail("SYS_VIRTUAL", trx);
if (err == DB_OUT_OF_FILE_SPACE) {
err = DB_MUST_GET_MORE_FILE_SPACE;
@@ -2462,16 +2388,11 @@ dict_create_or_check_sys_tablespace(void)
/* Check which incomplete table definition to drop. */
if (sys_tablespaces_err == DB_CORRUPTION) {
ib::warn() << "Dropping incompletely created"
" SYS_TABLESPACES table.";
row_drop_table_for_mysql("SYS_TABLESPACES", trx, TRUE, TRUE);
row_drop_table_after_create_fail("SYS_TABLESPACES", trx);
}
if (sys_datafiles_err == DB_CORRUPTION) {
ib::warn() << "Dropping incompletely created"
" SYS_DATAFILES table.";
row_drop_table_for_mysql("SYS_DATAFILES", trx, TRUE, TRUE);
row_drop_table_after_create_fail("SYS_DATAFILES", trx);
}
ib::info() << "Creating tablespace and datafile system tables.";
@@ -2506,8 +2427,8 @@ dict_create_or_check_sys_tablespace(void)
|| err == DB_DUPLICATE_KEY
|| err == DB_TOO_MANY_CONCURRENT_TRXS);
row_drop_table_for_mysql("SYS_TABLESPACES", trx, TRUE, TRUE);
row_drop_table_for_mysql("SYS_DATAFILES", trx, TRUE, TRUE);
row_drop_table_after_create_fail("SYS_TABLESPACES", trx);
row_drop_table_after_create_fail("SYS_DATAFILES", trx);
if (err == DB_OUT_OF_FILE_SPACE) {
err = DB_MUST_GET_MORE_FILE_SPACE;

View File

@@ -943,8 +943,8 @@ fil_crypt_read_crypt_data(fil_space_t* space)
/* The encryption metadata has already been read, or
the tablespace is not encrypted and the file has been
opened already, or the file cannot be accessed,
likely due to a concurrent TRUNCATE or
RENAME or DROP (possibly as part of ALTER TABLE).
likely due to a concurrent DROP
(possibly as part of TRUNCATE or ALTER TABLE).
FIXME: The file can become unaccessible any time
after this check! We should really remove this
function and instead make crypt_data an integral
@@ -1628,7 +1628,7 @@ fil_crypt_get_page_throttle_func(
ut_ad(space->n_pending_ops > 0);
/* Before reading from tablespace we need to make sure that
the tablespace is not about to be dropped or truncated. */
the tablespace is not about to be dropped. */
if (space->is_stopping()) {
return NULL;
}

View File

@@ -2246,13 +2246,14 @@ fil_op_write_log(
byte* log_ptr;
ulint len;
ut_ad(first_page_no == 0);
ut_ad(first_page_no == 0 || type == MLOG_FILE_CREATE2);
ut_ad(fsp_flags_is_valid(flags, space_id));
/* fil_name_parse() requires that there be at least one path
separator and that the file path end with ".ibd". */
ut_ad(strchr(path, OS_PATH_SEPARATOR) != NULL);
ut_ad(strcmp(&path[strlen(path) - strlen(DOT_IBD)], DOT_IBD) == 0);
ut_ad(first_page_no /* trimming an undo tablespace */
|| !strcmp(&path[strlen(path) - strlen(DOT_IBD)], DOT_IBD));
log_ptr = mlog_open(mtr, 11 + 4 + 2 + 1);
@@ -2685,7 +2686,7 @@ fil_op_replay_rename(
enum fil_operation_t {
FIL_OPERATION_DELETE, /*!< delete a single-table tablespace */
FIL_OPERATION_CLOSE, /*!< close a single-table tablespace */
FIL_OPERATION_TRUNCATE /*!< truncate a single-table tablespace */
FIL_OPERATION_TRUNCATE /*!< truncate an undo tablespace */
};
/** Check for pending operations.
@@ -2819,8 +2820,6 @@ fil_check_pending_operations(
/* Check for pending IO. */
*path = 0;
for (;;) {
sp = fil_space_get_by_id(id);
@@ -2833,7 +2832,7 @@ fil_check_pending_operations(
count = fil_check_pending_io(operation, sp, &node, count);
if (count == 0) {
if (count == 0 && path) {
*path = mem_strdup(node->name);
}
@@ -2921,7 +2920,8 @@ fil_close_tablespace(
not (necessarily) protected by meta-data locks.
(Rollback would generally be protected, but rollback of
FOREIGN KEY CASCADE/SET NULL is not protected by meta-data locks
but only by InnoDB table locks, which may be broken by TRUNCATE TABLE.)
but only by InnoDB table locks, which may be broken by
lock_remove_all_on_table().)
@param[in] table persistent table
checked @return whether the table is accessible */
bool
@@ -2937,8 +2937,6 @@ fil_table_accessible(const dict_table_t* table)
ut_ad(accessible || dict_table_is_file_per_table(table));
return(accessible);
} else {
/* The tablespace may momentarily be missing during
TRUNCATE TABLE. */
return(false);
}
}
@@ -3068,152 +3066,33 @@ fil_delete_tablespace(
return(err);
}
/** Truncate the tablespace to needed size.
@param[in] space_id id of tablespace to truncate
@param[in] size_in_pages truncate size.
@return true if truncate was successful. */
bool
fil_truncate_tablespace(
ulint space_id,
ulint size_in_pages)
/** Prepare to truncate an undo tablespace.
@param[in] space_id undo tablespace id
@return the tablespace
@retval NULL if tablespace not found */
fil_space_t* fil_truncate_prepare(ulint space_id)
{
/* Step-1: Prepare tablespace for truncate. This involves
stopping all the new operations + IO on that tablespace
and ensuring that related pages are flushed to disk. */
if (fil_prepare_for_truncate(space_id) != DB_SUCCESS) {
return(false);
/* Stop all I/O on the tablespace and ensure that related
pages are flushed to disk. */
fil_space_t* space;
if (fil_check_pending_operations(space_id, FIL_OPERATION_TRUNCATE,
&space, NULL) != DB_SUCCESS) {
return NULL;
}
/* Step-2: Invalidate buffer pool pages belonging to the tablespace
to re-create. Remove all insert buffer entries for the tablespace */
buf_LRU_flush_or_remove_pages(space_id, NULL);
/* Step-3: Truncate the tablespace and accordingly update
the fil_space_t handler that is used to access this tablespace. */
mutex_enter(&fil_system->mutex);
fil_space_t* space = fil_space_get_by_id(space_id);
/* The following code must change when InnoDB supports
multiple datafiles per tablespace. */
ut_a(UT_LIST_GET_LEN(space->chain) == 1);
fil_node_t* node = UT_LIST_GET_FIRST(space->chain);
ut_ad(node->is_open());
space->size = node->size = size_in_pages;
bool success = os_file_truncate(node->name, node->handle, 0);
if (success) {
os_offset_t size = os_offset_t(size_in_pages) * UNIV_PAGE_SIZE;
success = os_file_set_size(
node->name, node->handle, size,
FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags));
if (success) {
space->stop_new_ops = false;
space->is_being_truncated = false;
}
}
mutex_exit(&fil_system->mutex);
return(success);
ut_ad(space != NULL);
return space;
}
/*******************************************************************//**
Prepare for truncating a single-table tablespace.
1) Check pending operations on a tablespace;
2) Remove all insert buffer entries for the tablespace;
@return DB_SUCCESS or error */
dberr_t
fil_prepare_for_truncate(
/*=====================*/
ulint id) /*!< in: space id */
/** Write log about an undo tablespace truncate operation. */
void fil_truncate_log(fil_space_t* space, ulint size, mtr_t* mtr)
{
char* path = 0;
fil_space_t* space = 0;
ut_a(!is_system_tablespace(id));
dberr_t err = fil_check_pending_operations(
id, FIL_OPERATION_TRUNCATE, &space, &path);
ut_free(path);
if (err == DB_TABLESPACE_NOT_FOUND) {
ib::error() << "Cannot truncate tablespace " << id
<< " because it is not found in the tablespace"
" memory cache.";
}
return(err);
}
/** Reinitialize the original tablespace header with the same space id
for single tablespace
@param[in] table table belongs to tablespace
@param[in] size size in blocks
@param[in] trx Transaction covering truncate */
void
fil_reinit_space_header_for_table(
dict_table_t* table,
ulint size,
trx_t* trx)
{
ulint id = table->space;
ut_a(!is_system_tablespace(id));
/* Invalidate in the buffer pool all pages belonging
to the tablespace. The buffer pool scan may take long
time to complete, therefore we release dict_sys->mutex
and the dict operation lock during the scan and aquire
it again after the buffer pool scan.*/
/* Release the lock on the indexes too. So that
they won't violate the latch ordering. */
dict_table_x_unlock_indexes(table);
row_mysql_unlock_data_dictionary(trx);
/* Lock the search latch in shared mode to prevent user
from disabling AHI during the scan */
btr_search_s_lock_all();
DEBUG_SYNC_C("buffer_pool_scan");
buf_LRU_flush_or_remove_pages(id, NULL);
btr_search_s_unlock_all();
row_mysql_lock_data_dictionary(trx);
dict_table_x_lock_indexes(table);
/* Remove all insert buffer entries for the tablespace */
ibuf_delete_for_discarded_space(id);
mutex_enter(&fil_system->mutex);
fil_space_t* space = fil_space_get_by_id(id);
/* The following code must change when InnoDB supports
multiple datafiles per tablespace. */
ut_a(UT_LIST_GET_LEN(space->chain) == 1);
fil_node_t* node = UT_LIST_GET_FIRST(space->chain);
space->size = node->size = size;
mutex_exit(&fil_system->mutex);
mtr_t mtr;
mtr_start(&mtr);
mtr.set_named_space(id);
fsp_header_init(id, size, &mtr);
mtr_commit(&mtr);
/* Write a MLOG_FILE_CREATE2 record with the new size, so that
recovery and backup will ignore any preceding redo log records
for writing pages that are after the new end of the tablespace. */
ut_ad(UT_LIST_GET_LEN(space->chain) == 1);
const fil_node_t* file = UT_LIST_GET_FIRST(space->chain);
fil_op_write_log(MLOG_FILE_CREATE2, space->id, size, file->name,
NULL, space->flags & ~FSP_FLAGS_MEM_MASK, mtr);
}
#ifdef UNIV_DEBUG
@@ -5085,7 +4964,6 @@ fil_io(
if (space->id != TRX_SYS_SPACE
&& UT_LIST_GET_LEN(space->chain) == 1
&& (srv_is_tablespace_truncated(space->id)
|| space->is_being_truncated
|| srv_was_tablespace_truncated(space))
&& req_type.is_read()) {
@@ -5766,7 +5644,7 @@ fil_space_validate_for_mtr_commit(
fil_space_release() after mtr_commit(). This is why
n_pending_ops should not be zero if stop_new_ops is set. */
ut_ad(!space->stop_new_ops
|| space->is_being_truncated /* TRUNCATE sets stop_new_ops */
|| space->is_being_truncated /* fil_truncate_prepare() */
|| space->n_pending_ops > 0);
}
#endif /* UNIV_DEBUG */
@@ -5992,7 +5870,6 @@ truncate_t::truncate(
}
space->stop_new_ops = false;
space->is_being_truncated = false;
/* If we opened the file in this function, close it. */
if (!already_open) {
@@ -6185,7 +6062,7 @@ fil_space_keyrotate_next(
}
/* Skip spaces that are being created by fil_ibd_create(),
or dropped or truncated. Note that rotation_list contains only
or dropped. Note that rotation_list contains only
space->purpose == FIL_TYPE_TABLESPACE. */
while (space != NULL
&& (UT_LIST_GET_LEN(space->chain) == 0

View File

@@ -639,7 +639,6 @@ fsp_space_modify_check(
ut_ad(space->purpose == FIL_TYPE_TEMPORARY
|| space->purpose == FIL_TYPE_IMPORT
|| space->redo_skipped_count
|| space->is_being_truncated
|| srv_is_tablespace_truncated(space->id));
return;
case MTR_LOG_ALL:

View File

@@ -1470,7 +1470,8 @@ fts_drop_table(
/* Pass nonatomic=false (dont allow data dict unlock),
because the transaction may hold locks on SYS_* tables from
previous calls to fts_drop_table(). */
error = row_drop_table_for_mysql(table_name, trx, true, false, false);
error = row_drop_table_for_mysql(table_name, trx,
SQLCOM_DROP_DB, false, false);
if (error != DB_SUCCESS) {
ib::error() << "Unable to drop FTS index aux table "
@@ -1944,8 +1945,8 @@ func_exit:
if (error != DB_SUCCESS) {
for (it = common_tables.begin(); it != common_tables.end();
++it) {
row_drop_table_for_mysql(
(*it)->name.m_name, trx, true, FALSE);
row_drop_table_for_mysql((*it)->name.m_name, trx,
SQLCOM_DROP_DB);
}
}
@@ -2105,8 +2106,8 @@ fts_create_index_tables_low(
for (it = aux_idx_tables.begin(); it != aux_idx_tables.end();
++it) {
row_drop_table_for_mysql(
(*it)->name.m_name, trx, true, FALSE);
row_drop_table_for_mysql((*it)->name.m_name, trx,
SQLCOM_DROP_DB);
}
}
@@ -6712,7 +6713,8 @@ fts_drop_obsolete_aux_table_from_vector(
trx_start_for_ddl(trx_drop, TRX_DICT_OP_TABLE);
err = row_drop_table_for_mysql(
aux_drop_table->name, trx_drop, false, true);
aux_drop_table->name, trx_drop,
SQLCOM_DROP_TABLE, true);
trx_drop->dict_operation_lock_mode = 0;

View File

@@ -12647,7 +12647,8 @@ create_table_info_t::create_table()
trx_rollback_to_savepoint(m_trx, NULL);
m_trx->error_state = DB_SUCCESS;
row_drop_table_for_mysql(m_table_name, m_trx, true, FALSE);
row_drop_table_for_mysql(m_table_name, m_trx,
SQLCOM_DROP_DB);
m_trx->error_state = DB_SUCCESS;
DBUG_RETURN(error);
@@ -12843,24 +12844,29 @@ create_table_info_t::allocate_trx()
@param[in] name Table name, format: "db/table_name".
@param[in] form Table format; columns and index information.
@param[in] create_info Create info (including create statement string).
@param[in] file_per_table whether to create .ibd file
@param[in,out] trx dictionary transaction, or NULL to create new
@return 0 if success else error number. */
int
inline int
ha_innobase::create(
const char* name,
TABLE* form,
HA_CREATE_INFO* create_info)
HA_CREATE_INFO* create_info,
bool file_per_table,
trx_t* trx)
{
int error;
char norm_name[FN_REFLEN]; /* {database}/{tablename} */
char remote_path[FN_REFLEN]; /* Absolute path of table */
trx_t* trx;
DBUG_ENTER("ha_innobase::create");
create_table_info_t info(ha_thd(),
form,
create_info,
norm_name,
remote_path);
remote_path,
file_per_table, trx);
/* Initialize the object. */
if ((error = info.initialize())) {
@@ -12872,9 +12878,11 @@ ha_innobase::create(
DBUG_RETURN(error);
}
info.allocate_trx();
trx = info.trx();
bool own_trx = !trx;
if (own_trx) {
info.allocate_trx();
trx = info.trx();
}
/* Latch the InnoDB data dictionary exclusively so that no deadlocks
or lock waits can happen in it during a table create operation.
@@ -12882,10 +12890,16 @@ ha_innobase::create(
row_mysql_lock_data_dictionary(trx);
if ((error = info.create_table())) {
goto cleanup;
if (own_trx) {
trx_rollback_for_mysql(trx);
}
row_mysql_unlock_data_dictionary(trx);
goto func_exit;
}
innobase_commit_low(trx);
if (own_trx) {
innobase_commit_low(trx);
}
ut_ad(!srv_read_only_mode);
row_mysql_unlock_data_dictionary(trx);
@@ -12900,17 +12914,26 @@ ha_innobase::create(
utility threads: */
srv_active_wake_master_thread();
trx_free_for_mysql(trx);
func_exit:
if (own_trx) {
trx_free_for_mysql(trx);
}
DBUG_RETURN(error);
}
cleanup:
trx_rollback_for_mysql(trx);
row_mysql_unlock_data_dictionary(trx);
trx_free_for_mysql(trx);
DBUG_RETURN(error);
/** Create a new table to an InnoDB database.
@param[in] name Table name, format: "db/table_name".
@param[in] form Table format; columns and index information.
@param[in] create_info Create info (including create statement string).
@return 0 if success else error number. */
int
ha_innobase::create(
const char* name,
TABLE* form,
HA_CREATE_INFO* create_info)
{
return create(name, form, create_info, srv_file_per_table);
}
/*****************************************************************//**
@@ -13033,72 +13056,16 @@ ha_innobase::discard_or_import_tablespace(
DBUG_RETURN(convert_error_code_to_mysql(err, dict_table->flags, NULL));
}
/*****************************************************************//**
Deletes all rows of an InnoDB table.
@return error number */
int
ha_innobase::truncate()
/*===================*/
{
DBUG_ENTER("ha_innobase::truncate");
if (high_level_read_only) {
DBUG_RETURN(HA_ERR_TABLE_READONLY);
}
/* Get the transaction associated with the current thd, or create one
if not yet created, and update m_prebuilt->trx */
update_thd(ha_thd());
if (!trx_is_started(m_prebuilt->trx)) {
++m_prebuilt->trx->will_lock;
}
dberr_t err;
/* Truncate the table in InnoDB */
err = row_truncate_table_for_mysql(m_prebuilt->table, m_prebuilt->trx);
int error;
switch (err) {
case DB_TABLESPACE_DELETED:
case DB_TABLESPACE_NOT_FOUND:
ib_senderrf(
m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR,
(err == DB_TABLESPACE_DELETED ?
ER_TABLESPACE_DISCARDED : ER_TABLESPACE_MISSING),
table->s->table_name.str);
table->status = STATUS_NOT_FOUND;
error = HA_ERR_TABLESPACE_MISSING;
break;
default:
error = convert_error_code_to_mysql(
err, m_prebuilt->table->flags,
m_prebuilt->trx->mysql_thd);
table->status = STATUS_NOT_FOUND;
break;
}
DBUG_RETURN(error);
}
/*****************************************************************//**
/**
Drops a table from an InnoDB database. Before calling this function,
MySQL calls innobase_commit to commit the transaction of the current user.
Then the current user cannot have locks set on the table. Drop table
operation inside InnoDB will remove all locks any user has on the table
inside InnoDB.
@param[in] name table name
@param[in] sqlcom SQLCOM_DROP_DB, SQLCOM_TRUNCATE, ...
@return error number */
int
ha_innobase::delete_table(
/*======================*/
const char* name) /*!< in: table name */
inline int ha_innobase::delete_table(const char* name, enum_sql_command sqlcom)
{
dberr_t err;
THD* thd = ha_thd();
@@ -13162,9 +13129,7 @@ ha_innobase::delete_table(
/* Drop the table in InnoDB */
err = row_drop_table_for_mysql(
norm_name, trx, thd_sql_command(thd) == SQLCOM_DROP_DB,
false);
err = row_drop_table_for_mysql(norm_name, trx, sqlcom);
if (err == DB_TABLE_NOT_FOUND
&& innobase_get_lower_case_table_names() == 1) {
@@ -13188,9 +13153,7 @@ ha_innobase::delete_table(
par_case_name, name, FALSE);
#endif
err = row_drop_table_for_mysql(
par_case_name, trx,
thd_sql_command(thd) == SQLCOM_DROP_DB,
FALSE);
par_case_name, trx, sqlcom);
}
}
@@ -13253,9 +13216,7 @@ ha_innobase::delete_table(
par_case_name, name, FALSE);
#endif /* _WIN32 */
err = row_drop_table_for_mysql(
par_case_name, trx,
thd_sql_command(thd) == SQLCOM_DROP_DB,
true);
par_case_name, trx, sqlcom, true);
}
}
@@ -13273,6 +13234,25 @@ ha_innobase::delete_table(
DBUG_RETURN(convert_error_code_to_mysql(err, 0, NULL));
}
/** Drop an InnoDB table.
@param[in] name table name
@return error number */
int ha_innobase::delete_table(const char* name)
{
enum_sql_command sqlcom = enum_sql_command(thd_sql_command(ha_thd()));
if (sqlcom == SQLCOM_TRUNCATE
&& thd_killed(ha_thd())
&& (m_prebuilt == NULL
|| dict_table_is_temporary(m_prebuilt->table))) {
sqlcom = SQLCOM_DROP_TABLE;
}
/* SQLCOM_TRUNCATE will be passed via ha_innobase::truncate() only. */
DBUG_ASSERT(sqlcom != SQLCOM_TRUNCATE);
return delete_table(name, sqlcom);
}
/** Remove all tables in the named database inside InnoDB.
@param[in] hton handlerton from InnoDB
@param[in] path Database path; Inside InnoDB the name of the last
@@ -13347,7 +13327,7 @@ innobase_drop_database(
/*********************************************************************//**
Renames an InnoDB table.
@return DB_SUCCESS or error code */
inline MY_ATTRIBUTE((warn_unused_result))
inline
dberr_t
innobase_rename_table(
/*==================*/
@@ -13360,7 +13340,8 @@ innobase_rename_table(
char norm_from[FN_REFLEN];
DBUG_ENTER("innobase_rename_table");
DBUG_ASSERT(trx_get_dict_operation(trx) == TRX_DICT_OP_INDEX);
DBUG_ASSERT(trx_get_dict_operation(trx) == TRX_DICT_OP_INDEX
|| trx_get_dict_operation(trx) == TRX_DICT_OP_TABLE);
ut_ad(!srv_read_only_mode);
@@ -13471,6 +13452,89 @@ innobase_rename_table(
DBUG_RETURN(error);
}
/** TRUNCATE TABLE
@return error code
@retval 0 on success */
int ha_innobase::truncate()
{
DBUG_ENTER("ha_innobase::truncate");
if (high_level_read_only) {
DBUG_RETURN(HA_ERR_TABLE_READONLY);
}
update_thd();
HA_CREATE_INFO info;
mem_heap_t* heap = mem_heap_create(1000);
dict_table_t* ib_table = m_prebuilt->table;
const time_t update_time = ib_table->update_time;
const ulint stored_lock = m_prebuilt->stored_select_lock_type;
memset(&info, 0, sizeof info);
update_create_info_from_table(&info, table);
if (dict_table_is_temporary(ib_table)) {
info.options|= HA_LEX_CREATE_TMP_TABLE;
} else {
dict_get_and_save_data_dir_path(ib_table, false);
}
char* data_file_name = ib_table->data_dir_path;
if (data_file_name) {
info.data_file_name = data_file_name
= mem_heap_strdup(heap, data_file_name);
}
const char* temp_name = dict_mem_create_temporary_tablename(
heap, ib_table->name.m_name, ib_table->id);
const char* name = mem_heap_strdup(heap, ib_table->name.m_name);
trx_t* trx = innobase_trx_allocate(m_user_thd);
++trx->will_lock;
trx_set_dict_operation(trx, TRX_DICT_OP_TABLE);
int err = convert_error_code_to_mysql(
innobase_rename_table(trx, ib_table->name.m_name, temp_name),
ib_table->flags, m_user_thd);
if (!err) {
err = create(name, table, &info,
dict_table_is_file_per_table(ib_table), trx);
}
if (err) {
/* Before MDEV-14717, rollback of RENAME TABLE fails
to undo the rename in the file system, so we do it
manually here. In case the server is killed before the
TRUNCATE operation is committed, after recovery in
MariaDB 10.2, the data file could end up "missing"
(remain called temp_name). */
innobase_rename_table(trx, temp_name, name);
trx_rollback_to_savepoint(trx, NULL);
}
innobase_commit_low(trx);
trx_free_for_mysql(trx);
if (!err) {
/* Reopen the newly created table, and drop the
original table that was renamed to temp_name.
Note: In MariaDB 10.2 (before MDEV-14585), if the
server is killed and restarted before the original
table is dropped, the table will remain orphaned. */
close();
err = open(name, 0, 0);
if (!err) {
m_prebuilt->stored_select_lock_type = stored_lock;
m_prebuilt->table->update_time = update_time;
delete_table(temp_name, SQLCOM_TRUNCATE);
}
}
mem_heap_free(heap);
DBUG_RETURN(err);
}
/*********************************************************************//**
Renames an InnoDB table.
@return 0 or error code */

View File

@@ -26,6 +26,9 @@ extern const char innobase_index_reserve_name[];
/** Prebuilt structures in an InnoDB table handle used within MySQL */
struct row_prebuilt_t;
/** InnoDB transaction */
struct trx_t;
/** Engine specific table options are defined using this struct */
struct ha_table_option_struct
{
@@ -196,6 +199,13 @@ public:
void update_create_info(HA_CREATE_INFO* create_info);
inline int create(
const char* name,
TABLE* form,
HA_CREATE_INFO* create_info,
bool file_per_table,
trx_t* trx = NULL);
int create(
const char* name,
TABLE* form,
@@ -204,6 +214,8 @@ public:
const char* check_table_options(THD *thd, TABLE* table,
HA_CREATE_INFO* create_info, const bool use_tablespace, const ulint file_format);
inline int delete_table(const char* name, enum_sql_command sqlcom);
int truncate();
int delete_table(const char *name);
@@ -641,13 +653,16 @@ public:
TABLE* form,
HA_CREATE_INFO* create_info,
char* table_name,
char* remote_path)
char* remote_path,
bool file_per_table,
trx_t* trx = NULL)
:m_thd(thd),
m_trx(trx),
m_form(form),
m_create_info(create_info),
m_table_name(table_name),
m_remote_path(remote_path),
m_innodb_file_per_table(srv_file_per_table)
m_innodb_file_per_table(file_per_table)
{}
/** Initialize the object. */

View File

@@ -5579,7 +5579,8 @@ ha_innobase::prepare_inplace_alter_table(
altered_table,
ha_alter_info->create_info,
NULL,
NULL);
NULL,
srv_file_per_table);
info.set_tablespace_type(indexed_table->space != TRX_SYS_SPACE);

View File

@@ -4795,7 +4795,7 @@ reset_bit:
/*********************************************************************//**
Deletes all entries in the insert buffer for a given space id. This is used
in DISCARD TABLESPACE, IMPORT TABLESPACE and TRUNCATE TABLESPACE.
in DISCARD TABLESPACE, IMPORT TABLESPACE, and 5.7 TRUNCATE TABLE recovery.
NOTE: this does not update the page free bitmaps in the space. The space will
become CORRUPT when you call this function! */
void

View File

@@ -64,8 +64,10 @@ bool buf_LRU_drop_page_hash_for_tablespace(dict_table_t* table)
/** Empty the flush list for all pages belonging to a tablespace.
@param[in] id tablespace identifier
@param[in,out] observer flush observer,
or NULL if nothing is to be written */
void buf_LRU_flush_or_remove_pages(ulint id, FlushObserver* observer);
or NULL if nothing is to be written
@param[in] first first page to be flushed or evicted */
void buf_LRU_flush_or_remove_pages(ulint id, FlushObserver* observer,
ulint first = 0);
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
/********************************************************************//**

View File

@@ -151,14 +151,6 @@ dict_create_index_tree_in_mem(
dict_index_t* index, /*!< in/out: index */
const trx_t* trx); /*!< in: InnoDB transaction handle */
/*******************************************************************//**
Truncates the index tree but don't update SYSTEM TABLES.
@return DB_SUCCESS or error */
dberr_t
dict_truncate_index_tree_in_mem(
/*============================*/
dict_index_t* index); /*!< in/out: index */
/*******************************************************************//**
Drops the index tree but don't update SYS_INDEXES table. */
void

View File

@@ -101,10 +101,8 @@ struct fil_space_t {
new write operations because we don't
check this flag when doing flush
batches. */
/** whether undo tablespace truncation is in progress */
bool is_being_truncated;
/*!< this is set to true when we prepare to
truncate a single-table tablespace and its
.ibd file */
#ifdef UNIV_DEBUG
ulint redo_skipped_count;
/*!< reference count for operations who want
@@ -188,12 +186,8 @@ struct fil_space_t {
ulint magic_n;/*!< FIL_SPACE_MAGIC_N */
/** @return whether the tablespace is about to be dropped or
truncated */
bool is_stopping() const
{
return stop_new_ops || is_being_truncated;
}
/** @return whether the tablespace is about to be dropped */
bool is_stopping() const { return stop_new_ops; }
/** @return whether doublewrite buffering is needed */
bool use_doublewrite() const
@@ -923,7 +917,8 @@ fil_op_replay_rename(
not (necessarily) protected by meta-data locks.
(Rollback would generally be protected, but rollback of
FOREIGN KEY CASCADE/SET NULL is not protected by meta-data locks
but only by InnoDB table locks, which may be broken by TRUNCATE TABLE.)
but only by InnoDB table locks, which may be broken by
lock_remove_all_on_table().)
@param[in] table persistent table
checked @return whether the table is accessible */
bool
@@ -941,36 +936,15 @@ fil_delete_tablespace(
#endif /* BTR_CUR_HASH_ADAPT */
);
/** Truncate the tablespace to needed size.
@param[in] space_id id of tablespace to truncate
@param[in] size_in_pages truncate size.
@return true if truncate was successful. */
bool
fil_truncate_tablespace(
ulint space_id,
ulint size_in_pages);
/** Prepare to truncate an undo tablespace.
@param[in] space_id undo tablespace id
@return the tablespace
@retval NULL if the tablespace does not exist */
fil_space_t* fil_truncate_prepare(ulint space_id);
/*******************************************************************//**
Prepare for truncating a single-table tablespace. The tablespace
must be cached in the memory cache.
1) Check pending operations on a tablespace;
2) Remove all insert buffer entries for the tablespace;
@return DB_SUCCESS or error */
dberr_t
fil_prepare_for_truncate(
/*=====================*/
ulint id); /*!< in: space id */
/** Reinitialize the original tablespace header with the same space id
for single tablespace
@param[in] table table belongs to the tablespace
@param[in] size size in blocks
@param[in] trx Transaction covering truncate */
void
fil_reinit_space_header_for_table(
dict_table_t* table,
ulint size,
trx_t* trx);
/** Write log about an undo tablespace truncate operation. */
void fil_truncate_log(fil_space_t* space, ulint size, mtr_t* mtr)
MY_ATTRIBUTE((nonnull));
/*******************************************************************//**
Closes a single-table tablespace. The tablespace must be cached in the

View File

@@ -510,7 +510,7 @@ lock_trx_release_locks(
/*===================*/
trx_t* trx); /*!< in/out: transaction */
/*********************************************************************//**
Removes locks on a table to be dropped or truncated.
Removes locks on a table to be dropped or discarded.
If remove_also_table_sx_locks is TRUE then table-level S and X locks are
also removed in addition to other table-level and record-level locks.
No lock, that is going to be removed, is allowed to be a wait lock. */
@@ -518,7 +518,7 @@ void
lock_remove_all_on_table(
/*=====================*/
dict_table_t* table, /*!< in: table to be dropped
or truncated */
or discarded */
ibool remove_also_table_sx_locks);/*!< in: also removes
table S and X locks */

View File

@@ -490,10 +490,12 @@ to this checkpoint, or 0 if the information has not been written */
This used to be called LOG_GROUP_ID and always written as 0,
because InnoDB never supported more than one copy of the redo log. */
#define LOG_HEADER_FORMAT 0
/** 4 unused (zero-initialized) bytes. In format version 0, the
/** Redo log subformat (originally 0). In format version 0, the
LOG_FILE_START_LSN started here, 4 bytes earlier than LOG_HEADER_START_LSN,
which the LOG_FILE_START_LSN was renamed to. */
#define LOG_HEADER_PAD1 4
which the LOG_FILE_START_LSN was renamed to.
Subformat 1 is for the fully redo-logged TRUNCATE
(no MLOG_TRUNCATE records or extra log checkpoints or log files) */
#define LOG_HEADER_SUBFORMAT 4
/** LSN of the start of data in this log file (with format version 1;
in format version 0, it was called LOG_FILE_START_LSN and at offset 4). */
#define LOG_HEADER_START_LSN 8

View File

@@ -280,6 +280,15 @@ struct recv_sys_t{
ulint n_addrs;/*!< number of not processed hashed file
addresses in the hash table */
/** Undo tablespaces for which truncate has been logged
(indexed by id - srv_undo_space_id_start) */
struct trunc {
/** log sequence number of MLOG_FILE_CREATE2, or 0 if none */
lsn_t lsn;
/** truncated size of the tablespace, or 0 if not truncated */
unsigned pages;
} truncated_undo_spaces[127];
recv_dblwr_t dblwr;
/** Lastly added LSN to the hash table of log records. */

View File

@@ -1263,17 +1263,18 @@ bool
os_file_set_eof(
FILE* file); /*!< in: file to be truncated */
/** Truncates a file to a specified size in bytes. Do nothing if the size
preserved is smaller or equal than current size of file.
/** Truncate a file to a specified size in bytes.
@param[in] pathname file path
@param[in] file file to be truncated
@param[in] size size preserved in bytes
@param[in] allow_shrink whether to allow the file to become smaller
@return true if success */
bool
os_file_truncate(
const char* pathname,
os_file_t file,
os_offset_t size);
os_offset_t size,
bool allow_shrink = false);
/** NOTE! Use the corresponding macro os_file_flush(), not directly this
function!

View File

@@ -29,6 +29,8 @@ Created 9/17/2000 Heikki Tuuri
#define row0mysql_h
#include "ha_prototypes.h"
#include "sql_list.h"
#include "sql_cmd.h"
#include "data0data.h"
#include "que0types.h"
@@ -434,32 +436,28 @@ row_mysql_lock_table(
const char* op_info) /*!< in: string for trx->op_info */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/*********************************************************************//**
Truncates a table for MySQL.
@return error code or DB_SUCCESS */
dberr_t
row_truncate_table_for_mysql(
/*=========================*/
dict_table_t* table, /*!< in: table handle */
trx_t* trx) /*!< in: transaction handle */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/*********************************************************************//**
Drops a table for MySQL. If the data dictionary was not already locked
by the transaction, the transaction will be committed. Otherwise, the
data dictionary will remain locked.
@return error code or DB_SUCCESS */
/** Drop a table.
If the data dictionary was not already locked by the transaction,
the transaction will be committed. Otherwise, the data dictionary
will remain locked.
@param[in] name Table name
@param[in,out] trx Transaction handle
@param[in] sqlcom type of SQL operation
@param[in] create_failed true=create table failed
because e.g. foreign key column
@param[in] nonatomic Whether it is permitted to release
and reacquire dict_operation_lock
@return error code */
dberr_t
row_drop_table_for_mysql(
/*=====================*/
const char* name, /*!< in: table name */
trx_t* trx, /*!< in: dictionary transaction handle */
bool drop_db,/*!< in: true=dropping whole database */
ibool create_failed,/*!<in: TRUE=create table failed
because e.g. foreign key column
type mismatch. */
bool nonatomic = true);
/*!< in: whether it is permitted
to release and reacquire dict_operation_lock */
const char* name,
trx_t* trx,
enum_sql_command sqlcom,
bool create_failed = false,
bool nonatomic = true);
/** Drop a table after failed CREATE TABLE. */
dberr_t row_drop_table_after_create_fail(const char* name, trx_t* trx);
/*********************************************************************//**
Discards the tablespace of a table which stored in an .ibd file. Discarding

View File

@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -420,14 +421,4 @@ private:
const char* log_file_name);
};
/**
Truncates a table for MySQL.
@param table table being truncated
@param trx transaction covering the truncate
@return error code or DB_SUCCESS */
dberr_t
row_truncate_table_for_mysql(dict_table_t* table, trx_t* trx);
#endif /* row0trunc_h */

View File

@@ -252,27 +252,6 @@ namespace undo {
typedef std::vector<ulint> undo_spaces_t;
typedef std::vector<trx_rseg_t*> rseg_for_trunc_t;
/** Magic Number to indicate truncate action is complete. */
const ib_uint32_t s_magic = 76845412;
/** Truncate Log file Prefix. */
const char* const s_log_prefix = "undo_";
/** Truncate Log file Extension. */
const char* const s_log_ext = "trunc.log";
/** Populate log file name based on space_id
@param[in] space_id id of the undo tablespace.
@return DB_SUCCESS or error code */
dberr_t populate_log_file_name(
ulint space_id,
char*& log_file_name);
/** Create the truncate log file.
@param[in] space_id id of the undo tablespace to truncate.
@return DB_SUCCESS or error code. */
dberr_t init(ulint space_id);
/** Mark completion of undo truncate action by writing magic number to
the log file and then removing it from the disk.
If we are going to remove it from disk then why write magic number ?
@@ -439,23 +418,6 @@ namespace undo {
return(m_purge_rseg_truncate_frequency);
}
/* Start writing log information to a special file.
On successfull completion, file is removed.
On crash, file is used to complete the truncate action.
@param space_id space id of undo tablespace
@return DB_SUCCESS or error code. */
dberr_t start_logging(ulint space_id)
{
return(init(space_id));
}
/* Mark completion of logging./
@param space_id space id of undo tablespace */
void done_logging(ulint space_id)
{
return(done(space_id));
}
private:
/** UNDO tablespace is mark for truncate. */
ulint m_undo_for_trunc;

View File

@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -316,18 +316,6 @@ trx_undo_free_prepared(
trx_t* trx) /*!< in/out: PREPARED transaction */
ATTRIBUTE_COLD __attribute__((nonnull));
/* Forward declaration. */
namespace undo {
class Truncate;
};
/** Truncate UNDO tablespace, reinitialize header and rseg.
@param[in] undo_trunc UNDO tablespace handler
@return true if success else false. */
bool
trx_undo_truncate_tablespace(
undo::Truncate* undo_trunc);
/***********************************************************//**
Parses the redo log entry of an undo log page initialization.
@return end of log record or NULL */

View File

@@ -4635,7 +4635,7 @@ lock_remove_recovered_trx_record_locks(
}
/*********************************************************************//**
Removes locks on a table to be dropped or truncated.
Removes locks on a table to be dropped or discarded.
If remove_also_table_sx_locks is TRUE then table-level S and X locks are
also removed in addition to other table-level and record-level locks.
No lock, that is going to be removed, is allowed to be a wait lock. */
@@ -4643,7 +4643,7 @@ void
lock_remove_all_on_table(
/*=====================*/
dict_table_t* table, /*!< in: table to be dropped
or truncated */
or discarded */
ibool remove_also_table_sx_locks)/*!< in: also removes
table S and X locks */
{
@@ -5226,9 +5226,8 @@ lock_trx_print_locks(
}
/* It is a single table tablespace
and the .ibd file is missing
(TRUNCATE TABLE probably stole the
locks): just print the lock without
and the .ibd file is missing:
just print the lock without
attempting to load the page in the
buffer pool. */

View File

@@ -880,6 +880,7 @@ log_group_file_header_flush(
memset(buf, 0, OS_FILE_LOG_BLOCK_SIZE);
mach_write_to_4(buf + LOG_HEADER_FORMAT, group->format);
mach_write_to_4(buf + LOG_HEADER_SUBFORMAT, 1);
mach_write_to_8(buf + LOG_HEADER_START_LSN, start_lsn);
strcpy(reinterpret_cast<char*>(buf) + LOG_HEADER_CREATOR,
LOG_HEADER_CREATOR_CURRENT);

View File

@@ -131,8 +131,7 @@ bool recv_writer_thread_active;
/** Return string name of the redo log record type.
@param[in] type record log record enum
@return string name of record log record */
const char*
get_mlog_string(mlog_id_t type);
static const char* get_mlog_string(mlog_id_t type);
#endif /* !DBUG_OFF */
/** Tablespace item during recovery */
@@ -219,6 +218,75 @@ void (*log_file_op)(ulint space_id, const byte* flags,
const byte* name, ulint len,
const byte* new_name, ulint new_len);
/** Process a MLOG_CREATE2 record that indicates that a tablespace
is being shrunk in size.
@param[in] space_id tablespace identifier
@param[in] pages trimmed size of the file, in pages
@param[in] lsn log sequence number of the operation */
static void recv_addr_trim(ulint space_id, unsigned pages, lsn_t lsn)
{
DBUG_ENTER("recv_addr_trim");
DBUG_LOG("ib_log",
"discarding log beyond end of tablespace "
<< page_id_t(space_id, pages) << " before LSN " << lsn);
ut_ad(mutex_own(&recv_sys->mutex));
for (ulint i = recv_sys->addr_hash->n_cells; i--; ) {
hash_cell_t* const cell = hash_get_nth_cell(
recv_sys->addr_hash, i);
for (recv_addr_t* addr = static_cast<recv_addr_t*>(cell->node),
*prev = NULL, *next;
addr;
prev = addr, addr = next) {
next = static_cast<recv_addr_t*>(addr->addr_hash);
if (addr->space != space_id || addr->page_no < pages) {
continue;
}
for (recv_t* recv = UT_LIST_GET_FIRST(addr->rec_list);
recv; ) {
recv_t* n = UT_LIST_GET_NEXT(rec_list, recv);
if (recv->start_lsn < lsn) {
DBUG_PRINT("ib_log",
("Discarding %s for"
" page %u:%u at " LSN_PF,
get_mlog_string(
recv->type),
addr->space, addr->page_no,
recv->start_lsn));
UT_LIST_REMOVE(addr->rec_list, recv);
}
recv = n;
}
if (UT_LIST_GET_LEN(addr->rec_list)) {
DBUG_PRINT("ib_log",
("preserving " ULINTPF
" records for page %u:%u",
UT_LIST_GET_LEN(addr->rec_list),
addr->space, addr->page_no));
} else {
ut_ad(recv_sys->n_addrs);
--recv_sys->n_addrs;
if (addr == cell->node) {
cell->node = next;
} else {
prev->addr_hash = next;
}
}
}
}
if (fil_space_t* space = fil_space_get(space_id)) {
ut_ad(UT_LIST_GET_LEN(space->chain) == 1);
fil_node_t* file = UT_LIST_GET_FIRST(space->chain);
ut_ad(file->is_open());
os_file_truncate(file->name, file->handle,
os_offset_t(pages) << srv_page_size_shift,
true);
}
DBUG_VOID_RETURN;
}
/** Process a file name from a MLOG_FILE_* record.
@param[in,out] name file name
@param[in] len length of the file name
@@ -391,9 +459,8 @@ fil_name_parse(
user-created tablespaces. The name must be long enough
and end in .ibd. */
bool corrupt = is_predefined_tablespace(space_id)
|| first_page_no != 0 // TODO: multi-file user tablespaces
|| len < sizeof "/a.ibd\0"
|| memcmp(ptr + len - 5, DOT_IBD, 5) != 0
|| (!first_page_no != !memcmp(ptr + len - 5, DOT_IBD, 5))
|| memchr(ptr, OS_PATH_SEPARATOR, len) == NULL;
byte* end_ptr = ptr + len;
@@ -422,7 +489,18 @@ fil_name_parse(
reinterpret_cast<char*>(ptr), len, space_id, true);
/* fall through */
case MLOG_FILE_CREATE2:
if (log_file_op) {
if (first_page_no) {
ut_ad(first_page_no
== SRV_UNDO_TABLESPACE_SIZE_IN_PAGES);
ut_a(srv_is_undo_tablespace(space_id));
compile_time_assert(
UT_ARR_SIZE(recv_sys->truncated_undo_spaces)
== TRX_SYS_MAX_UNDO_SPACES);
recv_sys_t::trunc& t = recv_sys->truncated_undo_spaces[
space_id - srv_undo_space_id_start];
t.lsn = recv_sys->recovered_lsn;
t.pages = uint32_t(first_page_no);
} else if (log_file_op) {
log_file_op(space_id,
type == MLOG_FILE_CREATE2 ? ptr - 4 : NULL,
ptr, len, NULL, 0);
@@ -2118,6 +2196,14 @@ recv_apply_hashed_log_recs(bool last_batch)
recv_sys->apply_log_recs = TRUE;
recv_sys->apply_batch_on = TRUE;
for (ulint id = srv_undo_tablespaces_open; id--; ) {
recv_sys_t::trunc& t = recv_sys->truncated_undo_spaces[id];
if (t.lsn) {
recv_addr_trim(id + srv_undo_space_id_start, t.pages,
t.lsn);
}
}
for (ulint i = 0; i < hash_get_n_cells(recv_sys->addr_hash); i++) {
for (recv_addr_t* recv_addr = static_cast<recv_addr_t*>(
HASH_GET_FIRST(recv_sys->addr_hash, i));
@@ -3753,8 +3839,7 @@ recv_dblwr_t::find_page(ulint space_id, ulint page_no)
/** Return string name of the redo log record type.
@param[in] type record log record enum
@return string name of record log record */
const char*
get_mlog_string(mlog_id_t type)
static const char* get_mlog_string(mlog_id_t type)
{
switch (type) {
case MLOG_SINGLE_REC_FLAG:

View File

@@ -5456,25 +5456,27 @@ fallback:
return(current_size >= size && os_file_flush(file));
}
/** Truncates a file to a specified size in bytes.
Do nothing if the size to preserve is greater or equal to the current
size of the file.
/** Truncate a file to a specified size in bytes.
@param[in] pathname file path
@param[in] file file to be truncated
@param[in] size size to preserve in bytes
@param[in] size size preserved in bytes
@param[in] allow_shrink whether to allow the file to become smaller
@return true if success */
bool
os_file_truncate(
const char* pathname,
os_file_t file,
os_offset_t size)
os_offset_t size,
bool allow_shrink)
{
/* Do nothing if the size preserved is larger than or equal to the
current size of file */
os_offset_t size_bytes = os_file_get_size(file);
if (!allow_shrink) {
/* Do nothing if the size preserved is larger than or
equal to the current size of file */
os_offset_t size_bytes = os_file_get_size(file);
if (size >= size_bytes) {
return(true);
if (size >= size_bytes) {
return(true);
}
}
#ifdef _WIN32

View File

@@ -1629,8 +1629,7 @@ row_ins_check_foreign_constraint(
if (check_table == NULL
|| !check_table->is_readable()
|| check_index == NULL
|| fil_space_get(check_table->space)->is_being_truncated) {
|| check_index == NULL) {
if (!srv_read_only_mode && check_ref) {
FILE* ef = dict_foreign_err_file;

View File

@@ -4475,7 +4475,7 @@ row_merge_drop_table(
ut_a(table->get_ref_count() == 0);
return(row_drop_table_for_mysql(table->name.m_name,
trx, false, false, false));
trx, SQLCOM_DROP_TABLE, false, false));
}
/** Write an MLOG_INDEX_LOAD record to indicate in the redo-log

View File

@@ -2499,7 +2499,8 @@ error_handling:
trx_rollback_to_savepoint(trx, NULL);
}
row_drop_table_for_mysql(table_name, trx, FALSE, true);
row_drop_table_for_mysql(table_name, trx, SQLCOM_DROP_TABLE,
true);
if (trx_is_started(trx)) {
@@ -2591,7 +2592,7 @@ row_table_add_foreign_constraints(
trx_rollback_to_savepoint(trx, NULL);
}
row_drop_table_for_mysql(name, trx, FALSE, true);
row_drop_table_for_mysql(name, trx, SQLCOM_DROP_TABLE, true);
if (trx_is_started(trx)) {
@@ -2631,7 +2632,7 @@ row_drop_table_for_mysql_in_background(
/* Try to drop the table in InnoDB */
error = row_drop_table_for_mysql(name, trx, FALSE, FALSE);
error = row_drop_table_for_mysql(name, trx, SQLCOM_TRUNCATE);
/* Flush the log to reduce probability that the .frm files and
the InnoDB data dictionary get out-of-sync if the user runs
@@ -2777,6 +2778,7 @@ func_exit:
@param[in,out] trx transaction
@param[out] new_id new table id
@return error code or DB_SUCCESS */
static
dberr_t
row_mysql_table_id_reassign(
dict_table_t* table,
@@ -3259,7 +3261,7 @@ row_drop_table_from_cache(
trx_t* trx)
{
dberr_t err = DB_SUCCESS;
bool is_temp = dict_table_is_temporary(table);
ut_ad(!dict_table_is_temporary(table));
/* Remove the pointer to this table object from the list
of modified tables by the transaction because the object
@@ -3268,9 +3270,7 @@ row_drop_table_from_cache(
dict_table_remove_from_cache(table);
if (!is_temp
&& dict_load_table(tablename, true,
DICT_ERR_IGNORE_NONE) != NULL) {
if (dict_load_table(tablename, true, DICT_ERR_IGNORE_NONE)) {
ib::error() << "Not able to remove table "
<< ut_get_name(trx, tablename)
<< " from the dictionary cache!";
@@ -3319,25 +3319,25 @@ row_drop_single_table_tablespace(
return(err);
}
/** Drop a table for MySQL.
/** Drop a table.
If the data dictionary was not already locked by the transaction,
the transaction will be committed. Otherwise, the data dictionary
will remain locked.
@param[in] name Table name
@param[in] trx Transaction handle
@param[in] drop_db true=dropping whole database
@param[in] create_failed TRUE=create table failed
@param[in,out] trx Transaction handle
@param[in] sqlcom type of SQL operation
@param[in] create_failed true=create table failed
because e.g. foreign key column
@param[in] nonatomic Whether it is permitted to release
and reacquire dict_operation_lock
@return error code or DB_SUCCESS */
dberr_t
row_drop_table_for_mysql(
const char* name,
trx_t* trx,
bool drop_db,
ibool create_failed,
bool nonatomic)
const char* name,
trx_t* trx,
enum_sql_command sqlcom,
bool create_failed,
bool nonatomic)
{
dberr_t err;
dict_foreign_t* foreign;
@@ -3500,7 +3500,7 @@ row_drop_table_for_mysql(
foreign = *it;
const bool ref_ok = drop_db
const bool ref_ok = sqlcom == SQLCOM_DROP_DB
&& dict_tables_have_same_db(
name,
foreign->foreign_table_name_lookup);
@@ -3537,7 +3537,6 @@ row_drop_table_for_mysql(
}
}
DBUG_EXECUTE_IF("row_drop_table_add_to_background",
row_add_table_to_background_drop_list(table->id);
err = DB_SUCCESS;
@@ -3587,11 +3586,14 @@ row_drop_table_for_mysql(
ut_a(table->n_rec_locks == 0);
} else if (table->get_ref_count() > 0 || table->n_rec_locks > 0) {
if (row_add_table_to_background_drop_list(table->id)) {
ib::info() << "MySQL is trying to drop table "
<< table->name
<< " though there are still open handles to"
" it. Adding the table to the background drop"
" queue.";
if (!strstr(table->name.m_name,
"/" TEMP_FILE_PREFIX_INNODB)) {
ib::info() << "MySQL is trying to drop table "
<< table->name
<< " though there are still "
"open handles to it. Adding the table "
"to the background drop queue.";
}
/* We return DB_SUCCESS to MySQL though the drop will
happen lazily later */
@@ -3626,9 +3628,9 @@ row_drop_table_for_mysql(
/* If the transaction was previously flagged as
TRX_DICT_OP_INDEX, we should be dropping auxiliary
tables for full-text indexes or temp tables. */
ut_ad(strstr(table->name.m_name, "/FTS_") != NULL
|| strstr(table->name.m_name, TEMP_FILE_PREFIX_INNODB)
!= NULL);
ut_ad(strstr(table->name.m_name, "/FTS_")
|| strstr(table->name.m_name,
"/" TEMP_FILE_PREFIX_INNODB));
}
/* Mark all indexes unavailable in the data dictionary cache
@@ -3670,12 +3672,11 @@ row_drop_table_for_mysql(
pars_info_add_str_literal(info, "table_name", name);
err = que_eval_sql(
err = (sqlcom == SQLCOM_TRUNCATE) ? DB_SUCCESS : que_eval_sql(
info,
"PROCEDURE DROP_TABLE_PROC () IS\n"
"PROCEDURE DROP_FOREIGN_PROC () IS\n"
"sys_foreign_id CHAR;\n"
"table_id CHAR;\n"
"index_id CHAR;\n"
"foreign_id CHAR;\n"
"space_id INT;\n"
"found INT;\n"
@@ -3687,11 +3688,6 @@ row_drop_table_for_mysql(
" = TO_BINARY(:table_name)\n"
"LOCK IN SHARE MODE;\n"
"DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n"
"LOCK IN SHARE MODE;\n"
"BEGIN\n"
"SELECT ID INTO table_id\n"
@@ -3740,21 +3736,35 @@ row_drop_table_for_mysql(
"END LOOP;\n"
"CLOSE cur_fk;\n"
"found := 1;\n"
"OPEN cur_idx;\n"
"WHILE found = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id\n"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE cur_idx;\n"
"END;\n",
FALSE, trx);
if (err == DB_SUCCESS) {
if (sqlcom != SQLCOM_TRUNCATE) {
info = pars_info_create();
pars_info_add_str_literal(info, "table_name",
name);
}
err = que_eval_sql(
info,
"PROCEDURE DROP_TABLE_PROC () IS\n"
"table_id CHAR;\n"
"space_id INT;\n"
"index_id CHAR;\n"
"DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n"
"FOR UPDATE;\n"
"BEGIN\n"
"SELECT ID, SPACE INTO table_id,space_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = :table_name FOR UPDATE;\n"
"IF (SQL % NOTFOUND) THEN\n"
" RETURN;\n"
"END IF;\n"
"DELETE FROM SYS_COLUMNS\n"
"WHERE TABLE_ID = table_id;\n"
@@ -3768,8 +3778,25 @@ row_drop_table_for_mysql(
"DELETE FROM SYS_VIRTUAL\n"
"WHERE TABLE_ID = table_id;\n"
"OPEN cur_idx;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN\n"
" EXIT;\n"
" ELSE\n"
" DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id\n"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE cur_idx;\n"
"END;\n",
FALSE, trx);
}
} else {
page_no = page_nos;
for (dict_index_t* index = dict_table_get_first_index(table);
@@ -3778,7 +3805,9 @@ row_drop_table_for_mysql(
/* remove the index object associated. */
dict_drop_index_tree_in_mem(index, *page_no++);
}
err = row_drop_table_from_cache(tablename, table, trx);
trx->mod_tables.erase(table);
dict_table_remove_from_cache(table);
err = DB_SUCCESS;
goto funct_exit;
}
@@ -3907,6 +3936,13 @@ funct_exit:
DBUG_RETURN(err);
}
/** Drop a table after failed CREATE TABLE. */
dberr_t row_drop_table_after_create_fail(const char* name, trx_t* trx)
{
ib::warn() << "Dropping incompletely created " << name << " table.";
return row_drop_table_for_mysql(name, trx, SQLCOM_DROP_DB, true);
}
/*******************************************************************//**
Drop all foreign keys in a database, see Bug#18942.
Called at the end of row_drop_database_for_mysql().
@@ -4095,7 +4131,8 @@ loop:
goto loop;
}
err = row_drop_table_for_mysql(table_name, trx, TRUE, FALSE);
err = row_drop_table_for_mysql(
table_name, trx, SQLCOM_DROP_DB);
trx_commit_for_mysql(trx);
if (err != DB_SUCCESS) {

File diff suppressed because it is too large Load Diff

View File

@@ -354,8 +354,8 @@ row_undo_ins_parse_undo_rec(
close_table:
/* Normally, tables should not disappear or become
unaccessible during ROLLBACK, because they should be
protected by InnoDB table locks. TRUNCATE TABLE
or table corruption could be valid exceptions.
protected by InnoDB table locks. Corruption could be
a valid exception.
FIXME: When running out of temporary tablespace, it
would probably be better to just drop all temporary

View File

@@ -1152,8 +1152,8 @@ row_undo_mod_parse_undo_rec(
close_table:
/* Normally, tables should not disappear or become
unaccessible during ROLLBACK, because they should be
protected by InnoDB table locks. TRUNCATE TABLE
or table corruption could be valid exceptions.
protected by InnoDB table locks. Corruption could be
a valid exception.
FIXME: When running out of temporary tablespace, it
would probably be better to just drop all temporary

View File

@@ -286,34 +286,6 @@ row_upd_check_references_constraints(
FALSE, FALSE, DICT_ERR_IGNORE_NONE);
}
/* dict_operation_lock is held both here
(UPDATE or DELETE with FOREIGN KEY) and by TRUNCATE
TABLE operations.
If a TRUNCATE TABLE operation is in progress,
there can be 2 possible conditions:
1) row_truncate_table_for_mysql() is not yet called.
2) Truncate releases dict_operation_lock
during eviction of pages from buffer pool
for a file-per-table tablespace.
In case of (1), truncate will wait for FK operation
to complete.
In case of (2), truncate will be rolled forward even
if it is interrupted. So if the foreign table is
undergoing a truncate, ignore the FK check. */
if (foreign_table) {
mutex_enter(&fil_system->mutex);
const fil_space_t* space = fil_space_get_by_id(
foreign_table->space);
const bool being_truncated = space
&& space->is_being_truncated;
mutex_exit(&fil_system->mutex);
if (being_truncated) {
continue;
}
}
/* NOTE that if the thread ends up waiting for a lock
we will release dict_operation_lock temporarily!
But the counter on the table protects 'foreign' from

View File

@@ -1107,8 +1107,7 @@ srv_undo_tablespaces_init(bool create_new_db)
buf_LRU_flush_or_remove_pages(*it, &dummy2);
/* Remove the truncate redo log file. */
undo::Truncate undo_trunc;
undo_trunc.done_logging(*it);
undo::done(*it);
}
}

View File

@@ -536,18 +536,22 @@ truncate of the UNDO is in progress. This file is required during recovery
to complete the truncate. */
namespace undo {
/** Magic Number to indicate truncate action is complete. */
static const ib_uint32_t s_magic = 76845412;
/** Populate log file name based on space_id
@param[in] space_id id of the undo tablespace.
@return DB_SUCCESS or error code */
dberr_t populate_log_file_name(
static dberr_t populate_log_file_name(
ulint space_id,
char*& log_file_name)
{
ulint log_file_name_sz =
strlen(srv_log_group_home_dir) + 22 + 1 /* NUL */
+ strlen(undo::s_log_prefix)
+ strlen(undo::s_log_ext);
static const char s_log_prefix[] = "undo_";
static const char s_log_ext[] = "trunc.log";
ulint log_file_name_sz = strlen(srv_log_group_home_dir)
+ (22 - 1 /* NUL */
+ sizeof s_log_prefix + sizeof s_log_ext);
log_file_name = new (std::nothrow) char[log_file_name_sz];
if (log_file_name == 0) {
@@ -569,63 +573,12 @@ namespace undo {
snprintf(log_file_name + log_file_name_len,
log_file_name_sz - log_file_name_len,
"%s%lu_%s", undo::s_log_prefix,
(ulong) space_id, s_log_ext);
"%s" ULINTPF "_%s", s_log_prefix,
space_id, s_log_ext);
return(DB_SUCCESS);
}
/** Create the truncate log file.
@param[in] space_id id of the undo tablespace to truncate.
@return DB_SUCCESS or error code. */
dberr_t init(ulint space_id)
{
dberr_t err;
char* log_file_name;
/* Step-1: Create the log file name using the pre-decided
prefix/suffix and table id of undo tablepsace to truncate. */
err = populate_log_file_name(space_id, log_file_name);
if (err != DB_SUCCESS) {
return(err);
}
/* Step-2: Create the log file, open it and write 0 to
indicate init phase. */
bool ret;
os_file_t handle = os_file_create(
innodb_log_file_key, log_file_name, OS_FILE_CREATE,
OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode, &ret);
if (!ret) {
delete[] log_file_name;
return(DB_IO_ERROR);
}
ulint sz = UNIV_PAGE_SIZE;
void* buf = ut_zalloc_nokey(sz + UNIV_PAGE_SIZE);
if (buf == NULL) {
os_file_close(handle);
delete[] log_file_name;
return(DB_OUT_OF_MEMORY);
}
byte* log_buf = static_cast<byte*>(
ut_align(buf, UNIV_PAGE_SIZE));
IORequest request(IORequest::WRITE);
err = os_file_write(
request, log_file_name, handle, log_buf, 0, sz);
os_file_flush(handle);
os_file_close(handle);
ut_free(buf);
delete[] log_file_name;
return(err);
}
/** Mark completion of undo truncate action by writing magic number to
the log file and then removing it from the disk.
If we are going to remove it from disk then why write magic number ?
@@ -998,43 +951,140 @@ trx_purge_initiate_truncate(
/* Step-3: Start the actual truncate.
a. log-checkpoint
b. Write the DDL log to protect truncate action from CRASH
c. Remove rseg instance if added to purge queue before we
a. Remove rseg instance if added to purge queue before we
initiate truncate.
d. Execute actual truncate
e. Remove the DDL log. */
/* After truncate if server crashes then redo logging done for this
undo tablespace might not stand valid as tablespace has been
truncated. */
log_make_checkpoint_at(LSN_MAX, TRUE);
b. Execute actual truncate */
const ulint space_id = undo_trunc->get_marked_space_id();
ib::info() << "Truncating UNDO tablespace " << space_id;
#ifdef UNIV_DEBUG
dberr_t err =
#endif /* UNIV_DEBUG */
undo_trunc->start_logging(space_id);
ut_ad(err == DB_SUCCESS);
DBUG_EXECUTE_IF("ib_undo_trunc_before_truncate",
ib::info() << "ib_undo_trunc_before_truncate";
DBUG_SUICIDE(););
trx_purge_cleanse_purge_queue(undo_trunc);
if (!trx_undo_truncate_tablespace(undo_trunc)) {
/* Note: In case of error we don't enable the rsegs
and neither unmark the tablespace so the tablespace
continue to remain inactive. */
ib::error() << "Failed to truncate UNDO tablespace "
<< space_id;
ut_a(srv_is_undo_tablespace(space_id));
/* Flush all to-be-discarded pages of the tablespace.
During truncation, we do not want any writes to the
to-be-discarded area, because we must set the space->size
early in order to have deterministic page allocation.
If a log checkpoint was completed at LSN earlier than our
mini-transaction commit and the server was killed, then
discarding the to-be-trimmed pages without flushing would
break crash recovery. So, we cannot avoid the write. */
{
FlushObserver observer(
space_id,
UT_LIST_GET_FIRST(purge_sys->query->thrs)->graph->trx,
NULL);
buf_LRU_flush_or_remove_pages(space_id, &observer);
}
log_free_check();
/* Adjust the tablespace metadata. */
fil_space_t* space = fil_truncate_prepare(space_id);
if (!space) {
ib::error() << "Failed to find UNDO tablespace " << space_id;
return;
}
/* Undo tablespace always are a single file. */
ut_a(UT_LIST_GET_LEN(space->chain) == 1);
fil_node_t* file = UT_LIST_GET_FIRST(space->chain);
/* The undo tablespace files are never closed. */
ut_ad(file->is_open());
/* Re-initialize tablespace, in a single mini-transaction. */
mtr_t mtr;
const ulint size = SRV_UNDO_TABLESPACE_SIZE_IN_PAGES;
mtr.start();
mtr_x_lock(&space->latch, &mtr);
fil_truncate_log(space, size, &mtr);
fsp_header_init(space_id, size, &mtr);
mutex_enter(&fil_system->mutex);
space->size = file->size = size;
mutex_exit(&fil_system->mutex);
for (ulint i = 0; i < undo_trunc->rsegs_size(); ++i) {
trx_rsegf_t* rseg_header;
trx_rseg_t* rseg = undo_trunc->get_ith_rseg(i);
rseg->page_no = trx_rseg_header_create(
space_id, ULINT_MAX, rseg->id, &mtr);
rseg_header = trx_rsegf_get_new(space_id, rseg->page_no, &mtr);
/* Before re-initialization ensure that we free the existing
structure. There can't be any active transactions. */
ut_a(UT_LIST_GET_LEN(rseg->update_undo_list) == 0);
ut_a(UT_LIST_GET_LEN(rseg->insert_undo_list) == 0);
trx_undo_t* next_undo;
for (trx_undo_t* undo =
UT_LIST_GET_FIRST(rseg->update_undo_cached);
undo != NULL;
undo = next_undo) {
next_undo = UT_LIST_GET_NEXT(undo_list, undo);
UT_LIST_REMOVE(rseg->update_undo_cached, undo);
MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED);
trx_undo_mem_free(undo);
}
for (trx_undo_t* undo =
UT_LIST_GET_FIRST(rseg->insert_undo_cached);
undo != NULL;
undo = next_undo) {
next_undo = UT_LIST_GET_NEXT(undo_list, undo);
UT_LIST_REMOVE(rseg->insert_undo_cached, undo);
MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED);
trx_undo_mem_free(undo);
}
UT_LIST_INIT(rseg->update_undo_list, &trx_undo_t::undo_list);
UT_LIST_INIT(rseg->update_undo_cached, &trx_undo_t::undo_list);
UT_LIST_INIT(rseg->insert_undo_list, &trx_undo_t::undo_list);
UT_LIST_INIT(rseg->insert_undo_cached, &trx_undo_t::undo_list);
/* These were written by trx_rseg_header_create(). */
ut_ad(mach_read_from_4(rseg_header + TRX_RSEG_MAX_SIZE)
== uint32_t(rseg->max_size));
ut_ad(!mach_read_from_4(rseg_header + TRX_RSEG_HISTORY_SIZE));
rseg->max_size = ULINT_MAX;
/* Initialize the undo log lists according to the rseg header */
rseg->curr_size = 1;
rseg->trx_ref_count = 0;
rseg->last_page_no = FIL_NULL;
rseg->last_offset = 0;
rseg->last_trx_no = 0;
rseg->last_del_marks = FALSE;
}
mtr.commit();
/* Write-ahead the redo log record. */
log_write_up_to(mtr.commit_lsn(), true);
/* Trim the file size. */
os_file_truncate(file->name, file->handle,
os_offset_t(size) << srv_page_size_shift, true);
/* TODO: PUNCH_HOLE the garbage (with write-ahead logging) */
mutex_enter(&fil_system->mutex);
ut_ad(space->stop_new_ops);
ut_ad(space->is_being_truncated);
space->stop_new_ops = false;
space->is_being_truncated = false;
mutex_exit(&fil_system->mutex);
if (purge_sys->rseg != NULL
&& purge_sys->rseg->last_page_no == FIL_NULL) {
/* If purge_sys->rseg is pointing to rseg that was recently
@@ -1048,14 +1098,11 @@ trx_purge_initiate_truncate(
purge_sys->rseg = NULL;
}
DBUG_EXECUTE_IF("ib_undo_trunc_before_ddl_log_end",
ib::info() << "ib_undo_trunc_before_ddl_log_end";
DBUG_EXECUTE_IF("ib_undo_trunc",
ib::info() << "ib_undo_trunc";
log_write_up_to(LSN_MAX, true);
DBUG_SUICIDE(););
log_make_checkpoint_at(LSN_MAX, TRUE);
undo_trunc->done_logging(space_id);
/* Completed truncate. Now it is safe to re-use the tablespace. */
for (ulint i = 0; i < undo_trunc->rsegs_size(); ++i) {
trx_rseg_t* rseg = undo_trunc->get_ith_rseg(i);
@@ -1066,10 +1113,6 @@ trx_purge_initiate_truncate(
undo_trunc->reset();
undo::Truncate::clear_trunc_list();
DBUG_EXECUTE_IF("ib_undo_trunc_trunc_done",
ib::info() << "ib_undo_trunc_trunc_done";
DBUG_SUICIDE(););
}
/********************************************************************//**

View File

@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -86,7 +86,9 @@ trx_rseg_header_create(
/* Reset the undo log slots */
for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
/* FIXME: This is generating a lot of redo log.
Why not just let it remain zero-initialized,
and adjust trx_rsegf_undo_find_free() and friends? */
trx_rsegf_set_nth_undo(rsegf, i, FIL_NULL, mtr);
}

View File

@@ -1889,102 +1889,3 @@ trx_undo_free_prepared(
undo = NULL;
}
}
/** Truncate UNDO tablespace, reinitialize header and rseg.
@param[in] undo_trunc UNDO tablespace handler
@return true if success else false. */
bool
trx_undo_truncate_tablespace(
undo::Truncate* undo_trunc)
{
bool success = true;
ulint space_id = undo_trunc->get_marked_space_id();
/* Step-1: Truncate tablespace. */
success = fil_truncate_tablespace(
space_id, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES);
if (!success) {
return(success);
}
/* Step-2: Re-initialize tablespace header.
Avoid REDO logging as we don't want to apply the action if server
crashes. For fix-up we have UNDO-truncate-ddl-log. */
mtr_t mtr;
mtr_start(&mtr);
mtr_set_log_mode(&mtr, MTR_LOG_NO_REDO);
fsp_header_init(space_id, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr);
mtr_commit(&mtr);
/* Step-3: Re-initialize rollback segment header that resides
in truncated tablespaced. */
mtr_start(&mtr);
mtr_set_log_mode(&mtr, MTR_LOG_NO_REDO);
mtr_x_lock(fil_space_get_latch(space_id, NULL), &mtr);
for (ulint i = 0; i < undo_trunc->rsegs_size(); ++i) {
trx_rsegf_t* rseg_header;
trx_rseg_t* rseg = undo_trunc->get_ith_rseg(i);
rseg->page_no = trx_rseg_header_create(
space_id, ULINT_MAX, rseg->id, &mtr);
rseg_header = trx_rsegf_get_new(space_id, rseg->page_no, &mtr);
/* Before re-initialization ensure that we free the existing
structure. There can't be any active transactions. */
ut_a(UT_LIST_GET_LEN(rseg->update_undo_list) == 0);
ut_a(UT_LIST_GET_LEN(rseg->insert_undo_list) == 0);
trx_undo_t* next_undo;
for (trx_undo_t* undo =
UT_LIST_GET_FIRST(rseg->update_undo_cached);
undo != NULL;
undo = next_undo) {
next_undo = UT_LIST_GET_NEXT(undo_list, undo);
UT_LIST_REMOVE(rseg->update_undo_cached, undo);
MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED);
trx_undo_mem_free(undo);
}
for (trx_undo_t* undo =
UT_LIST_GET_FIRST(rseg->insert_undo_cached);
undo != NULL;
undo = next_undo) {
next_undo = UT_LIST_GET_NEXT(undo_list, undo);
UT_LIST_REMOVE(rseg->insert_undo_cached, undo);
MONITOR_DEC(MONITOR_NUM_UNDO_SLOT_CACHED);
trx_undo_mem_free(undo);
}
UT_LIST_INIT(rseg->update_undo_list, &trx_undo_t::undo_list);
UT_LIST_INIT(rseg->update_undo_cached, &trx_undo_t::undo_list);
UT_LIST_INIT(rseg->insert_undo_list, &trx_undo_t::undo_list);
UT_LIST_INIT(rseg->insert_undo_cached, &trx_undo_t::undo_list);
rseg->max_size = mtr_read_ulint(
rseg_header + TRX_RSEG_MAX_SIZE, MLOG_4BYTES, &mtr);
/* Initialize the undo log lists according to the rseg header */
rseg->curr_size = mtr_read_ulint(
rseg_header + TRX_RSEG_HISTORY_SIZE, MLOG_4BYTES, &mtr)
+ 1;
ut_ad(rseg->curr_size == 1);
rseg->trx_ref_count = 0;
rseg->last_page_no = FIL_NULL;
rseg->last_offset = 0;
rseg->last_trx_no = 0;
rseg->last_del_marks = FALSE;
}
mtr_commit(&mtr);
return(success);
}

View File

@@ -12859,13 +12859,22 @@ int ha_mroonga::delete_all_rows()
int ha_mroonga::wrapper_truncate()
{
int error = 0;
MRN_SHARE *tmp_share;
MRN_DBUG_ENTER_METHOD();
if (!(tmp_share = mrn_get_share(table->s->table_name.str, table, &error)))
DBUG_RETURN(error);
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
error = wrap_handler->ha_truncate();
error = parse_engine_table_options(ha_thd(), tmp_share->hton, table->s)
? MRN_GET_ERROR_NUMBER
: wrap_handler->ha_truncate();
MRN_SET_BASE_SHARE_KEY(share, table->s);
MRN_SET_BASE_TABLE_KEY(this, table);
mrn_free_share(tmp_share);
if (!error && wrapper_have_target_index()) {
error = wrapper_truncate_index();
}