程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL定期自動刪除表

MySQL定期自動刪除表

編輯:關於MYSQL數據庫

       單位8億多條的日志表,經過自動分表之後,需要自動刪除30天前創建的日志表。

      但是只是在Master下線這些日志表,而Slave還需要保持在線,以備查詢。

      由於Master-Slave結構,在Drop表之前,設置@@session.sql_log_bin=0,那麼Drop的行為就沒有記錄到binlog,所以Slave的日志表就會被保留。

      模擬環境如下,

      mysql> show tables;

      +---------------------------------+

      | Tables_in_edmond |

      +---------------------------------+

      | sod_song_log_2014_1_22_13_18_20 |

      | sod_song_log_2014_2_22_13_18_20 |

      | sod_song_log_2014_3_22_13_18_20 |

      | sod_song_log_2014_4_22_13_18_20 |

      +---------------------------------+

      4 rows in set (0.00 sec)

      過程如下:

      delimiter $$

      CREATE procedure drop_table()

      BEGIN

      declare t_name varchar(64);

      declare isFinished int default false;

      declare log_table_list cursor for (select table_name from information_schema.tables where table_schema = 'EDMOND' and table_name like 'sod_song_log_%');

      declare continue handler for not found set isFinished=true;

      open log_table_list;

      repeat

      fetch log_table_list into t_name;

      if isFinished = false then

      if datediff(now(),replace(t_name,'sod_song_log_',''))>30 then

      set @@session.sql_log_bin=0;

      set @sqltext=concat('drop table ',t_name,';');

      PREPARE c_tab_stat from @sqltext;

      execute c_tab_stat;

      set @@session.sql_log_bin=1;

      end if;

      end if;

      until isFinished

      end repeat;

      close log_table_list;

      END $$

      delimiter ;

      執行過程,結果如下

      mysql> call drop_table();

      Query OK, 0 rows affected (0.28 sec)

      mysql> show tables;

      +---------------------------------+

      | Tables_in_edmond |

      +---------------------------------+

      | sod_song_log_2014_4_22_13_18_20 |

      +---------------------------------+

      1 row in set (0.00 sec)

      mysql> select now() from dual;

      +---------------------+

      | now() |

      +---------------------+

      | 2014-04-22 17:58:24 |

      +---------------------+

      1 row in set (0.00 sec)

      並且binlog中沒有記錄這個Drop的行為。

      配合Linux crontab即可實現定期自動刪除表的功能。

      一定不要把sql_log_bin設置為global級別,不能犯迷糊

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved