Tasked with archiving large groups of tables, moving from one database to another. There are a few caveats involved depending on the architecture of the tables being moved, specifically bugs in MySQL 5.1, 5.5, 5.6 and maybe a few more versions documented here. this procedure handles the AUTO_INCREMENT issue, but will not alter tables containing various types of indexes. There are parameters for origin and destination databases in case you make a mistake and need to move one back. The archiveTable parameter is a boolean value 1/0, the rest is fairly straight forward.
DROP PROCEDURE IF EXISTS archive_tables; -- set a temp delimiter for procedure construction DELIMITER $$ -- create the procedure CREATE PROCEDURE archive_tables(tablePrefix VARCHAR(32), originTable VARCHAR(32), destinationTable VARCHAR(32), archiveTable BOOLEAN) BEGIN -- declare the variables DECLARE done INT DEFAULT FALSE; DECLARE tableName VARCHAR(50); DECLARE newTableName VARCHAR(70); DECLARE mv_query VARCHAR(1000); DECLARE alt_query VARCHAR(1000); -- create the cursor with the selected tables DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME LIKE CONCAT(tablePrefix,'%') AND TABLE_SCHEMA=originTable; -- this turns 'done' TRUE when there are no more tables DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- begin OPEN cur1; read_loop: LOOP -- push the current cursor element into the tableName var FETCH cur1 INTO tableName; -- if we are done, stop IF done THEN LEAVE read_loop; END IF; SET newTableName = CONCAT(destinationTable,'.',tableName); -- create the rename query SET mv_query = CONCAT('RENAME TABLE ', tableName, ' TO ', newTableName); SET @mvQuery = mv_query; -- exec rename PREPARE stmt FROM @mvQuery; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- are we archiving the relocated tables? -- Note: This engine will not work with all tables, there is also a bug related to AI columns -- documented here: http://bugs.mysql.com/bug.php?id=37871 (Dev is running 5.1.73) The -- temp workaround is setting AUTO_INCREMENT to 0, but even this is not sufficient for -- all tables. I suggest not trying to use this feature even though the benefits are many. IF archiveTable THEN -- create engine conversion query SET alt_query = CONCAT('ALTER TABLE ', newTableName, ' AUTO_INCREMENT=0 ENGINE=archive'); SET @altQuery = alt_query; -- set the engine attribute PREPARE stmt FROM @altQuery; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END LOOP; END;