我想写一个脚本,复制我的当前数据库sitedb1到sitedb2在相同的mysql数据库实例。我知道我可以转储sitedb1到一个sql脚本:
mysqldump -u root -p sitedb1 >~/db_name.sql
然后将它导入sitedb2。 有没有更简单的方法,不用将第一个数据库转储到sql文件?
我想写一个脚本,复制我的当前数据库sitedb1到sitedb2在相同的mysql数据库实例。我知道我可以转储sitedb1到一个sql脚本:
mysqldump -u root -p sitedb1 >~/db_name.sql
然后将它导入sitedb2。 有没有更简单的方法,不用将第一个数据库转储到sql文件?
当前回答
这个语句是在MySQL 5.1.7中添加的,但被发现是危险的,在MySQL 5.1.23中被删除了。它的目的是使升级5.1之前的数据库能够使用5.1中实现的将数据库名称映射到数据库目录名称的编码。但是,使用此语句可能会导致数据库内容的丢失,这就是删除它的原因。不要在出现RENAME DATABASE的早期版本中使用它。
要执行使用新编码升级数据库名称的任务,请使用ALTER database db_name UPGRADE DATA DIRECTORY NAME: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html
其他回答
使用MySQL实用工具
MySQL实用程序中包含了mysqldbcopy工具,默认情况下,它可以复制一个数据库,包括所有相关对象(“表、视图、触发器、事件、过程、函数和数据库级授权”)和数据,从一个DB服务器到同一个或另一个DB服务器。有许多选项可用于自定义实际复制的内容。
所以,为了回答OP的问题:
mysqldbcopy \
--source=root:your_password@localhost \
--destination=root:your_password@localhost \
sitedb1:sitedb2
首先创建重复的数据库:
CREATE DATABASE duplicateddb;
确保权限等都到位,并且:
mysqldump -u admin -p originaldb | mysql -u backup -p password duplicateddb;
如果你在你的原始数据库中有触发器,你可以通过在导入之前管道替换来避免“Trigger already exists”错误:
mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname
该命令需要在终端/命令提示符下执行。
mysqldump -u <user name> -p <pwd> <original db> | mysql -u <user name> <pwd> <new db>
例如:mysqldump -u root test_db1 | mysql -u root test_db2
这将把test_db1复制到test_db2,并授予'root'@'localhost'的访问权限。
你可以使用(在伪代码中):
FOREACH tbl IN db_a:
CREATE TABLE db_b.tbl LIKE db_a.tbl;
INSERT INTO db_b.tbl SELECT * FROM db_a.tbl;
我不使用CREATE TABLE的原因是…选择……语法是保存索引。当然,这只是复制表。视图和过程不会被复制,尽管可以以相同的方式完成。
参见CREATE TABLE。