通过SSH复制MySQL数据库

8

假设我有database1database2

database1 - 包含数据

database2 - 是空的。


我想通过SSH将所有数据从database1复制到database2 - 复制database1

我应该使用什么命令?


我已经尝试过

mysqldump -u user -p database1 > database1.sql
Enter password: mysqldump: Got error: 1045: Access denied for user 'user'@'localhost' (using password: NO) when trying to connect

1
谷歌搜索“mysql重复数据库”给了我所有必要的信息,例如http://www.rubyrobot.org/article/duplicate-a-mysql-database。 - Pekka
1
你收到的错误提示表明你输入了错误的密码。 - Mark O'Connor
4个回答

7

只需一个命令在SSH上复制MySQL数据库:

mysqldump -u <local-user> -p <local-db> | gzip | ssh user@hostname \
  "gunzip | mysql -u <remote-user> -p<password> <remote-db>"

请注意,您必须先创建远程数据库。
更高级的版本:
mysqldump -u <local-user> -p <local-db> | xz | pv -W | ssh user@hostname \
"tee remote-dump.sql.xz | unxz | mysql -u <remote-user> -p<password> <remote-db>"

高级版本:

  • 使用 xz/unxz 进行更好的压缩(但要注意压缩速度不要成为瓶颈 - 如果 xz 占用了 100% 的 CPU,那么它可能已经成为瓶颈,您最好使用 gzip

  • 使用 pv 显示进度指示器

  • 使用 tee 保存转储的副本

唯一没有解决的问题是如何避免在远程命令中指定密码。如果有人知道如何在命令行上交互式输入此密码,那将非常好,请提供帮助。


1
一种处理远程密码的方法是使用远程服务器上的选项文件,例如在~/.my.cnf中(参见http://dev.mysql.com/doc/refman/5.7/en/password-security-user.html)。 - James
1
我认为gzip/xz等工具会使这个过程变得不必要复杂,并且根据情况,你可能无法从压缩中获益。如果我认为需要压缩,我会使用“ssh -C”。以下是我通常使用的简化版本:$ ssh remotehost mysql -e "'create database dbname'"$ mysqldump dbname | ssh remotehost mysql dbname请注意,每个涉及到的主机都需要一对愚蠢的双引号。还请注意,我在我的~/.my.cnf文件中有所需的位来避免在命令行上输入用户名/密码。 - keithpjolley

5
这将会把数据库从S1复制到S2。
mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

解压文件

gunzip /tmp/yourfile.sql.gz

下一步,您需要在S2上进行导入。
mysql -h<host> -u<user> -p<password> < /tmp/yourfile.sql

享受


什么是“cat”?我应该替换它还是怎么样? - enloz
cat 是 Linux 中的一个命令,用于在屏幕上显示文件内容(请尝试阅读手册:man cat)。 - danielpopa
1
基本上没有命令可以在不同的服务器上复制数据库。这个操作需要多个命令来完成。 - danielpopa

1
使用以下两个命令:

mysqldump -u customers -p customers > customers.dump



mysql -u new_customers -p new_customers < customers.dump

您可能会因为无法向目录写入而被拒绝访问,因此您可能需要使用cd更改目录。

来源:http://support.tigertech.net/mysql-duplicate


0

你需要做的第一件事是从要复制或复制数据库到另一个服务器的服务器上ssh

我使用的命令是:

mysqldump -u <database-user> -p<database-password> <database-name> | xz | ssh <target-ssh-username>@<target-hostname> \ "tee remote-dump.sql.xz | unxz | mysql -u <target-database-user> -p<target-database-password> <target-database-name>"

注意:您可以使用.cnf文件来存储数据库的用户名和密码。因为我的执行很小,所以我没有使用它。
执行此操作的链接: https://www.techiecorner.com/1619/how-to-setup-mysqldump-without-password-in-cronjob/

输入命令后,它会提示您:

**The authenticity of host 'w01b3a99.kasserver.com (85.13.164.141)' can't be established.**

Are you sure you want to continue connecting (yes/no)?

输入“是”

然后它会提示您输入

*target-user@target-hostname* ssh password

输入目标用户的密码:target-user password

执行将会是静默运行的。一段时间后,您的命令执行将完成。

我没有使用pv -W,因为我正在使用Cloudways Serverpv尚未安装。他们不允许root访问来安装任何软件包。


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