背景
系统运行了几年,存在大量的日志数据文件,为了减轻数据的空间和转储的时间,需要删除前两年的数据,由于表数据量比较大,亿级别,同时还不能对线上系统有过多影响。
常用方法
- 如果有日期字段,写shell脚本,按照日期,每次删除一天的数据,
- 限制删除的条数,同样是按照日期字段作为条件,
- 重新命名表,重新建新表(如果业务可以接受的话)
- 创建新表,把需要的表数据复制到新表,使用新表作为业务记录表。
具体操作
针对上述列出的四种操作方法,操作如下(示例表 demo, 日期字段,有索引, add_time)
1.shell 脚本操作,
#!/usr/bin/env bash
# i 的具体数字,根据业务要求,要计算出来,
for((i=104;i<=824;i++))
do
end_date=`date -d "$i day ago" +'%F'`
start_date=`date -d "$(($i+1)) day ago" +'%F'`
echo "删除日期段 : ${start_date} - ${end_date}"
#具体数据连接根据各自的数据库参数填写
echo "delete from demo where add_time>'${start_date}' and add_time< '${end_date}'" | mysql --default-character-set utf8 -hip -Pport -uusername -ppassword dbname -A
done
2.限制条数, shell 操作(此种操作 需要有主键ID,否则主从同步延迟非常厉害,从库一行一行提交)
# 计算总条数,假设为10000000,每次删10000条
for((i=0;i<=1000;i++))
do
end_date=`date -d "$i day ago" +'%F'`
start_date=`date -d "$(($i+1)) day ago" +'%F'`
echo "删除日期段 : ${start_date} - ${end_date}"
#具体数据连接根据各自的数据库参数填写
echo "delete from demo where add_time< '2016-01-01' limit 10000 " | mysql --default-character-set utf8 -hip -Pport -uusername -ppassword dbname -A
done
3.Mysql 脚本
alter table demo rename to demo2;
create table demo as select * from demo_2 where add_time > '2016-01-01';
4.Mysql 脚本
/* demo_2 为业务逻辑的表 */
create table demo_2 as select * from demo where add_time > '2016-01-01';