shell脚本实现创建分库分表

在测试环境需要创建分库分表,为了方便不想通过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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值