Commit 7397aa91 authored by Venkatesh Duggirala's avatar Venkatesh Duggirala

Bug#14236170 MYSQLDUMP 5.5.25 CLIENT FAILS TO DUMP

MYSQL DB FROM REMOTE 5.0.96 SERVER

Problem: mysqldump tool assumes the existence of
general_log and slow_log tables in the server.
If mysqldump tool executes on a old server where
there are no log tables like these, mysqldump tool
fails.

Analysis: general_log and slow_log tables are added
in the ignore-table list as part of bug-26121 fix
causes bug-45740 (MYSQLDUMP DOESN'T DUMP GENERAL_LOG
AND SLOW_QUERY CAUSES RESTORE PROBLEM). As part of
the bug-45740 fix, mysqldump tool adds create table
queries for these two tables. But the fix assumes
that on all the servers, general_log and slow_log
will be there. If the new mysqldump tool is executed
against a old server where there are no general_log
and slow_log, the mysqldump tool fails with an error
that 'there is no general_log table'.

Fix: When mysqldump tool is trying to retrieve general_log
and slow_log table structures, first the tool should
check their existence of these tables in the server
instead of trying to dump it blindly.
parent 53f57ab2
...@@ -83,14 +83,6 @@ ...@@ -83,14 +83,6 @@
#define IGNORE_DATA 0x01 /* don't dump data for this table */ #define IGNORE_DATA 0x01 /* don't dump data for this table */
#define IGNORE_INSERT_DELAYED 0x02 /* table doesn't support INSERT DELAYED */ #define IGNORE_INSERT_DELAYED 0x02 /* table doesn't support INSERT DELAYED */
/* general_log or slow_log tables under mysql database */
static inline my_bool general_log_or_slow_log_tables(const char *db,
const char *table)
{
return (strcmp(db, "mysql") == 0) &&
((strcmp(table, "general_log") == 0) ||
(strcmp(table, "slow_log") == 0));
}
static void add_load_option(DYNAMIC_STRING *str, const char *option, static void add_load_option(DYNAMIC_STRING *str, const char *option,
const char *option_value); const char *option_value);
...@@ -2410,6 +2402,15 @@ static uint dump_routines_for_db(char *db) ...@@ -2410,6 +2402,15 @@ static uint dump_routines_for_db(char *db)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/* general_log or slow_log tables under mysql database */
static inline my_bool general_log_or_slow_log_tables(const char *db,
const char *table)
{
return (!my_strcasecmp(charset_info, db, "mysql")) &&
(!my_strcasecmp(charset_info, table, "general_log") ||
!my_strcasecmp(charset_info, table, "slow_log"));
}
/* /*
get_table_structure -- retrievs database structure, prints out corresponding get_table_structure -- retrievs database structure, prints out corresponding
CREATE statement and fills out insert_pat if the table is the type we will CREATE statement and fills out insert_pat if the table is the type we will
...@@ -4285,7 +4286,8 @@ static int dump_all_tables_in_db(char *database) ...@@ -4285,7 +4286,8 @@ static int dump_all_tables_in_db(char *database)
char table_buff[NAME_LEN*2+3]; char table_buff[NAME_LEN*2+3];
char hash_key[2*NAME_LEN+2]; /* "db.tablename" */ char hash_key[2*NAME_LEN+2]; /* "db.tablename" */
char *afterdot; char *afterdot;
int using_mysql_db= my_strcasecmp(&my_charset_latin1, database, "mysql"); my_bool general_log_table_exists= 0, slow_log_table_exists=0;
int using_mysql_db= !my_strcasecmp(charset_info, database, "mysql");
DBUG_ENTER("dump_all_tables_in_db"); DBUG_ENTER("dump_all_tables_in_db");
afterdot= strmov(hash_key, database); afterdot= strmov(hash_key, database);
...@@ -4296,22 +4298,6 @@ static int dump_all_tables_in_db(char *database) ...@@ -4296,22 +4298,6 @@ static int dump_all_tables_in_db(char *database)
if (opt_xml) if (opt_xml)
print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS); print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS);
if (strcmp(database, "mysql") == 0)
{
char table_type[NAME_LEN];
char ignore_flag;
uint num_fields;
num_fields= get_table_structure((char *) "general_log",
database, table_type, &ignore_flag);
if (num_fields == 0)
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'general_log' table\n");
num_fields= get_table_structure((char *) "slow_log",
database, table_type, &ignore_flag);
if (num_fields == 0)
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'slow_log' table\n");
}
if (lock_tables) if (lock_tables)
{ {
DYNAMIC_STRING query; DYNAMIC_STRING query;
...@@ -4357,6 +4343,26 @@ static int dump_all_tables_in_db(char *database) ...@@ -4357,6 +4343,26 @@ static int dump_all_tables_in_db(char *database)
} }
} }
} }
else
{
/*
If general_log and slow_log exists in the 'mysql' database,
we should dump the table structure. But we cannot
call get_table_structure() here as 'LOCK TABLES' query got executed
above on the session and that 'LOCK TABLES' query does not contain
'general_log' and 'slow_log' tables. (you cannot acquire lock
on log tables). Hence mark the existence of these log tables here and
after 'UNLOCK TABLES' query is executed on the session, get the table
structure from server and dump it in the file.
*/
if (using_mysql_db)
{
if (!my_strcasecmp(charset_info, table, "general_log"))
general_log_table_exists= 1;
else if (!my_strcasecmp(charset_info, table, "slow_log"))
slow_log_table_exists= 1;
}
}
} }
if (opt_events && mysql_get_server_version(mysql) >= 50106) if (opt_events && mysql_get_server_version(mysql) >= 50106)
{ {
...@@ -4375,7 +4381,26 @@ static int dump_all_tables_in_db(char *database) ...@@ -4375,7 +4381,26 @@ static int dump_all_tables_in_db(char *database)
} }
if (lock_tables) if (lock_tables)
(void) mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES"); (void) mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES");
if (flush_privileges && using_mysql_db == 0) if (using_mysql_db)
{
char table_type[NAME_LEN];
char ignore_flag;
if (general_log_table_exists)
{
if (!get_table_structure((char *) "general_log",
database, table_type, &ignore_flag) )
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'general_log' table\n");
}
if (slow_log_table_exists)
{
if (!get_table_structure((char *) "slow_log",
database, table_type, &ignore_flag) )
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'slow_log' table\n");
}
}
if (flush_privileges && using_mysql_db)
{ {
fprintf(md_result_file,"\n--\n-- Flush Grant Tables \n--\n"); fprintf(md_result_file,"\n--\n-- Flush Grant Tables \n--\n");
fprintf(md_result_file,"\n/*! FLUSH PRIVILEGES */;\n"); fprintf(md_result_file,"\n/*! FLUSH PRIVILEGES */;\n");
......
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