570 lines
20 KiB
Python
Executable File
570 lines
20 KiB
Python
Executable File
#!/usr/bin/python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
Примеры использования модуля postgresql.py новым способом
|
||
Демонстрирует прямое использование PostgreSQLOperations без основного класса ssh
|
||
"""
|
||
import config
|
||
from ssh_base import SSHBase
|
||
from postgresql import PostgreSQLOperations
|
||
|
||
|
||
def example_basic_usage():
|
||
"""
|
||
Пример базового использования модуля postgresql
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 1: Базовое использование модуля postgresql")
|
||
print("=" * 60)
|
||
|
||
# Загружаем конфигурацию
|
||
cfg = config.get_config()
|
||
|
||
# Создаем SSH подключение
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file'],
|
||
host_keys=cfg['ssh']['host_keys']
|
||
)
|
||
|
||
# Подключаемся
|
||
ssh_client.connect()
|
||
|
||
# Создаем экземпляр модуля PostgreSQL
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
# Получаем список баз данных
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
bases = pg.bases_list(srv_pgsql)
|
||
|
||
print(f"Сервер PostgreSQL: {srv_pgsql}")
|
||
print(f"Найдено баз данных: {len(bases)}")
|
||
for base in bases[:5]: # Показываем первые 5
|
||
print(f" - {base}")
|
||
|
||
# Закрываем соединение
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_get_bases_list():
|
||
"""
|
||
Пример получения и вывода списка баз данных
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 2: Получение списка баз данных PostgreSQL")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
# Получаем список баз данных
|
||
bases = pg.bases_list(srv_pgsql)
|
||
|
||
print(f"Сервер: {srv_pgsql}")
|
||
print(f"Всего баз данных: {len(bases)}")
|
||
print("\nСписок баз данных:")
|
||
pg.bases_list_print(srv_pgsql)
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_get_bases_size():
|
||
"""
|
||
Пример получения размеров баз данных
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 3: Получение размеров баз данных PostgreSQL")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
print(f"Сервер: {srv_pgsql}")
|
||
print("\nРазмеры баз данных:")
|
||
print("-" * 60)
|
||
print(f"{'База данных':<30} | Размер")
|
||
print("-" * 60)
|
||
pg.bases_size_print(srv_pgsql)
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_backup_single_base():
|
||
"""
|
||
Пример создания бэкапа одной базы данных
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 4: Создание бэкапа одной базы данных")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
# Получаем список баз и берем первую для примера
|
||
bases = pg.bases_list(srv_pgsql)
|
||
if bases:
|
||
base_name = bases[0]
|
||
print(f"Создание бэкапа базы данных: {base_name}")
|
||
print(f"Сервер: {srv_pgsql}")
|
||
|
||
try:
|
||
results = pg.bases_backup(srv_pgsql, base_name)
|
||
for result in results:
|
||
if result['success']:
|
||
print(f"✓ Бэкап базы '{result['base']}' создан успешно")
|
||
else:
|
||
print(f"✗ Ошибка при создании бэкапа '{result['base']}': {result['stderr']}")
|
||
except Exception as e:
|
||
print(f"Ошибка: {e}")
|
||
else:
|
||
print("Базы данных не найдены")
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_backup_multiple_bases():
|
||
"""
|
||
Пример создания бэкапа нескольких баз данных из списка в конфиге
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 5: Создание бэкапа нескольких баз данных")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
# Получаем список баз из конфигурации для примеров
|
||
bases_to_backup = cfg['migration'].get('bases', [])
|
||
|
||
if not bases_to_backup:
|
||
print("Список баз для бэкапа не указан в конфигурации (migration.bases)")
|
||
print("Используем все базы с сервера")
|
||
bases_to_backup = None
|
||
|
||
print(f"Сервер: {srv_pgsql}")
|
||
if bases_to_backup:
|
||
print(f"Базы для бэкапа: {', '.join(bases_to_backup)}")
|
||
else:
|
||
print("Бэкап всех баз данных")
|
||
|
||
try:
|
||
# Если указан список баз, создаем бэкап для каждой
|
||
if bases_to_backup:
|
||
for base_name in bases_to_backup:
|
||
print(f"\nСоздание бэкапа базы: {base_name}")
|
||
results = pg.bases_backup(srv_pgsql, base_name)
|
||
for result in results:
|
||
if result['success']:
|
||
print(f" ✓ Бэкап базы '{result['base']}' создан успешно")
|
||
else:
|
||
print(f" ✗ Ошибка: {result['stderr']}")
|
||
else:
|
||
# Бэкап всех баз
|
||
results = pg.bases_backup(srv_pgsql, None)
|
||
print(f"\nОбработано баз: {len(results)}")
|
||
successful = sum(1 for r in results if r['success'])
|
||
failed = len(results) - successful
|
||
print(f"Успешно: {successful}, Ошибок: {failed}")
|
||
|
||
for result in results:
|
||
if not result['success']:
|
||
print(f" ✗ Ошибка при бэкапе '{result['base']}': {result['stderr']}")
|
||
except Exception as e:
|
||
print(f"Ошибка: {e}")
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_backup_all_bases():
|
||
"""
|
||
Пример создания бэкапа всех баз данных
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 6: Создание бэкапа всех баз данных")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
print(f"Сервер: {srv_pgsql}")
|
||
print("Создание бэкапа всех баз данных...")
|
||
|
||
try:
|
||
result = pg.bases_backup_all(srv_pgsql)
|
||
print("✓ Бэкап всех баз данных завершен успешно")
|
||
except Exception as e:
|
||
print(f"✗ Ошибка при создании бэкапа: {e}")
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_create_and_drop_base():
|
||
"""
|
||
Пример создания и удаления базы данных
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 7: Создание и удаление базы данных")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['restore_server']
|
||
test_base_name = "test_base_example"
|
||
|
||
print(f"Сервер: {srv_pgsql}")
|
||
print(f"Тестовая база: {test_base_name}")
|
||
|
||
try:
|
||
# Создаем базу данных
|
||
print("\n1. Создание базы данных...")
|
||
pg.base_create(srv_pgsql, test_base_name)
|
||
print(f"✓ База данных '{test_base_name}' создана")
|
||
|
||
# Проверяем, что база создана
|
||
bases = pg.bases_list(srv_pgsql)
|
||
if test_base_name in bases:
|
||
print(f"✓ База '{test_base_name}' найдена в списке баз")
|
||
|
||
# Удаляем базу данных
|
||
print("\n2. Удаление базы данных...")
|
||
pg.base_drop(srv_pgsql, test_base_name)
|
||
print(f"✓ База данных '{test_base_name}' удалена")
|
||
|
||
# Проверяем, что база удалена
|
||
bases = pg.bases_list(srv_pgsql)
|
||
if test_base_name not in bases:
|
||
print(f"✓ База '{test_base_name}' отсутствует в списке баз")
|
||
|
||
except Exception as e:
|
||
print(f"✗ Ошибка: {e}")
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_restore_base():
|
||
"""
|
||
Пример восстановления базы данных из бэкапа
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 8: Восстановление базы данных из бэкапа")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
archive_server = cfg['postgresql']['archive_server']
|
||
restore_server = cfg['postgresql']['restore_server']
|
||
backup_date = cfg['postgresql']['backup_date']
|
||
extra = cfg['postgresql']['extra_backup']
|
||
|
||
# Используем первую базу из списка миграции
|
||
archive_bases = cfg['migration']['archive_bases_name']
|
||
restore_bases = cfg['migration']['restore_bases_name']
|
||
|
||
if archive_bases and restore_bases:
|
||
for archive_base, restore_base in zip(archive_bases, restore_bases):
|
||
print(f"Восстановление базы данных:")
|
||
print(f" Архив: {archive_server}")
|
||
print(f" База в архиве: {archive_base}")
|
||
print(f" Сервер восстановления: {restore_server}")
|
||
print(f" База для восстановления: {restore_base}")
|
||
print(f" Дата бэкапа: {backup_date}")
|
||
print(f" Экстра-бэкап: {extra}")
|
||
|
||
try:
|
||
# Сначала удаляем старую базу, если существует
|
||
print(f"\n1. Удаление старой базы '{restore_base}' (если существует)...")
|
||
try:
|
||
pg.base_drop(restore_server, restore_base)
|
||
print(f" ✓ Старая база удалена")
|
||
except Exception:
|
||
print(f" База не существует или уже удалена")
|
||
|
||
# Создаем новую базу
|
||
print(f"\n2. Создание новой базы '{restore_base}'...")
|
||
pg.base_create(restore_server, restore_base)
|
||
print(f" ✓ База создана")
|
||
|
||
# Восстанавливаем из бэкапа
|
||
print(f"\n3. Восстановление из бэкапа...")
|
||
pg.base_restore(
|
||
archive_server, restore_server, backup_date,
|
||
archive_base, restore_base, extra
|
||
)
|
||
print(f" ✓ База '{restore_base}' восстановлена успешно")
|
||
|
||
except Exception as e:
|
||
print(f" ✗ Ошибка при восстановлении: {e}")
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_manage_backups():
|
||
"""
|
||
Пример управления старыми бэкапами
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 9: Управление старыми бэкапами")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
backup_path = f'/backup/pgsql/{srv_pgsql}'
|
||
days_old = 30 # Удалять бэкапы старше 30 дней
|
||
|
||
print(f"Путь к бэкапам: {backup_path}")
|
||
print(f"Удаление бэкапов старше: {days_old} дней")
|
||
|
||
try:
|
||
# Получаем список старых директорий
|
||
print("\n1. Поиск старых бэкапов...")
|
||
old_dirs = pg.file_list(backup_path, days_old)
|
||
if old_dirs.strip():
|
||
dirs_list = [d.strip() for d in old_dirs.split('\n') if d.strip()]
|
||
print(f"Найдено директорий для удаления: {len(dirs_list)}")
|
||
for d in dirs_list[:5]: # Показываем первые 5
|
||
print(f" - {d}")
|
||
else:
|
||
print("Старые бэкапы не найдены")
|
||
|
||
# Удаляем старые бэкапы
|
||
print(f"\n2. Удаление бэкапов старше {days_old} дней...")
|
||
pg.delete_old_backups(backup_path, days_old)
|
||
print("✓ Удаление завершено")
|
||
|
||
except Exception as e:
|
||
print(f"✗ Ошибка: {e}")
|
||
|
||
ssh_client.close()
|
||
print("\n")
|
||
|
||
|
||
def example_full_workflow():
|
||
"""
|
||
Пример полного рабочего процесса: список -> размеры -> бэкап
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 10: Полный рабочий процесс")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
try:
|
||
# Шаг 1: Получаем список баз
|
||
print("Шаг 1: Получение списка баз данных...")
|
||
bases = pg.bases_list(srv_pgsql)
|
||
print(f" Найдено баз: {len(bases)}")
|
||
|
||
# Шаг 2: Получаем размеры баз
|
||
print("\nШаг 2: Получение размеров баз данных...")
|
||
sizes = pg.bases_size(srv_pgsql)
|
||
print(f" Получены размеры для {len(sizes)} баз")
|
||
for size_info in sizes[:3]: # Показываем первые 3
|
||
base_name = size_info[0]
|
||
size = ''.join(size_info[1]) if size_info[1] else 'N/A'
|
||
print(f" {base_name}: {size}")
|
||
|
||
# Шаг 3: Создаем бэкап первой базы (если есть)
|
||
if bases:
|
||
print(f"\nШаг 3: Создание бэкапа базы '{bases[0]}'...")
|
||
results = pg.bases_backup(srv_pgsql, bases[0])
|
||
for result in results:
|
||
if result['success']:
|
||
print(f" ✓ Бэкап создан успешно")
|
||
else:
|
||
print(f" ✗ Ошибка: {result['stderr']}")
|
||
|
||
except Exception as e:
|
||
print(f"Ошибка: {e}")
|
||
finally:
|
||
ssh_client.close()
|
||
|
||
print("\n")
|
||
|
||
|
||
def example_context_manager_style():
|
||
"""
|
||
Пример использования с обработкой ошибок
|
||
"""
|
||
print("=" * 60)
|
||
print("Пример 11: Использование с обработкой ошибок")
|
||
print("=" * 60)
|
||
|
||
cfg = config.get_config()
|
||
ssh_client = None
|
||
|
||
try:
|
||
ssh_client = SSHBase(
|
||
hostname=cfg['ssh']['hostname'],
|
||
port=cfg['ssh']['port'],
|
||
username=cfg['ssh']['username'],
|
||
pkey_file=cfg['ssh']['pkey_file']
|
||
)
|
||
ssh_client.connect()
|
||
|
||
pg = PostgreSQLOperations(ssh_client)
|
||
|
||
srv_pgsql = cfg['postgresql']['archive_server']
|
||
|
||
# Получаем список баз и их размеры
|
||
bases = pg.bases_list(srv_pgsql)
|
||
print(f"Сервер: {srv_pgsql}")
|
||
print(f"Найдено баз данных: {len(bases)}")
|
||
|
||
if bases:
|
||
print("\nПервые 5 баз данных:")
|
||
for base in bases[:5]:
|
||
print(f" - {base}")
|
||
|
||
except Exception as e:
|
||
print(f"Произошла ошибка: {e}")
|
||
finally:
|
||
if ssh_client:
|
||
ssh_client.close()
|
||
print("\nСоединение закрыто")
|
||
|
||
print("\n")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
print("\n" + "=" * 60)
|
||
print("Примеры использования модуля postgresql.py")
|
||
print("=" * 60 + "\n")
|
||
|
||
# Раскомментируйте нужные примеры для запуска
|
||
|
||
# example_basic_usage()
|
||
example_get_bases_list()
|
||
# example_get_bases_size()
|
||
# example_backup_single_base()
|
||
# example_backup_multiple_bases()
|
||
# example_backup_all_bases()
|
||
# example_create_and_drop_base()
|
||
# example_restore_base()
|
||
# example_manage_backups()
|
||
# example_full_workflow()
|
||
# example_context_manager_style()
|
||
|
||
print("Для запуска примеров раскомментируйте соответствующие функции в конце файла")
|
||
print("\nПримеры демонстрируют:")
|
||
print(" 1. Базовое использование модуля")
|
||
print(" 2. Получение списка баз данных")
|
||
print(" 3. Получение размеров баз данных")
|
||
print(" 4. Создание бэкапа одной базы")
|
||
print(" 5. Создание бэкапа нескольких баз из конфига")
|
||
print(" 6. Создание бэкапа всех баз")
|
||
print(" 7. Создание и удаление базы данных")
|
||
print(" 8. Восстановление базы из бэкапа")
|
||
print(" 9. Управление старыми бэкапами")
|
||
print(" 10. Полный рабочий процесс")
|
||
print(" 11. Использование с обработкой ошибок")
|
||
|
||
|