我想编写一个脚本,将我当前的数据库sitedb1
复制到同一个mysql数据库实例上的sitedb2
。我知道我可以将sitedb1转储到sql脚本:
mysqldump -u root -p sitedb1 >~/db_name.sql
然后将其导入sitedb2
。
有没有更简单的方法,而不将第一个数据库转储到sql文件?
答案 0 :(得分:230)
正如手册在Copying Databases中所说,您可以将转储直接传递到mysql客户端:
mysqldump db_name | mysql new_db_name
如果您正在使用MyISAM,可以复制文件,但我不会推荐它。这有点狡猾。
综合各种其他好的答案
mysqldump
和mysql
命令都接受用于设置连接详细信息的选项(以及更多内容),例如:
mysqldump -u <user name> --password=<pwd> <original db> | mysql -u <user name> -p <new db>
此外,如果新数据库尚未存在,您必须事先创建它(例如使用echo "create database new_db_name" | mysql -u <dbuser> -p
)。
答案 1 :(得分:57)
MySQL实用程序包含一个漂亮的工具mysqldbcopy
,它默认复制包含所有相关对象(“表,视图,触发器,事件,过程,函数和数据库级别授权”)的数据库和来自一个的数据DB服务器到同一个或另一个DB服务器。有很多选项可用于自定义实际复制的内容。
所以,回答OP的问题:
mysqldbcopy \
--source=root:your_password@localhost \
--destination=root:your_password@localhost \
sitedb1:sitedb2
答案 2 :(得分:18)
$ mysqladmin create DB_name -u DB_user --password=DB_pass && \
mysqldump -u DB_user --password=DB_pass DB_name | mysql -u DB_user --password=DB_pass -h DB_host DB_name
答案 3 :(得分:12)
您需要从终端/命令提示符运行该命令。
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并授予对&#39; root&#39; @&#39; localhost&#39;
的访问权限答案 4 :(得分:8)
你可以使用(伪代码):
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 ... SELECT ...语法的原因是保留索引。当然这只能复制表格。虽然可以以相同的方式完成,但不会复制视图和过程。
请参阅CREATE TABLE。
答案 5 :(得分:8)
最简单的方法是在终端中输入这些命令,并为root用户设置权限。对我有用..!
:~$> mysqldump -u root -p db1 > dump.sql
:~$> mysqladmin -u root -p create db2
:~$> mysql -u root -p db2 < dump.sql
答案 6 :(得分:4)
首先创建重复数据库:
CREATE DATABASE duplicateddb;
确保权限等全部到位并且:
mysqldump -u admin -p originaldb | mysql -u backup -p password duplicateddb;
答案 7 :(得分:2)
您可以执行以下操作:
mysqldump -u[username] -p[password] database_name_for_clone
| mysql -u[username] -p[password] new_database_name
答案 8 :(得分:1)
此声明已添加到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
答案 9 :(得分:1)
如果您安装了 phpmyadmin :
,这是一种简单的方法转到您的数据库,选择“操作”选项卡,您可以看到“将数据库复制到”块。使用它,您可以复制数据库。
答案 10 :(得分:0)
除了Greg's answer之外,如果new_db_name
尚不存在,这是最简单,最快捷的方式:
echo "create database new_db_name" | mysql -u <user> -p <pwd>
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
答案 11 :(得分:0)
如果原始数据库中有触发器,则可以通过在导入之前用管道输送替换项来避免“触发器已存在”错误:
mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname
答案 12 :(得分:0)
如Greg's answer中所述,mysqldump db_name | mysql new_db_name
是在数据库之间传输数据的免费,安全且容易的方式。但是,它也真的很慢。
如果您要备份数据,无法承受丢失数据(在此数据库或其他数据库中)或使用innodb
以外的表,则应使用{{1} }。
如果您正在寻找开发的东西,将所有数据库备份到其他地方,并且在出现所有问题时都可以很方便地清除并重新安装mysqldump
(可能是手动安装),那么我可能会为您提供解决方案你。
我找不到一个好的选择,所以我自己编写了一个脚本。我花了很多时间 第一次使它工作,老实说,现在对它进行更改使我有些害怕。 Innodb数据库并非要像这样复制和粘贴。微小的更改会导致此操作失败。自完成代码以来,我没有遇到任何问题,但这并不意味着您不会。
系统经过测试(但可能仍会失败):
mysql
特权并验证您是否有足够的存储空间来克隆数据库sudo
相比在3gb数据库上,使用mysqldump
和mysqldump
在我的计算机上需要40-50分钟。使用这种方法,相同的过程仅需约8分钟。
我们将我们的SQL更改与代码一起保存,并且升级过程在生产和开发过程中都是自动化的,每组更改都会对数据库进行备份,以便在出现错误时进行恢复。我们遇到的一个问题是,当我们在一个长期的项目中进行数据库更改时,不得不在其中途切换分支以修复一三个错误。
过去,我们对所有分支使用单个数据库,并且每当切换到与新数据库更改不兼容的分支时,都必须重建数据库。当我们切换回去时,我们将不得不再次运行升级。
我们尝试mysql
为不同分支复制数据库,但是等待时间太长(40至50分钟),并且在此期间我们无能为力。
此解决方案将数据库克隆时间缩短到原来的1/5(以咖啡和洗手间的时间代替了漫长的午餐时间)。
在具有不兼容数据库更改的分支之间切换在单个数据库上花费50+分钟,但是在使用mysqldump
或此代码的初始设置时间之后根本没有时间。这段代码恰好比mysqldump
快5倍。
以下是一些常见的任务,以及每种方法大约需要花费多长时间:
mysqldump
:50-60分钟mysqldump
进行错误修复,在功能分支上进行编辑,然后合并:master
:50-60分钟mysqldump
进行5次错误修复,同时在它们之间的功能分支上进行编辑,然后合并:master
:50-60分钟除非您已阅读并理解以上所有内容,否则请不要使用它。
mysqldump
如果一切顺利,您应该会看到类似以下内容的
:答案 13 :(得分:0)
使用 Mydumper
sudo apt install mydumper
生成转储
mydumper --user=YOUR_USER --password=YOUR_PASSWORD -B YOUR_CURRENT_DB \
--triggers --routines --events --outputdir YOUR_OUTPUT_DIR
负载转储
myloader --user=YOUR_USER --password=YOUR_PASSWORD --database=YOUR_NEW_DB \
--directory=YOUR_OUTPUT_DIR
答案 14 :(得分:-2)
我认为没有办法做到这一点。当PHPMyAdmin执行此操作时,它会转储数据库,然后以新名称重新插入它。