博主在日常工作中遇到的一个使用pt-archiver工具归档的且已经在生产环境中的定时任务,下文所有包含的路径,文件,可自行替换。
#!/bin/bash
source /root/.bash_profile
#日期变量
G_MONTH=$(date +%Y%m)
G_DAY=$(date +%Y%m%d)#工作目录
dir=/CoCo_archive/CoCo_archive_daily#日志文件
logname="coco_bulk_1_"${G_DAY}".log"
log=${dir}/${logname}# 钉钉推送
kaituo_notice="https://oapi.dingtalk.com/robot/send?access_token=e0c58e9e08c8aebf1cfa9de9f33759204c7850fec0f2f07430216d3e49b4129c"
dingding=$kaituo_notice#shell分隔符设置成换行符
IFS=$'\n'
# 中台生产库信息
IP="rydeen-pro-middle-mysql.mysql.polardb.rds.aliyuncs.com"
PORT="3306"
DBUSER="rydeen_user"# 正式数据
# 归档表源库、目标库、表名和where条件,用,分割
ARC_BULK_TABLES=(
"coco_order,coco_order,order_info_status_logs,create_time< CURDATE() - INTERVAL 8 DAY"
"coco_order,coco_order,order_info_detail_grill,create_time< CURDATE() - INTERVAL 8 DAY"
"coco_order,coco_order,order_info_payments,create_time< CURDATE() - INTERVAL 8 DAY"
"coco_order,coco_order,order_info_item_activity,create_time< CURDATE() - INTERVAL 8 DAY"
)
# 钉钉机器人
fun_send_dingding() {
# curl -XPOST -s -L 'https://oapi.dingtalk.com/robot/send?access_token=e9c11294ece08901db83e693581efed86af79c53507c7cc2f81f2cb73e591dfa' -H 'Content-Type: application/json' -H "charset:utf-8" -d "@/scripts/mysql_sh/test.json"
curl -XPOST -s -L "$dingding" \
-H 'Content-Type: application/json' -H "charset:utf-8" \
-d "{
'msgtype': 'text',
'text': {
'content': '$1 . $2 归档或清理失败,请查阅日志并处理,日志为:$log'
}
}"
}
# 若归档表不存在则创建归档表
swich_month_table(){
SQL="CREATE TABLE IF NOT EXISTS \`$3\`.\`$4\` LIKE \`$1\`.\`$2\`;"
echo $SQL
mysql -h $IP -P $PORT -u$DBUSER -D $3 -e "$SQL"
} &>> ${log}# 执行批量归档。若失败,则通过钉钉发送到告警群
run_bulk_archive(){
pt-archiver --source h=$IP,P=$PORT,u=$DBUSER,p=$MYSQL_PWD,D=$1,t=$2 \
--dest h=$IP,P=$PORT,u=$DBUSER,p=$MYSQL_PWD,D=$3,t=$4 \
--where "$5" --nosafe-auto-increment --bulk-delete --no-version-check \
--progress=100000 --limit=10000 --txn-size=2000 --statistics --why-quit --bulk-insert --no-check-charset --charset=utf8} &>> ${log}
# 循环归档任务
for TABLE in ${ARC_BULK_TABLES[@]}; do
# 拆变量
ARC_SRC_DATABASE=`echo $TABLE |awk -F "," '{print $1}'`
ARC_TGT_DATABASE=`echo $TABLE |awk -F "," '{print $2}'`
ARC_SRC_TABLE=`echo $TABLE |awk -F "," '{print $3}'`
ARC_TGT_TABLE="${ARC_SRC_TABLE}_${G_MONTH}"
ARC_WHERE=`echo $TABLE |awk -F "," '{print $4}'`
# 检查并创建归档表
if swich_month_table $ARC_SRC_DATABASE $ARC_SRC_TABLE $ARC_TGT_DATABASE $ARC_TGT_TABLE; then
true
else
fun_send_dingding $ARC_SRC_DATABASE $ARC_SRC_TABLE
continue
fi
# 执行归档
if run_bulk_archive $ARC_SRC_DATABASE $ARC_SRC_TABLE $ARC_TGT_DATABASE $ARC_TGT_TABLE $ARC_WHERE; then
true
else
fun_send_dingding $ARC_SRC_DATABASE $ARC_SRC_TABLE
continue
fi
done