1 关于中断session操作
mysql如果在前台执行drop table操作,中断了前台session
1 经过我测试,会执行成功,但是mysql.err会记录一些错误.而且删除后确实可以创建同名表
2 中断的时机不同,报错的日志可能不一样
3 手动ctrl+c kill xshell断开连接 这三者对于drop table 都一样
4 记住任何前台操作一定要执行后台操作,不然会有危险,养成良好习惯
2 关于drop 大表
0 选择在业务不繁忙的情况
1 rename table to table_new 这样是为了将bf中的关于该表的脏页刷新到磁盘中
2 ln table_new table_new.delete 建立linux硬链接
3 drop table
4 linux实现删除表 利用truncate命令
TRUNCATE=/usr/local/bin/truncate
for i in `seq 2194 -1 1 `;
do
sleep 2
$TRUNCATE -s ${i}G /data/mysql/mytest/erp.ibd.hdlk
done
rm -rf /data/mysql/mytest/erp.ibd.hdlk
3 drop 操作最新总结
可能触发的动作
1 AHI短时间内会释放大量的内存
2 表的脏页会刷新到磁盘
3 针对ibd文件会执行delete操作
可能的观察参数
1 innodb_buffer_pool_pages_misc大量释放,Innodb_buffer_pool_pages_free值同时增长,释放和增加的内容总量基本一致
2 在SEMAPHORES相关信息中,可以看到hang死期间大量Thread请求S-lock
可能导致问题
1 mysql thread hung
2 page cleaner 超时
总结
drop table引起的MySQL 短暂hang死的问题,是由于drop 一张使用AHI空间较大的表时,调用执行AHI的清理动作,会消耗较长时间,执行期间长时间持有dict_operation_lock的X锁,阻塞了其他后台线程和用户线程;
drop table执行结束锁释放,MySQL积压的用户线程集中运行,出现了并发线程和连接数瞬间上升的现象。规避问题的方法,可以考虑在drop table前关闭AHI。