脚本调用mysql存储过程删除mysql partition总结

本文介绍了一种通过Shell脚本结合MySQL存储过程自动清理过期数据的方法,以缓解因数据积累导致磁盘空间不足的问题。该脚本适用于MySQL 5.6.17版本,能够定期检查磁盘使用情况,并当达到设定阈值时执行存储过程删除指定天数之前的分区数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于脚本调用mysql存储过程删除mysql partition总结

需求:最近mysql partition分区随着时间推移越来越大,超过磁盘告警值系统运行受到影响,需要自动删除些旧的数据。
mysql的版本5.6.17

代码块

shell脚本模块:

#!/bin/sh
#设置默认磁盘告警值
filesize=80
riqi=`date +"%Y-%m-%d %H-%M-%S"`
#myFile后面的find 修改成的安装路径即可
while [ true ]
do
myFile=`find /opt/project -name size.txt`
 if [ -f "$myFile" ]; 
    then
    filesize=`cat $myFile`
    else 
    echo "$filesize 使用默认的告警值" 
fi
echo "$riqi 磁盘设置的告警容量"
echo "$filesize"
percent=`df | sed -n '/\/$/p' | gawk '{print $5}'|sed 's/%//'`
echo "$riqi 磁盘此时的容量"
echo "$percent" 
if [ $percent -ge $filesize ];
    then
    mysql -h 127.0.0.1 -u root -ptalent -Dtest < dp.sql
    echo "$riqi 超过磁盘的使用限额执行dp.sql"
    else
    echo "$riqi 磁盘使用正常"
fi
sleep 30
done

代码块

mysql 存储过程模块:

## Tt 
drop procedure IF EXISTS dp;
## 设置传入删除的天数i_start_index,例如i_start_index= 3 则3天之前的数据都将会被删除
DELIMITER //
CREATE DEFINER = CURRENT_USER PROCEDURE dp(IN i_start_index INT)
BEGIN
    ## 得到i_start_index的日期,拼成类似分区的名称
    SET @strsql =CONCAT('select CONCAT("P" ,DATE_FORMAT(DATE_SUB(curdate(),INTERVAL ',i_start_index,' DAY),"%Y%m%d")) into  @dateInTa;');
    PREPARE stmt FROM @strsql;
    execute stmt;
    deallocate prepare stmt; 
    ##得到要删除的分区名称
    SET @strsql =CONCAT('SELECT partition_name INTO @partitionData ', 'FROM INFORMATION_SCHEMA.partitions WHERE  TABLE_SCHEMA = schema()   and partition_ordinal_position="2"  AND TABLE_NAME="event"',';');
        PREPARE stmt FROM @strsql;  
        ## 执行SQL语句
        EXECUTE stmt;  
        ## 释放掉预处理段
        deallocate prepare stmt;
        ##如果要删除分区的名称与拼成类似分区的名称相同,则不能删除
        if(@dateInTa=@partitionData) then
        select CONCAT("alarm 此时已经删除到最近需要查询的数据,磁盘处于告警状态!!默认删除前",i_start_index,"天的数据,请调整磁盘大小或调整删除数据的天数 ") alarmTa;
        else 
        SET @sqlstr = CONCAT('ALTER TABLE SIM_EVENT DROP PARTITION ',(SELECT partition_name  FROM INFORMATION_SCHEMA.partitions WHERE  TABLE_SCHEMA = schema()   and partition_ordinal_position="2"  AND TABLE_NAME='event'),';');
        select @sqlstr;
        PREPARE stmt FROM @sqlstr;
        execute stmt;
        end if;
END;
DELIMITER //
call dp(3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值