2737 Jorgen Loland 2008-12-04
Bug#38426 - Backup of partitioned Falcon table will not use snapshot driver
Before, the Default backup driver was used when backing up a partitioned table. However, the Snapshot driver is capable of backing up partitioned tables if the underlying storage engine is InnoDB or Falcon.
With this patch, the Snapshot backup driver is used if the underlying storage engine of a partitioned table is InnoDB or Falcon
added:
mysql-test/suite/backup_engines/r/backup_partition.result
mysql-test/suite/backup_engines/t/backup_partition.test
modified:
mysql-test/suite/backup/r/backup_default.result
mysql-test/suite/backup/t/backup_default.test
sql/backup/backup_info.cc
2736 Rafal Somla 2008-11-28
BUG#40307 - Backup: The list of databases processed by BACKUP/RESTORE not
logged.
After this patch, the trace from BACKUP/RESTOE commands left in server's error
log (master.err) will look as follows:
[Note] Backup: Starting backup process
[Note] Backup: Backing up NN database(s) <list of databases>
[Note] Backup: Backup completed
[Note] Restore: Starting restore process
[Note] Restore: Restoring NN database(s) <list of databases>
[Note] Restore: Restore completed
This way DBA can find out which databases are affected by the operation.
Database list is reported in Logger::report_stats_pre() which is called after
initializing backup/restore catalogue and before performing backup of table
data.
modified:
sql/backup/kernel.cc
sql/backup/logger.cc
sql/share/errmsg.txt
=== modified file 'mysql-test/suite/backup/r/backup_default.result'
--- a/mysql-test/suite/backup/r/backup_default.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_default.result 2008-12-04 13:04:16 +0000
@@ -29,33 +29,20 @@ id name city
DROP DATABASE db1;
Server should not crash for backup using default driver
-Partitioned Falcon tables
-Test for bug#33566, bug#36792
+Mix of tables
CREATE DATABASE db1;
USE db1;
CREATE TABLE partition_table (
int_column int(11),
char_column char(5))
-engine=falcon
+ENGINE=myisam
PARTITION BY HASH (int_column);
INSERT INTO partition_table VALUES (0,'pVtIa');
INSERT INTO partition_table VALUES (5,'jTfSg');
INSERT INTO partition_table VALUES (20,'UezFi');
INSERT INTO partition_table VALUES (25,'cxmeH');
INSERT INTO partition_table VALUES (65,'lIuNS');
-testing content in restored tables
-SELECT * FROM partition_table ORDER BY int_column;
-int_column char_column
-0 pVtIa
-5 jTfSg
-20 UezFi
-25 cxmeH
-65 lIuNS
-
-Server should not crash for backup using default driver
-Mix of tables
-
CREATE TABLE csv_table(
id int NOT NULL,
name char(20) NOT NULL,
@@ -67,6 +54,33 @@ i int,
v varchar(20))
ENGINE=myisam;
INSERT INTO myisam_table VALUES(1,'v1'),(2,'v2'),(3,'v3');
+backup on mixed table database
+BACKUP DATABASE db1 to 'bup_mixed.bak';
+backup_id
+#
+DROP DATABASE db1;
+restore on mixed table database
+RESTORE FROM 'bup_mixed.bak';
+backup_id
+#
+testing content in restored tables
+SELECT * FROM partition_table ORDER BY int_column;
+int_column char_column
+0 pVtIa
+5 jTfSg
+20 UezFi
+25 cxmeH
+65 lIuNS
+SELECT * FROM csv_table ORDER BY id;
+id name city
+1 aa1 bb1
+2 aa2 bb2
+3 aa3 bb3
+SELECT * FROM myisam_table ORDER BY i;
+i v
+1 v1
+2 v2
+3 v3
*** CLEANUP ****
=== modified file 'mysql-test/suite/backup/t/backup_default.test'
--- a/mysql-test/suite/backup/t/backup_default.test 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/t/backup_default.test 2008-12-04 13:04:16 +0000
@@ -43,17 +43,17 @@ DROP DATABASE db1;
--echo
--echo Server should not crash for backup using default driver
---echo Partitioned Falcon tables
---echo Test for bug#33566, bug#36792
+--echo Mix of tables
--echo
CREATE DATABASE db1;
USE db1;
+# create partitioned MyISAM table - will use default driver
CREATE TABLE partition_table (
int_column int(11),
char_column char(5))
-engine=falcon
+ENGINE=myisam
PARTITION BY HASH (int_column);
INSERT INTO partition_table VALUES (0,'pVtIa');
@@ -62,30 +62,7 @@ INSERT INTO partition_table VALUES (20,'
INSERT INTO partition_table VALUES (25,'cxmeH');
INSERT INTO partition_table VALUES (65,'lIuNS');
-#
-# This portion of the test has been disabled. See BUG#39017
-#
-#--echo backup on partitioned falcon
-#--replace_column 1 #
-#BACKUP DATABASE db1 to 'bup_falcon.bak';
-#
-#DROP DATABASE db1;
-#
-#--echo restore on partitioned falcon
-#--replace_column 1 #
-#RESTORE FROM 'bup_falcon.bak';
-
---echo testing content in restored tables
-SELECT * FROM partition_table ORDER BY int_column;
-
-
---echo
---echo Server should not crash for backup using default driver
---echo Mix of tables
---echo
-
-# partition_table already exists in the database
-# re-create the csv_table
+# create CSV table - will use default driver
CREATE TABLE csv_table(
id int NOT NULL,
name char(20) NOT NULL,
@@ -102,23 +79,20 @@ ENGINE=myisam;
INSERT INTO myisam_table VALUES(1,'v1'),(2,'v2'),(3,'v3');
-#
-# This portion of the test has been disabled. See BUG#39017
-#
-#--echo backup on mixed table database
-#--replace_column 1 #
-#BACKUP DATABASE db1 to 'bup_mixed.bak';
-#
-#DROP DATABASE db1;
-#
-#--echo restore on mixed table database
-#--replace_column 1 #
-#RESTORE FROM 'bup_mixed.bak';
-#
-#--echo testing content in restored tables
-#SELECT * FROM partition_table ORDER BY int_column;
-#SELECT * FROM csv_table ORDER BY id;
-#SELECT * FROM myisam_table ORDER BY i;
+--echo backup on mixed table database
+--replace_column 1 #
+BACKUP DATABASE db1 to 'bup_mixed.bak';
+
+DROP DATABASE db1;
+
+--echo restore on mixed table database
+--replace_column 1 #
+RESTORE FROM 'bup_mixed.bak';
+
+--echo testing content in restored tables
+SELECT * FROM partition_table ORDER BY int_column;
+SELECT * FROM csv_table ORDER BY id;
+SELECT * FROM myisam_table ORDER BY i;
# Test cleanup section
=== added file 'mysql-test/suite/backup_engines/r/backup_partition.result'
--- a/mysql-test/suite/backup_engines/r/backup_partition.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/backup_engines/r/backup_partition.result 2008-12-04 13:04:16 +0000
@@ -0,0 +1,43 @@
+#
+# Creating databases
+#
+CREATE DATABASE backup_part;
+CREATE TABLE backup_part.t1 (
+t1_autoinc INTEGER NOT NULL AUTO_INCREMENT,
+t1_uuid CHAR(36),
+PRIMARY KEY (t1_autoinc))
+PARTITION BY HASH (t1_autoinc);
+INSERT INTO backup_part.t1(t1_uuid) VALUES ('aaa'),('bbb'),('ccc'),('ddd');
+# Show content
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+t1_autoinc t1_uuid
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+#
+# Perform backup
+#
+# Show drivers.
+
+SELECT count(*) FROM mysql.backup_history WHERE drivers LIKE 'FILTERED DRIVER' AND backup_id=FILTERED ID;
+count(*)
+1
+
+#
+# Restore and show content
+#
+RESTORE FROM 'partition.bak' OVERWRITE;
+backup_id
+#
+
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+t1_autoinc t1_uuid
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+#
+# Cleanup
+#
+DROP DATABASE backup_part;
=== added file 'mysql-test/suite/backup_engines/t/backup_partition.test'
--- a/mysql-test/suite/backup_engines/t/backup_partition.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/backup_engines/t/backup_partition.test 2008-12-04 13:04:16 +0000
@@ -0,0 +1,67 @@
+#
+# This test is designed to test that BACKUP selects the best available
+# driver for partitioned tables. The storage engines should use these
+# drivers:
+#
+# Partitioned Falcon table -> Snapshot
+# Partitioned InnoDB table -> Snapshot
+# All other partitioned tables -> Default
+#
+
+# Find expected backup driver for the current storage engine.
+
+let $exp_drv= Default;
+if (`select @@storage_engine = 'falcon'`) { let $exp_drv= Snapshot; }
+if (`select @@storage_engine = 'innodb'`) { let $exp_drv= Snapshot; }
+
+# Uncomment the line below and run the test with --force flag
+# if you want to verify that expected driver is correct
+#echo $exp_drv;
+
+--echo #
+--echo # Creating databases
+--echo #
+CREATE DATABASE backup_part;
+
+CREATE TABLE backup_part.t1 (
+ t1_autoinc INTEGER NOT NULL AUTO_INCREMENT,
+ t1_uuid CHAR(36),
+ PRIMARY KEY (t1_autoinc))
+PARTITION BY HASH (t1_autoinc);
+
+INSERT INTO backup_part.t1(t1_uuid) VALUES ('aaa'),('bbb'),('ccc'),('ddd');
+
+--echo # Show content
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+
+--echo #
+--echo # Perform backup
+--replace_column 1 #
+let $bup_id= `BACKUP DATABASE backup_part TO 'partition.bak'`;
+
+--echo #
+--echo # Show drivers.
+
+--echo
+# Count of expected driver for this backup_id should be 1
+# Replace exp_drv and backup_id in query because it will vary
+replace_regex /'.*'.*/'FILTERED DRIVER' AND backup_id=FILTERED ID/ ;
+--eval SELECT count(*) FROM mysql.backup_history WHERE drivers LIKE '$exp_drv' AND backup_id=$bup_id
+--echo
+
+--echo #
+--echo # Restore and show content
+--echo #
+
+--replace_column 1 #
+RESTORE FROM 'partition.bak' OVERWRITE;
+--echo
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+
+--echo #
+--echo # Cleanup
+--echo #
+
+DROP DATABASE backup_part;
+
+--remove_file $MYSQLTEST_VARDIR/master-data/partition.bak
=== modified file 'sql/backup/backup_info.cc'
--- a/sql/backup/backup_info.cc 2008-11-25 17:44:19 +0000
+++ b/sql/backup/backup_info.cc 2008-12-04 13:04:16 +0000
@@ -8,6 +8,7 @@
*/
#include "../mysql_priv.h"
+#include "../ha_partition.h"
#include "backup_info.h"
#include "backup_kernel.h"
@@ -34,6 +35,48 @@ storage_engine_ref get_storage_engine(TH
if (table)
{
se= plugin_ref_to_se_ref(table->s->db_plugin);
+
+ /*
+ Further check for underlying storage engine is needed
+ if table is partitioned
+ */
+
+ storage_engine_ref se_tmp= NULL;
+
+ if (table->part_info)
+ {
+ partition_info *p_info= table->part_info;
+ List_iterator<partition_element> p_it(p_info->partitions);
+ partition_element *p_el;
+
+ while ((p_el= p_it++))
+ {
+ if (!se_tmp)
+ {
+ se_tmp= hton2plugin[p_el->engine_type->slot];
+ ::handlerton *h= se_hton(se_tmp);
+
+ /*
+ Native drivers don't support partitioning. Let Falcon and
+ InnoDB use Snapshot driver; all other storage engines use
+ Default.
+ */
+ if (h->start_consistent_snapshot == NULL)
+ goto close; // This is not a Falcon or InnoDB storage engine
+
+ continue;
+ }
+
+ // use Default driver if partitions have different storage engines
+ if (se_tmp != hton2plugin[p_el->engine_type->slot])
+ goto close;
+ };
+
+ se= se_tmp;
+ }
+
+ close:
+
::intern_close_table(table);
my_free(table, MYF(0));
}
| Thread |
|---|
| • bzr push into mysql-6.0-backup branch (jorgen.loland:2736 to 2737) Bug#38426 | Jorgen Loland | 4 Dec |