系统内有一只游戏日志表,每日以百万条数据增长,过段时间需要按照日期清理数据。同事使用delete循环删除过一次,时间久不说,表中的数据是删除了,但是查看服务器发现,*.idb文件大小居高不下,使用optimize table 表名 , 优化表以后,内存大小恢复正常。前前后后花费将近4个小时的时间。效率比较低,偶然想起TRUNCATE TABLE,决定使用以下方案,结果10分钟内,清除3千多万条废弃数据。记录以下,已备下次使用。
- 1.创建临时表备份数据
CREATE TABLE user_game_log_old SELECT * FROM user_game_log where cts>1619798400000;
- 2.截断表
TRUNCATE TABLE user_game_log;
- 3.备份的数据插入到表中
INSERT INTO user_game_log SELECT * FROM user_game_log_old;
- 执行 TRUNCATE TABLE 可能会出现Waiting for table metadata lock 锁表解决方案
1.登录数据库 执行 SHOW PROCESSLIST;
2.select * from information_schema.innodb_trx\G; 查询当前事务
3.kill **** ;杀死当前进程
按以上步骤,可以解决锁表问题。