繁体   English   中英

mysqldump表名前缀

[英]mysqldump table names prefix

我有两个mysql数据库,它们具有几乎相同的结构并代表同一个Web应用程序的数据,但其中一个表示当前版本,第二个是很久以前制作的。

如何使用内部转储创建数据库,但是对于来自第二个数据库的表的第一个和new_前缀的表使用old_前缀?

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

这个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_。

“mysqldump文件”只是一个充满SQL语句的文本文件,因此您可以在文本编辑器中快速进行修改。

1)单独转储两个数据库。

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

  • 添加正确的use mydatabase; 线
  • 执行搜索并替换以在表名前面添加old_

3)然后, cat dump1 dump2 > combined_dump

4) mysql < combined_dump

  1. 按原样还原两个数据库。
  2. 添加前缀后,使用以下存储过程将所有表从一个DB移动到另一个DB。
  3. 移动后删除源数据库。

此存储过程从information_schema MySQL内存表中获取表列表,并使用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 ;

将它们导入不同的数据库。 说他们被称为newdbolddb 然后你可以将table1复制到old_table1,如:

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'

我在过去使用mysqldumpsed做了以下操作,但我承认它一次只对一个表有效。

$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB

您可以使用命令列表创建一个shell脚本,每个表一个,或者可能另一个用户有一种方法可以修改它以一次有效地对多个表进行操作。

窥视

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

如果您正在尝试这样做,最简单的方法就是在每次转储之前插入正确的“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

运行以下查询:

SELECT Concat('ALTER TABLE ', TABLE_NAME, ' RENAME TO my_prefix_', TABLE_NAME, ';') FROM information_schema.tables WHERE table_schema = 'my_database'

其输出是几个查询。 然后运行这些查询。

如果存在约束或其他复杂的事情,这将不起作用,但对于简单的DB,这可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM