MySQL: 在同一MySQL实例上克隆一个MySQL数据库
问题的原因是想要在同一个MySQL实例上克隆一个MySQL数据库。解决方法是使用终端中的命令来执行导出和导入数据库的操作,并为root用户设置权限。具体的解决方法如下:
1. 在终端中输入以下命令,将数据库db1导出到dump.sql文件中:
:~$> mysqldump -u root -p db1 > dump.sql
2. 在终端中输入以下命令,创建一个名为db2的新数据库:
:~$> mysqladmin -u root -p create db2
3. 在终端中输入以下命令,将dump.sql文件中的数据导入到db2数据库中:
:~$> mysql -u root -p db2 < dump.sql
这是解决该问题的最佳方法,并且适用于大型数据库。相比于使用管道的方法mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
,该方法可以避免在处理大型数据库时可能出现的问题。
这是最佳答案。只需根据您的需求为新创建的数据库授予所需的用户权限即可。
MySQL: 在同一个MySQL实例上克隆MySQL数据库的方法
在使用MySQL时,有时候我们需要在同一个MySQL实例上克隆一个数据库。本文将介绍一个使用MySQL Utilities工具来进行数据库克隆的方法。
MySQL Utilities是一组实用工具,其中包含一个很好的工具mysqldbcopy,默认情况下会将一个数据库(包括所有相关对象,如表、视图、触发器、事件、存储过程、函数和数据库级授权)以及数据从一个数据库服务器复制到同一个或另一个数据库服务器。有很多选项可用于自定义实际复制的内容。
下面是使用mysqldbcopy工具复制数据库的示例代码:
mysqldbcopy \ --source=root:your_password \ --destination=root:your_password \ sitedb1:sitedb2
这个方法对我来说很有效,而基于mysqldump的解决方案则失败了。在我的情况下,我需要像这样指定端口:--source=root:your_password:3307(否则会出现拒绝访问错误)。
需要注意的是,你需要使用sudo apt-get install mysql-utilities
命令来安装MySQL Utilities工具,但这是非常方便的。但是,我不知道是否有一种内置的方法可以让mysqldbcopy工具提示你输入密码;至少在文档中我找不到类似的内容。不过,你可以自己构建这个功能。在Bash中,可以像下面的示例代码这样实现:
mysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)" --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)" sitedb1:sitedb2
哇,这真是太棒了!我不知道密码可以这样读取。不过,我将尝试省略密码并查看会发生什么。
由于某种原因,我无法执行这个操作:mysqldbcopy: error: Source connection values invalid: .mylogin.cnf was not found at is default location: /home/afigueiredo.Please configure your login-path data before using it (use the mysql_config_editor tool)..
另外,有人指出Chriki的命令非常有效。我只需要在mysqldbcopy命令中添加--force选项,因为我已经创建了目标数据库。非常感谢!
听起来这是一个很好的工具,特别适用于主从初始化。然而,截至本文写作时(2017年4月),存在一个奇怪的bug,即在数据中存在单引号时,数据库复制会失败。
在Windows上,这种方法要比从mysqldump到mysql的管道复制慢得多。
在Linux上也是如此。mysqldbcopy:40秒,mysqldump | mysql:5秒。
如果你的数据库足够小,可以通过将导出的数据直接导入到另一个数据库来在5秒内完成复制,那么这并不是一个好的基准测试。请尝试使用大型数据库(至少10GB)来测试。
值得注意的是,这种方法有一个缺点:复制包含外键约束的数据库时,克隆表中的约束不会发生改变。例如,如果表db1.t1在表db1.t2上有一个外键约束,在将db1克隆到db2时,表db2.t1将具有对db1.t2的外键约束。
回顾一下过去,复制数据库文件夹就可以解决问题。
为什么我没有尝试这个方法呢?下次我会试试这个方法...
问题的出现原因是用户想要在相同的MySQL实例上克隆一个MySQL数据库,并且不希望将数据导出为外部文件进行操作。解决方法是使用mysqldump和mysql命令来将数据库直接从一个数据库复制到另一个数据库,并且可以通过设置连接详细信息等选项来自定义操作。如果新数据库还不存在,则需要预先创建该数据库。此方法可以节省磁盘IO操作,但对于大型数据库可能效果不明显。在MySQL中没有内置的方法可以直接在数据库内部进行复制,除非手动一个表/视图一个表/视图地复制。需要注意的是,在执行复制命令之前,需要从终端/命令提示符中运行命令。如果不先创建数据库,则会出现错误。还可以使用--routines=true选项来复制存储过程和函数。需要注意的是,在执行命令时,如果以root用户身份执行,则无需输入密码。此外,由于权限问题,可能需要在导出的SQL文件中删除一些行并重新导入。最后,复制用户可能无法通过此方法实现。