Автоматизируем "перезаливку" баз (Скрипты для SQL-Server - Часть 1)

0. Tavalik 2934 15.03.18 16:26 Сейчас в теме
Предлагаю вашему вниманию несколько SQL-скриптов (для MS SQL-Server) для автоматизации процесса резервного копирования и восстановления баз данных. Скрипты для восстановления позволяют "перезаливать" базы данных, т. е. восстанавливать одну базу из копий другой базы данных. Все скрипты формируют лог для вывода и при необходимости могут отправлять результат работы по электронной почте.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Armando 1399 16.03.18 23:14 Сейчас в теме
Еще частый сценарий это создание резервной копии БД на одном сервере и восстановление в БД на другом сервере.
Например, рабочие базы на своих серверах, а тестовые на отдельном. И надо загрузить копию рабочей базы в тестовую базу.
romankoav; Andy_NTG; +2 Ответить
3. Armando 1399 17.03.18 23:25 Сейчас в теме
(2) Жесть какая. Почему-то я скептически отношусь к oscript.
В принципе у нас все тоже самое, но на bat файлах.
5. webester 26 18.03.18 06:45 Сейчас в теме
(3) Действительно жесть.
- Это все авно!
- Почему?
- Ну я так решил...
rrustam11983; +1 Ответить
13. пользователь 15.05.18 05:47
Сообщение было скрыто модератором.
...
21. romankoav 09.03.23 17:11 Сейчас в теме
(1) А это можно сделать в рамках одного скрипта?
22. Armando 1399 09.03.23 19:37 Сейчас в теме
(21) у нас это был один скрипт + хранимая процедура. В скрипте было создание резервной копии и копирование ее на тестовый сервер, а там вызывалась хранимая процедура, в которой были шаги по восстановлению, очистка объемных таблиц и что-то ещё. Но в принципе можно было и одним сделать, просто это не за один присест рождалось.
4. nvv1970 18.03.18 01:59 Сейчас в теме
Блин, ну это вообще детский сад какой-то...
Где например определение имени последнего бэкапа, если бэкапы идут с разными именами?

SEL ECT  @@Servername AS ServerName ,
        d.Name AS DBName ,
        b.Backup_finish_date ,  b.[type],
        bmf.Physical_Device_name
FR OM    sys.databases d
        INNER JOIN msdb..backupset b ON b.database_name = d.name AND b.[type] = 'D'
        INNER JOIN msdb.dbo.backupmediafamily bmf ON b.media_set_id = bmf.media_set_id
ORDER BY d.NAME , b.Backup_finish_date DESC;
6. German 412 20.03.18 06:50 Сейчас в теме
Лучше этого еще ничего не встречал
https://www.red-gate.com/products/dba/sql-backup/ дорого, но оно того стоит
7. Mi11er 95 20.03.18 12:20 Сейчас в теме
8. ershz 21.03.18 16:57 Сейчас в теме
В секции, где восстановление базы - неплохо бы отключить существующие подключения

DECLARE @SQLString1 NVARCHAR(4000)
-------------------------------------------

BEGIN TRY 
 set @SQLstring1= 'alt er   database [' +@DBName_To+ ']  SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
 exec @SQLstring1
	EXEC sp_executesql @SQLString

set @SQLstring1= 'alt er   database [' +@DBName_To+ ']  SET MULTI_USER ' 
exec @SQLstring1

END TRY
Показать
18. user1406861 23.12.21 09:28 Сейчас в теме
(8) Ваш вариант нерабочий, но спасибо за наводку. Я его немного исправил и теперь действительно можно перезаливать базу, если в ней есть активные сеансы (они будут завершены)

P.S. форма кода почему-то автоматически разделяет команду "ALTER" на "ALT ER" - нужно удалить пробел при копировании кода!

	-- tweak: ЗАВЕРШЕНИЕ АКТИВНЫХ СЕАНСОВ В БАЗЕ путем перевода в однопользовательский режим и обратно
	BEGIN TRY
		SET @SQLstring= 'ALT ER     DATABASE ' +@DBName_To+ ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'
		EXEC sp_executesql @SQLString
		SET @SQLstring= 'ALT ER     DATABASE ' +@DBName_To+ ' SET MULTI_USER;' 
		EXEC sp_executesql @SQLString
	END TRY
	BEGIN CATCH  
		-- Ошбика выполнения операции
		SET @subject = 'ОШИБКА ВОССТАНОВЛЕНИЯ базы данных ' + @DBName_To
		SET @finalmassage = 'Ошибка перевода базы в одно- или многопользовательский режим ' + @DBName_To + CHAR(13) + CHAR(13)
			+ 'Код ошибки: ' + CAST(ERROR_NUMBER() as nvarchar(10)) + CHAR(13) + CHAR(13)
			+ 'Текст ошибки: ' + ERROR_MESSAGE()  + CHAR(13) + CHAR(13)
			+ 'Текст T-SQL:' + CHAR(13) + @SQLString  
	END CATCH;
Показать
9. bforce 479 02.05.18 17:21 Сейчас в теме
Хорошо, когда разработчик делает что-то своими руками. Это повышает компетентность и это здорово!
Но, как обычно, все уже придумано до нас. Ну и на github есть https://github.com/olahallengren/sql-server-maintenance-solution.
Silenser; ershz; +2 Ответить
10. пользователь 02.05.18 20:04
Сообщение было скрыто модератором.
...
11. blackhole321 1274 09.05.18 16:45 Сейчас в теме
Ну вот же нормальный подход, и без всяких там консольных утилит с параметрами ;)
12. Tavalik 2934 11.05.18 06:55 Сейчас в теме
(11)
Спасибо, конечно. Только там эти же скрипты, с той лишь разницей, что запуск из командной строки.
14. isaev2016 04.02.20 10:47 Сейчас в теме
15. user1308398 21.05.20 00:04 Сейчас в теме
Если в имени базы есть "-" то выдает ошибку
Сообщение 102, уровень 15, состояние 1, строка 1
Incorrect syntax near '-'.
Сообщение 319, уровень 15, состояние 1, строка 2
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

Как лечить?
А так скрипт, очень выручит.
16. jem 83 24.08.20 09:04 Сейчас в теме
Мне помогло. Спасибо! Даже если это велосипед, то дает скил для дальнейшего развития. Таким образом мы учимся. Комменты тоже полезны.
user1406861; +1 Ответить
17. finist7490 08.10.20 23:06 Сейчас в теме
Спасибо, полезные скрипты! А как такую же перезаливку на PostgreSQL сделать?
19. user1406861 23.12.21 10:16 Сейчас в теме
Кстати, автор, почему у тебя в условиях стоит какая-то двойка ?
IF @subject = '2'

Эти блоки кода ведь просто игнорируются, нигде не нашел, чтобы в переменной subject присваивалась цифра 2
Для успешного выполнения условия нужно указывать:
IF @subject = ''
20. rrustam11983 17.01.22 11:48 Сейчас в теме
Сам писал скрипты по восстановлению. Сейчас жалею что не нашел тогда вашу статью. Всё четко, лаконично и именно так как надо. Хочу сказать спасибо большое автору за проделанную работу.
Оставьте свое сообщение
Вакансии
Аналитик 1C
Москва
зарплата от 120 000 руб. до 250 000 руб.
Полный день

Начальник отдела программирования
Уфа
зарплата от 125 000 руб.
Полный день

Программист/тестировщик
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день

Программист 1С
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день