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