tidb归档历史数据删除

mysql我一般有3种方案:
一、使用percona的工具包之pt-archiver命令:
pt-archiver --source h=10.11.1.1,P=3306,u=root,p=‘xxx’,D=dbname,t=x_trx_log --purge --charset=latin1 --where “create_time <= ‘2018-12-31’” --progress 1000 --limit 1000 --txn-size=1000 --bulk-delete --statistics --dry-run

二、分批删除数据,大事务拆分成N个小事务
set innodb_lock_wait_timeout=60;
/* define procedure to run loop to delte 10000 rows at a time /
DELIMITER $$
CREATE PROCEDURE DeleteActions()
BEGIN
DECLARE counter INT DEFAULT 1;
REPEAT
delete from actions_action where action NOT IN (‘like’, ‘subscribe’) limit 10000; commit;
SET counter = counter + 1;
SELECT SLEEP(2);
UNTIL counter >= 200
END REPEAT;
END$$
DELIMITER ;
/
call the procedure */
CALL DeleteActions();

三、等价SQL改写,创建一个临时表,将要保留的数据写入临时表,然后临时表与原表兑换名字,删除临时表。
1、检查数据量,每月多少记录
select count() from next_eip.t__exec_log where fcreated_time >= DATE_FORMAT(DATE_SUB(now(),interval 3 month),‘%Y-%m-%d’);
select date_format(fcreated_time,‘%Y-%m’),count(
) from next_eip.t__exec_log group by date_format(fcreated_time,‘%Y-%m’) order by 1 desc;

2、创建临时表
CREATE TABLE IF NOT EXISTS t__exec_log_tmp like t__exec_log;

3、给表加独占写锁,冻结数据变更
lock table t__exec_log write, t__exec_log_tmp write;

3、往临时表写入想保留的最近1月数据
inert into t__exec_log_tmp select * from t__exec_log where fcreated_time >= date_format(date_sub(now(),interval 1 month),‘%y-%m-%d’);

4、交换表名字,原表改名为备份表,临时表改名为原表
rename table t__exec_log to t__exec_log_bak, t__exec_log_tmp to t__exec_log;

5、释放表锁
unlock tables;