如何从本地机器mysqldump远程数据库

Posted

技术标签:

【中文标题】如何从本地机器mysqldump远程数据库【英文标题】:how to mysqldump remote db from local machine 【发布时间】:2011-02-28 16:53:20 【问题描述】:

我需要在远程服务器上做一个数据库的mysqldump,但是服务器没有安装mysqldump。我想使用我机器上的 mysqldump 连接到远程数据库并在我的机器上进行转储。

我尝试创建一个 ssh 隧道然后进行转储,但这似乎不起作用。我试过了:

ssh -f -L3310:remote.server:3306 user@remote.server -N

隧道创建成功。如果我这样做了

telnet localhost 3310

我得到了一些显示正确的服务器 mysql 版本的简介。但是,执行以下操作似乎尝试在本地连接

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name

【问题讨论】:

由于这个问题更多地与管理有关,而不是与编程有关,我想说serverfault.com 的好心人可以为您提供更好的帮助。 看看MSQL WorkBench 5.2.22。它会很容易让你做到这一点。 注意:要转储远程 mysql 服务器,请务必包含 --host=sqlserver.host.name --port=3306 我投票结束这个问题,因为它属于 DBA, 【参考方案1】:

远程服务器的mysqldump使用SSL

1- SSL 的安全性

192.168.0.101 - 远程服务器

192.168.0.102 - 本地服务器

更多服务器

CREATE USER 'backup_remote_2'@'192.168.0.102' IDENTIFIED WITH caching_sha2_password BY '3333333' REQUIRE SSL;

GRANT ALL PRIVILEGES ON *.* TO 'backup_remote_2'@'192.168.0.102';

FLUSH PRIVILEGES;

-

本地服务器

sudo /usr/local/mysql/bin/mysqldump \
 --databases test_1 \
 --host=192.168.0.101 \
 --user=backup_remote_2 \
 --password=3333333 \
 --master-data \
 --set-gtid-purged \
 --events \
 --triggers \
 --routines \
 --verbose \
 --ssl-mode=REQUIRED \
 --result-file=/home/db_1.sql

======================================

2 - SSL 安全性(需要 X509)

192.168.0.101 - 远程服务器

192.168.0.102 - 本地服务器

更多服务器

CREATE USER 'backup_remote'@'192.168.0.102' IDENTIFIED WITH caching_sha2_password BY '1111111' REQUIRE X509;

GRANT ALL PRIVILEGES ON *.* TO 'backup_remote'@'192.168.0.102';

FLUSH PRIVILEGES;

-

本地服务器

sudo /usr/local/mysql/bin/mysqldump \
 --databases test_1 \
 --host=192.168.0.101 \
 --user=backup_remote \
 --password=1111111 \
 --events \
 --triggers \
 --routines \
 --verbose \
 --ssl-mode=VERIFY_CA \
 --ssl-ca=/usr/local/mysql/data/ssl/ca.pem \
 --ssl-cert=/usr/local/mysql/data/ssl/client-cert.pem \
 --ssl-key=/usr/local/mysql/data/ssl/client-key.pem \
 --result-file=/home/db_name.sql

[注意]

在本地服务器上

/usr/local/mysql/data/ssl/

-rw------- 1 mysql mysql 1.7K Apr 16 22:28 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28 client-cert.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28 client-key.pem

从远程服务器复制此文件以用于 (REQUIRE X509) 或者如果 SSL 没有 (REQUIRE X509) 则不复制


在远程服务器上

/usr/local/mysql/data/

-rw------- 1 mysql mysql 1.7K Apr 16 22:28  ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28  ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28  client-cert.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28  client-key.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28  private_key.pem
-rw-r--r-- 1 mysql mysql  451 Apr 16 22:28  public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Apr 16 22:28  server-cert.pem
-rw------- 1 mysql mysql 1.7K Apr 16 22:28  server-key.pem

我的.cnf

