如何最高效地从远程 mysql 上拷贝一个 table?

2014-04-30 18:32:44 +08:00
 mornlight
机器A在公网,机器B在内网,客观原因限制,B可访问A,A不能访问B。A的数据库里有某table,大约几万行,B作为后台服务器,要做到从内网拿资源的同时从A中拿数据,再执行业务。

问:如何每次执行业务时最高效地让B拥有一个table的拷贝,存入B自己的mysql中?不是主从备份,不是实时一致,大概每15分钟会执行一次。

我自己原先想的方法:

不考虑存入B的mysql中,而是每次执行时程序都从A中select * ,运行结束就没了。但怕几万行数据可能量太大,通过网络传输会太慢而且占了A的带宽资源。

不知各位V友有何建议?有价值的回复必感谢。
3109 次点击
所在节点    问与答
8 条回复
suckli
2014-04-30 18:53:28 +08:00
不知道直接使用 rsync 同步数据表文件是否可行~
qsun
2014-04-30 18:56:48 +08:00
Livid
2014-04-30 18:59:36 +08:00
如果是文本数据的话,SELECT 出来之后,用 gzip 压缩一下。

比如可以在 A 上有个 web service,提供这几万行数据,然后用 NGINX 反代这个 web service 并设置 gzip on。

或者,每 15 分钟在 A 上写入到一个 txt 中,并 git push,然后从 B 上 git pull。如果是文本数据并且每次变化不大的话,就只需要传输压缩过的变化了的部分了。
mornlight
2014-04-30 19:30:16 +08:00
@suckli B机器上的mysql一直在运行,直接替换文件会不会产生麻烦?
mornlight
2014-04-30 19:31:39 +08:00
@qsun 试了一下,蛮好用的功能,感谢
mornlight
2014-04-30 19:36:19 +08:00
@Livid 我需要存到数据库里,这样用文本传输会不会绕的弯太大了点
ETiV
2014-04-30 19:50:08 +08:00
我现在外面跑的异地备份脚本是:

ssh database "/usr/bin/mysqldump -u${REMOTE_DB_USER} -p${REMOTE_DB_PASS} ${REMOTE_DB} ${REMOTE_TABLE} | /bin/bzip2 -zqc --best" | bunzip2 | /usr/bin/mysql -u${DB_USER} -p${DB_PASS} ${DB}

只有一行.
意思是, ssh 登录到 database, 而后执行 dump > bzip, 并输出到 stdout.
输出出来的内容会被执行脚本的服务接收进 stdin, 然后由 bunzip 直接解压缩出来, 再塞回 mysql 服务器.

由于是备份用的, 多数跑在凌晨三四点, 所以效率不需要很高.

如果你需要高效率, 根据mysql手册, 使用 LOAD DATA INFILE, 性能更快. 不过可能需要传输文件, 可以根据上面的脚本改一改.

* 当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍。参见13.2.5节,“LOAD DATA INFILE语法”。

http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
7.2.16. INSERT语句的速度
mornlight
2014-05-01 00:05:17 +08:00
@ETiV 学习了,感谢。我现在在尝试使用2楼federated引擎的方法,把两台机器数据库放一起来,备份也方便些。因为A机器是centos,B机器是win server,在B上放个脚本备份就可以了。

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

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

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

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

© 2021 V2EX