在管理线上数据库,时常要做一些数据归档操作,在没有了解 Percona toolkit 之前,第一个想到的是在夜深人静的时候使用 MySqlDump 来完成这件事情。但它不是我们的优质选择,理由有:

  • MySqlDump 只能备份在本机,不能直接做远端备份
  • 导出数据量太大的时候会锁表, 即使它的速度很快,但是在线上服务这是很危险的操作
  • 它仅仅只能导出,无法做到同时删除(可能不是太有必要)

面对上述的场景,Percona Toolkit 让DBA 有了更好地选择,pt-archiver 应时而生。

pt-archiver 介绍:

根据官方文档的说法,几乎不会对线上的OTLP操作有影响:

The goal is a low-impact, forward-only job to nibble old data out of the table without impacting OLTP queries much

它可以帮助我们将数据归档到文件, 另一个数据库,或者同一个数据库的另一个表, 亦或是用于合并两个表的内容。

用法介绍:

1
pt-archiver [OPTION...] --source DSN --where WHERE

归档的文件方便使用 load data infile 命令导入数据。另外你还可以用它来执行 delete 操作。这个工具默认的会删除源中的数据,使用的时候请注意。

假如我们将数据库里符合条件的记录归档到文件,并不做删除操作。

1
pt-archiver --ask-pass --progress 100000 --no-delete --no-check-charset --source h=localhost,u=root,D=blog,t=comment--file /home/ubuntu/tmp/comment--where 'time < "2013-12-31h"'

注意的选项参数:

1
2
3
4
5
6
7
--ask-pass        提示要求输密码
--progress num 执行num行在界面通知我们
--source h,D,t 数据源
--no-delete 加上这个参数并不会执行删除操作
--dry-run 仅仅将执行语句打印在终端,事实上并不执行。可以用于检测执行过程
--where 执行语句,需要用冒号包围起来
--limit 批量操作的数量,合理提高这个数值可以加快archive速度

小总结

通过开启 mysql 的 general log, 可以发现pt-archiver 执行时,是分批commit 的事务,因此执行效率会慢,在8核16G 内存的生产环境机器备份 1kw 条记录, 耗时150 分钟。 但基本不对服务造成影响,而且可以不用深夜进行, 值得一用。

最近攒了好多好工具和经验,要好好整理搬上来和大家分享才是。

开发中,要定位具体问题,特别是网络问题的时候,多数是要晋出tcpdump,遗憾的是我略懂皮毛,有必要深入一些。
简单说下我常用的 TcpDump的方法

1
tcpdump -i eth0 -Xxn port 80 -s 0 -c 1024 

如果仅仅是看manual 多数时候还是会忘记,好记性不如烂笔头,上述的选项是我认为很有用的

1
2
3
4
-i 指定网卡
-Xxn X使用Ascii和16进制,n 表示 ip 用数字表示
-s 0 表示整包抓取
-c 1024 表示包得大小

如果希望将抓包过程中保留下来,可以在上述命令尾部加上 -w trace.cap
这种格式的文件,文本编辑器是无法理解,需要特殊的软件才能回复,比如 wireshark

Tcpdump 中的 flag 有必要提下:

  • PSH 代表要求发送立即发送缓冲区内的其他对应数据包,无需缓冲区满才发送
  • RST 如果RST=1表示连接马上结束,无需等待终止确认手续,发送端已经断线
  • SYNC 表示主动连接到对方,建立连接
  • FIN 表示传送结束,发送方等待对方响应

通过 wireshark 可以再现所谓的三次握手和四次挥手过程。

这三个月以来,有30天是凌晨才离开公司的.甚至有好几天都通宵没有睡过,累。

貌似熟悉了凌晨的路灯,和冷冽的寒风。

技术的东西,整理在 EvertNote 里,但想写一些非技术的冲动似乎更强。

生活有很长的路要走, 几乎每天都在发现不足之处,只能让内心更强大, 去接受,去改变, 淡定去拥抱无时不刻的变化, 怀着信念与希望继续走着。

感谢 Everet 一直以来给我的信念, 我们也都在《感谢你让我上场》获得共鸣。我也坚信这位青年会是我们这届的骄傲。

我想让生活慢下来,做一些重要不紧急的事。

业务原来所在的Redis需要做迁移,感谢Redis,主从切换不算太复杂。
为了可以更好地阐述过程,我们定义了:

  • A 服务器,原来拥有 redis 数据库的机器
  • B 服务器,未来取代 A 服务器的 redis 数据库服务器

主从同步

把 B 服务器的 redis 配置更改为:

1
slaveof  IP地址 端口

这样就开始同步了,并且只读了。接下来准备把 B 服务器提升为 master,

1
redis-in-b-host> slaveof no one

B服务器就断掉主从同步,提升为主,并行可读写

Tips;

我们在停止服务的5分钟,在 A 的命令行,执行

1
bgsave

使得内存里的数据,完整地保存于 dumps.rdb

0%