在测试环境需要创建分库分表,为了方便不想通过java、python的方式实现,可以通过shell脚本创建分库分表。
以下是createDB.sh脚本内容:
#!/bin/bash
# 创建语句sql路径,${table_idx}作为分表下标占位符
sql_path='/path/test.sql'
sed -i "s/\r//" ${sql_path}
# 每个库包含的表
# 例如:table_config_1=(1 1024) 1表示第一个库,(1 1024)分表的起始到结束下标
table_config_1=(1 1024)
# 每个库的连接配置
# 与上面table_config的下标一一对应,db_config_count为分库的总数,这里控制后续创建遍历循环次数,务必与db_config个数一致
# 数组内容顺序分别为:host,port,db,user,password
db_config_count=1
db_config_1=('127.0.0.1' '3306' 'dbName' 'root' 'password')
#遍历分库
echo "分库总数:${db_config_count}"
for ((i=1;i<=${db_config_count};i++))
do
eval ev_db_config=\${db_config_${i}[*]}
eval ev_table_config=\${table_config_${i}[*]}
db_config=($ev_db_config)
table_config=($ev_table_config)
echo ">>>>>>>>>当前db信息,host:${db_config[0]} port:${db_config[1]} db:${db_config[2]} user:${db_config[3]} password:${db_config[4]}"
echo ">>>>>>>>>当前分表范围: ${table_config[0]} - ${table_config[1]}"
user=${db_config[3]}
password=${db_config[4]}
host=${db_config[0]}
port=${db_config[1]}
db=${db_config[2]}
#创建数据库
create_db_sql="create database IF NOT EXISTS ${db}"
mysql -h${host} -P${port} -u${user} -p${password} -e "${create_db_sql}"
#遍历分表
start_idx=${table_config[0]}
end_idx=${table_config[1]}
for ((table_idx=${start_idx};table_idx<=${end_idx};table_idx++))
do
#替换占位符
eval_sql=`cat ${sql_path}|sed 's/${table_idx}/'"${table_idx}"'/g'`
#执行sql
#mysql -u"${user}" -p"${pass}" -h"${host}" -P${port} ${db} --default-character-set=utf8 -A -e "${eval_sql}"
mysql -h${host} -P${port} -u${user} -p${password} ${db} --default-character-set=utf8 -A -e "${eval_sql}"
echo ">>>>>>>>>分库:${i} 分表:${table_idx} 已经创建完毕"
done
done
echo "finish..."
代码逻辑是:
1.循环遍历连接分库DB
2.判断库是否存在,不存在则创建
3.循环分表下标,创建分表
这个是创建sql的例子,${table_idx}是分表下标的占位符,执行时会被替换为数字。把这个语句文本放在sql_path对应的路径下面就行了。
CREATE TABLE IF NOT EXISTS `student${table_idx}`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT'姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT'123456' COMMENT'密码' ,
`sex` VARCHAR(2) NOT NULL DEFAULT '男'COMMENT'性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address`VARCHAR (100)DEFAULT NULL COMMENT '家庭住址',
`email`VARCHAR(50)DEFAULT NULL COMMENT '邮箱',
-- 添加主键操作
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET = utf8;
CREATE TABLE IF NOT EXISTS `student_test_${table_idx}`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT'姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT'123456' COMMENT'密码' ,
`sex` VARCHAR(2) NOT NULL DEFAULT '男'COMMENT'性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address`VARCHAR (100)DEFAULT NULL COMMENT '家庭住址',
`email`VARCHAR(50)DEFAULT NULL COMMENT '邮箱',
-- 添加主键操作
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET = utf8;
这里的例子是创建单库1024张分表。如果需要创建多个库,根据注释修改就行了,例如创建4个库一共8个分表,每个库有2分表
# 每个库包含的表
# 例如:table_config_1=(1 1024) 1表示第一个库,(1 1024)分表的起始到结束下标
# 配置每个库的分表下标,也可以重复都是(1 1024),看个人需要
table_config_1=(1 2)
table_config_2=(3 4)
table_config_3=(5 6)
table_config_4=(7 8)
# 每个库的连接配置
# 与上面table_config的下标一一对应,db_config_count为分库的总数,这里控制后续创建遍历循环次数,务必与db_config个数一致
# 数组内容顺序分别为:host,port,db,user,password
# 配置每个分库的配置,可以是同一个机器,也可以是不同机器,看个人需要
db_config_count=4
db_config_1=('127.0.0.1' '3306' 'dbName1' 'root' 'password')
db_config_2=('127.0.0.1' '3306' 'dbName2' 'root' 'password')
db_config_3=('127.0.0.1' '3306' 'dbName3' 'root' 'password')
db_config_4=('127.0.0.1' '3306' 'dbName4' 'root' 'password')
有其他特殊需求的可以根据源码自己调整~
如果提示格式错误什么的可以先执行下面的命令。
#格式转换
sed -i "s/\r//" createDB.sh
#添加权限
chmod +x createDB.sh
# 执行
./createDB.sh