文章目录
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