Below is the list of changes that have just been committed into a local
6.0 repository of cbell. When cbell does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2008-01-23 17:51:19-05:00, cbell@mysql_cab_desk. +4 -0
BUG#33355 : Backup: hang if database is mysql
Code now warns user if mysql or information_schema is found in
the database list. Code throws error if database list is empty.
mysql-test/r/backup_errors.result@stripped, 2008-01-23 17:51:11-05:00, cbell@mysql_cab_desk. +21 -0
BUG#33355 : Backup: hang if database is mysql
New result file.
mysql-test/t/backup_errors.test@stripped, 2008-01-23 17:51:12-05:00, cbell@mysql_cab_desk. +66 -0
BUG#33355 : Backup: hang if database is mysql
Updated test.
sql/backup/kernel.cc@stripped, 2008-01-23 17:51:12-05:00, cbell@mysql_cab_desk. +19 -2
BUG#33355 : Backup: hang if database is mysql
Added code to send error if no databases to backup.
Added code to capture and warn if mysql or information_schema
included in database list.
sql/share/errmsg.txt@stripped, 2008-01-23 17:51:12-05:00, cbell@mysql_cab_desk. +4 -0
BUG#33355 : Backup: hang if database is mysql
New error/warning messages.
diff -Nrup a/mysql-test/r/backup_errors.result b/mysql-test/r/backup_errors.result
--- a/mysql-test/r/backup_errors.result 2007-12-13 11:52:49 -05:00
+++ b/mysql-test/r/backup_errors.result 2008-01-23 17:51:11 -05:00
@@ -22,3 +22,24 @@ BACKUP DATABASE test,foo,bdb,bar TO 'tes
ERROR 42000: Unknown database 'foo,bar'
DROP DATABASE adb;
DROP DATABASE bdb;
+Backup of mysql, information_schema scenario 1
+BACKUP DATABASE mysql TO 't.bak';
+ERROR HY000: Nothing to backup
+Backup of mysql, information_schema scenario 2
+BACKUP DATABASE information_schema TO 't.bak';
+ERROR HY000: Nothing to backup
+Backup of mysql, information_schema scenario 3
+BACKUP DATABASE mysql, information_schema TO 't.bak';
+ERROR HY000: Nothing to backup
+Backup of mysql, information_schema scenario 4
+BACKUP DATABASE mysql, test TO 't.bak';
+backup_id
+#
+Backup of mysql, information_schema scenario 5
+BACKUP DATABASE information_schema, test TO 't.bak';
+backup_id
+#
+Backup of mysql, information_schema scenario 6
+BACKUP DATABASE mysql, information_schema, test TO 't.bak';
+backup_id
+#
diff -Nrup a/mysql-test/t/backup_errors.test b/mysql-test/t/backup_errors.test
--- a/mysql-test/t/backup_errors.test 2007-12-13 11:58:31 -05:00
+++ b/mysql-test/t/backup_errors.test 2008-01-23 17:51:12 -05:00
@@ -57,3 +57,69 @@ DROP DATABASE bdb;
# will fail and we will be warned that something is wrong with the test
--error 1
--remove_file $MYSQLTEST_VARDIR/master-data/test.bak
+
+# Check error conditions for including mysql and information_schema in
+# the list of databases.
+#
+# There are several scenarios:
+# 1) BACKUP DATABASE mysql TO 't.bak'
+# Error: Nothing to backup
+# 2) BACKUP DATABASE information_schema TO 't.bak'
+# Error: Nothing to backup
+# 3) BACKUP DATABASE mysql, information_schema TO 't.bak'
+# Error: Nothing to backup
+# 4) BACKUP DATABASE mysql, test TO 't.bak'
+# Warning: Backup cannot include database 'mysql'
+# 5) BACKUP DATABASE information_schema, test TO 't.bak'
+# Warning: Backup cannot include database 'information_schema'
+# 6) BACKUP DATABASE mysql, information_schema, test TO 't.bak'
+# Warning: Backup cannot include database 'mysql'
+# Warning: Backup cannot include database 'mysql'
+
+# Scenario 1
+--echo Backup of mysql, information_schema scenario 1
+--error ER_BACKUP_NOTHING_TO_BACKUP
+BACKUP DATABASE mysql TO 't.bak';
+
+--error 0, 1
+--remove_file $MYSQLTEST_VARDIR/master-data/t.bak
+
+# Scenario 2
+--echo Backup of mysql, information_schema scenario 2
+--error ER_BACKUP_NOTHING_TO_BACKUP
+BACKUP DATABASE information_schema TO 't.bak';
+
+--error 0, 1
+--remove_file $MYSQLTEST_VARDIR/master-data/t.bak
+
+# Scenario 3
+--echo Backup of mysql, information_schema scenario 3
+--error ER_BACKUP_NOTHING_TO_BACKUP
+BACKUP DATABASE mysql, information_schema TO 't.bak';
+
+--error 0, 1
+--remove_file $MYSQLTEST_VARDIR/master-data/t.bak
+
+# Scenario 4
+--echo Backup of mysql, information_schema scenario 4
+--replace_column 1 #
+BACKUP DATABASE mysql, test TO 't.bak';
+
+--error 0, 1
+--remove_file $MYSQLTEST_VARDIR/master-data/t.bak
+
+# Scenario 5
+--echo Backup of mysql, information_schema scenario 5
+--replace_column 1 #
+BACKUP DATABASE information_schema, test TO 't.bak';
+
+--error 0, 1
+--remove_file $MYSQLTEST_VARDIR/master-data/t.bak
+
+# Scenario 6
+--echo Backup of mysql, information_schema scenario 6
+--replace_column 1 #
+BACKUP DATABASE mysql, information_schema, test TO 't.bak';
+
+--error 0, 1
+--remove_file $MYSQLTEST_VARDIR/master-data/t.bak
diff -Nrup a/sql/backup/kernel.cc b/sql/backup/kernel.cc
--- a/sql/backup/kernel.cc 2007-12-14 02:51:28 -05:00
+++ b/sql/backup/kernel.cc 2008-01-23 17:51:12 -05:00
@@ -295,7 +295,16 @@ execute_backup_command(THD *thd, LEX *le
else
{
info.write_message(log_level::INFO,"Backing up selected databases");
- info.add_dbs(lex->db_list); // backup databases specified by user
+ res= info.add_dbs(lex->db_list); // backup databases specified by user
+ }
+ if ((info.db_count() == 0) && (res != ERROR))
+ {
+ res= ERROR;
+ info.report_error(log_level::ERROR, ER_BACKUP_NOTHING_TO_BACKUP, MYF(0));
+ stop= my_time(0);
+ info.save_end_time(stop);
+ report_errors(thd, info, ER_BACKUP_BACKUP);
+ goto backup_error;
}
report_ob_num_objects(backup_prog_id, info.table_count);
@@ -697,7 +706,15 @@ int Backup_info::add_dbs(List< ::LEX_STR
String db_name(*s);
Db_ref db(db_name);
- if (db_exists(db))
+ if (((my_strcasecmp(system_charset_info,
+ db_name.c_ptr(), "information_schema") == 0)) ||
+ (my_strcasecmp(system_charset_info,
+ db_name.c_ptr(), "mysql") == 0))
+ {
+ report_error(log_level::WARNING, ER_BACKUP_CANNOT_INCLUDE_DB,
+ db_name.c_ptr());
+ }
+ else if (db_exists(db))
{
if (!unknown_dbs.is_empty()) // we just compose unknown_dbs list
continue;
diff -Nrup a/sql/share/errmsg.txt b/sql/share/errmsg.txt
--- a/sql/share/errmsg.txt 2007-12-13 11:49:58 -05:00
+++ b/sql/share/errmsg.txt 2008-01-23 17:51:12 -05:00
@@ -6114,6 +6114,10 @@ ER_BACKUP_RESTORE_START
ER_BACKUP_RESTORE_DONE
eng "Restore completed"
+ER_BACKUP_NOTHING_TO_BACKUP
+ eng "Nothing to backup"
+ER_BACKUP_CANNOT_INCLUDE_DB
+ eng "Database '%-.64s' cannot be included in a backup and will be skipped"
ER_BACKUP_BACKUP
eng "Error during backup operation - server's error log contains more information about the error"
ER_BACKUP_RESTORE