Skip to content

Instantly share code, notes, and snippets.

@vanpelt
Created September 29, 2022 04:01
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save vanpelt/0c13c556fa82cabdecb70d5ef90a4ea9 to your computer and use it in GitHub Desktop.
Save vanpelt/0c13c556fa82cabdecb70d5ef90a4ea9 to your computer and use it in GitHub Desktop.
MySQL procedure to drop deleted data in batches.
DELIMITER $$
CREATE PROCEDURE batch_delete(batch INT, sinceDays INT)
BEGIN
DECLARE remaining INT DEFAULT batch;
CREATE TEMPORARY TABLE del_runs SELECT e.name as e, p.name as p, r.name as r, r.project_id as pid FROM runs as r
JOIN projects as p ON p.id = r.project_id
JOIN entities as e ON e.id = p.entity_id
WHERE r.deleted_at > DATE_ADD(NOW(), INTERVAL -sinceDays DAY)
ORDER BY r.deleted_at ASC;
WHILE remaining > 0 DO
DELETE FROM hs_history WHERE run REGEXP (
SELECT GROUP_CONCAT(CONCAT(".*:",d.e,":",d.p,":",d.r) SEPARATOR '|') FROM
(SELECT * FROM del_runs LIMIT batch) as d);
DELETE FROM hs_events WHERE run REGEXP (
SELECT GROUP_CONCAT(CONCAT(".*:",d.e,":",d.p,":",d.r) SEPARATOR '|') FROM
(SELECT * FROM del_runs LIMIT batch) as d);
DELETE FROM hs_logs WHERE run REGEXP (
SELECT GROUP_CONCAT(CONCAT(".*:",d.e,":",d.p,":",d.r) SEPARATOR '|') FROM
(SELECT * FROM del_runs LIMIT batch) as d);
DELETE FROM del_runs LIMIT batch;
DELETE FROM runs WHERE deleted_at > DATE_ADD(NOW(), INTERVAL -sinceDays DAY)
ORDER BY deleted_at ASC LIMIT batch;
SELECT COUNT(*) FROM del_runs INTO remaining;
END WHILE;
DROP TABLE del_runs;
END$$
DELIMITER ;
CALL batch_delete(100, 1);
DROP PROCEDURE batch_delete;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment