复制整个MySQL数据库

100
可以在Linux服务器上复制整个MySQL数据库吗?
我知道可以使用导出和导入的方法,但原始数据库大小超过25MB,所以这不是理想的选择。
是否可以使用Mysqldump或直接复制数据库文件来实现?
10个回答

188

首先创建重复的数据库:

CREATE DATABASE duplicateddb;

确保用户和权限都已准备就绪:

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

32
我认为在第二个命令行的第二部分,"-p" 和 "password" 之间不应该有空格。 - user213154
17
不,这里不应该有空格!答案是这样正确的。MySQL手册中写道:--password[=password]或者-p[password]连接服务器时要使用的密码。如果您使用短选项形式(-p),则选项和密码之间不能有空格。如果在命令行上省略了--password或-p选项后面的密码值,则MySQL会提示输入密码。在命令行上指定密码应被视为不安全的做法。请参见第6.1.2.1节“最终用户指南...” - nils petersohn
3
注意,mysqldump默认备份触发器但不备份存储过程,对于这种情况需要添加--routines选项。 - LinuxDevOps
1
如果您正在这样做,并且不希望此用户的MySQL密码在bash历史记录中可用,请在执行后从〜/ .bash_history文件中编辑它。或者,您还可以将第一个命令的结果输出到临时文件中,并在其后执行以下操作(这将提示您输入密码)mysql -p -u admin duplicatedb < temporaryfile.sql - Mike
2
这个回答确实可行,但问题声明了“我知道我可以使用导出和导入,但原始数据库大小超过25MB,所以那不是理想的解决方案”,而这个回答建议的基本上就是导出和导入。 - el.pescado - нет войне
显示剩余6条评论

20

连接远程服务器

mysqldump mydbname | ssh host2 "mysql mydbcopy"

到本地服务器

mysqldump mydbname | mysql mydbcopy

错误 1064 (42000):您的 SQL 语法存在错误;在本地服务器使用命令时出现错误,请帮忙解决。 - Amit Dwivedi
https://dev59.com/vmAg5IYBdhLWcg3wjrkZ - Peter Lindqvist

6
有时我会运行mysqldump并将输出导入另一个mysql命令中以将其导入到不同的数据库。
mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

当我使用此程序时,出现了目标数据库不存在的错误。因此,您需要添加一个CREATE DATABASE语句。 - blak3r
这个操作是移动数据库而不是创建副本吗?"--add-drop-table"听起来像是会删除原始数据库。 - Felix Dolderer
@FelixDolderer 这只是在mysqldump的输出中添加了删除表和重新添加表的命令,而mysqldump会在目标上执行这些操作。 - Paul Tomblin

3
在拥有数据的系统中创建一个mysqldump文件,并使用管道将此mysqldump文件作为输入提供给新系统。可以使用ssh命令连接到新系统。
mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

-p[password]之间不要有空格


1
你能否添加一个关于这个如何工作的描述,例如管道的使用? - kalyfe

3

复制数据库

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

1

这种方法对于InnoDB不起作用。只有在尝试复制MyISAM数据库时才使用此解决方法。

如果在备份期间锁定表格,并且可能会在导入数据库期间暂停MySQL是可接受的,mysqlhotcopy 可能会更快地工作。

例如:

备份:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

恢复:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy还可以通过SSH(scp)传输文件,并且可能直接传输到副本数据库目录中。

例如:

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1
这是我编写的一个 Windows 批处理文件,结合了 Vincent 和 Paul 的建议。它会提示用户输入源和目标名称。
只需修改顶部的变量以设置正确的可执行文件 / 数据库端口路径即可。
:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: https://dev59.com/6nI-5IYBdhLWcg3wYXL8

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

样例输出:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

0

这对我来说在命令提示符下有效,从mysql shell之外:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

这对我来说看起来是最好的方法。如果压缩“dump.sql”,您可以将其简单地存储为压缩备份。太棒了! 对于一个具有Innodb表的1GB数据库,创建“dump.sql”约需要一分钟,并将数据转储到新的DB db2约需要三分钟。

直接复制整个db目录(mysql/data/db1)对我不起作用,我想这是因为InnoDB表的原因。


0

对我来说,以下代码行解决了问题

mysqldump --quote-names -q -u username1 --password='password1' originalDB | mysql -u username2 --password='password2' duplicateDB

-2

曾经在MySQL中,你可以直接将所有表文件复制到mysql树的另一个目录中。

mysql cli - 创建数据库db2

linux cli - cp db1 db2


这只适用于MyISAM,是吗?好的,那些糟糕的旧日子已经过去了。 - Laurenz Albe
好的记录留存史册,但现在已经不太有用了。 - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接