V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
liwenbest
V2EX  ›  Python

求助 v 站大佬 如何利用 Python 迁移数据

  •  
  •   liwenbest · 2019-08-05 17:39:45 +08:00 · 2422 次点击
    这是一个创建于 1719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个每天定时的数据迁移任务,数据源在远程服务器 A 数据库中,要每天把数据迁移到另一个远程服务器 B 的数据库中,其中 A 需要通过登录 ssh-vpn 才能把数据搬到 B 中,用 python 设计成自动化迁移,有个难题是 ssh-vpn 每隔半小时会断开,需要手动重新登录,考虑了两种方式都失败了,请大佬指点下:
    1、使用 Python pymouse 每天在迁移前定时点击远程桌面的 EasyConnect,登录 vpn 再进行数据迁移作业;失败原因:由于是在远程桌面,离开远程桌面后,程序无法捕获鼠标位置,无法点击 EasyConnect,登录 vpn ;
    2、利用 from sshtunnel import SSHTunnelForwarder python 链接 vpn

    server = SSHTunnelForwarder(ssh_address_or_host=('ip', port), # 指定 SSH 中间登录地址和端口号
    ssh_username='账号', # 指定地址 B 的 SSH 登录用户名
    ssh_password='密码', # 指定地址 B 的 SSH 登录密码
    #local_bind_address=('ip',port), # 绑定本地地址 A (默认 127.0.0.1 )及与 B 相通的端口(根据网络策略配置,若端口全放,则此行无需配置,使用默认即可)
    remote_bind_address=('ip', port) # 指定最终目标 C 地址,端口号为 mysql 默认端口号 3306
    )

    报错:
    2019-08-05 16:52:11,045| ERROR | Exception: Error reading SSH protocol banner[WinError 10054] 远程主机强迫关闭了一个现有的连接。
    2019-08-05 16:52:11,153| ERROR | Traceback (most recent call last):
    2019-08-05 16:52:11,153| ERROR | File "D:\python\lib\site-packages\paramiko\transport.py", line 2211, in _check_banner
    2019-08-05 16:52:11,153| ERROR | buf = self.packetizer.readline(timeout)
    2019-08-05 16:52:11,153| ERROR | File "D:\python\lib\site-packages\paramiko\packet.py", line 380, in readline
    2019-08-05 16:52:11,153| ERROR | buf += self._read_timeout(timeout)
    2019-08-05 16:52:11,153| ERROR | File "D:\python\lib\site-packages\paramiko\packet.py", line 607, in _read_timeout
    2019-08-05 16:52:11,153| ERROR | x = self.__socket.recv(128)
    2019-08-05 16:52:11,154| ERROR | ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
    2019-08-05 16:52:11,154| ERROR |
    2019-08-05 16:52:11,154| ERROR | During handling of the above exception, another exception occurred:
    2019-08-05 16:52:11,154| ERROR |
    2019-08-05 16:52:11,154| ERROR | Traceback (most recent call last):
    2019-08-05 16:52:11,154| ERROR | File "D:\python\lib\site-packages\paramiko\transport.py", line 2039, in run
    2019-08-05 16:52:11,154| ERROR | self._check_banner()
    2019-08-05 16:52:11,154| ERROR | File "D:\python\lib\site-packages\paramiko\transport.py", line 2216, in _check_banner
    2019-08-05 16:52:11,154| ERROR | "Error reading SSH protocol banner" + str(e)
    2019-08-05 16:52:11,154| ERROR | paramiko.ssh_exception.SSHException: Error reading SSH protocol banner[WinError 10054] 远程主机强迫关闭了一个现有的连接。
    2019-08-05 16:52:11,154| ERROR |
    2019-08-05 16:52:11,154| ERROR | Could not connect to gateway ip:port : Error reading SSH protocol banner[WinError 10054] 远程主机强迫关闭了一个现有的连接。
    Could not establish session to SSH gateway

    百度了好久也没发现问题错在哪里,请各位大佬不吝赐教,谢谢
    14 条回复    2019-08-16 22:11:44 +08:00
    Aliencn
        1
    Aliencn  
       2019-08-05 18:05:00 +08:00
    python 只是个工具,python 不能完全实现就换别的方式呗
    比如找个能双向同步的 XX 网盘,或者利用阿里云 OSS 做文件中转。
    然后再用 python 做一些辅助的拷贝校验工作,就行了
    cz5424
        2
    cz5424  
       2019-08-05 18:12:11 +08:00   ❤️ 1
    感觉是实现手段有问题...

    ```
    有个每天定时的数据迁移任务,数据源在远程服务器 A 数据库中,要每天把数据迁移到另一个远程服务器 B 的数据库中,
    ```

    不应该直接链接数据库 a, 读取后发到数据库 b?
    liwenbest
        3
    liwenbest  
    OP
       2019-08-05 18:28:11 +08:00
    @cz5424 主要是要链接 vpn 才能把数据迁移过去,这 vpn 登录半小时如果没有链接数据库会自动断开 ,所以每次迁移前要登录下 vpn
    jdhao
        4
    jdhao  
       2019-08-05 18:33:44 +08:00 via Android
    @liwenbest 好像一直 ping 服务器地址,vpn 就不会断了
    jaynos
        5
    jaynos  
       2019-08-05 18:38:47 +08:00
    数据库迁移?为啥不考虑主从实现?
    inwar
        6
    inwar  
       2019-08-05 18:42:08 +08:00 via Android
    @liwenbest 照楼上一直 ping,或者搞个心跳几分钟从数据库获取个数据
    zst
        7
    zst  
       2019-08-05 18:43:32 +08:00 via Android
    用个心跳包呗
    cz5424
        8
    cz5424  
       2019-08-05 20:03:12 +08:00 via iPhone
    @liwenbest 这个自动断也是 vpn 设置吧,改一下不行?
    cz5424
        9
    cz5424  
       2019-08-05 20:04:20 +08:00 via iPhone
    很明显你的错误提示就是 socket 超时
    aSmallNewbie
        10
    aSmallNewbie  
       2019-08-06 09:40:36 +08:00
    非要翻墙???直接用 ip 地址也会被墙???
    aSmallNewbie
        11
    aSmallNewbie  
       2019-08-06 09:41:08 +08:00
    vpn 看错了。。。
    37Y37
        12
    37Y37  
       2019-08-06 10:20:37 +08:00
    lmingzhi08
        13
    lmingzhi08  
       2019-08-15 20:09:23 +08:00 via Android
    1 远程服务器 A,B 是否为 linux 系统
    2 A 服务器是否可以通过 ssh(bash 端)访问 B 服务器
    3 如果满足前面 2 个,那么可以用 SSHTunnelForwarder 做端口映射,将在 A 服务器将远程的 B 服务器上面的数据库端口映射在本地
    4 在 A 服务器用 python 访问本地数据库和远程数据库,完成数据迁移

    其实感觉也可以直接用 bash 脚本,A 服务器定时将数据库的数据导出成本地文件,将本地文件 rsync 到远程服务器 B, 远程服务器 B 将文件导入到数据库
    liwenbest
        14
    liwenbest  
    OP
       2019-08-16 22:11:44 +08:00
    用 SSHTunnelForwarder 报了个错 无法 10054] 远程主机强迫关闭了一个现有的连接。
    Could not establish session to SSH gateway
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   922 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:20 · PVG 04:20 · LAX 13:20 · JFK 16:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.