我有两个 mysql 数据库,它们具有几乎相同的结构并代表同一个 Web 应用程序的数据,但其中一个代表当前版本,第二个是很久以前制作的。
如何创建包含两个转储的数据库,但对于第一个数据库中的表使用 old_ 前缀,对于第二个数据库中的表使用 new_ 前缀?
是否有任何 mysqldump 选项来设置前缀或其他解决方案?
最佳答案
这个存储过程从
information_schema
中 MySQL 的内存表中获取表列表,并使用 RENAME
命令自动移动到另一个数据库。DELIMITER $$
USE `db`$$
DROP PROCEDURE IF EXISTS `renameDbTables`$$
CREATE DEFINER=`db`@`%` PROCEDURE `renameDbTables`(
IN from_db VARCHAR(20),
IN to_db VARCHAR(30),
IN to_name_prefix VARCHAR(20)
)
BEGIN
/*
call db.renameDbTables('db1','db2','db_');
db1.xxx will be renamed to db2.db_xxx
*/
DECLARE from_state_table VARCHAR(20) DEFAULT '';
DECLARE done INT DEFAULT 0;
DECLARE b VARCHAR(255) DEFAULT '';
DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA=from_db;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO from_state_table;
IF NOT done THEN
-- select from_state_table;
SET @QUERY = '';
SET @QUERY = CONCAT(@QUERY,'RENAME TABLE ',from_db,'.', from_state_table,' TO ',to_db,'.', to_name_prefix, from_state_table,';');
-- SELECT @query;
PREPARE s FROM @QUERY;
EXECUTE s;
DEALLOCATE PREPARE s;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END$$
DELIMITER ;
关于mysqldump 表名前缀,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1917021/