Any better way out of MySQL InnoDB log "in the future"?
This was a pretty rare situation.  I hope to never end up there again, with an InnoDB "log sequence number is in the future!" error.  Because of my particular details, rebuilding/restoring my server's data was a last resort.  Some cheats in helping that were good ideas, but in the end, I decided to just keep improving my Perl script to play this silly game and churn through as many gigs/hour as I could.  What the heck, it's a good system stress test.

Remember: the goal is to increase a single counter ("log sequence number") which is stored somewhere in the headers of ib_logfile0 and ib_logfile1.  This is to fake out InnoDB so it will ignore an apparent time warp and get on with life.  But no one knows how to edit that number. Or if they do know, no one's talking. 

Here's my final product.  YMMV, but using mysql's REPEAT function to generate the data internally is highly efficient. 

 #!/usr/bin/perl
 use DBI;
 $table = shift || die;
 $dbh = DBI-&gt;connect("DBI:mysql:junk:host=localhost", "user", "pass"); #Edit "junk" (DB name), user, and pass to suit.
 $dbh-&gt;do("DROP TABLE IF EXISTS $table");
 $dbh-&gt;do("CREATE TABLE $table (str TEXT) ENGINE=INNODB");
 $sth = $dbh-&gt;prepare("INSERT INTO $table (str) VALUES (REPEAT(?,1000000))");
 foreach (1..50) {
    $sth-&gt;execute('0123456789');   # 10 MB
 }
 $dbh-&gt;do("DELETE FROM $table");


My suggested recipe:


Create a 'junk' database
Save the above perl script as junk.pl.
Run junk.pl data1, and junk.pl data2, and junk.pl data3, etc. all at once, for as many CPU cores as your database server has, to start.  Open multiple shells and wrap each run in a Bash loop: while true; do date; junk.pl dataX; done. 


Watch your LSN grow, perhaps in another loop:

 silly# echo "SHOW INNODB STATUS \G" | mysql -p'xxxxxx' | grep '^Log seq'
 Log sequence number 124 3871092821
 silly# echo "SHOW INNODB STATUS \G" | mysql -p'xxxxxx' | grep '^Log seq'
 Log sequence number 124 4209892586
 silly# echo "SHOW INNODB STATUS \G" | mysql -p'xxxxxx' | grep '^Log seq'
 Log sequence number 125 85212387


The big number is an unsigned 32-bit INT which will wrap at 4GB, increasing the smaller number every time.  In this case above it just rolled from 124 to 125.  Your goal is hidden in the mysqld.log that sent you Googling for this ridiculous solution in the first place.  Once you cross that finish line, that's it!  Blow the horns!  Release the confetti!


  Sidebar: This uncovered an interesting bug in mysqld 5.0 w/REPEAT: if you go to 20 MB, it flips some internal counter and rolls over to ~ 96 KB.  No warning or error anywhere.  I wasn't about to waste time tracking that down.  10 MB works great.  If you do hit some other limit, it may complain.  I have various innodb buffers increased from default.  Season to taste.  As always, watch mysqld.log in one window.