Skip to content

Instantly share code, notes, and snippets.

@kien-truong
Last active January 17, 2019 03:29
Show Gist options
  • Save kien-truong/d33b8da5a20718e7a07d1cb8800a3708 to your computer and use it in GitHub Desktop.
Save kien-truong/d33b8da5a20718e7a07d1cb8800a3708 to your computer and use it in GitHub Desktop.
Maintenace procedure to create & drop MySQL on a weekly basis
CREATE PROCEDURE CREATE_WEEKLY_PARTITION(tableName VARCHAR(200), refDate DATE)
BEGIN
SET @startOfWeek = SUBDATE(refDate, WEEKDAY(refDate));
SET @partName = DATE_FORMAT(@startOfWeek, 'part%Y%m%d');
SET @dbName = DATABASE();
SET @tName = tableName;
SET @checkQuery = 'SELECT PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = ? and TABLE_NAME = ? and PARTITION_NAME = ?';
PREPARE chkStmt FROM @checkQuery;
EXECUTE chkStmt USING @dbName, @tName, @partName;
DEALLOCATE PREPARE chkStmt;
SET @found = FOUND_ROWS();
IF @found = 0 THEN
SET @addPartSql = concat('alter table ',
@tName,
' reorganize partition future into (',
' partition ', @partName, ' VALUES LESS THAN (UNIX_TIMESTAMP(\'', @startOfWeek, '\') * 1000),',
' partition future VALUES LESS THAN(MAXVALUE))'
);
PREPARE stmt1 FROM @addPartSql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
END;
CREATE PROCEDURE DROP_WEEKLY_PARTITION(tableName VARCHAR(200), watermark DATE)
BEGIN
SET @startOfWeek = SUBDATE(watermark, WEEKDAY(watermark));
SET @partName = DATE_FORMAT(@startOfWeek, 'part%Y%m%d');
SET @dbName = DATABASE();
SET @tName = tableName;
SET @checkQuery = 'SELECT PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = ? and TABLE_NAME = ? and PARTITION_NAME = ?';
PREPARE chkStmt FROM @checkQuery;
EXECUTE chkStmt USING @dbName, @tName, @partName;
DEALLOCATE PREPARE chkStmt;
SET @found = FOUND_ROWS();
IF @found > 0 THEN
SET @addPartSql = concat('ALTER TABLE ',
@tName,
' DROP PARTITION ', @partName
);
PREPARE stmt1 FROM @addPartSql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment