问题描述:
一、早上上班收到报警,用户中心某slave不同步。
二、查看情况,发现mysql error 1114,The table ‘xxxx’ is full 。。。。。
三、检查其他slave,都出现同样问题。
四、解决问题方案
1、网上解决方案
a、修改tmp_table_size参数
b、修改max_heap_table_size参数
*试了上述修改方案,问题没排除。
2、实施方案
1、跟同事协商,采用之前php程序挪数据的方案。创建一个xxxx_old的表,将xxxx表中数据 replace into xxxx_old select * from xxxx。
2、在slave上执行了 rename xxxx xxxx_old_xx,将xxxx表重命名了xxxx_old_xx。
3、重启salve同步进程,报错:Slave SQL: Query caused different errors on master and slave. Error on master: message (format)=’The table ‘%-.192s’ is full’ error code=1114 。
4、采用跳过方式处理:set global sql_slave_skip_counter=1,重启slave进程。
5、mysql报1062错误,比如:’Duplicate entry ‘11434134’ for key ‘PRIMARY”, error code=1062. ,该错误通过修改my.cnf配置文件,slave-skip-errors=1062 。
6、slave同步之后,同事开始执行php脚本,将xxxx表数据挪到xxxx_old表。期间出现问题,部分slave的xxxx_old表没有数据(原因是之前冲命名了xxxx表,导致replace的sql语句执行失败)。
7、由于数据量大,主库往各个slave同步比较消耗资源。直接从master 将xxxx表冲命名为xxxx_old2。
8、主从库,结构统一。
上述处理过程存在问题:
1、php挪数据脚本,在没沟通好的情况下,开始执行
2、首先在slave上重命名,导致后期修改成本比较大
3、第一次处理此类故障,小心为上还是可取的。鉴于第一次处理过程中存在问题,后期要不段优化处理流量。