153 lines
5.8 KiB
Python
153 lines
5.8 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Скрипт для диагностики и исправления проблем с базой данных Telegram бота.
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import sqlite3
|
||
from pathlib import Path
|
||
|
||
def check_database_file(db_path):
|
||
"""Проверяет состояние файла базы данных."""
|
||
print(f"Проверка файла: {db_path}")
|
||
|
||
if not os.path.exists(db_path):
|
||
print(f"❌ Файл базы данных не найден: {db_path}")
|
||
return False
|
||
|
||
# Проверяем права доступа
|
||
if not os.access(db_path, os.R_OK | os.W_OK):
|
||
print(f"❌ Нет прав доступа к файлу: {db_path}")
|
||
return False
|
||
|
||
# Проверяем размер файла
|
||
file_size = os.path.getsize(db_path)
|
||
print(f"✅ Размер файла: {file_size} байт")
|
||
|
||
return True
|
||
|
||
def check_wal_files(db_path):
|
||
"""Проверяет WAL файлы."""
|
||
db_dir = os.path.dirname(db_path)
|
||
db_name = os.path.basename(db_path)
|
||
base_name = os.path.splitext(db_name)[0]
|
||
|
||
wal_file = os.path.join(db_dir, f"{base_name}.db-wal")
|
||
shm_file = os.path.join(db_dir, f"{base_name}.db-shm")
|
||
|
||
print(f"\nПроверка WAL файлов:")
|
||
|
||
if os.path.exists(wal_file):
|
||
wal_size = os.path.getsize(wal_file)
|
||
print(f"✅ WAL файл найден: {wal_file} ({wal_size} байт)")
|
||
else:
|
||
print(f"ℹ️ WAL файл не найден: {wal_file}")
|
||
|
||
if os.path.exists(shm_file):
|
||
shm_size = os.path.getsize(shm_file)
|
||
print(f"✅ SHM файл найден: {shm_file} ({shm_size} байт)")
|
||
else:
|
||
print(f"ℹ️ SHM файл не найден: {shm_file}")
|
||
|
||
return wal_file, shm_file
|
||
|
||
def test_database_connection(db_path):
|
||
"""Тестирует подключение к базе данных."""
|
||
print(f"\nТестирование подключения к базе данных...")
|
||
|
||
try:
|
||
conn = sqlite3.connect(db_path, timeout=10.0)
|
||
cursor = conn.cursor()
|
||
|
||
# Проверяем версию SQLite
|
||
cursor.execute("SELECT sqlite_version()")
|
||
version = cursor.fetchone()[0]
|
||
print(f"✅ SQLite версия: {version}")
|
||
|
||
# Проверяем таблицы
|
||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
||
tables = cursor.fetchall()
|
||
print(f"✅ Найдено таблиц: {len(tables)}")
|
||
|
||
# Проверяем целостность
|
||
cursor.execute("PRAGMA integrity_check")
|
||
integrity = cursor.fetchone()[0]
|
||
if integrity == "ok":
|
||
print("✅ Целостность базы данных: OK")
|
||
else:
|
||
print(f"⚠️ Проблемы с целостностью: {integrity}")
|
||
|
||
conn.close()
|
||
return True
|
||
|
||
except sqlite3.Error as e:
|
||
print(f"❌ Ошибка SQLite: {e}")
|
||
return False
|
||
except Exception as e:
|
||
print(f"❌ Неожиданная ошибка: {e}")
|
||
return False
|
||
|
||
def cleanup_wal_files(db_path):
|
||
"""Очищает WAL файлы."""
|
||
print(f"\nОчистка WAL файлов...")
|
||
|
||
try:
|
||
conn = sqlite3.connect(db_path, timeout=10.0)
|
||
cursor = conn.cursor()
|
||
|
||
# Переключаем на DELETE режим для очистки WAL
|
||
cursor.execute("PRAGMA journal_mode=DELETE")
|
||
cursor.execute("PRAGMA journal_mode=WAL")
|
||
|
||
# Принудительно создаем checkpoint
|
||
cursor.execute("PRAGMA wal_checkpoint(TRUNCATE)")
|
||
|
||
conn.close()
|
||
print("✅ WAL файлы очищены")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка при очистке WAL файлов: {e}")
|
||
return False
|
||
|
||
def main():
|
||
"""Основная функция."""
|
||
print("🔧 Диагностика базы данных Telegram бота")
|
||
print("=" * 50)
|
||
|
||
# Определяем путь к базе данных
|
||
current_dir = os.getcwd()
|
||
db_path = os.path.join(current_dir, 'database', 'tg-bot-database.db')
|
||
|
||
print(f"Текущая директория: {current_dir}")
|
||
print(f"Путь к базе данных: {db_path}")
|
||
|
||
# Проверяем файл базы данных
|
||
if not check_database_file(db_path):
|
||
print("\n❌ Файл базы данных недоступен. Проверьте права доступа и существование файла.")
|
||
return
|
||
|
||
# Проверяем WAL файлы
|
||
wal_file, shm_file = check_wal_files(db_path)
|
||
|
||
# Тестируем подключение
|
||
if not test_database_connection(db_path):
|
||
print("\n❌ Не удалось подключиться к базе данных.")
|
||
return
|
||
|
||
# Очищаем WAL файлы
|
||
if cleanup_wal_files(db_path):
|
||
print("\n✅ База данных проверена и исправлена.")
|
||
else:
|
||
print("\n⚠️ База данных проверена, но не удалось очистить WAL файлы.")
|
||
|
||
print("\n📋 Рекомендации:")
|
||
print("1. Убедитесь, что у процесса есть права на запись в директорию database/")
|
||
print("2. Проверьте свободное место на диске")
|
||
print("3. Если проблемы продолжаются, попробуйте перезапустить бота")
|
||
print("4. В крайнем случае, создайте резервную копию и пересоздайте базу данных")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|