Резервное копирование и восстановление: BACKUP DATABASE, RESTORE

🔄 Зачем нужно резервное копирование?

Базы данных — это сердце приложений. Представь: месяцы работы, тысячи записей, критичные транзакции... и вдруг — сбой диска, человеческая ошибка или зловредный вирус. Резервные копии — это страховка от катастрофы!

Три главные причины:

  1. 💾 Аппаратные сбои (диски не вечны)
  2. 🧑‍💻 Ошибки разработчиков (DELETE без WHERE случается)
  3. 🔥 Стихийные бедствия (дата-центры тоже горят)

🛠️ Основные команды SQL Server

BACKUP DATABASE — твой цифровой спасатель

Создаёт "снимок" базы в указанном месте:

-- Простейший бэкап всей БД
BACKUP DATABASE MyDatabase 
TO DISK = 'C:\Backups\MyDatabase.bak'
WITH COMPRESSION, STATS = 10;

Ключевые параметры:

  • COMPRESSION — уменьшает размер (экономит до 60% места!)
  • STATS — показывает прогресс (10 = обновлять каждые 10%)
  • NAME — метка для идентификации ("Резервная копия от 01.01.2024")

🔄 Типы резервных копий

1. Полный бэкап (FULL)

Весь дамп базы — основа стратегии:

BACKUP DATABASE AdventureWorks 
TO DISK = 'C:\Backups\AdventureWorks_Full.bak'
WITH INIT, -- Перезаписать файл если существует
     NAME = 'Полный бэкап AdventureWorks';

2. Разностный (DIFFERENTIAL)

Только изменения с последнего FULL:

BACKUP DATABASE AdventureWorks 
TO DISK = 'C:\Backups\AdventureWorks_Diff.bak'
WITH DIFFERENTIAL, 
     NAME = 'Разностный бэкап за 01.01';

3. Лог транзакций (LOG)

Для point-in-time восстановления:

BACKUP LOG AdventureWorks 
TO DISK = 'C:\Backups\AdventureWorks_Log.trn'
WITH NORECOVERY; -- База остаётся в состоянии восстановления

Восстановление: RESTORE DATABASE

Полное восстановление из бэкапа

RESTORE DATABASE MyDatabase 
FROM DISK = 'C:\Backups\MyDatabase.bak'
WITH REPLACE, -- Перезаписать существующую БД
     RECOVERY, -- Перевести в рабочее состояние
     STATS = 5; -- Детальный прогресс

Важные нюансы: - REPLACE — обязателен при восстановлении поверх существующей БД - MOVE — если нужно изменить пути файлов:

RESTORE DATABASE MyDatabase 
FROM DISK = 'C:\Backups\MyDatabase.bak'
WITH MOVE 'MyDatabase_Data' TO 'D:\Data\MyDatabase.mdf',
     MOVE 'MyDatabase_Log' TO 'E:\Logs\MyDatabase.ldf';

🕰️ Восстановление на момент времени (Point-in-Time)

Сценарий: "Мы случайно удалили таблицу в 14:30, нужно вернуть состояние на 14:25!"

RESTORE DATABASE MyDatabase 
FROM DISK = 'C:\Backups\MyDatabase_Full.bak'
WITH NORECOVERY; -- Первый шаг: восстановить полный бэкап

RESTORE LOG MyDatabase 
FROM DISK = 'C:\Backups\MyDatabase_Log1.trn'
WITH STOPAT = '2024-01-01 14:25:00', RECOVERY;

🛡️ Лучшие практики резервного копирования

1. Правило 3-2-1:

  • 3 копии данных
  • 2 разных типа носителей (диск + облако)
  • 1 копия оффлайн (например, лента в сейфе)

2. Автоматизация через Maintenance Plans:

-- Создание простого плана обслуживания
USE [msdb];
GO
EXEC sp_add_maintenance_plan N'WeeklyBackupPlan';
GO

3. Тестирование восстановления:

  • Раз в квартал проверяй, что бэкапы действительно работают
  • Храни скрипты восстановления рядом с бэкапами

4. Мониторинг:

-- Проверка истории бэкапов
SELECT database_name, backup_start_date, type 
FROM msdb.dbo.backupset
ORDER BY backup_start_date DESC;

💡 Продвинутые техники

Сжатые бэкапы с шифрованием

BACKUP DATABASE MyDatabase 
TO DISK = 'C:\Backups\MyDatabase_Encrypted.bak'
WITH COMPRESSION,
     ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = BackupCert);

Резервное копирование в облако (Azure Blob Storage)

BACKUP DATABASE MyDatabase 
TO URL = 'https://mystorage.blob.core.windows.net/backups/MyDatabase.bak'
WITH CREDENTIAL = 'AzureStorageCredential';

🚨 Чего НЕЛЬЗЯ делать

  1. Хранить бэкапы на том же диске, что и сама БД
  2. Доверять только автоматическим решениям без проверки
  3. Игнорировать тестирование восстановления
  4. Использовать общие учётные записи для доступа к бэкапам

Помни: резервная копия, которую нельзя восстановить — это просто бесполезный файл!

Скрыть рекламу навсегда

🎥 YouTube: программирование простым языком

Канал, где я спокойно и по шагам объясняю сложные темы — без заумных терминов и лишней теории.

Подходит, если раньше «не заходило», но хочется наконец понять.

▶️ Смотреть курсы на YouTube