Commit e0d5a6c1 authored by Ramil Kalimullin's avatar Ramil Kalimullin

Fix for bug#37527: mysqlcheck fails to report entire database

when InnoDB frm file corruption

Problem: mysqlcheck runs 'SHOW FULL TABLE' queries to get table lists.
The query may fail for some reasons (e.g. null .frm file) then
mysqlcheck doesn't process the database tables.

Fix: try to run 'SHOW TABLES' if 'SHOW FULL TABLES' failed.
parent f88fd3fe
...@@ -488,9 +488,14 @@ static int process_all_tables_in_db(char *database) ...@@ -488,9 +488,14 @@ static int process_all_tables_in_db(char *database)
LINT_INIT(res); LINT_INIT(res);
if (use_db(database)) if (use_db(database))
return 1; return 1;
if (mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") || if ((mysql_query(sock, "SHOW /*!50002 FULL*/ TABLES") &&
!((res= mysql_store_result(sock)))) mysql_query(sock, "SHOW TABLES")) ||
!(res= mysql_store_result(sock)))
{
my_printf_error(0, "Error: Couldn't get table list for database %s: %s",
MYF(0), database, mysql_error(sock));
return 1; return 1;
}
num_columns= mysql_num_fields(res); num_columns= mysql_num_fields(res);
......
...@@ -63,4 +63,11 @@ Table Op Msg_type Msg_text ...@@ -63,4 +63,11 @@ Table Op Msg_type Msg_text
test.v1 check status OK test.v1 check status OK
information_schema.routines check note The storage engine for the table doesn't support check information_schema.routines check note The storage engine for the table doesn't support check
drop view v1; drop view v1;
CREATE TABLE t1(a INT);
CREATE TABLE t2(a INT);
test.t1
Error : Incorrect information in file: './test/t1.frm'
error : Corrupt
test.t2 OK
DROP TABLE t1, t2;
End of 5.0 tests End of 5.0 tests
...@@ -65,4 +65,24 @@ create view v1 as select * from information_schema.routines; ...@@ -65,4 +65,24 @@ create view v1 as select * from information_schema.routines;
check table v1, information_schema.routines; check table v1, information_schema.routines;
drop view v1; drop view v1;
#
# Bug#37527: mysqlcheck fails to report entire database
# when frm file corruption
#
CREATE TABLE t1(a INT);
CREATE TABLE t2(a INT);
# backup then null t1.frm
--copy_file $MYSQLTEST_VARDIR/master-data/test/t1.frm $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm
--write_file $MYSQLTEST_VARDIR/master-data/test/t1.frm
EOF
--exec $MYSQL_CHECK test
# restore t1.frm
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm
--copy_file $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak $MYSQLTEST_VARDIR/master-data/test/t1.frm
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.frm.bak
DROP TABLE t1, t2;
--echo End of 5.0 tests --echo End of 5.0 tests
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