我有两个mysql数据库具有几乎相同的结构和代表相同的Web应用程序的数据,但其中一个代表当前版本,第二个是很久以前。mysqldump表名前缀
如何创建数据库,其中既有内部转储,也有old_前缀,用于来自第二个数据库的表的first和new_前缀的表?
是否有任何mysqldump选项来设置前缀或其他解决方案?
我有两个mysql数据库具有几乎相同的结构和代表相同的Web应用程序的数据,但其中一个代表当前版本,第二个是很久以前。mysqldump表名前缀
如何创建数据库,其中既有内部转储,也有old_前缀,用于来自第二个数据库的表的first和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 ;
将它们导入到不同的数据库中。说他们叫newdb
和olddb
。然后,你可以复制表1到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'
A“mysqldump档案”只是一个文本文件的完整的SQL语句,因此您可以在文本编辑器中进行类似的快速修改。
1)分别转储两个数据库。
2)编辑“旧”转储文件:
use mydatabase;
线old_
。3)然后,cat dump1 dump2 > combined_dump
4)mysql < combined_dump
+1这些文件可能非常大,但是,请确保使用像样的文本编辑器(例如notepad ++)来进行更改。另一种方法是对一个转储使用'--no-data'标志,对另一个转储使用'--no-create-info'。这会给你一个更小的文件来进行初始编辑,并让你确保你正在创建你想要的。请确保更改第二个文件表的名称,否则最终可能会将旧文件的内容放入新文件的表中。 – aronchick 2009-12-16 20:05:06
@aronchick +1关于bigness。一些编辑器在遇到几兆字节的行时(绝对数据在mysqldump文件中是一个巨大的插入语句,全部在一行上)时,绝对会发生崩溃和烧毁。 – Seth 2009-12-16 21:15:48
我已经做了,在过去使用mysqldump
和sed
以下,但我承认它可能只为一个表是有效的在时间。
$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB
您可以创建一个shell脚本的命令,每个表一个,或者其他用户的方式来修改这个打击多个表有效一次拍摄工作的列表。
同伴
我可能误解了问题,但它听起来像你想的2个数据库转储到一个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_。
这是不够的;你必须处理约束 – 2015-07-28 08:06:03
如果表的约束取决于表还没有被复制,那么它是行不通的 – 2015-07-28 08:07:54