• 导航

SQL 更改表结构,减少影响面

后端杂烩 2018-04-27 22 次浏览
数据量较大,业务不允许长时间锁表,我们会使用QOSC(Online-Schema-Change)工具,这个工具的工作流程以及影响是:
1.根据线上的表online创建影子表shadow
影响:无
2.修改shadow表为最终想要的表结构
影响:无
3.在online表上创建触发器
影响:由于online表正在提供线上服务,在online表上创建触发器需要首先获得MDL(metadata lock)锁。如果此时线上有针对online表的慢查询,则创建触发器的过程将会等待直到该慢查询语句执行结束。与此同时,osc在等待MDL锁的整个过程中,针对online表的其他任何查询(包括select),都会阻塞,直到osc获得MDL锁,才能开始执行。为此,dba通过调整参数:lock_wait_timeout为5s,来降低osc可能对线上造成的影响。由于osc每次都需要创建3个触发器,所以,这个获得MDL的过程要重复3次。正常情况下,影响不大于1秒。如果有慢查询,极端情况下最多影响15秒针对该online表的查询。
4.开始把online表的数据导入到shadow表
影响:由于需要批量把online表的数据导入到shadow表中,osc需要给online表加共享锁。被锁住的是一个chunk,一个chunk通常是1000行左右的数据。在insert into shadow select from online语句执行过程中,这1000行数据只能提供查询,不能被修改;online表上的其他数据可以被查询和修改。为了降低共享锁的影响,我们通过参数来控制,保证insert into shadow select from online语句每次执行的时间控制在30ms左右。如果正好在这30ms过程中,线上程序需要写入恰好被锁住的1000行数据的某一行或者几行,则会等待最多30ms,表现为线上的row lock time的增加。
5.触发器把对online表的更新同步更新到shadow表上
影响:在使用insert into shadow select from online拷贝数据的过程中,线上对online表进行的所有更新,都会通过触发器更新到shadow表上。因此这会导致线上服务器的压力增大,增大的压力最多达到对该online表写入压力的一倍。
6.交换online表和shadow表
此时会执行rename表的操作,最终把shadow表转换为online表,老的online表作为备份表保留在线上。
影响:在执行过程中,会对online表加锁。正常情况下影响最多1秒,如果此时有针对online表的慢查询,则会影响最多15秒。
7.删除老表上的触发器
影响:无