数据库表的轮转

负责的一个项目,在开通时会赠送一批服务(粗略算了下大概有10来个),而开通这些服务有些可能比较耗时,就将这些服务都以后台任务的形式处理了。

最开始开通量少的时候,这些任务都是在一张表里以不同任务名记录的,处理完就修改下任务状态。后来随着开通量的增加,集中在一张表里已经开始会影响性能了,那么很自然地就想到分表,将不同的任务划分到不同的表里,数据量就少了一个数量级。

但是开通量增长得比较快,就算分表发现性能也并不能好多少。最开始想偷懒就打算隔一段时间清理一下已经处理完的任务(反正这些任务处理完后基本都不需要再保留的了),但是mysql如果不optimize表的话,删除的空间是不会被回收利用的,索引也是,所以就得经常停机optimize表。

经常这么折腾,谁都受不了,而且服务也得停会影响线上用户的正常使用也不好。最近就将这些任务表都做成按天轮转,每天轮换一个表,这样每个表的数据就基本在10多万行里,而且空间不够的时候可以直接drop掉一些过期的表(写个脚本定期drop)也不会影响线上服务,维护工作量明显少了很多。

转换文件名编码

合作方给了一批含有大量中文文件名的文件过来,需要对这批文件批量处理后再将结果反馈回去。这批文件的文件名是GBK编码的,但是我本地的环境是zh_CN.UTF-8的,在我的机器上这些文件名就乱码了。当然,可以先通过LANG=zh_CN.GBK将本地环境临时改成GBK来处理,但是能不能一次性将这些文件名批量转成UTF-8呢?

很显然,是可以的。iconv能将文件内容从一种字符集编码转换成另一种,类似的,convmv能将文件名从一种编码转换成另一种。


conmv - converts filenames from one encoding to another.

这个命令相当强大,可以递归目录,可以指定其他命令替代rename操作,可以指定低内存使用量,可以unescape,可以转换大小写等。实乃居家旅行,杀人灭口必备良品啊!