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
zyqf
V2EX  ›  Python

如何优雅简单的备份远程数据库到本机?

  •  
  •   zyqf · 2016-05-30 16:09:28 +08:00 via Android · 5599 次点击
    这是一个创建于 3095 天前的主题,其中的信息可能已经有所发展或是发生改变。
    多个 vps 的数据库授权一个 vps(A)访问,打算在 vps(A)运行 python ,把其余的 vps 数据库都备份到 vps ( A )

    * 首先, mysqldump 好像只能备份到该数据库所在的 vps 上,不开 ftp 的情况下可有方法拉回来?

    * 在python中使用 sql 语句取数据,如表字段( DESC user ),表数据( SELECT * FROM user ),然后再处理这些数据成备份格式的 sql 文件,略嫌麻烦。

    各位大大,还有其他好的方法吗?
    第 1 条附言  ·  2016-05-30 16:43:52 +08:00
    只要在 vps(A)上运行 python 就可以拉回来至 vps A ,其他 vps 不作另外处理。

    大概 50 个 vps ,每个数据库的表量不大,几十 KB 左右,日后 vps 数量还会持续增加
    第 2 条附言  ·  2016-05-30 21:01:09 +08:00
    没想到引发战争,实在抱歉😥。我觉得提出一个思路就好了,至于优劣,能罗列也是极好,没必要引战,以上个人愚见。总之还是谢谢大家的指点。☺️☺️
    60 条回复    2016-06-01 08:51:38 +08:00
    lslqtz
        1
    lslqtz  
       2016-05-30 16:30:52 +08:00 via iPhone   ❤️ 1
    通过脚本导出数据库,然后另一台机子也搞一个:我一般是计划任务运行一个脚本,然后导出后 post 到另一台机子。
    clino
        2
    clino  
       2016-05-30 16:35:13 +08:00   ❤️ 1
    dump 以后 rsync?
    alex321
        3
    alex321  
       2016-05-30 16:35:58 +08:00   ❤️ 1
    crontab 中 mysqldump 到 vps 的 dropbox 同步目录,搞定。
    或者 crontab 中增加一个 scp 到 A 。。。
    zyqf
        4
    zyqf  
    OP
       2016-05-30 16:36:03 +08:00 via Android   ❤️ 1
    @lslqtz 机子有点多,一个个部署实在麻烦。
    zyqf
        5
    zyqf  
    OP
       2016-05-30 16:37:35 +08:00 via Android   ❤️ 1
    @alex321
    @clino

    额,我的意思是:只要在 vps(A)上运行 python 就可以拉回来。其他 vps 不作另外处理。
    zyqf
        6
    zyqf  
    OP
       2016-05-30 16:38:45 +08:00 via Android   ❤️ 1
    补充下,大约 50 个 vps 。
    lslqtz
        7
    lslqtz  
       2016-05-30 16:39:46 +08:00 via iPhone   ❤️ 1
    @zyqf 从 A 上用脚本连远程数据库,存进文件夹,打包文件夹, post 到远程。
    hujianxin
        8
    hujianxin  
       2016-05-30 16:40:07 +08:00   ❤️ 1
    fabric 可以试试。
    clino
        9
    clino  
       2016-05-30 16:40:57 +08:00   ❤️ 1
    你所谓的拉回来是拉到 vps A 上还是你本地的 PC 上?
    loading
        10
    loading  
       2016-05-30 16:41:00 +08:00 via Android   ❤️ 1
    主从数据库,就是比较慢。

    别搞错
    zyqf
        11
    zyqf  
    OP
       2016-05-30 16:41:24 +08:00 via Android   ❤️ 1
    @clino 拉到 vps A
    zyqf
        12
    zyqf  
    OP
       2016-05-30 16:41:47 +08:00 via Android   ❤️ 1
    @lslqtz 好,晚上试试
    xfwduke
        13
    xfwduke  
       2016-05-30 16:45:17 +08:00   ❤️ 2
    mysqldump 肯定可以远程备份的
    开个有权限的账号就行了
    alex321
        14
    alex321  
       2016-05-30 16:46:06 +08:00   ❤️ 1
    @zyqf 那就 A 上 crontab 50 个远程 mysqldump 到 A ,然后打包到 dropbox 目录,要拉取文件的机器上装个 dropbox ;或者在要拉取备份文件的机器上开个计划任务,定期 scp A 的 mysql 备份打包文件。。
    话说这东西,我 dropbox 就在跑,备份着 4 台机器的数据的数据库和一台机器的 web 文件;另有一个七牛的 bucket 也在跑数据库备份和 web 文件。。。。
    cxbig
        15
    cxbig  
       2016-05-30 16:46:51 +08:00   ❤️ 1
    - 在 A 上用 ssh tunnel ,远程执行 dump 命令,打包传输一次性解决,或分开先打包成文件,再用 scp 拖回 A 机器。
    - 如果这些 vps 都是内网,可以将 A 机的某个文件夹 mount 到各 vps ,在 vps 上做 cronjob 定时 dump ,随后 A 机直接操作文件。
    xqin
        16
    xqin  
       2016-05-30 16:50:13 +08:00   ❤️ 2
    @zyqf 你听谁说的 mysqldump 只能备份到数据库所在的服务器?
    mysqldump 这个程序在哪台机器上运行, 数据就是备份到哪台机器上的.

    按你描述的内容,你直接在 vps(A) 上执行

    mysqldump -C --all-databases -h VPS1_IP -u root -p > VPS1.sql

    mysqldump -C --all-databases -h VPS2_IP -u root -p > VPS2.sql

    就可以把 VPS1/VPS2 上的数据库备份到你当前的 vps(A) 上了.
    xqin
        17
    xqin  
       2016-05-30 16:52:21 +08:00   ❤️ 1
    上面那些回复的人, 我都怀疑他们是否有认真看清楼主的描述, 以及是否用过 mysqldump ?
    zyqf
        18
    zyqf  
    OP
       2016-05-30 16:57:50 +08:00 via Android   ❤️ 1
    @xqin mysqldump 好像只能备份到该数据库所在的 vps 上,不开 ftp 的情况下可有方法拉回来?

    用了好像,因为百度了下,没有找到相关信息,也许关键词不对。我不太肯定
    zyqf
        19
    zyqf  
    OP
       2016-05-30 16:58:20 +08:00 via Android   ❤️ 1
    @xqin 实在谢谢,这个命令对现有的代码来讲是最简单的
    xqin
        20
    xqin  
       2016-05-30 16:58:33 +08:00   ❤️ 1
    @zyqf 另外目前的命令是 要手工输入密码的, 但是也可以通过 参数 来指定密码.
    格式为:

    mysqldump.exe --all-databases -h 8.8.8.8 -C -u root --password=这里写 mysql 账号的密码 > backup.sql

    这样在备份的时候就不用手工输入密码了.
    zyqf
        21
    zyqf  
    OP
       2016-05-30 17:00:57 +08:00 via Android   ❤️ 1
    @xqin 十分感激,我晚上回去用电脑实验下,楼上的方法我也会参考的,谢谢各位的建议😊😊
    des
        22
    des  
       2016-05-30 17:42:16 +08:00
    数据库版本一致的情况下,直接复制二进制文件最快
    zyqf
        23
    zyqf  
    OP
       2016-05-30 17:53:55 +08:00 via Android
    @des 然而版本在 5.3-5.6 间波动😂😂
    qooweds
        24
    qooweds  
       2016-05-30 18:03:04 +08:00
    远程修改 crontab,加一条命令就行了,50 台机器就是一个循环的事.
    fabric 应该也可以吧
    goodryb
        25
    goodryb  
       2016-05-30 18:03:50 +08:00
    @xqin 这么激动干啥,这么简单的问题处理起来方法多了,前面的人也没说不能远程 dump 吧
    照你这么说,你知道楼主的 VPS 是一家服务商的吗?就算是一家服务商,内网互通吗? 假如内网不互通,要是 VPS 的 mysql 没有公网访问,你这个方法能用吗?

    开放条件下,什么可能都有,为啥这么急躁呢。
    我倒是觉得 15 楼
    @cxbig 的第二个方法最简单
    wingtatlee
        26
    wingtatlee  
       2016-05-30 18:31:02 +08:00
    又開始吵架的節奏...😄
    cxbig
        27
    cxbig  
       2016-05-30 18:32:25 +08:00
    @xqin
    - 远程使用 mysqldump 势必要在 server 端开启访问端口和设置账户密码和 IP ,这是很危险的。
    - 另外 3306 端口是不加密的,把明文密码放在这种远程命令里更是危险。
    请不要误导他人
    xqin
        28
    xqin  
       2016-05-30 19:05:37 +08:00
    @goodryb 你说 @cxbig 的方法好, 说明你还没明白楼主目前的处境,
    楼主是可以登陆 vsp(A), 且 vps(A) 是可以访问 他所要备份数据库的那些机器的.
    所以不存在开什么 ssh tunnel, 楼主直接 ssh 登陆 vps(A) 然后执行 mysqldump 就可以把其他的那 50 台机器的数据库备份至 vps(A).

    @cxbig 你根本就没明白楼主的环境, 他要备份的那几十台机器的 3306 只有 vps(A)可以访问得到.
    另外 3306 加不加密, 我不知道, 我也没研究过.

    密码只是做为参数传递给 mysqldump 这个命令, 至于 mysqldump 在向 mysql 服务器交互的时候 是不是加密的是由 mysql 远程访问协议所决定的.

    另外你的 3306 端口不加密的依据是哪来的? 是谁在误导人?
    xqin
        29
    xqin  
       2016-05-30 19:12:20 +08:00
    @goodryb 你第一段中描述的那些内容已经说明你没有认真看楼主的问题.
    我再帮他重复一遍.
    ```
    多个 vps 的数据库授权一个 vps(A)访问,打算在 vps(A)运行 python ,把其余的 vps 数据库都备份到 vps ( A )

    * 首先, mysqldump 好像只能备份到该数据库所在的 vps 上,不开 ftp 的情况下可有方法拉回来?
    ```
    goodryb
        30
    goodryb  
       2016-05-30 19:18:14 +08:00
    @xqin 你这么抠细节,那你看看楼主的补充里面
    “只要在 vps(A)上运行 python 就可以拉回来至 vps A ,其他 vps 不作另外处理。”,
    那我能不能说 “你没有认真看楼主的问题.” ?

    毫无意义,这里只是讨论方法,用不用楼主自己选,不要动不动就放地图炮
    xqin
        31
    xqin  
       2016-05-30 19:21:24 +08:00
    @goodryb 难道我回复的方法, 需要在其他的 vps 上做处理吗?
    goodryb
        32
    goodryb  
       2016-05-30 19:23:54 +08:00
    @xqin

    “只要在 vps(A)上——运行 python ——就可以拉回来至 vps A ,其他 vps 不作另外处理。”,

    你根本就没明白楼主的环境,楼主就是要用 python
    xqin
        33
    xqin  
       2016-05-30 19:27:17 +08:00
    @goodryb 哈哈哈哈, 笑死我了.
    都有不需要 python 的方法了, 不是更省事了? 强拉 python 来为自己做辩护有意思吗?
    xqin
        34
    xqin  
       2016-05-30 19:29:22 +08:00
    @goodryb 另外 楼主 考虑用 python 的原因, 就是因为他用百度搜索 mysqldump 的用法之后,
    以为 mysqldump 把备份后的数据保存至 mysql 的服务器上(即其他的 vps 上),
    才考虑用 python 来写代码解决.

    现在已经告诉楼主 他百度出来的结果是错的, 所以就根本不存在继续写 python 代码来备份数据这一说了.
    goodryb
        35
    goodryb  
       2016-05-30 19:35:50 +08:00
    @xqin 你是楼主开的马甲? 楼主的情况你都知道?挖个坑你就真的跳进去了?

    楼主哪里告诉你
    “考虑用 python 的原因, 就是因为他用百度搜索 mysqldump 的用法之后,
    以为 mysqldump 把备份后的数据保存至 mysql 的服务器上(即其他的 vps 上),
    才考虑用 python 来写代码解决.”

    这个问题,楼主不明白,楼上的 V 友都不懂?

    “上面那些回复的人, 我都怀疑他们是否有认真看清楼主的描述, 以及是否用过 mysqldump ?”
    还要专门一个回复来个反问句? 你想干嘛,是不是楼上的 V 友给你道歉认错?
    xqin
        36
    xqin  
       2016-05-30 19:39:10 +08:00
    @goodryb 不需要道歉.

    我专门回复的那句话, 就是在问这些人, 是否真的理解楼主的问题, 是否真的有用过 mysqldump ?

    楼主说 mysqldump 备份的数据是在远程的 mysql 服务器, 那就真的是在 远程的 mysql 服务器上?

    真正用过 mysqldump 的人, 会不知道 这个数据是备份在哪的?
    falcon05
        37
    falcon05  
       2016-05-30 19:45:20 +08:00 via iPhone
    @goodryb 潜台词:我不是针对谁,而是说在座的各位都是 XX ,哈哈哈哈
    xqin
        38
    xqin  
       2016-05-30 19:46:18 +08:00
    @cxbig MySQL 协议分析
    http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/

    请拿出证据证明你所描述的说法:
    "- 另外 3306 端口是不加密的,把明文密码放在这种远程命令里更是危险。 "
    goodryb
        39
    goodryb  
       2016-05-30 19:46:27 +08:00
    @xqin 你说的这个方法, 13 楼不是早就回复了?你认真看过楼上的回复么?


    另外:
    技术上的问题,就从技术上来讨论,就算是楼上众 V 友没用过 mysqldump ,也是再为楼主想办法,闻道有先后,不知道也没什么,你知道,告诉他正确的方法就是,能帮助别人也是一种快乐。

    但是不要在回答问题的时候使用这种反问句来质问别人,不想上升到个人素质修养层面。

    如果你请教别人一个问题,别人回答了之后,还要加上一个反问句“这都不知道?”,你心里舒服吗?
    goodryb
        40
    goodryb  
       2016-05-30 19:47:11 +08:00
    @falcon05 你算是 Get 到 G 点了
    xqin
        41
    xqin  
       2016-05-30 19:53:14 +08:00
    @goodryb 我没别的意思, 我的反问 只是想提醒他们, 错误的方向 不仅帮助不了别人, 更会误导别人.

    另外你说的 13 楼 是有说过, 他说的 `mysqldump 肯定可以远程备份的 `, 对楼主有什么帮助?

    我回复的更详细些不好吗?
    goodryb
        42
    goodryb  
       2016-05-30 20:03:40 +08:00   ❤️ 1
    @xqin 没说你详细不好,上一个回复已经说的很清楚了“你知道,告诉他正确的方法就是,能帮助别人也是一种快乐”

    13 楼的回复是很简略,如果楼主有心跟进,继续追问或者自己搜索就是,不管百度还是 google ,“ mysqldump+远程备份”都能搜出无数答案。

    可以做伸手党,但是不能一直做伸手党
    授人以鱼不如授人以渔
    这些道理我相信大家都懂,但是我们更需要的是大气谦和的态度。

    PS :
    “我的反问 只是想提醒他们, 错误的方向 不仅帮助不了别人, 更会误导别人.”
    回复某人的时候请先 @他,否则,你的回复,楼上这些 V 友不会有任何提示,仅此而已。
    cxbig
        43
    cxbig  
       2016-05-30 20:14:48 +08:00
    @xqin 这些远程通信安不安全基于配置, LZ 没有说明他强化过这些配置,而你提供的 mysqldump 命令也没有指定 --ssl 之类的申明,我当然会理解为不安全。
    likuku
        44
    likuku  
       2016-05-30 20:19:10 +08:00
    能接受瞬断 mysql 的话,可以
    瞬间锁表 /关闭 mysql + 数据分区 fsfreeze + 数据分区作快照

    数据分区 解冻 + mysql 释放表锁 /启动 mysql

    将数据分区快照里的数据目录 整个 rsync 到 远程备份机 (定期进行的话,由于 rsync 是差异传输,也并不慢)
    likuku
        45
    likuku  
       2016-05-30 20:21:01 +08:00
    mysql mysqldump 也都支持 ssl 连接
    xqin
        46
    xqin  
       2016-05-30 20:30:37 +08:00
    @cxbig 不指定 --ssl 参数 也不代表不安全, 且根据那篇文章中的分析 mysql 协议本身就有认证机制, 且密码也不是明文传输. 所以你后面的 我误导人的说法 不成立.


    @goodryb :)
    RIcter
        47
    RIcter  
       2016-05-30 20:42:03 +08:00
    nfs 呀(
    cxbig
        48
    cxbig  
       2016-05-30 20:48:49 +08:00
    @xqin 你以为不明文传输就抓不到?有协议机制也要确保开启才行。你可以去搜搜
    “ using wireshark to sniff mysql passwords ”

    http://forums.mysql.com/read.php?30,372341,374096#msg-374096
    xqin
        49
    xqin  
       2016-05-30 20:53:46 +08:00
    @cxbig 你有看你发的连接的日期吗?
    cxbig
        50
    cxbig  
       2016-05-30 21:00:57 +08:00
    @xqin 这种硬抬杠没太大意义。毕竟我不知道 LZ 怎么搭的环境、怎样的安全配置,至少我就绝不会用这种可能被黑的方法。
    xqin
        51
    xqin  
       2016-05-30 21:04:59 +08:00   ❤️ 1
    @cxbig mysql 的抓包数据分析.
    http://wenku.baidu.com/view/62b5516869eae009581becec.html


    MySQL 认证协议
    http://www.bitscn.com/pdb/mysql/201407/226725.html


    得到用户名是可能的, 因为用户名是明文传输的, 但密码不是.
    cxbig
        52
    cxbig  
       2016-05-30 21:42:04 +08:00
    @xqin
    我并没有说密码是明文,如果在通信时没有指定加密方式,它很有可能是 SHA1 加密,而 scramble 也是很容易拿到的。破解 SHA1 似乎已不是难事。
    SHA256 是 5.6 才有,而且不是默认开启。
    另,不指定加密方式,那么其他数据库交互的内容多半也是明文传输的。
    kanezeng
        53
    kanezeng  
       2016-05-30 22:22:10 +08:00
    要求不高的话,找台机器装 Navicat ,连上远程 MySql 后,可以设定时备份到本地,前提是本地机器开着。
    wclebb
        54
    wclebb  
       2016-05-30 22:47:19 +08:00
    什么时候优雅成了懒惰的代名词了……
    msg7086
        55
    msg7086  
       2016-05-31 03:10:06 +08:00
    只有我是用的 MariaDB 多来源复制吗。
    jellybool
        56
    jellybool  
       2016-05-31 08:49:13 +08:00
    1. ssh
    2. mysqldump
    3. git 仓库管理导出的数据库文件
    4. 本机脚本实现 git pull
    5. mac 定时执行 shell

    我现在就是使用 mac 的日历,每天定时三个时间点备份。
    holajamc
        57
    holajamc  
       2016-05-31 14:02:11 +08:00   ❤️ 1
    刚刚好最近写了一个
    http://holajelly.cc/?p=114
    lumen
        58
    lumen  
       2016-05-31 17:49:30 +08:00   ❤️ 1
    通过 ssh 远程执行 mysqldump 命令,在远程用 bzip2 压缩
    重定向到本地的 .bz2 文件:
    ssh USER@HOST "mysqldump --all-databases --single-transaction | bzip2 " > /path/to/local/file.HOST.sql.bz2

    这样一个命令就搞定了远程、加密、压缩、存储
    写成脚本,通过配置文件来添加机器及数据库就好
    xfwduke
        59
    xfwduke  
       2016-06-01 08:45:05 +08:00   ❤️ 1
    额... 想不到还被当典型了-_-
    因为看到 po 主说 mysqldump 不能远程备份,觉得他应该知道怎么用,所以也没想到要详细点

    在要求比较严格的生产环境, 确实不太建议用 mysqldump 做远程备份.
    这里有 2 个说法
    1. 如果远程机器和 db 机器都是内网, 远程备份的速度一般没本地快. 而备份时候对 db 的影响还是不小的 --- 主要是负载
    2. 如果走外网, 让 mysql 监听到外网 ip, 这肯定是不对的

    用 mysqldump 在 db 机器本地做备份. 考虑到 db 机器本身可能损坏导致数据丢失, 所以备份的结果肯定需要放到异机器保留
    这个 MySQL 自己没这样的功能, 需要做一些周边系统的开发. 一般会做出有这样功能的支持系统
    1. 在本地做 mysqldump 备份
    2. 自动用各种可选的文件传输协议( ssh, ftp, 网络磁盘) 把备份放到异机器
    3. db 本地以磁盘空间做参考, 考虑保留最近的 N 份备份
    4. 远程机器保留更长的 M 份 (M>N)
    5. db 机器还需要把 binlog 做远程备份, 保留的时间段至少要 >=M

    再回过头来说 mysqldump
    这个工具如果不加任何参数, 是需要有 lock 权限, 对于生产环境是没法用的. 但是只要添加了适当的参数, 权限就只需要 select

    通常, 在使用 innodb 引擎的 MySQL 上, mysqldump 的命令行参数是

    mysqldump -u${USER} -p${PWD} --default-character-set=${CHARSET} --single-transaction --skip-opt -q --create-options -R ${DB1} ${DB2} ... | gzip > backup_result_file.sql.gz

    解释下几个重要的
    1. --single-transaction 对于 innodb 引擎会建立全局一致性事务, 保证所有表都处于相同的时间状态
    2. --skip-opt 关闭备份前获取全局锁
    3. -q 禁止 client 缓存结果, 这个在本地备份场景极其重要, 防止因为数据过多, mysqldump 占用过多内存引起 OOM
    4. 字符集指定, 这个非常重要. 通常如果无法确定 db 字符集或者字符集有多种兼容性差的组合----如同时又 GBK 和 UTF-8, 那么选用 BINARY 会比较好

    其他的随便看看 -help 就好了
    xfwduke
        60
    xfwduke  
       2016-06-01 08:51:38 +08:00
    追加解释下
    对于 myisam 引擎, 无论如何都会需要 lock, 否则备份出来的数据没有意义 --- mysqldump 好像不管怎么组合参数, 遇到 myisam 表都会自己去加个 lock table
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5364 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 07:16 · PVG 15:16 · LAX 23:16 · JFK 02:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.