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

在工作过程中,经常会遇到由于评估的表数据量太大,需要对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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容