背景:由于工作中接觸到幾個(gè)很大數(shù)據(jù)量的表过椎,大約在幾千萬(wàn)到1億以上的數(shù)據(jù)量,個(gè)別表由于分表后的數(shù)據(jù)量仍在千萬(wàn)級(jí)棒口,需要按天進(jìn)行分區(qū)保屯,所以自己寫了一個(gè)針對(duì)數(shù)據(jù)庫(kù)進(jìn)行分表和分庫(kù)的Shell腳本,供大家參考學(xué)習(xí)
代碼:
#!/bin/bash
# description:自動(dòng)分表分區(qū)腳本
# 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
#涉及數(shù)據(jù)表
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")
#獲取下個(gè)月年份
YEAR=`date -d "next month" +%Y`
#獲取下個(gè)月月份
MONTH=`date -d "next month" +%m`
#獲取下個(gè)月第一天
FIRST_DATE=$YEAR$MONTH"01"
#獲取下個(gè)月總天數(shù)
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表根據(jù)分區(qū)基礎(chǔ)表創(chuàng)建分表
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表創(chuàng)建分區(qū)
? ? ? ? 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
#其他表根據(jù)主表創(chuàng)建分表
CREATE_SQL="CREATE TABLE IF NOT EXISTS origin_platform.$CHILD_TABLE LIKE origin_platform.$TABLE"
RESULT=`$MYSQL -e "$CREATE_SQL"`
? ? fi
done