diff --git a/mysql-test/suite/maria/maria-autozerofill.result b/mysql-test/suite/maria/maria-autozerofill.result index 22856fe54b0..ef9e2f77345 100644 --- a/mysql-test/suite/maria/maria-autozerofill.result +++ b/mysql-test/suite/maria/maria-autozerofill.result @@ -12,6 +12,8 @@ create table t4 (a int) engine=aria; INSERT INTO t4 VALUES (1),(2); create table t5 (a int) engine=aria; INSERT INTO t5 VALUES (1),(2); +create table t6 (a int) engine=aria; +INSERT INTO t6 VALUES (1),(2); flush tables; create_rename_lsn has non-magic value * shut down mysqld, removed logs, restarted it @@ -25,6 +27,10 @@ Status: changed,sorted index pages,zerofilled insert into t1 values(2); flush table t1; create_rename_lsn has non-magic value +# +# BUG#44422 "mysql_upgrade destroys Maria tables?" +# Check repair and optimize of moved table +# check table t2; Table Op Msg_type Msg_text mysqltest.t2 check error Table is from another system and must be zerofilled or repaired to be usable on this system @@ -59,4 +65,11 @@ mysqltest.t5 repair status OK check table t5; Table Op Msg_type Msg_text mysqltest.t5 check status OK +select * from t6; +a +1 +2 +check table t6; +Table Op Msg_type Msg_text +mysqltest.t6 check status OK drop database mysqltest; diff --git a/mysql-test/suite/maria/maria-autozerofill.test b/mysql-test/suite/maria/maria-autozerofill.test index 9bb2782105a..e56f71d2c5f 100644 --- a/mysql-test/suite/maria/maria-autozerofill.test +++ b/mysql-test/suite/maria/maria-autozerofill.test @@ -33,11 +33,13 @@ create table t4 (a int) engine=aria; INSERT INTO t4 VALUES (1),(2); create table t5 (a int) engine=aria; INSERT INTO t5 VALUES (1),(2); +create table t6 (a int) engine=aria; +INSERT INTO t6 VALUES (1),(2); flush tables; # Check that table is not zerofilled, not movable let $MYSQLD_DATADIR= `select @@datadir`; ---exec $MARIA_CHK -dv $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt +--exec $MARIA_CHK -dv --ignore-control-file $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt perl; use strict; use warnings; @@ -62,7 +64,7 @@ enable_ps_protocol; flush table t1; # Check that table is auto-zerofilled, movable ---exec $MARIA_CHK -dv $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt +--exec $MARIA_CHK -dv --ignore-control-file $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt perl; use strict; use warnings; @@ -79,7 +81,7 @@ insert into t1 values(2); flush table t1; # Check that table is not zerofilled, not movable ---exec $MARIA_CHK -dv $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt +--exec $MARIA_CHK -dv --ignore-control-file $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt perl; use strict; use warnings; @@ -91,10 +93,13 @@ perl; close FILE; EOF -# -# BUG#44422 "mysql_upgrade destroys Maria tables?" -# Check repair and optimize of moved table -# +--echo # +--echo # BUG#44422 "mysql_upgrade destroys Maria tables?" +--echo # Check repair and optimize of moved table +--echo # + +# Table t2 is regarded as it would be from another server as we removed +# the aria control file earlier check table t2; check table t2; repair table t2; @@ -108,4 +113,10 @@ check table t5; repair table t5; check table t5; +# Check that if we zerofill with aria_chk, we should not get any warnings when +# accessing the table +--exec $MARIA_CHK --zerofill $MYSQLD_DATADIR/mysqltest/t6 >$MYSQLTEST_VARDIR/tmp/ariachk.txt +select * from t6; +check table t6; + drop database mysqltest; diff --git a/mysql-test/suite/maria/maria-recovery2.result b/mysql-test/suite/maria/maria-recovery2.result index 149ce5a01af..1dcb476af42 100644 --- a/mysql-test/suite/maria/maria-recovery2.result +++ b/mysql-test/suite/maria/maria-recovery2.result @@ -107,6 +107,9 @@ flush table t1; * copied t1 for comparison lock tables t1 write, t2 read; delete from t1 limit 1; +select count(*) from t1; +count(*) +0 insert into t1 select * from t2; SET SESSION debug_dbug="+d,maria_flush_whole_log,maria_flush_whole_page_cache,maria_crash"; * crashing mysqld intentionally @@ -123,6 +126,9 @@ use mysqltest; show keys from t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment t1 1 a 1 a A 1 NULL NULL YES BTREE +select count(*) from t1; +count(*) +1 drop table t1; * TEST of recovery when OPTIMIZE has replaced the index file and crash create table t_corrupted1 (a varchar(100), key(a)) engine=aria; diff --git a/mysql-test/suite/maria/maria-recovery2.test b/mysql-test/suite/maria/maria-recovery2.test index 8d27d9aaaac..21944026cf6 100644 --- a/mysql-test/suite/maria/maria-recovery2.test +++ b/mysql-test/suite/maria/maria-recovery2.test @@ -130,9 +130,11 @@ insert into t1 values(30); lock tables t1 write, t2 read; delete from t1 limit 1; # 127 rows in t2, >100, so this will use repair-at-end +select count(*) from t1; insert into t1 select * from t2; -- source include/maria_verify_recovery.inc show keys from t1; # should be enabled +select count(*) from t1; drop table t1; --echo * TEST of recovery when OPTIMIZE has replaced the index file and crash diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index d050a65a1cb..722fb059d5f 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -1668,6 +1668,11 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize) } } thd_proc_info(thd, "Saving state"); + if (optimize_done && !error && !(param->testflag & T_NO_CREATE_RENAME_LSN)) + { + /* Set trid (needed if the table was moved from another system) */ + share->state.create_trid= trnman_get_min_safe_trid(); + } mysql_mutex_lock(&share->intern_lock); if (!error) { @@ -1683,6 +1688,7 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize) */ if (file->state != &share->state.state) *file->state= share->state.state; + if (share->base.auto_key) _ma_update_auto_increment_key(param, file, 1); if (optimize_done) @@ -1690,6 +1696,9 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize) UPDATE_TIME | UPDATE_OPEN_COUNT | (local_testflag & T_STATISTICS ? UPDATE_STAT : 0)); + /* File is repaired; Mark the file as moved to this system */ + (void) _ma_set_uuid(share, 0); + info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE | HA_STATUS_CONST); if (rows != file->state->records && !(param->testflag & T_VERY_SILENT)) diff --git a/storage/maria/maria_chk.c b/storage/maria/maria_chk.c index 7379af10c03..05a5aefb4f4 100644 --- a/storage/maria/maria_chk.c +++ b/storage/maria/maria_chk.c @@ -1205,8 +1205,11 @@ static int maria_chk(HA_CHECK *param, char *filename) ((param->testflag & (T_REP_ANY | T_SORT_RECORDS | T_SORT_INDEX | T_ZEROFILL | T_ZEROFILL_KEEP_LSN)) != (T_ZEROFILL | T_ZEROFILL_KEEP_LSN))) + { share->state.create_rename_lsn= share->state.is_of_horizon= share->state.skip_redo_lsn= LSN_NEEDS_NEW_STATE_LSNS; + share->state.create_trid= 0; + } } if (!error && (param->testflag & T_REP_ANY)) {