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

2016-05-30 16:09:28 +08:00
 zyqf
多个 vps 的数据库授权一个 vps(A)访问,打算在 vps(A)运行 python ,把其余的 vps 数据库都备份到 vps ( A )

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

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

各位大大,还有其他好的方法吗?
5464 次点击
所在节点    Python
60 条回复
xqin
2016-05-30 19:53:14 +08:00
@goodryb 我没别的意思, 我的反问 只是想提醒他们, 错误的方向 不仅帮助不了别人, 更会误导别人.

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

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

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

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

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

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

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


@goodryb :)
RIcter
2016-05-30 20:42:03 +08:00
nfs 呀(
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
2016-05-30 20:53:46 +08:00
@cxbig 你有看你发的连接的日期吗?
cxbig
2016-05-30 21:00:57 +08:00
@xqin 这种硬抬杠没太大意义。毕竟我不知道 LZ 怎么搭的环境、怎样的安全配置,至少我就绝不会用这种可能被黑的方法。
xqin
2016-05-30 21:04:59 +08:00
@cxbig mysql 的抓包数据分析.
http://wenku.baidu.com/view/62b5516869eae009581becec.html


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


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

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

这样一个命令就搞定了远程、加密、压缩、存储
写成脚本,通过配置文件来添加机器及数据库就好
xfwduke
2016-06-01 08:45:05 +08:00
额... 想不到还被当典型了-_-
因为看到 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
2016-06-01 08:51:38 +08:00
追加解释下
对于 myisam 引擎, 无论如何都会需要 lock, 否则备份出来的数据没有意义 --- mysqldump 好像不管怎么组合参数, 遇到 myisam 表都会自己去加个 lock table

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/282252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX