关于脚本调用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);