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;