1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
mysqldump assumed the existence of the general_log and slow_log
tables in the mysql database. It failed if invoked to dump tables
from an older server where these tables do not exist.
Upstream bug report http://bugs.mysql.com/bug.php?id=65670
RHBZ#877577
diff -up mysql-5.1.70/client/mysqldump.c.bug877557upstream mysql-5.1.70/client/mysqldump.c
--- mysql-5.1.70/client/mysqldump.c.bug877557upstream 2013-05-13 15:33:33.000000000 +0200
+++ mysql-5.1.70/client/mysqldump.c 2013-08-01 12:38:12.225403859 +0200
@@ -84,14 +84,6 @@
#define IGNORE_DATA 0x01 /* don't dump data for this table */
#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,
const char *option_value);
@@ -2432,6 +2424,15 @@ static uint dump_routines_for_db(char *d
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
CREATE statement and fills out insert_pat if the table is the type we will
@@ -4282,7 +4283,8 @@ static int dump_all_tables_in_db(char *d
char table_buff[NAME_LEN*2+3];
char hash_key[2*NAME_LEN+2]; /* "db.tablename" */
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");
afterdot= strmov(hash_key, database);
@@ -4293,22 +4295,6 @@ static int dump_all_tables_in_db(char *d
if (opt_xml)
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)
{
DYNAMIC_STRING query;
@@ -4352,6 +4338,26 @@ static int dump_all_tables_in_db(char *d
}
}
}
+ 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)
{
@@ -4370,7 +4376,26 @@ static int dump_all_tables_in_db(char *d
}
if (lock_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/*! FLUSH PRIVILEGES */;\n");
|