Commit fdc582fd authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.5 into 10.6

parents 05cd10b7 bd694bb7
...@@ -462,6 +462,27 @@ flush query cache| ...@@ -462,6 +462,27 @@ flush query cache|
delete from t1| delete from t1|
drop procedure bug3583| drop procedure bug3583|
drop table t1| drop table t1|
#
# MDEV-29760 DROP DATABASE hangs when particular query cache is present
#
create table t1 (id int);
create table t2 like t1;
create table t3 like t1;
create database d;
create table d.t1 like test.t1;
create table d.t2 like test.t2;
set LOCAL query_cache_type=ON;
select id from t3;
id
select 'x' a, 'y' b from d.t1;
a b
select 'x' a, 'y' b from d.t1, d.t2;
a b
drop database d;
drop table t1, t2, t3;
#
# End of 10.5 tests
#
SET GLOBAL query_cache_size=@query_cache_size_save; SET GLOBAL query_cache_size=@query_cache_size_save;
SET GLOBAL query_cache_type=@query_cache_type_save; SET GLOBAL query_cache_type=@query_cache_type_save;
set GLOBAL sql_mode=@sql_mode_save; set GLOBAL sql_mode=@sql_mode_save;
...@@ -325,6 +325,33 @@ drop procedure bug3583| ...@@ -325,6 +325,33 @@ drop procedure bug3583|
drop table t1| drop table t1|
delimiter ;| delimiter ;|
--echo #
--echo # MDEV-29760 DROP DATABASE hangs when particular query cache is present
--echo #
create table t1 (id int);
create table t2 like t1;
create table t3 like t1;
create database d;
create table d.t1 like test.t1;
create table d.t2 like test.t2;
set LOCAL query_cache_type=ON;
select id from t3;
select 'x' a, 'y' b from d.t1;
select 'x' a, 'y' b from d.t1, d.t2;
drop database d;
drop table t1, t2, t3;
--echo #
--echo # End of 10.5 tests
--echo #
# Wait till we reached the initial number of concurrent sessions # Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc --source include/wait_until_count_sessions.inc
SET GLOBAL query_cache_size=@query_cache_size_save; SET GLOBAL query_cache_size=@query_cache_size_save;
......
...@@ -164,28 +164,9 @@ connection default; ...@@ -164,28 +164,9 @@ connection default;
SET GLOBAL debug_dbug="+d,only_kill_system_threads_no_loop"; SET GLOBAL debug_dbug="+d,only_kill_system_threads_no_loop";
# restart # restart
** Proof of shutdown caused ROLLBACK-completed transaction ** Proof of shutdown caused ROLLBACK-completed transaction
include/show_binlog_events.inc # MYSQL_BINLOG datadir/binlog_file --result-file=assert_file
Log_name Pos Event_type Server_id End_log_pos Info include/assert_grep.inc [No XA statements should be written into the binary log]
master-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION include/assert_grep.inc [The transaction should be rolled back]
master-bin.000002 # Gtid_list # # []
master-bin.000002 # Binlog_checkpoint # # master-bin.000001
master-bin.000002 # Binlog_checkpoint # # master-bin.000002
master-bin.000002 # Gtid # # GTID #-#-#
master-bin.000002 # Query # # use `test`; CREATE TABLE tm (a INT) ENGINE = myisam
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
master-bin.000002 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Table \'./test/tm\' is marked as crashed' COLLATE 'latin1_swedish_ci'))
master-bin.000002 # Query # # COMMIT
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
master-bin.000002 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Checking table' COLLATE 'latin1_swedish_ci'))
master-bin.000002 # Query # # COMMIT
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
master-bin.000002 # Query # # use `test`; INSERT INTO tm SET a = 1
master-bin.000002 # Query # # COMMIT
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (2, 1)
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
master-bin.000002 # Query # # ROLLBACK
master-bin.000002 # Rotate # # master-bin.000003;pos=POS
SELECT * FROM tm; SELECT * FROM tm;
a a
1 1
......
...@@ -212,7 +212,23 @@ XA END 'xa1'; ...@@ -212,7 +212,23 @@ XA END 'xa1';
--source include/start_mysqld.inc --source include/start_mysqld.inc
--echo ** Proof of shutdown caused ROLLBACK-completed transaction --echo ** Proof of shutdown caused ROLLBACK-completed transaction
--source include/show_binlog_events.inc
--let assert_file=$MYSQLTEST_VARDIR/tmp/binlog_decoded.out
--let datadir=`select @@datadir`
--echo # MYSQL_BINLOG datadir/binlog_file --result-file=assert_file
--exec $MYSQL_BINLOG $datadir/$binlog_file --result-file=$assert_file
--let $assert_text= No XA statements should be written into the binary log
--let $assert_count= 0
--let assert_select= XA START|XA END|XA PREPARE|XA COMMIT|XA ROLLBACK
--source include/assert_grep.inc
--let $assert_text= The transaction should be rolled back
--let $assert_count= 1
--let assert_select= ^ROLLBACK\$
--source include/assert_grep.inc
SELECT * FROM tm; SELECT * FROM tm;
--eval SELECT * FROM t1 WHERE a = $a --eval SELECT * FROM t1 WHERE a = $a
......
...@@ -69,6 +69,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED'); ...@@ -69,6 +69,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*) COUNT(*)
1 1
FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Empty large multi-file redo log from after MariaDB 10.2.2
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# redo log from "after" MariaDB 10.2.2, but with invalid header checksum # redo log from "after" MariaDB 10.2.2, but with invalid header checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption # restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES SELECT * FROM INFORMATION_SCHEMA.ENGINES
...@@ -179,7 +187,7 @@ WHERE engine = 'innodb' ...@@ -179,7 +187,7 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED'); AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*) COUNT(*)
1 1
FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err FOUND 6 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Minimal MariaDB 10.1.21 encrypted redo log # Minimal MariaDB 10.1.21 encrypted redo log
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 # restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb' SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
......
...@@ -69,6 +69,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED'); ...@@ -69,6 +69,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*) COUNT(*)
1 1
FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Empty large multi-file redo log from after MariaDB 10.2.2
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# redo log from "after" MariaDB 10.2.2, but with invalid header checksum # redo log from "after" MariaDB 10.2.2, but with invalid header checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption # restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES SELECT * FROM INFORMATION_SCHEMA.ENGINES
...@@ -179,7 +187,7 @@ WHERE engine = 'innodb' ...@@ -179,7 +187,7 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED'); AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*) COUNT(*)
1 1
FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err FOUND 6 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Minimal MariaDB 10.1.21 encrypted redo log # Minimal MariaDB 10.1.21 encrypted redo log
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 # restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES SELECT * FROM INFORMATION_SCHEMA.ENGINES
......
...@@ -19,6 +19,7 @@ call mtr.add_suppression("InnoDB: Obtaining redo log encryption key version 1 fa ...@@ -19,6 +19,7 @@ call mtr.add_suppression("InnoDB: Obtaining redo log encryption key version 1 fa
call mtr.add_suppression("InnoDB: Decrypting checkpoint failed"); call mtr.add_suppression("InnoDB: Decrypting checkpoint failed");
call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfile0 to start up the database\\? Log sequence number in the ib_logfile0 is 1213964,"); call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfile0 to start up the database\\? Log sequence number in the ib_logfile0 is 1213964,");
call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!"); call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!");
call mtr.add_suppression("InnoDB: The change buffer is corrupted");
--enable_query_log --enable_query_log
let bugdir= $MYSQLTEST_VARDIR/tmp/log_corruption; let bugdir= $MYSQLTEST_VARDIR/tmp/log_corruption;
...@@ -297,6 +298,42 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED'); ...@@ -297,6 +298,42 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/search_pattern_in_file.inc --source include/search_pattern_in_file.inc
--let $restart_parameters= $dirs --let $restart_parameters= $dirs
--echo # Empty large multi-file redo log from after MariaDB 10.2.2
perl;
do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
my $polynomial = 0x82f63b78; # CRC-32C
die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile0";
binmode OUT;
$_= pack("Nx[5]nx[5]", 1, 0x1286) . "BogoDB 4.3.2.1" . chr(0) x 478;
print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
# checkpoint page 1 and all-zero checkpoint 2
$_= pack("x[13]nCNNx[484]", 0x1286, 12, 2, 0x80c);
print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
print OUT chr(0) x 1024;
die unless seek(OUT, 0x1FFFFFFFF, 0);
print OUT chr(0);
close OUT or die;
die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1";
binmode OUT;
die unless seek(OUT, 0x800, 0); # the first 2048 bytes are unused!
$_= pack("Nnnx[500]", 0x80000944, 12, 12);
print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
die unless seek(OUT, 0x1FFFFFFFF, 0);
print OUT chr(0);
close OUT or die;
EOF
--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/shutdown_mysqld.inc
--let SEARCH_PATTERN= InnoDB: Upgrading redo log:
--source include/search_pattern_in_file.inc
--let $restart_parameters= $dirs
--remove_file $bugdir/ib_logfile0 --remove_file $bugdir/ib_logfile0
--move_file $bugdir/ib_logfile $bugdir/ib_logfile0 --move_file $bugdir/ib_logfile $bugdir/ib_logfile0
......
...@@ -2131,8 +2131,7 @@ def_week_frmt: %zu, in_trans: %d, autocommit: %d", ...@@ -2131,8 +2131,7 @@ def_week_frmt: %zu, in_trans: %d, autocommit: %d",
("Handler require invalidation queries of %.*s %llu-%llu", ("Handler require invalidation queries of %.*s %llu-%llu",
(int)qcache_se_key_len, qcache_se_key_name, (int)qcache_se_key_len, qcache_se_key_name,
engine_data, table->engine_data())); engine_data, table->engine_data()));
invalidate_table_internal(thd, invalidate_table_internal((uchar *) table->db(),
(uchar *) table->db(),
table->key_length()); table->key_length());
} }
else else
...@@ -2381,7 +2380,7 @@ void Query_cache::invalidate(THD *thd, const char *db) ...@@ -2381,7 +2380,7 @@ void Query_cache::invalidate(THD *thd, const char *db)
if (strcmp(table->db(),db) == 0) if (strcmp(table->db(),db) == 0)
{ {
Query_cache_block_table *list_root= table_block->table(0); Query_cache_block_table *list_root= table_block->table(0);
invalidate_query_block_list(thd,list_root); invalidate_query_block_list(list_root);
} }
table_block= next; table_block= next;
...@@ -3320,7 +3319,7 @@ void Query_cache::invalidate_table(THD *thd, uchar * key, size_t key_length) ...@@ -3320,7 +3319,7 @@ void Query_cache::invalidate_table(THD *thd, uchar * key, size_t key_length)
DEBUG_SYNC(thd, "wait_in_query_cache_invalidate2"); DEBUG_SYNC(thd, "wait_in_query_cache_invalidate2");
if (query_cache_size > 0) if (query_cache_size > 0)
invalidate_table_internal(thd, key, key_length); invalidate_table_internal(key, key_length);
unlock(); unlock();
} }
...@@ -3335,14 +3334,14 @@ void Query_cache::invalidate_table(THD *thd, uchar * key, size_t key_length) ...@@ -3335,14 +3334,14 @@ void Query_cache::invalidate_table(THD *thd, uchar * key, size_t key_length)
*/ */
void void
Query_cache::invalidate_table_internal(THD *thd, uchar *key, size_t key_length) Query_cache::invalidate_table_internal(uchar *key, size_t key_length)
{ {
Query_cache_block *table_block= Query_cache_block *table_block=
(Query_cache_block*)my_hash_search(&tables, key, key_length); (Query_cache_block*)my_hash_search(&tables, key, key_length);
if (table_block) if (table_block)
{ {
Query_cache_block_table *list_root= table_block->table(0); Query_cache_block_table *list_root= table_block->table(0);
invalidate_query_block_list(thd, list_root); invalidate_query_block_list(list_root);
} }
} }
...@@ -3359,8 +3358,7 @@ Query_cache::invalidate_table_internal(THD *thd, uchar *key, size_t key_length) ...@@ -3359,8 +3358,7 @@ Query_cache::invalidate_table_internal(THD *thd, uchar *key, size_t key_length)
*/ */
void void
Query_cache::invalidate_query_block_list(THD *thd, Query_cache::invalidate_query_block_list(Query_cache_block_table *list_root)
Query_cache_block_table *list_root)
{ {
while (list_root->next != list_root) while (list_root->next != list_root)
{ {
...@@ -3544,7 +3542,7 @@ Query_cache::insert_table(THD *thd, size_t key_len, const char *key, ...@@ -3544,7 +3542,7 @@ Query_cache::insert_table(THD *thd, size_t key_len, const char *key,
*/ */
{ {
Query_cache_block_table *list_root= table_block->table(0); Query_cache_block_table *list_root= table_block->table(0);
invalidate_query_block_list(thd, list_root); invalidate_query_block_list(list_root);
} }
table_block= 0; table_block= 0;
......
...@@ -319,7 +319,7 @@ class Query_cache ...@@ -319,7 +319,7 @@ class Query_cache
Cache_staus m_cache_status; Cache_staus m_cache_status;
void free_query_internal(Query_cache_block *point); void free_query_internal(Query_cache_block *point);
void invalidate_table_internal(THD *thd, uchar *key, size_t key_length); void invalidate_table_internal(uchar *key, size_t key_length);
protected: protected:
/* /*
...@@ -375,8 +375,7 @@ class Query_cache ...@@ -375,8 +375,7 @@ class Query_cache
void invalidate_table(THD *thd, TABLE *table); void invalidate_table(THD *thd, TABLE *table);
void invalidate_table(THD *thd, uchar *key, size_t key_length); void invalidate_table(THD *thd, uchar *key, size_t key_length);
void invalidate_table(THD *thd, Query_cache_block *table_block); void invalidate_table(THD *thd, Query_cache_block *table_block);
void invalidate_query_block_list(THD *thd, void invalidate_query_block_list(Query_cache_block_table *list_root);
Query_cache_block_table *list_root);
TABLE_COUNTER_TYPE TABLE_COUNTER_TYPE
register_tables_from_list(THD *thd, TABLE_LIST *tables_used, register_tables_from_list(THD *thd, TABLE_LIST *tables_used,
......
...@@ -1689,13 +1689,16 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, ...@@ -1689,13 +1689,16 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables,
} }
error= thd->is_error(); error= thd->is_error();
if (non_temp_tables_count)
query_cache_invalidate3(thd, tables, 0);
/* /*
We are always logging drop of temporary tables. We are always logging drop of temporary tables.
The reason is to handle the following case: The reason is to handle the following case:
- Use statement based replication - Use statement based replication
- CREATE TEMPORARY TABLE foo (logged) - CREATE TEMPORARY TABLE foo (logged)
- set row based replication - set row based replication
- DROP TEMPORAY TABLE foo (needs to be logged) - DROP TEMPORARY TABLE foo (needs to be logged)
This should be fixed so that we remember if creation of the This should be fixed so that we remember if creation of the
temporary table was logged and only log it if the creation was temporary table was logged and only log it if the creation was
logged. logged.
...@@ -1707,7 +1710,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, ...@@ -1707,7 +1710,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables,
if (non_trans_tmp_table_deleted || trans_tmp_table_deleted) if (non_trans_tmp_table_deleted || trans_tmp_table_deleted)
thd->transaction->stmt.mark_dropped_temp_table(); thd->transaction->stmt.mark_dropped_temp_table();
query_cache_invalidate3(thd, tables, 0);
if (!dont_log_query && mysql_bin_log.is_open()) if (!dont_log_query && mysql_bin_log.is_open())
{ {
debug_crash_here("ddl_log_drop_before_binlog"); debug_crash_here("ddl_log_drop_before_binlog");
......
...@@ -413,73 +413,6 @@ buf_dump( ...@@ -413,73 +413,6 @@ buf_dump(
export_vars.innodb_buffer_pool_load_incomplete = 0; export_vars.innodb_buffer_pool_load_incomplete = 0;
} }
/*****************************************************************//**
Artificially delay the buffer pool loading if necessary. The idea of
this function is to prevent hogging the server with IO and slowing down
too much normal client queries. */
UNIV_INLINE
void
buf_load_throttle_if_needed(
/*========================*/
ulint* last_check_time, /*!< in/out: milliseconds since epoch
of the last time we did check if
throttling is needed, we do the check
every srv_io_capacity IO ops. */
ulint* last_activity_count,
ulint n_io) /*!< in: number of IO ops done since
buffer pool load has started */
{
if (n_io % srv_io_capacity < srv_io_capacity - 1) {
return;
}
if (*last_check_time == 0 || *last_activity_count == 0) {
*last_check_time = ut_time_ms();
*last_activity_count = srv_get_activity_count();
return;
}
/* srv_io_capacity IO operations have been performed by buffer pool
load since the last time we were here. */
/* If no other activity, then keep going without any delay. */
if (srv_get_activity_count() == *last_activity_count) {
return;
}
/* There has been other activity, throttle. */
ulint now = ut_time_ms();
ulint elapsed_time = now - *last_check_time;
/* Notice that elapsed_time is not the time for the last
srv_io_capacity IO operations performed by BP load. It is the
time elapsed since the last time we detected that there has been
other activity. This has a small and acceptable deficiency, e.g.:
1. BP load runs and there is no other activity.
2. Other activity occurs, we run N IO operations after that and
enter here (where 0 <= N < srv_io_capacity).
3. last_check_time is very old and we do not sleep at this time, but
only update last_check_time and last_activity_count.
4. We run srv_io_capacity more IO operations and call this function
again.
5. There has been more other activity and thus we enter here.
6. Now last_check_time is recent and we sleep if necessary to prevent
more than srv_io_capacity IO operations per second.
The deficiency is that we could have slept at 3., but for this we
would have to update last_check_time before the
"cur_activity_count == *last_activity_count" check and calling
ut_time_ms() that often may turn out to be too expensive. */
if (elapsed_time < 1000 /* 1 sec (1000 milli secs) */) {
std::this_thread::sleep_for(
std::chrono::milliseconds(1000 - elapsed_time));
}
*last_check_time = ut_time_ms();
*last_activity_count = srv_get_activity_count();
}
/*****************************************************************//** /*****************************************************************//**
Perform a buffer pool load from the file specified by Perform a buffer pool load from the file specified by
innodb_buffer_pool_filename. If any errors occur then the value of innodb_buffer_pool_filename. If any errors occur then the value of
...@@ -626,9 +559,6 @@ buf_load() ...@@ -626,9 +559,6 @@ buf_load()
std::sort(dump, dump + dump_n); std::sort(dump, dump + dump_n);
} }
ulint last_check_time = 0;
ulint last_activity_cnt = 0;
/* Avoid calling the expensive fil_space_t::get() for each /* Avoid calling the expensive fil_space_t::get() for each
page within the same tablespace. dump[] is sorted by (space, page), page within the same tablespace. dump[] is sorted by (space, page),
so all pages from a given tablespace are consecutive. */ so all pages from a given tablespace are consecutive. */
...@@ -703,9 +633,6 @@ buf_load() ...@@ -703,9 +633,6 @@ buf_load()
return; return;
} }
buf_load_throttle_if_needed(
&last_check_time, &last_activity_cnt, i);
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
if ((i+1) >= srv_buf_pool_load_pages_abort) { if ((i+1) >= srv_buf_pool_load_pages_abort) {
buf_load_abort_flag = true; buf_load_abort_flag = true;
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2021, MariaDB Corporation. Copyright (c) 2017, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -190,8 +190,6 @@ LRU list. The compressed page is preserved, and it need not be clean. ...@@ -190,8 +190,6 @@ LRU list. The compressed page is preserved, and it need not be clean.
@return true if freed */ @return true if freed */
static bool buf_LRU_free_from_unzip_LRU_list(ulint limit) static bool buf_LRU_free_from_unzip_LRU_list(ulint limit)
{ {
mysql_mutex_assert_owner(&buf_pool.mutex);
if (!buf_LRU_evict_from_unzip_LRU()) { if (!buf_LRU_evict_from_unzip_LRU()) {
return(false); return(false);
} }
...@@ -210,6 +208,7 @@ static bool buf_LRU_free_from_unzip_LRU_list(ulint limit) ...@@ -210,6 +208,7 @@ static bool buf_LRU_free_from_unzip_LRU_list(ulint limit)
freed = buf_LRU_free_page(&block->page, false); freed = buf_LRU_free_page(&block->page, false);
if (freed) { if (freed) {
scanned++;
break; break;
} }
...@@ -254,17 +253,16 @@ static bool buf_LRU_free_from_common_LRU_list(ulint limit) ...@@ -254,17 +253,16 @@ static bool buf_LRU_free_from_common_LRU_list(ulint limit)
} }
freed = true; freed = true;
scanned++;
break; break;
} }
} }
if (scanned) { MONITOR_INC_VALUE_CUMULATIVE(
MONITOR_INC_VALUE_CUMULATIVE( MONITOR_LRU_SEARCH_SCANNED,
MONITOR_LRU_SEARCH_SCANNED, MONITOR_LRU_SEARCH_SCANNED_NUM_CALL,
MONITOR_LRU_SEARCH_SCANNED_NUM_CALL, MONITOR_LRU_SEARCH_SCANNED_PER_CALL,
MONITOR_LRU_SEARCH_SCANNED_PER_CALL, scanned);
scanned);
}
return(freed); return(freed);
} }
......
...@@ -297,9 +297,9 @@ dberr_t dict_boot() ...@@ -297,9 +297,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "NAME", 0); dict_mem_index_add_field(index, "NAME", 0);
index->id = DICT_TABLES_ID; index->id = DICT_TABLES_ID;
dberr_t error = dict_index_add_to_cache( err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_TABLES)); index, mach_read_from_4(dict_hdr + DICT_HDR_TABLES));
ut_a(error == DB_SUCCESS); ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant()); ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>( table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable))); UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
...@@ -309,9 +309,9 @@ dberr_t dict_boot() ...@@ -309,9 +309,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "ID", 0); dict_mem_index_add_field(index, "ID", 0);
index->id = DICT_TABLE_IDS_ID; index->id = DICT_TABLE_IDS_ID;
error = dict_index_add_to_cache( err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_TABLE_IDS)); index, mach_read_from_4(dict_hdr + DICT_HDR_TABLE_IDS));
ut_a(error == DB_SUCCESS); ut_a(err == DB_SUCCESS);
/*-------------------------*/ /*-------------------------*/
table = dict_table_t::create(dict_sys.SYS_TABLE[dict_sys.SYS_COLUMNS], table = dict_table_t::create(dict_sys.SYS_TABLE[dict_sys.SYS_COLUMNS],
...@@ -339,9 +339,9 @@ dberr_t dict_boot() ...@@ -339,9 +339,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "POS", 0); dict_mem_index_add_field(index, "POS", 0);
index->id = DICT_COLUMNS_ID; index->id = DICT_COLUMNS_ID;
error = dict_index_add_to_cache( err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_COLUMNS)); index, mach_read_from_4(dict_hdr + DICT_HDR_COLUMNS));
ut_a(error == DB_SUCCESS); ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant()); ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>( table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable))); UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
...@@ -382,9 +382,9 @@ dberr_t dict_boot() ...@@ -382,9 +382,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "ID", 0); dict_mem_index_add_field(index, "ID", 0);
index->id = DICT_INDEXES_ID; index->id = DICT_INDEXES_ID;
error = dict_index_add_to_cache( err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_INDEXES)); index, mach_read_from_4(dict_hdr + DICT_HDR_INDEXES));
ut_a(error == DB_SUCCESS); ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant()); ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>( table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable))); UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
...@@ -411,9 +411,9 @@ dberr_t dict_boot() ...@@ -411,9 +411,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "POS", 0); dict_mem_index_add_field(index, "POS", 0);
index->id = DICT_FIELDS_ID; index->id = DICT_FIELDS_ID;
error = dict_index_add_to_cache( err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_FIELDS)); index, mach_read_from_4(dict_hdr + DICT_HDR_FIELDS));
ut_a(error == DB_SUCCESS); ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant()); ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>( table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable))); UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
...@@ -422,7 +422,8 @@ dberr_t dict_boot() ...@@ -422,7 +422,8 @@ dberr_t dict_boot()
err = ibuf_init_at_db_start(); err = ibuf_init_at_db_start();
if (err == DB_SUCCESS) { if (err == DB_SUCCESS || srv_force_recovery >= SRV_FORCE_NO_DDL_UNDO) {
err = DB_SUCCESS;
/* Load definitions of other indexes on system tables */ /* Load definitions of other indexes on system tables */
dict_load_sys_table(dict_sys.sys_tables); dict_load_sys_table(dict_sys.sys_tables);
......
...@@ -49,6 +49,7 @@ Created 7/19/1997 Heikki Tuuri ...@@ -49,6 +49,7 @@ Created 7/19/1997 Heikki Tuuri
#include "que0que.h" #include "que0que.h"
#include "srv0start.h" /* srv_shutdown_state */ #include "srv0start.h" /* srv_shutdown_state */
#include "rem0cmp.h" #include "rem0cmp.h"
#include "log.h"
/* STRUCTURE OF AN INSERT BUFFER RECORD /* STRUCTURE OF AN INSERT BUFFER RECORD
...@@ -402,24 +403,11 @@ ibuf_init_at_db_start(void) ...@@ -402,24 +403,11 @@ ibuf_init_at_db_start(void)
if (!header_page) { if (!header_page) {
err_exit: err_exit:
sql_print_error("InnoDB: The change buffer is corrupted");
mtr.commit(); mtr.commit();
return err; return err;
} }
/* At startup we intialize ibuf to have a maximum of
CHANGE_BUFFER_DEFAULT_SIZE in terms of percentage of the
buffer pool size. Once ibuf struct is initialized this
value is updated with the user supplied size by calling
ibuf_max_size_update(). */
ibuf.max_size = ((buf_pool_get_curr_size() >> srv_page_size_shift)
* CHANGE_BUFFER_DEFAULT_SIZE) / 100;
mysql_mutex_init(ibuf_mutex_key, &ibuf_mutex, nullptr);
mysql_mutex_init(ibuf_pessimistic_insert_mutex_key,
&ibuf_pessimistic_insert_mutex, nullptr);
mysql_mutex_lock(&ibuf_mutex);
fseg_n_reserved_pages(*header_page, fseg_n_reserved_pages(*header_page,
IBUF_HEADER + IBUF_TREE_SEG_HEADER IBUF_HEADER + IBUF_TREE_SEG_HEADER
+ header_page->page.frame, &ibuf.seg_size, &mtr); + header_page->page.frame, &ibuf.seg_size, &mtr);
...@@ -438,6 +426,25 @@ ibuf_init_at_db_start(void) ...@@ -438,6 +426,25 @@ ibuf_init_at_db_start(void)
goto err_exit; goto err_exit;
} }
if (page_is_comp(root) || fil_page_get_type(root) != FIL_PAGE_INDEX
|| btr_page_get_index_id(root) != DICT_IBUF_ID_MIN) {
err = DB_CORRUPTION;
goto err_exit;
}
/* At startup we intialize ibuf to have a maximum of
CHANGE_BUFFER_DEFAULT_SIZE in terms of percentage of the
buffer pool size. Once ibuf struct is initialized this
value is updated with the user supplied size by calling
ibuf_max_size_update(). */
ibuf.max_size = ((buf_pool_get_curr_size() >> srv_page_size_shift)
* CHANGE_BUFFER_DEFAULT_SIZE) / 100;
mysql_mutex_init(ibuf_mutex_key, &ibuf_mutex, nullptr);
mysql_mutex_init(ibuf_pessimistic_insert_mutex_key,
&ibuf_pessimistic_insert_mutex, nullptr);
mysql_mutex_lock(&ibuf_mutex);
ibuf_size_update(root); ibuf_size_update(root);
mysql_mutex_unlock(&ibuf_mutex); mysql_mutex_unlock(&ibuf_mutex);
...@@ -487,6 +494,7 @@ ibuf_max_size_update( ...@@ -487,6 +494,7 @@ ibuf_max_size_update(
ulint new_val) /*!< in: new value in terms of ulint new_val) /*!< in: new value in terms of
percentage of the buffer pool size */ percentage of the buffer pool size */
{ {
if (UNIV_UNLIKELY(!ibuf.index)) return;
ulint new_size = ((buf_pool_get_curr_size() >> srv_page_size_shift) ulint new_size = ((buf_pool_get_curr_size() >> srv_page_size_shift)
* new_val) / 100; * new_val) / 100;
mysql_mutex_lock(&ibuf_mutex); mysql_mutex_lock(&ibuf_mutex);
......
...@@ -1880,7 +1880,7 @@ static dberr_t recv_log_recover_10_4() ...@@ -1880,7 +1880,7 @@ static dberr_t recv_log_recover_10_4()
return DB_CORRUPTION; return DB_CORRUPTION;
} }
recv_sys.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1), recv_sys.read(source_offset & ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1),
{buf, OS_FILE_LOG_BLOCK_SIZE}); {buf, OS_FILE_LOG_BLOCK_SIZE});
ulint crc = log_block_calc_checksum_crc32(buf); ulint crc = log_block_calc_checksum_crc32(buf);
......
...@@ -2010,7 +2010,8 @@ void innodb_shutdown() ...@@ -2010,7 +2010,8 @@ void innodb_shutdown()
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);
ut_ad(lock_sys.is_initialised() || !srv_was_started); ut_ad(lock_sys.is_initialised() || !srv_was_started);
ut_ad(log_sys.is_initialised() || !srv_was_started); ut_ad(log_sys.is_initialised() || !srv_was_started);
ut_ad(ibuf.index || !srv_was_started); ut_ad(ibuf.index || !srv_was_started
|| srv_force_recovery >= SRV_FORCE_NO_DDL_UNDO);
dict_stats_deinit(); dict_stats_deinit();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment