昨天新项目上线,数据库最初的逻辑是根据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 ,对表进行迁移 

    算是工作的简单总结吧!

    (以后对于新上线的应用 可以简单比较分库中的数据量来发现问题,或者 试着插入测试数据来确定是否有问题)