bash脚本手动清空mysql表数据


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

#!/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


### 使用 Navicat 和 MySQL 8.0 进行清空后的数据恢复 当使用 Navicat 清空 MySQL 中的数据后,如果需要恢复这些已删除的数据,通常可以通过几种不同的方式来实现。 #### 利用二进制日志 (Binlog) 对于开启了 Binlog 的 MySQL 实例来说,可以利用 `binlog` 文件来进行回滚操作。具体做法如下: - 首先确认服务器端启用了 binlog 功能,并且能够找到对应的 binlog 日志文件位置[^2]。 ```bash mysql> SHOW VARIABLES LIKE 'log_bin'; ``` - 如果确实存在可用的日志,则可以根据执行删除命令前后的时间戳定位具体的事务记录范围。 - 接着借助第三方工具如 Python 脚本解析并生成用于撤销更改的 SQL 命令[^4]: ```python import subprocess command = "python binlog2sql/binlog2sql.py \ -h127.0.0.1 -P3306 -uadmin -p'admin'\ -dDatabaseName -tTableNameDeleted \ --start-file='binlog.000007' --start-position=24908391 \ --stop-position=24920250 -B > rollback.sql" subprocess.run(command, shell=True) ``` 请注意上述代码仅为示例用途,请根据实际情况调整参数值。 - 执行生成好的 `rollback.sql` 文件完成数据还原工作。 然而需要注意的是,此方案依赖于事先配置好 binlog 并保存了一定时间长度的历史变更记录;如果没有启用该特性则无法采用这种方法。 #### 应用专用恢复软件 另一种选择是尝试专业的数据库恢复解决方案,比如提到过的 **AneData全能文件恢复** 工具[^3]。这类应用程序专为处理各种意外情况下的数据丢失而设计,支持多种场景下的恢复需求,包括但不限于直接删除、格式化等情况。不过值得注意的一点在于,这种类型的工具主要针对物理层面的数据检索,可能并不适用于逻辑层面上的操作失误所造成的损失。 考虑到以上两种途径各有优劣以及适用条件的不同,在实际应用过程中应当依据具体情况做出合理的选择。另外建议定期做好重要业务系统的备份措施以防止不可预见的风险发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值