77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Create your tasks here
 | |
| from __future__ import absolute_import, unicode_literals
 | |
| from datetime import timedelta
 | |
| from apps.monitor.models import DrfRequestLog
 | |
| from apps.utils.tasks import CustomTask
 | |
| from celery import shared_task
 | |
| from django.utils import timezone
 | |
| from django.conf import settings
 | |
| import os
 | |
| from apps.utils.sql import execute_raw_sql
 | |
| 
 | |
| 
 | |
| @shared_task(base=CustomTask)
 | |
| def clear_drf_log(days: int = 7):
 | |
|     """清除N天前的日志记录,默认七天
 | |
| 
 | |
|     清除N天前的日志记录
 | |
|     """
 | |
|     now = timezone.now()
 | |
|     days7_ago = now - timedelta(days=days)
 | |
|     DrfRequestLog.objects.filter(create_time__lte=days7_ago).delete()
 | |
| 
 | |
| @shared_task(base=CustomTask)
 | |
| def clear_dbbackup(num: int=7):
 | |
|     """
 | |
|     清除N条前的数据库备份记录,默认七条
 | |
| 
 | |
|     清除N条前的数据库备份记录
 | |
|     """
 | |
|     from apps.monitor.views import get_file_list
 | |
|     backpath = settings.BACKUP_PATH + '/database'
 | |
|     files = get_file_list(backpath)
 | |
|     files_remove_list = files[num:]
 | |
|     for f in files_remove_list:
 | |
|         filepath = os.path.join(backpath, f)
 | |
|         os.remove(filepath)
 | |
| 
 | |
| @shared_task(base=CustomTask)
 | |
| def clean_timescaledb_job_his(num: int = 30):
 | |
|     execute_raw_sql(f"""
 | |
|         DO $$
 | |
|         DECLARE
 | |
|             batch_size INTEGER := 100000; -- 每次删除的行数
 | |
|             deleted_count INTEGER := 0;
 | |
|         BEGIN
 | |
|             IF EXISTS (
 | |
|                 SELECT 1
 | |
|                 FROM pg_class c
 | |
|                 JOIN pg_namespace n ON n.oid = c.relnamespace
 | |
|                 WHERE n.nspname = '_timescaledb_internal'
 | |
|                 AND c.relname = 'bgw_job_stat_history'
 | |
|             ) THEN
 | |
|                 RAISE NOTICE 'Start cleaning _timescaledb_internal.bgw_job_stat_history ...';
 | |
| 
 | |
|                 LOOP
 | |
|                     WITH del AS (
 | |
|                     SELECT ctid
 | |
|                     FROM _timescaledb_internal.bgw_job_stat_history
 | |
|                     WHERE execution_start < NOW() - INTERVAL '{num} days'
 | |
|                     LIMIT batch_size
 | |
|                     )
 | |
|                     DELETE FROM _timescaledb_internal.bgw_job_stat_history
 | |
|                     WHERE ctid IN (SELECT ctid FROM del);
 | |
|             
 | |
|                     GET DIAGNOSTICS deleted_count = ROW_COUNT;
 | |
|                     RAISE NOTICE 'Deleted % rows...', deleted_count;
 | |
|                     EXIT WHEN deleted_count = 0;
 | |
| 
 | |
|                     
 | |
|                     PERFORM pg_sleep(0.1);  -- 稍微休息,避免压力过大
 | |
|                 END LOOP;
 | |
|                 RAISE NOTICE '✅ Data cleanup complete. Run VACUUM FULL manually.';
 | |
|             ELSE
 | |
|                 RAISE NOTICE 'Table _timescaledb_internal.bgw_job_stat_history not found.';
 | |
|             END IF;
 | |
|         END$$;
 | |
|     """, timeout=300) |