当前位置:首页 > 问答 > 正文

数据库管理|数据清理 Linux数据库删除脚本,linux删除数据库的执行脚本

Linux数据库清理实战:高效删除数据的脚本指南

场景引入:凌晨3点,服务器警报突然响起——磁盘空间仅剩5%!排查发现是测试数据库堆积了上百张过期表,手动删除显然不现实,这时候,一个可靠的Linux数据库删除脚本就是你的救星。


为什么需要数据库清理脚本?

在Linux环境下管理数据库时,常遇到:

  • 测试环境产生大量临时表
  • 历史数据占用磁盘空间
  • 需要批量删除符合特定条件的记录

手动操作不仅效率低,还容易出错,下面分享几种实战验证过的脚本方案。

数据库管理|数据清理 Linux数据库删除脚本,linux删除数据库的执行脚本


MySQL数据库清理脚本

按表名批量删除

#!/bin/bash
# 删除指定前缀的旧表(示例:清除所有以'temp_'开头的表)
USER="your_username"
PASS="your_password"
DB="your_database"
HOST="localhost"
tables=$(mysql -h$HOST -u$USER -p$PASS $DB -e "SHOW TABLES LIKE 'temp_%'" | grep -v "Tables_in")
for table in $tables; do
    echo "删除表: $table"
    mysql -h$HOST -u$USER -p$PASS $DB -e "DROP TABLE $table"
done

安全提示:建议先执行SHOW TABLES命令确认要删除的表列表。

按时间清理数据

#!/bin/bash
# 删除7天前的订单记录(假设有created_at字段)
mysql -u$USER -p$PASS $DB <<EOF
DELETE FROM orders 
WHERE created_at < DATE_SUB(NOW(), INTERVAL 7 DAY);
EOF

PostgreSQL清理方案

批量删除表

#!/bin/bash
# 删除public schema下所有临时表
PGUSER="postgres"
PGDB="your_db"
psql -U $PGUSER -d $PGDB <<EOF
DO \$\$
DECLARE
    tbl text;
BEGIN
    FOR tbl IN 
        SELECT tablename 
        FROM pg_tables 
        WHERE schemaname = 'public' 
        AND tablename LIKE 'tmp_%'
    LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(tbl) || ' CASCADE';
        RAISE NOTICE '已删除表: %', tbl;
    END LOOP;
END \$\$;
EOF

清理大表数据(避免锁表)

#!/bin/bash
# 分批次删除日志记录
psql -U $PGUSER -d $PGDB <<EOF
WITH deleted AS (
    DELETE FROM app_logs
    WHERE created_at < NOW() - INTERVAL '30 days'
    RETURNING *
)
SELECT COUNT(*) FROM deleted;
EOF

MongoDB清理脚本

删除过期文档

#!/bin/bash
# 删除30天前的日志(通过mongo shell执行)
mongo your_db --eval '
db.logs.deleteMany({
    "timestamp": { 
        "$lt": new Date(ISODate().getTime() - 30*24*60*60*1000) 
    }
})'

清理整个集合

#!/bin/bash
# 快速清空集合(生产环境慎用!)
mongo your_db --eval 'db.temp_collection.drop()'

安全注意事项

  1. 备份优先
    执行删除前务必备份:

    数据库管理|数据清理 Linux数据库删除脚本,linux删除数据库的执行脚本

    mysqldump -u$USER -p$PASS $DB > /backups/db_before_clean.sql
  2. 使用事务测试
    MySQL示例:

    START TRANSACTION;
    DELETE FROM test_table WHERE id > 1000;
    -- 确认影响行数后执行 COMMIT 或 ROLLBACK
  3. 添加执行确认
    在脚本开头加入交互确认:

    数据库管理|数据清理 Linux数据库删除脚本,linux删除数据库的执行脚本

    read -p "即将删除$DB数据库中所有测试表,确认继续?[y/N] " confirm
    [[ $confirm == [yY] ]] || exit 1

进阶技巧

记录删除日志

# 在删除脚本中添加日志记录
LOGFILE="/var/log/db_clean.log"
echo "$(date '+%Y-%m-%d %T') 开始清理数据库" >> $LOGFILE
mysql -u$USER -p$PASS $DB -e "DELETE FROM logs WHERE..." 2>&1 | tee -a $LOGFILE

设置定时任务

通过crontab每周日凌晨执行:

0 3 * * 0 /path/to/your/clean_script.sh > /dev/null 2>&1

发表评论