我需要在远程服务器上做一个数据库的 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 看到它,答案很简单:
改变:
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 下,这可以是命名管道。
可以针对远程服务器在本地调用 mysqldump。
对我有用的例子:
mysqldump -h hostname-of-the-server -u mysql_user -p database_name > file.sql
我在连接选项上遵循了 mysqldump documentation。
-p
用于密码参数 - 而不是数据库名称。但是以纯文本形式存储它是不安全的,因此添加 -p
意味着您将在登录时被提示输入密码。也许只有我一个人,但 mysql
和 mysql
转储语法从来都不是命令行参数那么简单。
来自远程服务器的 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/数据/
-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
基于此页面:
我对其进行了修改,以便您可以在不同的主机中使用 ddbb。
#!/bin/sh echo "Usage: dbdiff [user1:pass1@dbname1:host] [user2:pass2@dbname2:host] [ignore_table1:ignore_table2...]" dump () { up=${1%%@*}; down=${1##*@}; user=${up%%:*}; pass=${up##*:}; dbname=${down%%:*}; host=${down##*:}; mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname -h $host $table > $2 } rm -f /tmp/db.diff # Compare up=${1%%@*}; down=${1##*@}; user=${up%%:*}; pass=${up##*:}; dbname=${down%%:*}; host=${down##*:}; for table in `mysql -u $user -p$pass $dbname -h $host -N -e "show tables" --batch`; do if [ "`echo $3 | grep $table`" = "" ]; then echo "Comparing '$table'..." dump $1 /tmp/file1.sql dump $2 /tmp/file2.sql diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff else echo "Ignored '$table'..." fi done less /tmp/db.diff rm -f /tmp/file1.sql /tmp/file2.sql
localhost
通常默认为::1
IPv6,而不是127.0.0.1
。