我有两个 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/

    10-13 07:34