Резервное копирование и восстановление: BACKUP DATABASE, RESTORE
🔄 Зачем нужно резервное копирование?
Базы данных — это сердце приложений. Представь: месяцы работы, тысячи записей, критичные транзакции... и вдруг — сбой диска, человеческая ошибка или зловредный вирус. Резервные копии — это страховка от катастрофы!
Три главные причины:
- 💾 Аппаратные сбои (диски не вечны)
- 🧑💻 Ошибки разработчиков (DELETE без WHERE случается)
- 🔥 Стихийные бедствия (дата-центры тоже горят)
🛠️ Основные команды 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';
🚨 Чего НЕЛЬЗЯ делать
- Хранить бэкапы на том же диске, что и сама БД
- Доверять только автоматическим решениям без проверки
- Игнорировать тестирование восстановления
- Использовать общие учётные записи для доступа к бэкапам
Помни: резервная копия, которую нельзя восстановить — это просто бесполезный файл!