首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysqldump表名前缀

mysqldump表名前缀
EN

Stack Overflow用户
提问于 2009-12-17 03:23:24
回答 7查看 7.3K关注 0票数 3

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

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

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-17 04:36:42

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

此存储过程从information_schema中MySQL的inmemory表中获取表列表,并使用RENAME命令自动移动到另一个DB。

代码语言:javascript
复制
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 ;
票数 1
EN

Stack Overflow用户

发布于 2009-12-17 03:53:29

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

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

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

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

3)然后,cat dump1 dump2 > combined_dump

4) mysql < combined_dump

票数 2
EN

Stack Overflow用户

发布于 2010-03-22 10:21:35

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

代码语言:javascript
复制
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_并将其替换为所需的表前缀。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1917021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档