有一张表(innodb)有30万行数据,现在需要对表增加几个字段,但是因为数据量大,直接修改表结构会导致锁表。影响服务。服务不能停。所以目前考虑是另做一个新表(老表+新增的字段),然后程序上对新老两表同时做写操作,读仍然是读老表数据(因为老表数据是100%完整)。
然后将老表数据和新表数据的差分copy到新表后(新表数据就完整了),读写就都改到新表。老表即可作废。(实际上差分找出后,还得去查另一个表找到相应数据再插入到新表中。)现在问题是在做新老两表差分时我用的是left join。差分数据应该有30万条。这样会不会消耗太多内存? 以及整个流程有没有更好的解决方案?

解决方案 »

  1.   


    修改老表估计会造成几秒的锁定状态  无法直接修改老表。
    还有一些比较好的copy数据但又不影响服务的方法吗
      

  2.   

    lz的方法逻辑太麻烦  而且并不保险在低峰时段锁定30万数据也就锁定几秒钟而已,一般的业务我觉的都可以接受的如果非要在线更改,就用perconal的pt-online-schema-changehttp://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html  
      

  3.   


    开发环境上册了一下修改表结构需要2.09 sec 
    增加相应的索引(1个)需1.20 sec生产环境上涉及到主从复制,这个时间会被放大化吗?这个库里含有的一些表是比较重要的,比如用户信息等。
      

  4.   

    生产环境下会有锁的问题,另外生产环境中的表中记录数也会影响。 alter table实质就是复制一个表,然后删除老表,再重命名新表为老表名。
      

  5.   

    最好在也夜间操作少的情况下,重建一个新表,对修改老表数据,然后删除老表数据,新表重命名就可以。
    在生产环境下操作最好先lock table 表名,否则会涉及到数据完整性的问题。