Mysql自动分表分区脚本

2018-12-27  本文已影响16人  杍劼

背景:由于工作中接触到几个很大数据量的表,大约在几千万到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

上一篇下一篇

猜你喜欢

热点阅读