[mysqld]
# SSL
ssl_ca=/usr/local/mysql/data/ca.pem
ssl_cert=/usr/local/mysql/data/server-cert.pem
ssl_key=/usr/local/mysql/data/server-key.pem

提高密码安全性

https://dev.mysql.com/doc/refman/8.0/en/password-security-user.html

【讨论】:

【参考方案2】:

基于此页面:

Compare two MySQL databases

我对其进行了修改,以便您可以在不同的主机上使用 ddbb。

#!/bin/sh echo "用法:dbdiff [user1:pass1@dbname1:host] [user2:pass2@dbname2:host] [ignore_table1:ignore_table2...]" 倾倒 () 向上=$1%%@*;向下=$1##*@;用户=$up%%:*;通过=$向上##*:; dbname=$down%%:*;主机=$down##*:; mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname -h $host $table > $2 rm -f /tmp/db.diff # 比较 向上=$1%%@*;向下=$1##*@;用户=$up%%:*;通过=$向上##*:; dbname=$down%%:*;主机=$down##*:; 对于`mysql -u $user -p$pass $dbname -h $host -N -e "show tables" --batch` 中的表;做 if [ "`echo $3 | grep $table`" = "" ];然后 echo "比较'$table'..." 转储 $1 /tmp/file1.sql 转储 $2 /tmp/file2.sql diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff 别的 echo "忽略了'$table'..." 菲 完毕 少 /tmp/db.diff rm -f /tmp/file1.sql /tmp/file2.sql

【讨论】:

【参考方案3】:

可以针对远程服务器在本地调用 mysqldump。

对我有用的示例:

mysqldump -h hostname-of-the-server -u mysql_user -p database_name > file.sql

我在连接选项上关注了 mysqldump documentation。

【讨论】:

之前不需要打开ssh隧道。 +1 最简单的方法,无需通过 ssh 连接并将文件带回本地计算机!直接带垃圾箱就行了! 这很危险,非常危险。它要求mysql的端口对公众开放。这很容易被机器人暴力破解。 加入 *** 怎么样?或者从您通过 SSH 连接到的可以访问数据库机器的机器上进行转储?端口不需要公开。 这里重要的是要记住-p 用于密码参数 - 而不是数据库名称。但是以纯文本形式存储它是不安全的,因此添加-p 意味着您将在登录时被提示输入密码。也许只有我一个人,但就命令行参数而言,mysqlmysql 转储语法从来都不是那么简单。【参考方案4】:

因为我还没有在 serverfault 看到它,答案很简单:

变化:

ssh -f -L3310:remote.server:3306 user@remote.server -N

收件人:

ssh -f -L3310:localhost:3306 user@remote.server -N

然后改变:

mysqldump -P 3310 -h localhost -u mysql_user -p database_name table_name

收件人:

mysqldump -P 3310 -h 127.0.0.1 -u mysql_user -p database_name table_name

(不要使用本地主机,它是这些“特殊含义”的废话之一,可能通过套接字而不是端口连接)

编辑:好吧,详细说明:如果主机设置为localhost,则假定配置(或默认)--socket 选项。请参阅the manual 寻找/使用哪些选项文件。在 Windows 下,这可以是命名管道。

【讨论】:

注意:localhost 通常默认为::1 IPv6,而不是127.0.0.1 -P 有什么作用? -P 用于端口,-p 用于提示输入密码。 -P 确实如您所说,用于端口。如问题所示,并在答案中完成。随意放弃它,并将 SSH 隧道中的 3310 替换为 3306

以上是关于如何从本地机器mysqldump远程数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用终端从远程服务器执行“mysqldump”并在本地保存

来自远程主机的 mysqldump

从 SSH 会话到远程机器,如何在本地机器上的 Vim 会话中打开文件

如何从 mysqldump 恢复转储文件?

将 mongodb 数据库从本地主机迁移到远程服务器

远程桌面连接与本地机器之间数据拷贝