• mysql主库执行alter操作


    前几日,遇到的问题,表数据量不是很大,研发人员,修改表结构,导致数据库出现大量元数据锁等待,由于是5.5版本的数据库,对表进行alter操作是要锁表的。

    解决:

    show processlist;查看数据库出现大量元数据锁等待。

    select * from information_schema.innodb_trx;命令查看,正在获得锁的SQL

    找到之后,将线程ID 杀死。此时数据库恢复正常

    ---------------------------------------------------------------------

    ?有人会想,该SQL已经运行了,一段时间,中途KILL,那么表是改了还是没有改,是改了一部分吗?

    ?此时从库是怎么做的?

    ---------------------------------------------------------------------

    那么针对这两个问题,做了个实验:

    环境一主一从:

    mysql数据库修改字段的过程:

    a:创建一个临时的新表,首先复制旧表的表结构包含索引

    create table new_table like old_table;

    b:给新的表添加字段等操作

    c:把旧表的数据复制过来

    insert into new_table(file1,file2...) select file1,file2... from old_table;

    d:删除旧表,重命名旧表的名字为新表的名字

    1、在主库执行SQL,等数据库执行完了的情况

    (1)在主库执行alter table wxj2 add address varchar(10) not null;操作之后;

    主库查看show processlist;此时数据库显示 altering table

    此时查看主库的binlog文件,并没有记录alter table的SQL语句,此时登录从库查看show processlist;没有显示alter table操作。binlog也没有记录

    (2)等待主库将这个SQL语句执行完了,将执行的SQL语句,记录到自己的binlog日志中,此时从库把binlog写入到自己的中继日志中,重复主库的操作。那么此时,如果主库有对该表大量的写入,从库会出现延迟。

    2、在主库执行SQL,执行了一半的时候,在主库将alter操作KILL掉,查看主从的状况。

    (1)在主库执行alter table wxj2 modify address varchar(100) not null;语句,此时数据库正在做copy to tmp table.此时binlog没有记录,如果此时线上业务出现高峰,阻塞,那么直接将改语句进行kill掉。binlog是没有记录的,因为此时正在拷贝数据,SQL还没有执行完,不记录 BINLOG。此时数据库是没有任何更改的,从库当然也没有。因为主库没有记录BINLOG。

    总结:alter操作,是SQL执行完毕,才记录BINLOG,中途将SQL中止掉,是不记录BINLOG的,那么主库和从库都不会修改。

    =================================================================================================

    下面是使用PT工具修改表结构,查看 binlog记录的格式

    =================================================================================================

    在主库使用工具修改表结构:

     pt-online-schema-change --no-version-check --execute --critical-load="Threads_running=1200" --alter-foreign-keys-method=auto --alter "add column sie1_length DECIMAL(7,2) NOT NULL DEFAULT 0.00" h=10.205.9.55,P=3306,u=root,p=123456,D=pp,t=wxj2

    主库执行该命令的时候,会把PT工具执行的原理过程都记录到自己的BINLOG中,建新表,创建触发器,alter操作,然后向新表拷贝数据,此时从库看到有新的binlog写入,也会跟着在自己的从库,重新操作一遍。

    此时从库也会出现延迟!!!!

    总结:alter操作是原子性 ,要么成功,要么失败,而pt工具修改,过程是正常SQL操作,需要写入BINLOG,所以,如果一个大表使用PT工具修改表结构,BINLOG会增加很多。

  • 相关阅读:
    第二周作业
    20172331 《Java程序设计》第1周学习总结
    20172316《程序设计与数据结构》(下)课程总结
    哈夫曼编码测试博客
    20172316 2017-2018-2 《程序设计与数据结构》实验三报告
    20172316 2018-2019-1《程序设计与数据结构》第九周学习总结
    20172316 2018-2019-1 《程序设计与数据结构》实验二报告
    2018-2019-1 20172316《程序设计与数据结构》第八周学习总结
    20172316 2018-2019-1《程序设计与数据结构》第七周学习总结
    20172316 《程序设计与数据结构》第六周学习总结
  • 原文地址:https://www.cnblogs.com/lucky8866/p/10538273.html
Copyright © 2020-2023  润新知