mysql - 通过 SSH 隧道进行 MySql 复制
问题描述
我有一个独特的情况,我无法在网上找到任何资源来解决它,所以就这样吧。
我有一个给定的服务器 A(mysql id=1)和一个远程 mysql 服务器 B(mysql id = 2)
我有一个从服务器 A -> 服务器 B 建立的 SSH 隧道,在该隧道中,我将服务器 B 3306 转发到本地端口(比如 1234)
我也没有能力反向映射这个,所以我的 ssh 命令看起来像
ssh -L 1234:remote_server_b:3306 user@gateway -i my_key.pem
在服务器 A 上,要连接到服务器 B 上的 mysql,我使用 mysql -h127.0.0.1 -P1234,我可以毫无问题地访问 mysql 服务器 B。
现在,我想设置从 A(主)到 B(从)的复制。但是,我无法从服务器 B 访问服务器 A,只能通过 SSH 隧道从 A-> B 访问。
在所有 mysql 复制文档中,我需要从从服务器(而不是我的设置中的主服务器)建立 SSH 隧道
有谁知道如何做到这一点,或者指向我一些关于正确方法的文档?
解决方案
要复制数据库,您必须:
- 做一个完整的数据库副本
- 在从属服务器上配置一个 mysql 复制流到主服务器,从属服务器连接并拉取二进制日志。
实施记录在这里。
https://dev.mysql.com/doc/refman/5.6/en/replication-implementation.html
您可以使用 SSH 连接到隧道或反向隧道。
ssh 中的隧道可以是双向的,因此您可以将本地端口映射到远程端口,或者将远程端口映射到本地端口。
在服务器 A 上,此命令将设置双隧道。
ssh -R 6464:127.0.0.1:3306 -L 6565:127.0.0.1:3306 serveurB
从手册页中提取ssh
-L [bind_address:]port:host:hostport
Specifies that the given port on the local (client) host is to be
forwarded to the given host and port on the remote side.
-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to be
forwarded to the given host and port on the local side.
另一种解决方法是使用socat
强大的网络工具,所以必须在服务器B上安装它,你可以这样做
while ( true ) ;
do
socat EXEC:"ssh SERVER_B 'socat - TCP4-LISTEN:6464,reuseaddr'" \
TCP4:localhost:3306 ;
done
推荐阅读
- python - 如何将 AWS Redshift 与 Python Jupyter NoteBook 连接以提取存储的数据?
- html - 网格元素未排列/显示
- php - Laravel 会话 Cookie 在第一次 API 请求后设置为 HttpOnly
- c++ - 将数组的每个元素解包到模板参数中
- adonis.js - 是否可以在 @beforeSave Adonis 5 中访问 ctx 上下文?
- networkx - Networkx 边诱导子图同构
- python - 在 github 工作流程中崩溃后有什么方法可以自动重启
- python - 3 维权重 [200, 1, 4] 的预期 3 维输入,但得到了大小为 [64, 1500] 的 2 维输入
- python-3.x - WinError 2: 使用 AudioSegment.from_file 时系统找不到指定的文件
- amazon-web-services - AWS Cognito 集成上的 ASP.Net 核心 Web 应用程序失败