Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:在同一MySQL实例上克隆MySQL数据库_Mysql_Database_Copy_Clone - Fatal编程技术网

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

MySQL:在同一MySQL实例上克隆MySQL数据库,mysql,database,copy,clone,Mysql,Database,Copy,Clone,我想编写一个脚本,将当前数据库sitedb1复制到同一mysql数据库实例上的sitedb2。我知道我可以将sitedb1转储到sql脚本: mysqldump -u root -p sitedb1 >~/db_name.sql 然后将其导入siteb2。 有没有更简单的方法,不将第一个数据库转储到sql文件中?如手册中所述,您可以通过管道将转储直接导入mysql客户端: mysqldump db_name | mysql new_db_name 如果您使用MyISAM,您可以复制这些

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

mysqldump -u root -p sitedb1 >~/db_name.sql
然后将其导入
siteb2
。 有没有更简单的方法,不将第一个数据库转储到sql文件中?

如手册中所述,您可以通过管道将转储直接导入mysql客户端:

mysqldump db_name | mysql new_db_name
如果您使用MyISAM,您可以复制这些文件,但我不推荐这样做。这有点狡猾

综合了其他各种好答案

mysqldump
mysql
命令都接受设置连接详细信息的选项(以及更多选项),例如:

mysqldump-u--password=| mysql-u-p
此外,如果新数据库还不存在,您必须事先创建它(例如,使用
echo“create database new_db_name”| mysql-u-p
)。

您可以使用(伪代码):

我不使用创建表的原因。。。选择。。。语法是为了保留索引。当然,这只复制表。视图和过程不会被复制,尽管可以以相同的方式进行复制

请参阅。

mysqladmin创建DB\u名称-u DB\u用户--password=DB\u pass&&\
mysqldump-u DB_user--password=DB_pass DB_name|\
mysql-u DB\u user--password=DB\u pass-h DB\u host DB\u name

首先创建重复数据库:

CREATE DATABASE duplicateddb;
确保权限等均已到位,并且:

mysqldump -u admin -p originaldb | mysql -u backup -p password duplicateddb;

此语句是在MySQL 5.1.7中添加的,但被发现是危险的,并在MySQL 5.1.23中删除。它旨在使5.1之前的数据库能够升级,以便使用5.1中实现的编码将数据库名称映射到数据库目录名称。但是,使用此语句可能会导致数据库内容丢失,这就是它被删除的原因。不要在存在数据库的早期版本中使用重命名数据库

要执行使用新编码升级数据库名称的任务,请改用ALTER database db_name UPGRADE DATA DIRECTORY name:

Using MySQL Utilities MySQL实用程序包含一个nice工具,默认情况下,该工具将一个数据库(包括所有相关对象(“表、视图、触发器、事件、过程、函数和数据库级授权”)和数据从一个数据库服务器复制到同一个数据库服务器或另一个数据库服务器。有很多选项可用于自定义实际复制的内容

因此,要回答OP的问题:

mysqldbcopy\
--source=root:您的_password@localhost \
--destination=root:您的_password@localhost \
sitedb1:sitedb2

您需要从终端/命令提示符运行命令

mysqldump -u <user name> -p <pwd> <original db> | mysql -u <user name> <pwd> <new db>
mysqldump-u-p | mysql-u
e、 g:
mysqldump-u root test_db1 | mysql-u root test_db2

这将test_db1复制到test_db2,并授予对“root”@“localhost”的访问权。此外,如果新的\u db_名称还不存在,这是最简单、最快的方法:

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
echo“创建数据库新名称”| mysql-u-p
mysqldump-u-pdb_name | mysql-u-p new_db_name

您可以执行以下操作:

mysqldump -u[username] -p[password] database_name_for_clone 
 | mysql -u[username] -p[password] new_database_name

最好且简单的方法是在终端中输入这些命令,并为根用户设置权限。为我工作

:~$> mysqldump -u root -p db1 > dump.sql
:~$> mysqladmin -u root -p create db2
:~$> mysql -u root -p db2 < dump.sql
:~$>mysqldump-u root-pdb1>dump.sql
:~$>mysqladmin-u root-p创建db2
:~$>mysql-u root-p db2
如果安装了phpmyadmin,则可以使用以下简单方法:


转到您的数据库,选择“操作”选项卡,您可以看到“将数据库复制到”块。使用它,您可以复制数据库。

如果原始数据库中有触发器,您可以在导入之前通过管道替换来避免“触发器已存在”错误:

mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname
如中所述,
mysqldump db_name | mysql new_db_name
是在数据库之间传输数据的免费、安全且简单的方法。然而,它也很慢

如果您正在寻找备份数据,无法承受数据丢失(在此数据库或其他数据库中),或者正在使用非
innodb
的表,那么您应该使用
mysqldump

如果您正在寻找用于开发的东西,将所有数据库备份到其他地方,并且在出现问题时轻松地清除和重新安装
mysql
(可能是手动),那么我可能会为您提供解决方案

我找不到好的替代方案,所以我自己编写了一个脚本。第一次我花了很多时间让它工作,现在对它进行修改确实让我有点害怕。Innodb数据库不应该像这样复制和粘贴。微小的变化会以惊人的方式导致失败。自从我完成代码后,我就没有遇到过问题,但这并不意味着你不会

在上测试的系统(但仍可能在上失败):

  • Ubuntu 16.04,默认mysql,innodb,每个表有单独的文件
  • Ubuntu 18.04,默认mysql,innodb,每个表有单独的文件
它做什么
  • 获取
    sudo
    权限,并验证您是否有足够的存储空间克隆数据库
  • 获取根mysql权限
  • 创建一个以当前git分支命名的新数据库
  • 将结构克隆到新数据库
  • 切换到innodb的恢复模式
  • 删除新数据库中的默认数据
  • 停止mysql
  • 将数据克隆到新数据库
  • 启动mysql
  • 链接新数据库中导入的数据
  • 关闭innodb的恢复模式
  • 重新启动mysql
  • 允许mysql用户访问数据库
  • 清理临时文件
  • 它与mysqldump的比较 在3gb数据库上,在我的机器上使用
    mysqldump
    mysql
    需要40-50分钟。使用此方法,相同的过程只需约8分钟

    我们如何使用它 我们已将SQL更改保存在一个单独的系统中
    mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname
    
    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