rotate archive tables

Developed In: SQL — Contributed by: Gregory Haase

script to illustrate article by Greg Haase "Using Partitioning and Event Scheduler to Prune Archive Tables"


Gregory Haase
SQL
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `db_stats`.`rotate_archive_tables`$$
  4. CREATE PROCEDURE `db_stats`.`rotate_archive_tables`(IN p_retention_days INT)
  5. BEGIN
  6. /*
  7.   * Script to keep at least p_retention_days worth of data in the archive tables.
  8.   * We select from information schema, and use a whole lot of dynamic sql.
  9.   */
  10.  
  11. DECLARE l_cutoff_date BIGINT(20);
  12. DECLARE l_table_name VARCHAR(100);
  13. DECLARE sql_create_table VARCHAR(1000);
  14. DECLARE sql_rename_table VARCHAR(1000);
  15. DECLARE sql_reload_table VARCHAR(1000);
  16. DECLARE sql_drop_table VARCHAR(1000);
  17.  
  18. DECLARE done INT DEFAULT 0;
  19. DECLARE c_table_name CURSOR FOR SELECT a.table_name
  20. FROM information_schema.TABLES a,
  21. information_schema.COLUMNS b
  22. WHERE a.table_name = b.table_name
  23. AND a.engine = 'archive'
  24. AND b.column_name = 'date_string';
  25. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  26.  
  27. -- if p_retention_days is null, we keep 7 days
  28. IF (p_retention_days IS NULL) THEN
  29. SET p_retention_days = 7;
  30. END IF;
  31.  
  32. -- get the cutoff date - this is p_retention_days from midnight
  33. SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL p_retention_days DAY),'%Y%m%d%H%i')
  34. INTO l_cutoff_date;
  35.  
  36. -- OPEN CURSOR
  37. OPEN c_table_name;
  38. REPEAT
  39. FETCH c_table_name INTO l_table_name;
  40. IF NOT done THEN
  41.  
  42. -- CREATE TABLE LIKE SOURCE TABLE
  43. SET sql_create_table = CONCAT('CREATE TABLE IF NOT EXISTS `new_',l_table_name,'` LIKE `',l_table_name,'`');
  44. -- SELECT sql_create_table;
  45. SET @sqlstatement = sql_create_table;
  46. PREPARE sqlquery FROM @sqlstatement;
  47. EXECUTE sqlquery;
  48. DEALLOCATE PREPARE sqlquery;
  49.  
  50. -- RENAME TABLES
  51. SET sql_rename_table = CONCAT('RENAME TABLE `',l_table_name,'` TO `old_',l_table_name,'`, `new_',l_table_name,'` TO `',l_table_name,'`');
  52. -- SELECT sql_rename_table;
  53. SET @sqlstatement = sql_rename_table;
  54. PREPARE sqlquery FROM @sqlstatement;
  55. EXECUTE sqlquery;
  56. DEALLOCATE PREPARE sqlquery;
  57.  
  58. -- COPY LAST 7 DAYS DATA BACK INTO THE SOURCE TABLE
  59. SET sql_reload_table = CONCAT('INSERT INTO `',l_table_name,'` SELECT * FROM `old_',l_table_name,'` WHERE date_string >= ',l_cutoff_date);
  60. -- SELECT sql_reload_table;
  61. SET @sqlstatement = sql_reload_table;
  62. PREPARE sqlquery FROM @sqlstatement;
  63. EXECUTE sqlquery;
  64. DEALLOCATE PREPARE sqlquery;
  65.  
  66. -- DROP NEW TABLE
  67. SET sql_drop_table = CONCAT('DROP TABLE IF EXISTS `old_',l_table_name,'`');
  68. -- SELECT sql_drop_table;
  69. SET @sqlstatement = sql_drop_table;
  70. PREPARE sqlquery FROM @sqlstatement;
  71. EXECUTE sqlquery;
  72. DEALLOCATE PREPARE sqlquery;
  73.  
  74. -- CLOSE CURSOR
  75. END IF;
  76. UNTIL done END REPEAT;
  77. CLOSE c_table_name;
  78.  
  79. END $$
  80.  
  81. DELIMITER ;
  82.  

Current Tags

oksoft 

You must be logged in to tag this tool

No Comments yet

Votes

  • Rated 5.00 out of 5
Rated 5.00 out of 5 with 1 votes cast.
You must be logged in to vote.

Watches

0 members are watching this tool
You must be logged in to track this tool.

Provide Feedback

Please note:
HTML will be purified, but we allow for a number of HTML tags so that you have the flexibility to decorate your comment text to some extent. The comments allow the following HTML tags:

strong, b, em, blockquote, a, code, pre

To put code into your comment, simply encapsulate your code with
[code language="XXX"][/code], where XXX is any common language, for instance "PHP", "SQL", "C", etc.



You must be logged in to comment