[shell]-定时建表

森格 | 2023年4月

工作中常常会按天按月对不同的数据库建表,下面是利用shell编写的两个建表脚本。


0. 写在最前

大致思路就是编写一个文本保存你要对哪些库进行建表,然后使用read循环读取,例如:

ip1 schema1
ip2 schema2
... ...
... ... 
ipn scheman

读取完后,利用create table if not EXISTS “要创建的表名” like “源表名”,这里的源表名可以是第一个月的表,create tables like 只会复制源表的表定义,不会复制数据。

明白上述两点思路下面就很简单了,直接看脚本。

1. 按月建表

#!/bin/bash
source ~/.bash_profile
# author:liangsen
# data:2023.04.02
# description:create tables in every month

# common setting
sourcepasswd='your_password'
sourceuser=your_user
port=330x
sourcetable="xxx"
currentdate=$(date +%Y%m)
nextdate=$(date -d '+1 month' +%Y%m)

main() {
    tableName=$sourcetable"_"$currentdate
    cTableName=$sourcetable"_"$nextdate
    echo "源表名:$tableName"
    echo "要创建的表名:$cTableName"

    # destinct host schema
    cat /xxx/dbhost.txt | while read sourcehost sourcedb; do
        createSql="create table if not EXISTS "$cTableName" like "$tableName";"
        echo "建表信息如下:"
        echo $sourcehost $sourcedb $tableName $cTableName $createSql
        mysql -h$sourcehost -u$sourceuser -p$sourcepasswd -P$port -A $sourcedb -e "$createSql"
        flagTable=$(mysql -h$sourcehost -u$sourceuser -p$sourcepasswd -P$port -A $sourcedb -e "show tables like '$cTableName%';" | grep -v Tables)
        if [ "$cTableName" == "$flagTable" ]; then
            echo "$sourcedb $cTableName 创建成功"
        else
            echo "$sourcedb $cTableName 创建失败"
        fi
    done
}
main

2. 按天建表(每月15号)

#!/bin/bash
source ~/.bash_profile
# author:liangsen
# data:2023.04.02
# description:create tables on the fifteenth of each month

# common setting
sourcepasswd='xxx'
sourceuser=xxx
sourcetable="xxx"
port=330x
today="202x0x15"

main() {

  # Time: start & end
  startYmd_tmp=$(date -d "$today +1 month" +%Y%m%d)
  echo "$startYmd_tmp"
  startYmd=$(date -d "$startYmd_tmp -14 day" +%Y%m%d)
  echo "$startYmd"
  endYmd_tmp=$(date -d "$today +2 month" +%Y%m%d)
  echo "$endYmd_tmp"
  endYmd=$(date -d "$endYmd_tmp -15 day" +%Y%m%d)
  echo "$endYmd"

  while [[ $startYmd -le $endYmd ]]; do

    # sourceTableName & destinctTableName & tmp
    tableName=$sourcetable"_"$today
    echo "源表名:$tableName"
    cTableName=$sourcetable"_"$startYmd
    echo "要创建的表名:$cTableName"
    tmp=$(date -d "$startYmd 1 day" +%Y%m%d)
    startYmd=$tmp

    # destinct host schema
    cat /xxx/dbhost.txt | while read sourcehost sourcedb; do
      createSql="create table if not EXISTS "$cTableName" like "$tableName";"
      echo "建表信息如下:"
      echo $sourcehost $sourcedb $tableName $cTableName $createSql
      mysql -h$sourcehost -u$sourceuser -p$sourcepasswd -P$port -A $sourcedb -e "$createSql"
      flagTable=$(mysql -h$sourcehost -u$sourceuser -p$sourcepasswd -P$port -A $sourcedb -e "show tables like '$cTableName%';" | grep -v Tables)
      if [ "$cTableName" == "$flagTable" ]; then
        echo "$sourcedb $cTableName 创建成功"
      else
        echo "$sourcedb $cTableName 创建失败"
      fi
    done
  done
}
main

3. crontab

建立完上述脚本后,我们只需要设置crontab就可以了,顺便将输出的结果到日志中,方便日后查看。

x x x * * source ~/.bash_profile;sh /xx.sh >> /xx/xx.log

4. 最后

今天就到这里了,如果问题欢迎指正。溜了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森格的博

创作不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值