List:Commits« Previous MessageNext Message »
From:Jorgen Loland Date:December 4 2008 2:20pm
Subject:bzr push into mysql-6.0-backup branch (jorgen.loland:2736 to 2737) Bug#38426
View as plain text  
 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#38426Jorgen Loland4 Dec