上一期写了用mybatis实现按月分表,可是一个一个月表如果需要我们自己每月手动去创建,也是不太方便,毕竟多一事不如少一事,写个脚本能让它自动创建谁还愿意手动去创建。这个时候服务器中的crontab定时器就起到了大作用;
就单纯的拿按月建表来说,大部分人都选择在本月的零点零分执行建表脚本来创建本月的表,在我看来这样做是有一点不太合理的,很多时候数据库中的表是一直都有新增数据的,如果零点零分建表时,有多条数据要插入到当月的表中,但此时该月的表还没创建完毕,那么就有可能造成这些数据的丢失,故我准备在每月的最后一天执行创建下一个月的表的脚本。这样就能保证当月零点零分一定有对应的月表啦。接下来看具体的脚本createMonthTable.sh:
#!/bin/bash
HOSTNAME="192.168.101.133" #数据库信息
PORT="3306"
USERNAME="mysql用户名"
PASSWORD="mysql密码"
DBNAME="user_mdb" #要使用的数据库,没有则会新建
MYSQL_CMD="mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD}"
echo ${MYSQL_CMD}
echo "create database ${DBNAME}"
create_db_sql="create database IF NOT EXISTS ${DBNAME}"
echo ${create_db_sql} | ${MYSQL_CMD} #创建数据库
#判断是否创建成功,&?=0表示上条命令执行成功
if [ $? -ne 0 ]
then
echo "create databases ${DBNAME} failed ..."
exit 1
fi
# 数据表名定义,按月建表,这里我是在本月最后一天执行该脚本,建下一个月的表,
timestamp=$(date -d "next month" +%Y%m) #下个月的月份
TABLENAME="ims_json_log_"$timestamp #具体的表名例ims_json_log_202302
#SQL语句
echo "create table ${TABLENAME}"
create_table_sql="create table ${TABLENAME}(
JSON_ID bigint(18) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
DONE_CODE varchar(64) NOT NULL,
PHONE_ID bigint(11),
BUSI_CODE smallint(4) DEFAULT 0,
TIME_COST bigint(11) NOT NULL,
SERVER_HOST varchar(32) DEFAULT '',
SERVER_PORT smallint(6),
CREATE_DATE datetime NOT NULL,
INPUT_SOAP text,
OUTPUT_SOAP text,
FLAG tinyint(1) DEFAULT 0,
RESULT_CODE varchar(64) DEFAULT '',
ERROR_MSG text,
EXT3 varchar(64) DEFAULT '',
EXT4 varchar(64) DEFAULT '',
KEY `index_name` (DONE_CODE,PHONE_ID)
)ENGINE=INNODB DEFAULT CHARSET=utf8"
#在给定的DB上,创建表
echo ${create_table_sql} | ${MYSQL_CMD} ${DBNAME}
if [ $? -ne 0 ] #判断是否创建成功
then
echo "create table ${DBNAME}.${TABLENAME} fail ..."
fi
写完脚本后执行chmod +x createNextMonthTable.sh命令赋予该脚本可执行权限;
最后输入crontab -e 编写定时任务,因为二月只有28天,所以就定每月28号晚上八点执行该脚本
可以看到每月的28号晚上20:00:00执行该脚本。
0 20 28 * * sh /usr/createNextMonthTable.sh
上面为最终的定时任务,这样大大提高了效率,何乐而不为呢。