首页 > 解决方案 > 通过 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 隧道

有谁知道如何做到这一点,或者指向我一些关于正确方法的文档?

标签: mysqlsshreplication

解决方案


要复制数据库,您必须:

  • 做一个完整的数据库副本
  • 在从属服务器上配置一个 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

推荐阅读