mysqldump表名前缀

mysqldump表名前缀,mysql,database,mysqldump,Mysql,Database,Mysqldump,我有两个mysql数据库,它们的结构几乎相同,表示同一个web应用程序的数据,但其中一个表示当前版本,第二个是很久以前创建的 如何创建包含两个转储的数据库,但第一个数据库中的表使用旧前缀,第二个数据库中的表使用新前缀 是否有任何mysqldump选项用于设置前缀或其他解决方案?将它们导入不同的数据库。假设它们被称为newdb和olddb。然后您可以将表1复制到旧的\u表1,如下所示: insert into newdb.old_table1 select * from olddb.table1

我有两个mysql数据库,它们的结构几乎相同,表示同一个web应用程序的数据,但其中一个表示当前版本,第二个是很久以前创建的

如何创建包含两个转储的数据库,但第一个数据库中的表使用旧前缀,第二个数据库中的表使用新前缀


是否有任何mysqldump选项用于设置前缀或其他解决方案?

将它们导入不同的数据库。假设它们被称为
newdb
olddb
。然后您可以将表1复制到旧的\u表1,如下所示:

insert into newdb.old_table1
select *
from olddb.table1
如果有大量表,请生成一个脚本来复制它们:

select concat('insert into newdb.old_',  table_name,
    'select * from olddb.', table_name, ';')
from information_schema.tables
where table_schema = 'olddb'
“mysqldump文件”只是一个充满SQL语句的文本文件,因此您可以在文本编辑器中进行类似的快速修改

1) 分别转储这两个数据库

2) 编辑“旧”转储文件:

  • 添加正确的
    使用mydatabase
  • 执行搜索和替换以在表名前添加
    old
3) 然后,
cat dump1 dump2>组合转储


4)
mysql

我以前使用
mysqldump
sed
做过以下工作,但我承认它一次只能对一个表有效

$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB
您可以创建一个shell脚本,其中包含一个命令列表,每个表对应一个命令,或者另一个用户可以修改该脚本,以便在一次操作中有效地处理多个表

同行

  • 按原样恢复两个数据库
  • 添加前缀后,使用以下存储过程将所有表从一个DB移动到另一个DB
  • 移动后,删除源数据库
  • 此存储过程从MySQL的inmemory表中获取表列表,该表位于
    information\u schema
    中,并使用
    RENAME
    命令自动移动到另一个DB

    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 ;

    我可能误解了这个问题,但听起来您希望将这两个数据库转储到一个SQL文件中,用于恢复dbs,旧表进入一个模式,新表进入另一个模式

    如果您正试图这样做,最简单的方法就是在每次转储之前插入适当的“use database”命令

    像这样:

    echo "use old_db;" > /tmp/combined_dump.sql
    mysqldump old_db >> /tmp/combined_dump.sql
    echo "use new_db;" >> /tmp/combined_dump.sql
    mysqldump new_db >> /tmp/combined_dump.sql
    

    这个sed脚本可能更安全一些。将其保存到文件中,并使用sed-f筛选转储文件

    s/\(-- Table structure for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/
    s/\(DROP TABLE IF EXISTS `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/
    s/\(CREATE TABLE `\)\([^`]\+\)\(` (\)/\1xyzzy_\2\3/
    s/\(-- Dumping data for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/
    s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` DISABLE KEYS \*\/\)/\1xyzzy_\2\3/
    s/\(LOCK TABLES `\)\([^`]\+\)\(` WRITE\)/\1xyzzy_\2\3/
    s/\(INSERT INTO `\)\([^`]\+\)\(` VALUES (\)/\1xyzzy_\2\3/
    s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` ENABLE KEYS \*\/\)/\1xyzzy_\2\3/
    

    搜索并将xyzzy_uu替换为所需的表前缀。

    运行以下查询:

    从information_schema.tables中选择Concat('ALTER TABLE',TABLE_NAME',RENAME TO my_prefix_',TABLE_NAME',;'),其中TABLE_schema='my_database'
    
    它的输出是几个查询。然后运行这些查询


    如果存在约束或其他复杂情况,这将不起作用,但对于简单的DBs来说,这很好。

    +1这些文件可能非常大,但是,请确保使用合适的文本编辑器(例如记事本+)进行更改。另一种选择是对一个转储使用“--no data”标志,对第二个转储使用“--no create info”。这将为您提供一个较小的文件来进行初始编辑,并确保您创建的正是您想要的。请确保更改第二个文件表的名称,否则可能会将旧文件的内容放在新文件表中。@aronchick+1 on bigness。一些编辑器在遇到几兆字节长的行时(mysqldump文件中的数据是一个巨大的insert语句,全部在一行中),绝对会崩溃和烧坏;你必须处理这些约束。你需要更多的细节。我尝试了以下方法:
    sed-f my-text-file.txt my-dump.sql>new dump.sql
    这两个文件之间没有区别。如果一个表具有依赖于尚未复制的表的约束,则该方法无效