登录
首页 >  数据库 >  MySQL

记录一次 Online DDL 操作

来源:SegmentFault

时间:2023-02-17 12:39:58 466浏览 收藏

本篇文章给大家分享《记录一次 Online DDL 操作》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

记录一次 Online DDL 操作

为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。

一、环境

数据库:Mysql5.6

被操作表 user:数量级为100w,外键200多个

操作:

$ set lock_wait_timeout=10;

# 在10s内获取不到MDL锁,直接退出 alter 操作
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  • kill 掉对应的线程以及事务

    $ select group_concat(stat separator ' ') from (select concat('kill query ',id,';') as stat from information_schema.processlist  where command != 'Sleep' and Time > 5 order by Time desc) as stats;
    
    +-------------------------------------+
    | group_concat(stat separator ' ')    |
    +-------------------------------------+
    | kill query 42510; kill query 42514; |
    +-------------------------------------+
    1 row in set (0.00 sec)
    
    
    $ select group_concat(stat separator ' ') from (select concat('kill ',trx_mysql_thread_id,';')   as stat from information_schema.innodb_trx order by trx_started desc) as stats;
    
    +-------------------------------------------------------------------------+
    | group_concat(stat separator ' ')                                        |
    +-------------------------------------------------------------------------+
    | kill 42436; kill 42435; kill 42521; kill 42511; kill 42510; kill 42483; |
    +-------------------------------------------------------------------------+
    1 row in set (0.01 sec)
  • 执行 DDL 操作:

    $ alter table user add deleted boolean NOT NULL default false comment '用户注销标识' , algorithm=inplace, lock=none;
  • 结果:

    wecom-temp-118536-3bbc6a695cb30f104d63241c008a0720.png
  • 以上是在停服后操作的结果,其中 2 操作在停服后,没有需要 kill 的 ID。

    六、参考文献

    InnoDB and Online DDL

    好了,本文到此结束,带大家了解了《记录一次 Online DDL 操作》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

    声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
    相关阅读
    更多>
    最新阅读
    更多>
    课程推荐
    更多>