加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL定期自动删掉表

发布时间:2022-03-30 00:51:35 所属栏目:编程 来源:互联网
导读:单位8亿多条的日志表,经过自动分表之后,需要自动删除30天前创建的日志表。 但是只是在Master下线这些日志表,而Slave还需要保持在线,以备查询。 由于Master-Slave结构,在Drop表之前,设置@@session.sql_log_bin=0,那么Drop的行为就没有记录到binlog,所
       单位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级别,不能犯迷糊。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读