MySQL预先创建批量分库分表的脚本

2018-02-06  本文已影响533人  张伟科

在工作过程中,经常会遇到由于评估的表数据量太大,需要对MySQL进行分库分表操作,比如需要先建立十个库,每个库根据日期建立一个表,格式如下:

库名:meta_file_(1……10)

表:meta_file_(180101……181231)

批量创建分库分表的脚本(create_multi_table.sh):

#!/bin/bash

# Connection MySQL

CMD="mysql -S /var/lib/mysql/mysql.sock"

# 第一个for循环,用于创建库;

for i in `seq 1 10`;do

  # 定义数据库的名称;

  database="meta_file_$i"

  $CMD -e "CREATE DATABASE IF NOT EXISTS $database;"

  # 第二个for循环,用于创建表($month);

  for i in `seq 1 3`;do

  month=`printf "%02d\n" $i`

  # 第三个for循环,用于创建表($day)

  for i in `seq 1 31`;do

  day=`printf "%02d\n" $i`

  # 定义表的名称;

  table="meta_file_18${month}${day}"

  # 把转义后的SQL语句导入到.sql文件;

  echo "CREATE TABLE $table(

    \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT,

    \`fid\` bigint(15) NOT NULL,

    \`filename\` varchar(128) NOT NULL DEFAULT '',

    \`uid\` bigint(15) unsigned NOT NULL DEFAULT '0',

    \`appid\` int(10) unsigned NOT NULL DEFAULT '1',

    \`ip\` int(10) unsigned NOT NULL DEFAULT '0',

    \`tfsfid\` varchar(20) NOT NULL DEFAULT '',

    \`filetype\` smallint(4) NOT NULL DEFAULT '0',

    \`filesize\` int(10) unsigned NOT NULL DEFAULT '0',

    \`ctime\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

    \`extension\` varchar(12) NOT NULL DEFAULT '',

    \`tid\` bigint(15) unsigned NOT NULL DEFAULT '0',

    \`props\` varchar(300) NOT NULL DEFAULT '',

    PRIMARY KEY (\`id\`),

    KEY \`meta_file_fid\` (\`fid\`)

  ) ENGINE=InnoDB;" > /app/scripts/table_desc.sql

  # 执行创建表的语句;

  $CMD $database -e "source /app/scripts/table_desc.sql;"

  # 打印一些信息;

  if [ $? = 0 ];then

    echo -e "\033[1;32mcreate ${database}.${table} success\033[0m"

  else

    echo -e "\033[1;31mcreate ${database}.${table} failed\033[0m"

  fi

  done

  done

done


批量删除分库分表的脚本(drop_multi_table.sh):

#!/bin/bash

# Connection MySQL

CMD="mysql -S /var/lib/mysql/mysql.sock"

# 第一个for循环,用于定义库名;

for i in `seq 1 10`;do

  # 定义数据库的名称;

  database="meta_file_$i"

  # 第二个for循环,用于定义表($month);

  for i in `seq 1 3`;do

  month=`printf "%02d\n" $i`

  # 第三个for循环,用于定义表($day)

  for i in `seq 1 31`;do

  day=`printf "%02d\n" $i`

  # 定义表的名称;

  table="meta_file_18${month}${day}"

  # 执行创建表的语句;

  $CMD $database -e "drop table $table"

  # 打印一些信息;

  if [ $? = 0 ];then

    echo -e "\033[1;32mdrop ${database}.${table} success\033[0m"

  else

    echo -e "\033[1;31mdrop ${database}.${table} failed\033[0m"

  fi

  done

  done

  # 删除数据库;

  $CMD -e "drop database $database"

done

上一篇下一篇

猜你喜欢

热点阅读