RAGflow/management/server/clean_all_data.py

141 lines
4.9 KiB
Python
Raw Normal View History

import os
from dotenv import load_dotenv
import mysql.connector
from minio import Minio
# 加载环境变量
load_dotenv("../../docker/.env")
# 数据库连接配置
DB_CONFIG = {
"host": "localhost",
"port": int(os.getenv("MYSQL_PORT", "5455")),
"user": "root",
"password": os.getenv("MYSQL_PASSWORD", "infini_rag_flow"),
"database": "rag_flow"
}
# MinIO连接配置
MINIO_CONFIG = {
"endpoint": "localhost:" + os.getenv("MINIO_PORT", "9000"),
"access_key": os.getenv("MINIO_USER", "rag_flow"),
"secret_key": os.getenv("MINIO_PASSWORD", "infini_rag_flow"),
"secure": False
}
def get_minio_client():
"""创建MinIO客户端"""
return Minio(
endpoint=MINIO_CONFIG["endpoint"],
access_key=MINIO_CONFIG["access_key"],
secret_key=MINIO_CONFIG["secret_key"],
secure=MINIO_CONFIG["secure"]
)
def clear_database_tables():
"""清空数据库表"""
try:
conn = mysql.connector.connect(**DB_CONFIG)
cursor = conn.cursor()
# 禁用外键检查
cursor.execute("SET FOREIGN_KEY_CHECKS = 0")
# 清空表数据
tables = ["document", "file2document", "file"]
for table in tables:
cursor.execute(f"TRUNCATE TABLE {table}")
print(f"已清空表: {table}")
# 启用外键检查
cursor.execute("SET FOREIGN_KEY_CHECKS = 1")
conn.commit()
cursor.close()
conn.close()
print("数据库表已全部清空")
except Exception as e:
print(f"清空数据库表失败: {str(e)}")
raise
def clear_minio_buckets():
"""清空并删除MinIO所有存储桶"""
try:
minio_client = get_minio_client()
buckets = minio_client.list_buckets()
if not buckets:
print("MinIO中没有存储桶需要清理")
return
print(f"开始清理 {len(buckets)} 个MinIO存储桶...")
for bucket in buckets:
bucket_name = bucket.name
# 跳过系统保留的存储桶
if bucket_name.startswith('.'):
print(f"跳过系统存储桶: {bucket_name}")
continue
try:
# 递归删除存储桶中的所有对象(包括版本控制对象)
objects = minio_client.list_objects(bucket_name, recursive=True)
for obj in objects:
try:
# 强制删除对象(包括所有版本)
minio_client.remove_object(bucket_name, obj.object_name, version_id=obj.version_id)
except Exception as e:
print(f"删除对象 {obj.object_name} 失败: {str(e)}")
continue
# 确保所有对象已删除
while True:
remaining_objects = list(minio_client.list_objects(bucket_name))
if not remaining_objects:
break
for obj in remaining_objects:
minio_client.remove_object(bucket_name, obj.object_name)
# 实际删除存储桶
try:
minio_client.remove_bucket(bucket_name)
print(f"已删除存储桶: {bucket_name}")
except Exception as e:
print(f"删除存储桶 {bucket_name} 失败: {str(e)}. 尝试强制删除...")
# 强制删除存储桶(即使非空)
try:
# 再次确保删除所有对象
objects = minio_client.list_objects(bucket_name, recursive=True)
for obj in objects:
minio_client.remove_object(bucket_name, obj.object_name)
minio_client.remove_bucket(bucket_name)
print(f"已强制删除存储桶: {bucket_name}")
except Exception as e:
print(f"强制删除存储桶 {bucket_name} 仍然失败: {str(e)}")
except Exception as e:
print(f"处理存储桶 {bucket_name} 时发生错误: {str(e)}")
print("MinIO存储桶清理完成")
except Exception as e:
print(f"清理MinIO存储桶失败: {str(e)}")
raise
def confirm_action():
"""确认操作"""
print("警告: 此操作将永久删除所有数据!")
confirmation = input("确认要清空所有数据吗? (输入'y'确认): ")
return confirmation.lower() == 'y'
if __name__ == "__main__":
if confirm_action():
print("开始清理数据...")
clear_database_tables()
clear_minio_buckets()
print("数据清理完成")
else:
print("操作已取消")