#!/bin/bash # ============================================================================== # MySQL 分区表自动扩展脚本(按月分区) # 适用表:t_stock_daily_trade(已按 trade_date 按月分区) # 执行时机:每月最后一天凌晨2点(确保下一个月分区已创建) # ============================================================================== # -------------------------- 配置区(用户需根据实际情况修改) -------------------------- DB_HOST="localhost" DB_PORT="3306" DB_USER="root" DB_PASS="your_password" DB_NAME="a_stock_db" TARGET_TABLE="t_stock_daily_trade" # 目标分区表 # ---------------------------------------------------------------------------------- # 日志函数 log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> /var/log/auto_add_mysql_partition.log } # 1. 计算下一个月的关键日期(如当前12月,下一个月是次年1月) # 下一个月的1号(用于分区边界:VALUES LESS THAN (TO_DAYS('下下月1号'))) next_month_first_day=$(date -d "$(date +%Y-%m-01) +1 month" +%Y-%m-01) # 下下月的1号(分区边界:小于下下月1号,即包含整个下一个月) next_next_month_first_day=$(date -d "$next_month_first_day +1 month" +%Y-%m-01) # 分区名(格式:p202501) partition_name="p$(date -d "$next_month_first_day" +%Y%m)" log "INFO: 开始检查MySQL分区!下一个月:$next_month_first_day,分区名:$partition_name,边界:$next_next_month_first_day" # 2. 检查分区是否已存在 check_sql="SELECT COUNT(*) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = '$DB_NAME' AND TABLE_NAME = '$TARGET_TABLE' AND PARTITION_NAME = '$partition_name';" # 执行查询并获取结果(过滤掉表头和空行) partition_count=$(mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -D$DB_NAME -N -s -e "$check_sql") if [ "$partition_count" -eq 1 ]; then log "INFO: 分区已存在!无需创建,分区名:$partition_name" exit 0 fi # 3. 创建新分区 add_partition_sql="ALTER TABLE $TARGET_TABLE ADD PARTITION ( PARTITION $partition_name VALUES LESS THAN (TO_DAYS('$next_next_month_first_day')) COMMENT '$(date -d "$next_month_first_day" +%Y年%m月)数据' );" if mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -D$DB_NAME -e "$add_partition_sql"; then log "SUCCESS: 分区创建完成!分区名:$partition_name,边界:$next_next_month_first_day" else log "ERROR: 分区创建失败!SQL:$add_partition_sql" exit 1 fi