3

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

如何创建包含两个转储的数据库,但第一个数据库中的表具有 old_ 前缀,第二个数据库中的表具有 new_ 前缀?

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

4

7 回答 7

2

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

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

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

  • 添加正确的use mydatabase;
  • 进行搜索和替换以old_在表名前面添加。

3)然后,cat dump1 dump2 > combined_dump

4)mysql < combined_dump

于 2009-12-16T19:53:28.817 回答
2

这个 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_ 并将其替换为所需的表前缀。

于 2010-03-22T02:21:34.890 回答
1
  1. 按原样还原两个数据库。
  2. 添加前缀后,使用以下存储过程将所有表从一个 DB 移动到另一个 DB。
  3. 移动后删除源数据库。

这个存储过程从 MySQL 的 inmemory 表中获取表列表,并使用命令information_schema自动移动到另一个 DB 。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 ;
于 2009-12-16T20:36:42.173 回答
0

将它们导入不同的数据库。假设他们被称为newdband olddb。然后您可以将 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'
于 2009-12-16T19:51:18.643 回答
0

我过去使用mysqldumpand完成了以下操作sed,但我承认它可能一次只对一张桌子有效。

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

您可以创建一个带有命令列表的 shell 脚本,每个表一个,或者另一个用户可以修改它以一次有效地处理多个表。

同行

于 2009-12-16T20:00:55.863 回答
0

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

如果这就是你想要做的,最简单的方法就是在每次转储之前插入正确的“使用数据库”命令。

像这样:

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
于 2009-12-16T20:54:48.223 回答
0

运行以下查询:

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

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

如果有限制或其他复杂的事情,这将不起作用,但对于简单的数据库,这工作正常。

于 2018-06-01T20:20:47.270 回答