bash脚本手动清空mysql表数据

文章目录


1、bash脚本手动清空mysql表数据

bash 复制代码
#!/bin/bash

# 配置区域(修改此处)
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_HOST="localhost"
DATABASES=(
  "hps-base:base_test_item"        # 格式:数据库名:表名1,表名2
  #"db2:tableA,tableB"
  #"db3:*"                    # *表示清空所有表
)

LOG_FILE="./cleanup_$(date +%Y%m%d_%H%M%S).log"
echo "清理日志已创建: $LOG_FILE" | tee -a $LOG_FILE

# 检查MySQL连接
check_mysql() {
  mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -e "SELECT 1;" &> /dev/null
  if [ $? -ne 0 ]; then
    echo "错误: 无法连接到MySQL服务器" | tee -a $LOG_FILE
    exit 1
  fi
}

escape_db_name() {
  local db_name="$1"
  # 用反引号包裹整个数据库名(保留连字符等字符)
  echo "\`$db_name\`"
}

# 清理指定数据库
cleanup_db() {
  local raw_db_name=$1
  local db_name=$(escape_db_name "$raw_db_name")  # 关键转义处理
  #local db_name=$1
  local tables_str=$2
  IFS=',' read -r -a tables <<< "$tables_str"  # 将逗号分隔转为数组

  echo "========== 正在清理数据库: $db_name ==========" | tee -a $LOG_FILE

  # 禁用外键检查
  mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -e "SET FOREIGN_KEY_CHECKS=0;" 2>> $LOG_FILE

  for table in "${tables[@]}"; do
    if [ "$table" == "*" ]; then
      # 清空所有表
      echo "清空数据库 $db_name 所有表..." | tee -a $LOG_FILE
      ALL_TABLES=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -N -B -e "SHOW TABLES FROM $db_name")
      for t in $ALL_TABLES; do
        echo "TRUNCATE TABLE $db_name.$t" | tee -a $LOG_FILE
        mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -e "TRUNCATE TABLE $db_name.$t" 2>> $LOG_FILE
      done
    else
      echo "清空表 $db_name.$table" | tee -a $LOG_FILE
      mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -e "TRUNCATE TABLE $db_name.$table" 2>> $LOG_FILE
    fi
  done

  # 恢复外键检查
  mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -e "SET FOREIGN_KEY_CHECKS=1;" 2>> $LOG_FILE
}

# 主执行流程
main() {
  check_mysql
  for db_config in "${DATABASES[@]}"; do
    IFS=':' read -r db_name db_tables <<< "$db_config"  # 拆分数据库名和表名
    cleanup_db "$db_name" "$db_tables"
  done
  echo "清理完成,日志保存在: $LOG_FILE" | tee -a $LOG_FILE
}

main
相关推荐
麦聪聊数据1 天前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
myzshare1 天前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序
国强_dev1 天前
在数据库开发和运维中的“错误信息误导(Red Herring)”
运维·adb·数据库开发
辞砚技术录1 天前
MySQL面试题——索引2nd
数据库·mysql·面试
墨笔之风1 天前
java后端根据双数据源进行不同的接口查询
java·开发语言·mysql·postgres
黑白极客1 天前
怎么给字符串字段加索引?日志系统 一条更新语句是怎么执行的
java·数据库·sql·mysql·引擎
哈里谢顿1 天前
小探mysql覆盖索引
mysql
X***07881 天前
理解 MySQL 的索引设计逻辑:从数据结构到实际查询性能的系统分析
数据库·mysql·sqlite
warton881 天前
ubuntu24 安装 proxsql 实现数据库代理
linux·运维·mysql·ubuntu
天意pt1 天前
Blog-SSR 系统操作手册(v1.0.0)
前端·vue.js·redis·mysql·docker·node.js·express