在同一个MySql实例上克隆MySQL数据库

时间:2009-03-23 21:24:52

标签: mysql database copy clone mysqldump

我想编写一个脚本,将我当前的数据库sitedb1复制到同一个mysql数据库实例上的sitedb2。我知道我可以将sitedb1转储到sql脚本:

mysqldump -u root -p sitedb1 >~/db_name.sql

然后将其导入sitedb2。 有没有更简单的方法,而不将第一个数据库转储到sql文件?

15 个答案:

答案 0 :(得分:230)

正如手册在Copying Databases中所说,您可以将转储直接传递到mysql客户端:

mysqldump db_name | mysql new_db_name

如果您正在使用MyISAM,可以复制文件,但我不会推荐它。这有点狡猾。

综合各种其他好的答案

mysqldumpmysql命令都接受用于设置连接详细信息的选项(以及更多内容),例如:

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实用程序

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数据库并非要像这样复制和粘贴。微小的更改会导致此操作失败。自完成代码以来,我没有遇到任何问题,但这并不意味着您不会。

系统经过测试(但可能仍会失败):

  • Ubuntu 16.04,默认mysql,innodb,每个表单独的文件
  • Ubuntu 18.04,默认mysql,innodb,每个表的单独文件

它做什么

  1. 获得mysql特权并验证您是否有足够的存储空间来克隆数据库
  2. 获取root mysql特权
  3. 创建一个以当前git分支命名的新数据库
  4. 将结构克隆到新数据库
  5. 切换到innodb的恢复模式
  6. 删除新数据库中的默认数据
  7. 停止mysql
  8. 将数据克隆到新数据库
  9. 启动mysql
  10. 在新数据库中链接导入的数据
  11. 退出innodb的恢复模式
  12. 重新启动mysql
  13. 赋予mysql用户对数据库的访问权限
  14. 清理临时文件

sudo相比

在3gb数据库上,使用mysqldumpmysqldump在我的计算机上需要40-50分钟。使用这种方法,相同的过程仅需约8分钟。

我们如何使用它

我们将我们的SQL更改与代码一起保存,并且升级过程在生产和开发过程中都是自动化的,每组更改都会对数据库进行备份,以便在出现错误时进行恢复。我们遇到的一个问题是,当我们在一个长期的项目中进行数据库更改时,不得不在其中途切换分支以修复一三个错误。

过去,我们对所有分支使用单个数据库,并且每当切换到与新数据库更改不兼容的分支时,都必须重建数据库。当我们切换回去时,我们将不得不再次运行升级。

我们尝试mysql为不同分支复制数据库,但是等待时间太长(40至50分钟),并且在此期间我们无能为力。

此解决方案将数据库克隆时间缩短到原来的1/5(以咖啡和洗手间的时间代替了漫长的午餐时间)。

常见任务及其时间

在具有不兼容数据库更改的分支之间切换在单个数据库上花费50+分钟,但是在使用mysqldump或此代码的初始设置时间之后根本没有时间。这段代码恰好比mysqldump快5倍。

以下是一些常见的任务,以及每种方法大约需要花费多长时间:

创建具有数据库更改的功能分支并立即合并:

  • 单个数据库:〜5分钟
  • 克隆mysqldump:50-60分钟
  • 使用以下代码克隆:〜18分钟

创建具有数据库更改的功能分支,切换到mysqldump进行错误修复,在功能分支上进行编辑,然后合并:

  • 单个数据库:约60分钟
  • 克隆master:50-60分钟
  • 使用以下代码克隆:〜18分钟

创建具有数据库更改的功能分支,切换至mysqldump进行5次错误修复,同时在它们之间的功能分支上进行编辑,然后合并:

  • 单个数据库:〜4小时40分钟
  • 克隆master:50-60分钟
  • 使用以下代码克隆:〜18分钟

代码

除非您已阅读并理解以上所有内容,否则请不要使用它。

mysqldump

如果一切顺利,您应该会看到类似以下内容的

Screenshot of script output for example database

答案 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执行此操作时,它会转储数据库,然后以新名称重新插入它。