From 505da21e336f1e46b655f78fc0ad42e6cf17494d Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 11 Nov 2022 12:28:44 +0400 Subject: [PATCH] MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ... This bug was previously fixed in 10.6.11 by: MDEV-28327 InnoDB persistent statistics fail to update after bulk insert Adding MTR tests only. Also, fixing the old test for MDEV-28327 to make "mtr" reliably pass with/without --mysqld=--innodb-stats-persistent=0, and with different page sizes, as suggested by Marko. --- .../suite/innodb/r/insert_into_empty.result | 27 ++++++++++-- .../r/insert_into_empty_notembedded.result | 30 +++++++++++++ .../suite/innodb/t/insert_into_empty.test | 29 ++++++++++++- .../t/insert_into_empty_notembedded.test | 43 +++++++++++++++++++ 4 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 mysql-test/suite/innodb/r/insert_into_empty_notembedded.result create mode 100644 mysql-test/suite/innodb/t/insert_into_empty_notembedded.test diff --git a/mysql-test/suite/innodb/r/insert_into_empty.result b/mysql-test/suite/innodb/r/insert_into_empty.result index bca8e5a31f6..be5082489f8 100644 --- a/mysql-test/suite/innodb/r/insert_into_empty.result +++ b/mysql-test/suite/innodb/r/insert_into_empty.result @@ -186,11 +186,30 @@ DROP TABLE t; # MDEV-28327 InnoDB persistent statistics fail to update # after bulk insert # -CREATE TABLE t1 (a INT PRIMARY KEY)ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY)ENGINE=InnoDB +STATS_PERSISTENT=1 STATS_AUTO_RECALC=1; INSERT INTO t1 SELECT * FROM seq_1_to_4096; # Wait till statistics update after bulk insert operation -SELECT n_rows FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1"; -n_rows -4096 +SELECT n_rows>=4096 FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1"; +n_rows>=4096 +1 +DROP TABLE t1; +# +# MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ... +# +SET UNIQUE_CHECKS=0; +SET FOREIGN_KEY_CHECKS=0; +CREATE TABLE `t1` ( +`id` int(11) NOT NULL, +`a` int(11) DEFAULT NULL, +PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +STATS_PERSISTENT=1 STATS_AUTO_RECALC=1; +INSERT INTO `t1` VALUES (1,2),(2,3),(3,4); +# Wait till statistics update after bulk insert operation +SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; +TABLE_ROWS AVG_ROW_LENGTH>0 +3 1 DROP TABLE t1; # End of 10.6 tests diff --git a/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result b/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result new file mode 100644 index 00000000000..5305b2e7a85 --- /dev/null +++ b/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result @@ -0,0 +1,30 @@ +# +# Start of 10.6 tests +# +# +# MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ... +# +CREATE DATABASE db1; +CREATE TABLE db1.t1 (id int, a int,PRIMARY KEY (id)) ENGINE=InnoDB +STATS_PERSISTENT=1 STATS_AUTO_RECALC=1; +INSERT INTO db1.t1 VALUES (1,2),(2,3),(3,4); +DROP DATABASE IF EXISTS db1; +CREATE DATABASE db1; +# Wait till statistics update after bulk insert operation +SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='db1'; +TABLE_ROWS AVG_ROW_LENGTH>0 +3 1 +OPTIMIZE TABLE db1.t1; +Table Op Msg_type Msg_text +db1.t1 optimize note Table does not support optimize, doing recreate + analyze instead +db1.t1 optimize status OK +# Wait till statistics update after bulk insert operation +SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='db1'; +TABLE_ROWS AVG_ROW_LENGTH>0 +3 1 +DROP DATABASE db1; +# +# End of 10.6 tests +# diff --git a/mysql-test/suite/innodb/t/insert_into_empty.test b/mysql-test/suite/innodb/t/insert_into_empty.test index 1e275a48dda..b545927d690 100644 --- a/mysql-test/suite/innodb/t/insert_into_empty.test +++ b/mysql-test/suite/innodb/t/insert_into_empty.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/innodb_page_size.inc --source include/have_sequence.inc --source include/maybe_debug.inc --source include/have_partition.inc @@ -198,13 +199,37 @@ DROP TABLE t; --echo # MDEV-28327 InnoDB persistent statistics fail to update --echo # after bulk insert --echo # -CREATE TABLE t1 (a INT PRIMARY KEY)ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY)ENGINE=InnoDB +STATS_PERSISTENT=1 STATS_AUTO_RECALC=1; INSERT INTO t1 SELECT * FROM seq_1_to_4096; --echo # Wait till statistics update after bulk insert operation let $wait_condition= select n_rows > 100 from mysql.innodb_table_stats where table_name="t1"; source include/wait_condition.inc; -SELECT n_rows FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1"; +SELECT n_rows>=4096 FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1"; DROP TABLE t1; + +--echo # +--echo # MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ... +--echo # + +SET UNIQUE_CHECKS=0; +SET FOREIGN_KEY_CHECKS=0; +CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + `a` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +STATS_PERSISTENT=1 STATS_AUTO_RECALC=1; +INSERT INTO `t1` VALUES (1,2),(2,3),(3,4); +--echo # Wait till statistics update after bulk insert operation +let $wait_condition= select n_rows > 0 from mysql.innodb_table_stats +where database_name='test' and table_name='t1'; +source include/wait_condition.inc; +SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; +DROP TABLE t1; + + --echo # End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test b/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test new file mode 100644 index 00000000000..267501133ea --- /dev/null +++ b/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test @@ -0,0 +1,43 @@ +--source include/not_embedded.inc +--source include/have_innodb.inc +--source include/innodb_page_size.inc +--source include/maybe_debug.inc + +--echo # +--echo # Start of 10.6 tests +--echo # + +--echo # +--echo # MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ... +--echo # + +CREATE DATABASE db1; +CREATE TABLE db1.t1 (id int, a int,PRIMARY KEY (id)) ENGINE=InnoDB +STATS_PERSISTENT=1 STATS_AUTO_RECALC=1; +INSERT INTO db1.t1 VALUES (1,2),(2,3),(3,4); +--let $file = $MYSQLTEST_VARDIR/tmp/dump.sql +--exec $MYSQL_DUMP db1 t1 >$file +DROP DATABASE IF EXISTS db1; + +CREATE DATABASE db1; +--exec $MYSQL db1 < $file +--remove_file $file +--echo # Wait till statistics update after bulk insert operation +let $wait_condition= select n_rows > 0 from mysql.innodb_table_stats +where database_name='db1' and table_name='t1'; +source include/wait_condition.inc; +SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='db1'; + +OPTIMIZE TABLE db1.t1; +--echo # Wait till statistics update after bulk insert operation +let $wait_condition= select n_rows > 0 from mysql.innodb_table_stats +where database_name='db1' and table_name='t1'; +source include/wait_condition.inc; +SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='db1'; +DROP DATABASE db1; + +--echo # +--echo # End of 10.6 tests +--echo #