由于业务需要对MySQL数据库进行分库分表操作,大概需要建立10个库,每个库根据日期建立一年的表,格式如下:
库:meta_file_1-10
表:meta_file_20170101-20171231
还好库和表名称是规律的,并且表结构相同,所以可以使用脚本处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE TABLE mate_file_1( `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 DEFAULT CHARSET=utf8; |
由于在Shell中,需要对一些特殊字符处理一把,进行转义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sed 's#`#\\`#'g sql.txt CREATE TABLE mate_file_1( \`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 DEFAULT CHARSET=utf8; |
Shell版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#!/bin/bash # # Connection MySQL CMD="mysql -S /apps/mysql/weiphoto/mysql.sock" # 第一个for循环,用于创建库; for i in `seq 1 10`;do # 定义数据库的名称; database="meta_file_$i" $CMD -e "CREATE DATABASE IF NOT EXISTS $database CHARSET utf8;" # 第二个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_17${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 DEFAULT CHARSET=utf8;" > /tmp/1.sql # 执行创建表的语句; $CMD $database -e "source /tmp/1.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 |
批量删除库和表的脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/bin/bash # # Connection MySQL CMD="mysql -uroot -p123456" # 第一个for循环,用于创建库; for i in `seq 1 10`;do # 定义数据库的名称; database="meta_file_$i" # 删除数据库; # $CMD $database -e "drop table $table" # 第二个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_17${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 done |
可以愉快地创建和删除数据库和表了。