昨天新项目上线,数据库最初的逻辑是根据UID 取模分库分表。(ps 在测试环境下还是使用的单库单表),结果上线第二天,发现所有的数据都存在于一个库中。
以上我们可以先不给出解决方式:
原因很简单,应用端没有分库分表的逻辑(开发人员的离职,导致该部分空白)。
DBA没有检查数据的均衡(其实这个时候的DBA 已经被派去做数据统计部分,忙着赶工)。
总体来说还是应用端和DBA缺少沟通。
个人是通过python 解决数据问题的。
import MySQLdb import sys try: conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='xxx') cursor=conn.cursor() cursor.execute("select * from xxx.user_equip_diamonds") uinfo=cursor.fetchall() for context in uinfo: co=int(context[5]%9) if co in (4,5,6,7,8,9): cursor.execute("insert into test.user_equip_diamonds select * from dragon0.user_equip_diamonds where id=%d" % (int(context[0]))) cursor.close() conn.commit() conn.close() finally: conn.close() sys.exit(1)
其中数据是根据primary key 进行分类的(防止重复键的产生)。
上线一天数据也就几万条。所以很快就搞定啦
通过SQL的方式也是可以的
select id from XXXX.XXXX where user_id%9 in (4,5,6,7,8,9); 可以建立一张temporary table 专门存储 id ,然后利用子查询或者 join ,对表进行迁移
算是工作的简单总结吧!
(以后对于新上线的应用 可以简单比较分库中的数据量来发现问题,或者 试着插入测试数据来确定是否有问题)
本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1036774,如需转载请自行联系原作者