背景:由于工作中接触到几个很大数据量的表,大约在几千万到1亿以上的数据量,个别表由于分表后的数据量仍在千万级,需要按天进行分区,所以自己写了一个针对数据库进行分表和分库的Shell脚本,供大家参考学习
代码:
#!/bin/bash
# description:自动分表分区脚本
# author:ZZJ
# time:2018-12-26
USER=root
PASSWORD=123456
HOST=127.0.0.1
MYSQL="/usr/local/percona/bin/mysql -u$USER -h$HOST -p$PASSWORD"
#RESULT=`$MYSQL -e "show databases"`
#echo $RESULT
#exit
#涉及数据表
TABLE_ARR=("tb_api_item_flow" "tb_api_money_flow" "tb_sdk_active_log" "tb_sdk_role_login" "tb_sdk_user_login" "tb_sdk_user_online" "tb_sdk_user_payment" "tb_sdk_user_reg")
#获取下个月年份
YEAR=`date -d "next month" +%Y`
#获取下个月月份
MONTH=`date -d "next month" +%m`
#获取下个月第一天
FIRST_DATE=$YEAR$MONTH"01"
#获取下个月总天数
DAY_NUM=`date -d "$FIRST_DATE +1 month -1 days" +%d`
for i in ${!TABLE_ARR[*]};
do
TABLE=${TABLE_ARR[$i]}
CHILD_TABLE=$TABLE"_"$YEAR$MONTH
if [[ $TABLE == "tb_api_money_flow" ]];then
#money_flow表根据分区基础表创建分表
TABLE=${TABLE_ARR[$i]}"_partition_base"
CREATE_SQL="CREATE TABLE IF NOT EXISTS origin_platform.$CHILD_TABLE LIKE origin_platform.$TABLE"
RESULT=`$MYSQL -e "$CREATE_SQL"`
#为money_flow表创建分区
for((DAY=1;DAY<=$DAY_NUM;DAY++));
do
if [[ $DAY -lt 10 ]]; then
DATE=$YEAR"-"$MONTH"-0"$DAY
else
DATE=$YEAR"-"$MONTH"-"$DAY
fi
PARTITIONS="$PARTITIONS PARTITION "'`'$DATE'`'" VALUES LESS THAN (TO_DAYS('$DATE')),"
done
#删除最后的“,”
PARTITIONS=${PARTITIONS%,*}
ALTER_SQL="ALTER TABLE origin_platform.$CHILD_TABLE PARTITION BY RANGE (TO_DAYS(TIME))($PARTITIONS);"
RESULT=`$MYSQL -e "$ALTER_SQL"`
else
#其他表根据主表创建分表
CREATE_SQL="CREATE TABLE IF NOT EXISTS origin_platform.$CHILD_TABLE LIKE origin_platform.$TABLE"
RESULT=`$MYSQL -e "$CREATE_SQL"`
fi
done
网友评论