Bug #47484 | Online Backup: Restore does not set the auto_increment value correctly | ||
---|---|---|---|
Submitted: | 21 Sep 2009 15:01 | Modified: | 7 Mar 2010 19:40 |
Reporter: | Ingo Strüwing | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Backup | Severity: | S3 (Non-critical) |
Version: | 5.4.4 | OS: | Any |
Assigned to: | Ingo Strüwing | CPU Architecture: | Any |
[21 Sep 2009 15:01]
Ingo Strüwing
[21 Sep 2009 15:02]
Ingo Strüwing
The test case
Attachment: wl4844-3.test (application/octet-stream, text), 4.13 KiB.
[21 Sep 2009 15:08]
Ingo Strüwing
Medium defect, requires a new backup image format. Unacceptable workaround, one needs to adjust auto_increment values manually. Widespread impact, everyone with InnoDB tables is affected.
[22 Sep 2009 5:47]
Rafal Somla
An alternative approach would be to require backup/restore drivers to preserve the value of AUTO_INCREMENT. This is already the case for MyISAM and Memory drivers. One would have to fix the logical CS driver (perhaps also the blocking one) to set the AUTO_INCREMENT after restoring table data. With this solution there is no need to change backup image format as the value of AUTO_INCREMENT would be saved by backup driver in table data snapshot.
[22 Sep 2009 7:30]
Ingo Strüwing
IMHO it is just by chance, not by design, that the MyISAM driver preserves that auto_increment value. The MEMORY driver does _not_ preserve the value. I'm sorry if I was unclear about it. A restored MEMORY table shows tha auto_increment value as the highest existing value plus one. This is not necessarily the same value as of the time of backup. The value can be higher than max+1, not only by explicit ALTER, but also by deleting the row with the max value.
[20 Oct 2009 11:09]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/87456 2872 Ingo Struewing 2009-10-20 Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly When implementing the new locking scheme for RESTORE, the table's auto_increment values won't be restored. The new scheme contains TRUNCATE, which resets the auto_increment values to zero. This will lead to a "duplicate key" error on the next attempt to insert an auto_increment value, at least for the InnoDB storage engine. This patch arranges for a reset of the values to what they were at backup time. The auto_increment value of each table is stored at the end of the table data stream in its own chunk. Note that this is done for the default- and consistent snapshot drivers only. The MyISAM native driver restores the value on its own already. Note that the auto_increment value for a MEMORY table is reset correctly, but an incremented value is used on the next insert. I can't say if this is a problem of MEMORY or of the default driver. There is no other storage engine, which has a (working) auto_increment feature and uses the default driver. Also there is a chance that the restored auto_increment value can be higher than at the validation point of BACKUP. One case is mentioned above. Another case could be concurrent DML on a table backed up with the consistent snapshot driver. Since we do not guarantee gap free auto_increment values, I consider this as acceptable. At least this patch assures that the values cannot be lower. @ mysql-test/suite/backup/r/backup_auto_incr.result Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly New test result. @ mysql-test/suite/backup/t/backup_auto_incr.test Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly New test case. @ sql/backup/be_default.cc Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added write and read operations for auto_increment values to the table data stream writer/reader objects. @ sql/backup/be_default.h Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added AUTO_INCR buffer type.
[20 Oct 2009 15:43]
Ingo Strüwing
Please understand the above patch as a prototype. The attached test case does not have the final quality. A couple of other test cases need updated result files.
[21 Oct 2009 12:10]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/87626 2879 Ingo Struewing 2009-10-21 Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly When implementing the new locking scheme for RESTORE, the table's auto_increment values won't be restored. The new scheme contains TRUNCATE, which resets the auto_increment values to zero. This will lead to a "duplicate key" error on the next attempt to insert an auto_increment value, at least for the InnoDB storage engine. This patch arranges for a reset of the values to what they were at backup time. The auto_increment value of each table is stored at the end of the table data stream in its own chunk. Note that this is done for the default- and consistent snapshot drivers only. The MyISAM native driver restores the value on its own already. Note that there is a chance that the restored auto_increment value can be higher than at the validation point of BACKUP. Concurrent DML on a table backed up with the consistent snapshot driver can increase the auto_increment value before the driver reads it. Since we do not guarantee gap free auto_increment values, I consider this as acceptable. At least this patch assures that the values cannot be lower. Note that the patch does also contain a fix to the MEMORY storage engine. ha_heap::reset_auto_increment() assigned the value incorrectly. This has not been noticed yet because the only use case of the method was to reset the value to zero. @ mysql-test/suite/backup/r/backup_auto_incr.result Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly New test result. @ mysql-test/suite/backup/t/backup_auto_incr.test Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly New test case. @ sql/backup/be_default.cc Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added write and read operations for auto_increment values to the table data stream writer/reader objects. @ sql/backup/be_default.h Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added AUTO_INCR buffer type. @ storage/heap/ha_heap.cc Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Fixed the value assignment to HP_SHARE::auto_increment in ha_heap::reset_auto_increment(). @ storage/heap/hp_open.c Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added DBUG.
[23 Oct 2009 9:06]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/87903 2879 Ingo Struewing 2009-10-23 Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly When implementing the new locking scheme for RESTORE, the table's auto_increment values won't be restored. The new scheme contains TRUNCATE, which resets the auto_increment values to zero. This will lead to a "duplicate key" error on the next attempt to insert an auto_increment value, at least for the InnoDB storage engine. This patch arranges for a reset of the values to what they were at backup time. The auto_increment value of each table is stored at the end of the table data stream in its own chunk. Note that this is done for the default- and consistent snapshot drivers only. The MyISAM native driver restores the value on its own already. Note that there is a chance that the restored auto_increment value can be higher than at the validation point of BACKUP. Concurrent DML on a table backed up with the consistent snapshot driver can increase the auto_increment value before the driver reads it. Since we do not guarantee gap free auto_increment values, I consider this as acceptable. At least this patch assures that the values cannot be lower. Note that the patch does also contain a fix to the MEMORY storage engine. ha_heap::reset_auto_increment() assigned the value incorrectly. This has not been noticed yet because the only use case of the method was to reset the value to zero. @ mysql-test/suite/backup/r/backup_auto_incr.result Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly New test result. @ mysql-test/suite/backup/t/backup_auto_incr.test Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly New test case. @ sql/backup/be_default.cc Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added write and read operations for auto_increment values to the table data stream writer/reader objects. @ sql/backup/be_default.h Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added AUTO_INCR buffer type. @ storage/heap/ha_heap.cc Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Fixed the value assignment to HP_SHARE::auto_increment in ha_heap::reset_auto_increment(). @ storage/heap/hp_open.c Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added DBUG.
[23 Oct 2009 13:37]
Rafal Somla
Good to push.
[23 Oct 2009 14:46]
Chuck Bell
Approved
[23 Oct 2009 14:54]
Ingo Strüwing
Hi docs team, this patch arranges the default and consistent snapshot backup/restore drivers so that they restore the auto_increment value of each table to a value equal or higher to the value it had at backup validity time. The MyISAM native driver does already restore the auto_increment values equal to what they were at backup validity time. Implicitly, we do now have a new requirement for backup/restore drivers. They need to restore the auto_increment value of each table as equal or higher to what it was at backup validity time. I don't know, where such requirement can be documented though.
[23 Oct 2009 15:05]
Ingo Strüwing
Oops, while editing my above comment, Chuck approved. When I saved my comment, the status has implicitly been reset to what it was when I started typing. :-(
[27 Oct 2009 8:07]
Ingo Strüwing
Queued to mysql-6.0-backup.
[11 Jan 2010 15:32]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/96509 3050 Ingo Struewing 2010-01-11 WL#5101 - MySQL Backup back port Merged revid:ingo.struewing@sun.com-20091023090611-spkufmaiz1sttp58 Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly When implementing the new locking scheme for RESTORE, the table's auto_increment values won't be restored. The new scheme contains TRUNCATE, which resets the auto_increment values to zero. This will lead to a "duplicate key" error on the next attempt to insert an auto_increment value, at least for the InnoDB storage engine. This patch arranges for a reset of the values to what they were at backup time. The auto_increment value of each table is stored at the end of the table data stream in its own chunk. Note that this is done for the default- and consistent snapshot drivers only. The MyISAM native driver restores the value on its own already. Note that there is a chance that the restored auto_increment value can be higher than at the validation point of BACKUP. Concurrent DML on a table backed up with the consistent snapshot driver can increase the auto_increment value before the driver reads it. Since we do not guarantee gap free auto_increment values, I consider this as acceptable. At least this patch assures that the values cannot be lower. Note that the patch does also contain a fix to the MEMORY storage engine. ha_heap::reset_auto_increment() assigned the value incorrectly. This has not been noticed yet because the only use case of the method was to reset the value to zero. @ storage/heap/ha_heap.cc WL#5101 - MySQL Backup back port Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Fixed the value assignment to HP_SHARE::auto_increment in ha_heap::reset_auto_increment(). @ storage/heap/hp_open.c WL#5101 - MySQL Backup back port Bug#47484 - Online Backup: Restore does not set the auto_increment value correctly Added DBUG.
[20 Feb 2010 9:17]
Bugs System
Pushed into 6.0.14-alpha (revid:ingo.struewing@sun.com-20100218152520-s4v1ld76bif06eqn) (version source revid:ingo.struewing@sun.com-20100119103538-wtp5alpz4p2jayl5) (merge vers: 6.0.14-alpha) (pib:16)
[7 Mar 2010 19:40]
Paul DuBois
Noted in 6.0.14 changelog. RESTORE did not restore table AUTO_INCREMENT values properly.