mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
0db0e64f33
MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR ENGINES NOT SUPPORTING NATIVE REPAIR Executing 'mysqlcheck --check-upgrade --auto-repair ...' will first issue 'CHECK TABLE FOR UPGRADE' for all tables in the database in order to check if the tables are compatible with the current version of MySQL. Any tables that are found incompatible are then upgraded using 'REPAIR TABLE'. The problem was that some engines (e.g. InnoDB) do not support 'REPAIR TABLE'. This caused any such tables to be left incompatible. As a result such tables were not properly fixed by the mysql_upgrade tool. This patch fixes the problem by first changing 'CHECK TABLE FOR UPGRADE' to return a different error message if the engine does not support REPAIR. Instead of "Table upgrade required. Please do "REPAIR TABLE ..." it will report "Table rebuild required. Please do "ALTER TABLE ... FORCE ..." Second, the patch changes mysqlcheck to do 'ALTER TABLE ... FORCE' instead of 'REPAIR TABLE' in these cases. This patch also fixes 'ALTER TABLE ... FORCE' to actually rebuild the table. This change should be reflected in the documentation. Before this patch, 'ALTER TABLE ... FORCE' was unused (See Bug#11746162) Test case added to mysqlcheck.test client/mysqlcheck.c: Changed mysqlcheck to do 'ALTER TABLE ... FORCE' if 'CHECK TABLE FOR UPGRADE' reports ER_TABLE_NEEDS_REBUILD and not ER_TABLE_NEEDS_UPGRADE. mysql-test/r/mysqlcheck.result: Added regression test. mysql-test/std_data/bug47205.frm: InnoDB 5.0 FRM which contains a varchar primary key using utf8_general_ci. This is an incompatible FRM for 5.5. mysql-test/t/mysqlcheck.test: Added regression test. sql/handler.h: Added new HA_CAN_REPAIR flag. sql/share/errmsg-utf8.txt: Added new error message ER_TABLE_NEEDS_REBUILD sql/sql_admin.cc: Changed 'CHECK TABLE FOR UPDATE' to give ER_TABLE_NEEDS_REBUILD instead of ER_TABLE_NEEDS_UPGRADE if the engine does not support REPAIR (as indicated by the new HA_CAN_REPAIR flag). sql/sql_lex.h: Remove unused ALTER_FORCE flag. sql/sql_yacc.yy: Make sure ALTER TABLE ... FORCE recreates the table by setting the ALTER_RECREATE flag as the ALTER_FORCE flag was unused. storage/archive/ha_archive.h: Added new HA_CAN_REPAIR flag to Archive storage/csv/ha_tina.h: Added new HA_CAN_REPAIR flag to CSV storage/federated/ha_federated.h: Added new HA_CAN_REPAIR flag to Federated storage/myisam/ha_myisam.cc: Added new HA_CAN_REPAIR flag to MyISAM
326 lines
14 KiB
Text
326 lines
14 KiB
Text
DROP TABLE IF EXISTS t1, `t``1`, `t 1`;
|
|
drop view if exists v1;
|
|
drop database if exists client_test_db;
|
|
mtr.global_suppressions OK
|
|
mtr.test_suppressions OK
|
|
mysql.columns_priv OK
|
|
mysql.db OK
|
|
mysql.event OK
|
|
mysql.func OK
|
|
mysql.general_log
|
|
note : The storage engine for the table doesn't support analyze
|
|
mysql.help_category OK
|
|
mysql.help_keyword OK
|
|
mysql.help_relation OK
|
|
mysql.help_topic OK
|
|
mysql.host OK
|
|
mysql.ndb_binlog_index OK
|
|
mysql.plugin OK
|
|
mysql.proc OK
|
|
mysql.procs_priv OK
|
|
mysql.proxies_priv OK
|
|
mysql.servers OK
|
|
mysql.slow_log
|
|
note : The storage engine for the table doesn't support analyze
|
|
mysql.tables_priv OK
|
|
mysql.time_zone OK
|
|
mysql.time_zone_leap_second OK
|
|
mysql.time_zone_name OK
|
|
mysql.time_zone_transition OK
|
|
mysql.time_zone_transition_type OK
|
|
mysql.user OK
|
|
mtr.global_suppressions Table is already up to date
|
|
mtr.test_suppressions Table is already up to date
|
|
mysql.columns_priv OK
|
|
mysql.db OK
|
|
mysql.event OK
|
|
mysql.func OK
|
|
mysql.general_log
|
|
note : The storage engine for the table doesn't support optimize
|
|
mysql.help_category OK
|
|
mysql.help_keyword OK
|
|
mysql.help_relation OK
|
|
mysql.help_topic OK
|
|
mysql.host OK
|
|
mysql.ndb_binlog_index OK
|
|
mysql.plugin OK
|
|
mysql.proc OK
|
|
mysql.procs_priv OK
|
|
mysql.proxies_priv OK
|
|
mysql.servers OK
|
|
mysql.slow_log
|
|
note : The storage engine for the table doesn't support optimize
|
|
mysql.tables_priv OK
|
|
mysql.time_zone OK
|
|
mysql.time_zone_leap_second OK
|
|
mysql.time_zone_name OK
|
|
mysql.time_zone_transition OK
|
|
mysql.time_zone_transition_type OK
|
|
mysql.user OK
|
|
mysql.columns_priv OK
|
|
mysql.db OK
|
|
mysql.event OK
|
|
mysql.func OK
|
|
mysql.general_log
|
|
note : The storage engine for the table doesn't support analyze
|
|
mysql.help_category OK
|
|
mysql.help_keyword OK
|
|
mysql.help_relation OK
|
|
mysql.help_topic OK
|
|
mysql.host OK
|
|
mysql.ndb_binlog_index OK
|
|
mysql.plugin OK
|
|
mysql.proc OK
|
|
mysql.procs_priv OK
|
|
mysql.proxies_priv OK
|
|
mysql.servers OK
|
|
mysql.slow_log
|
|
note : The storage engine for the table doesn't support analyze
|
|
mysql.tables_priv OK
|
|
mysql.time_zone OK
|
|
mysql.time_zone_leap_second OK
|
|
mysql.time_zone_name OK
|
|
mysql.time_zone_transition OK
|
|
mysql.time_zone_transition_type OK
|
|
mysql.user OK
|
|
mysql.columns_priv Table is already up to date
|
|
mysql.db Table is already up to date
|
|
mysql.event Table is already up to date
|
|
mysql.func Table is already up to date
|
|
mysql.general_log
|
|
note : The storage engine for the table doesn't support optimize
|
|
mysql.help_category Table is already up to date
|
|
mysql.help_keyword Table is already up to date
|
|
mysql.help_relation Table is already up to date
|
|
mysql.help_topic Table is already up to date
|
|
mysql.host Table is already up to date
|
|
mysql.ndb_binlog_index Table is already up to date
|
|
mysql.plugin Table is already up to date
|
|
mysql.proc Table is already up to date
|
|
mysql.procs_priv Table is already up to date
|
|
mysql.proxies_priv Table is already up to date
|
|
mysql.servers Table is already up to date
|
|
mysql.slow_log
|
|
note : The storage engine for the table doesn't support optimize
|
|
mysql.tables_priv Table is already up to date
|
|
mysql.time_zone Table is already up to date
|
|
mysql.time_zone_leap_second Table is already up to date
|
|
mysql.time_zone_name Table is already up to date
|
|
mysql.time_zone_transition Table is already up to date
|
|
mysql.time_zone_transition_type Table is already up to date
|
|
mysql.user Table is already up to date
|
|
create table t1 (a int) engine=myisam;
|
|
create view v1 as select * from t1;
|
|
test.t1 OK
|
|
test.t1 Table is already up to date
|
|
test.t1 OK
|
|
test.t1 Table is already up to date
|
|
drop view v1;
|
|
drop table t1;
|
|
create table `t``1`(a int) engine=myisam;
|
|
create table `t 1`(a int) engine=myisam;
|
|
test.t 1 OK
|
|
test.t`1 OK
|
|
drop table `t``1`, `t 1`;
|
|
create database d_bug25347;
|
|
use d_bug25347;
|
|
create table t_bug25347 (a int) engine=myisam;
|
|
create view v_bug25347 as select * from t_bug25347;
|
|
insert into t_bug25347 values (1),(2),(3);
|
|
flush tables;
|
|
removing and creating
|
|
d_bug25347.t_bug25347
|
|
Error : Incorrect file format 't_bug25347'
|
|
error : Corrupt
|
|
insert into t_bug25347 values (4),(5),(6);
|
|
ERROR HY000: Incorrect file format 't_bug25347'
|
|
d_bug25347.t_bug25347
|
|
warning : Number of rows changed from 0 to 3
|
|
status : OK
|
|
insert into t_bug25347 values (7),(8),(9);
|
|
select * from t_bug25347;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
7
|
|
8
|
|
9
|
|
select * from v_bug25347;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
7
|
|
8
|
|
9
|
|
drop view v_bug25347;
|
|
drop table t_bug25347;
|
|
drop database d_bug25347;
|
|
use test;
|
|
create view v1 as select * from information_schema.routines;
|
|
check table v1, information_schema.routines;
|
|
Table Op Msg_type Msg_text
|
|
test.v1 check status OK
|
|
information_schema.routines check note The storage engine for the table doesn't support check
|
|
drop view v1;
|
|
CREATE TABLE t1(a INT) engine=myisam;
|
|
CREATE TABLE t2(a INT) engine=myisam;
|
|
test.t1
|
|
Error : Incorrect information in file: './test/t1.frm'
|
|
error : Corrupt
|
|
test.t2 OK
|
|
DROP TABLE t1, t2;
|
|
End of 5.0 tests
|
|
create table t1(a int) engine=myisam;
|
|
create view v1 as select * from t1;
|
|
show tables;
|
|
Tables_in_test
|
|
t1
|
|
v1
|
|
show tables;
|
|
Tables_in_test
|
|
t1
|
|
#mysql50#v-1
|
|
v1
|
|
test.t1 OK
|
|
show tables;
|
|
Tables_in_test
|
|
t1
|
|
v1
|
|
v-1
|
|
drop view v1, `v-1`;
|
|
drop table t1;
|
|
SET NAMES utf8;
|
|
CREATE TABLE `#mysql50#@` (a INT) engine=myisam;
|
|
SHOW TABLES;
|
|
Tables_in_test
|
|
#mysql50#@
|
|
SET NAMES DEFAULT;
|
|
mysqlcheck --fix-table-names --databases test
|
|
SET NAMES utf8;
|
|
SHOW TABLES;
|
|
Tables_in_test
|
|
@
|
|
DROP TABLE `@`;
|
|
CREATE TABLE `я` (a INT) engine=myisam;
|
|
SET NAMES DEFAULT;
|
|
mysqlcheck --default-character-set="latin1" --databases test
|
|
test.?
|
|
Error : Table doesn't exist
|
|
status : Operation failed
|
|
mysqlcheck --default-character-set="utf8" --databases test
|
|
test.я OK
|
|
SET NAMES utf8;
|
|
DROP TABLE `я`;
|
|
SET NAMES DEFAULT;
|
|
CREATE DATABASE `#mysql50#a@b`;
|
|
USE `#mysql50#a@b`;
|
|
CREATE TABLE `#mysql50#c@d` (a INT) engine=myisam;
|
|
CREATE TABLE t1 (a INT) engine=myisam;
|
|
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
|
|
WHERE TRIGGER_SCHEMA="#mysql50#a@b" ORDER BY trigger_name;
|
|
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
|
|
def #mysql50#a@b tr1 INSERT def #mysql50#a@b #mysql50#c@d 0 NULL SET NEW.a = 10 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
|
|
def #mysql50#a@b tr2 INSERT def #mysql50#a@b t1 0 NULL SET NEW.a = 100 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
|
|
mysqlcheck --fix-db-names --fix-table-names --all-databases
|
|
USE `a@b`;
|
|
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
|
|
WHERE TRIGGER_SCHEMA="a@b" ORDER BY trigger_name;
|
|
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
|
|
def a@b tr1 INSERT def a@b c@d 0 NULL SET NEW.a = 10 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost utf8 utf8_general_ci latin1_swedish_ci
|
|
def a@b tr2 INSERT def a@b t1 0 NULL SET NEW.a = 100 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost utf8 utf8_general_ci latin1_swedish_ci
|
|
INSERT INTO `c@d` VALUES (2), (1);
|
|
SELECT * FROM `c@d`;
|
|
a
|
|
20
|
|
10
|
|
INSERT INTO t1 VALUES (3), (5);
|
|
SELECT * FROM t1;
|
|
a
|
|
300
|
|
500
|
|
DROP DATABASE `a@b`;
|
|
USE test;
|
|
#
|
|
# Bug #31821: --all-in-1 and --fix-table-names don't work together
|
|
#
|
|
drop table if exists `#mysql50#t1-1`;
|
|
create table `#mysql50#t1-1` (a int) engine=myisam;
|
|
show tables like 't1-1';
|
|
Tables_in_test (t1-1)
|
|
t1-1
|
|
drop table `t1-1`;
|
|
create table `#mysql50#t1-1` (a int) engine=myisam;
|
|
show tables like 't1-1';
|
|
Tables_in_test (t1-1)
|
|
t1-1
|
|
drop table `t1-1`;
|
|
End of 5.1 tests
|
|
#
|
|
# Bug #35269: mysqlcheck behaves different depending on order of parameters
|
|
#
|
|
#
|
|
# Bug#11755431 47205: MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR
|
|
# ENGINES NOT SUPPORTING NATIVE
|
|
#
|
|
DROP TABLE IF EXISTS bug47205;
|
|
#
|
|
# Test 1: Check that ALTER TABLE ... rebuilds the table
|
|
CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY)
|
|
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb;
|
|
INSERT INTO bug47205 VALUES ("foobar");
|
|
FLUSH TABLE bug47205;
|
|
# Replace the FRM with a 5.0 FRM that will require upgrade
|
|
# Should indicate that ALTER TABLE ... FORCE is needed
|
|
CHECK TABLE bug47205 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.bug47205 check error Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it!
|
|
# ALTER TABLE ... FORCE should rebuild the table
|
|
# and therefore output "affected rows: 1"
|
|
ALTER TABLE bug47205 FORCE;
|
|
affected rows: 1
|
|
info: Records: 1 Duplicates: 0 Warnings: 0
|
|
# Table should now be ok
|
|
CHECK TABLE bug47205 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.bug47205 check status OK
|
|
DROP TABLE bug47205;
|
|
#
|
|
# Test 2: InnoDB - REPAIR not supported
|
|
CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY)
|
|
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb;
|
|
FLUSH TABLE bug47205;
|
|
# Replace the FRM with a 5.0 FRM that will require upgrade
|
|
# Should indicate that ALTER TABLE .. FORCE is needed
|
|
CHECK TABLE bug47205 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.bug47205 check error Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it!
|
|
# Running mysqlcheck to check and upgrade
|
|
test.bug47205
|
|
error : Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it!
|
|
|
|
Repairing tables
|
|
# Table should now be ok
|
|
CHECK TABLE bug47205 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.bug47205 check status OK
|
|
DROP TABLE bug47205;
|
|
#
|
|
# Test 3: MyISAM - REPAIR supported
|
|
# Use an old FRM that will require upgrade
|
|
# Should indicate that REPAIR TABLE is needed
|
|
CHECK TABLE bug47205 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.bug47205 check error Table upgrade required. Please do "REPAIR TABLE `bug47205`" or dump/reload to fix it!
|
|
# Running mysqlcheck to check and upgrade
|
|
test.bug47205
|
|
error : Table upgrade required. Please do "REPAIR TABLE `bug47205`" or dump/reload to fix it!
|
|
|
|
Repairing tables
|
|
test.bug47205 OK
|
|
# Table should now be ok
|
|
CHECK TABLE bug47205 FOR UPGRADE;
|
|
Table Op Msg_type Msg_text
|
|
test.bug47205 check status OK
|
|
DROP TABLE bug47205;
|