Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
И снова здравствуйте.
Существует multi-job для бэкапирования БД, модель которых стоит FULL
Скрипт в job:
DECLARE @DBName       VARCHAR(64)
DECLARE @RecoverModel INT
DECLARE @cmd          NVARCHAR(2048)

-- Курсор по БД
DECLARE DB_Curs CURSOR FOR
  SELECT
    d.name,
    d.recovery_model
  FROM
    sys.databases d
  ORDER BY
    d.name

OPEN DB_Curs
FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel

WHILE @@FETCH_STATUS = 0
BEGIN
  -- BACKUP
  IF @RecoverModel = 1
  BEGIN
  	-- DB
    EXEC Create_Backups @DBName, 'FULL'
    
    -- LOG
    SET @cmd = 'BACKUP LOG ' + @DBName + ' TO DISK=''NUL:'''
    EXECUTE sp_executesql @cmd
  END

-- SHRINK DB
  SET @cmd = 'DBCC SHRINKDATABASE (' + @DBName + ')'
  EXECUTE sp_executesql @cmd

-- SHRINK LOG
  SET @cmd = 'USE ' + @DBName + '
              DBCC SHRINKFILE(2, 1)'
  EXECUTE sp_executesql @cmd

  FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel
END

-- Закрытие курсора
CLOSE DB_Curs
DEALLOCATE DB_Curs


На одном из серверов запрос для курсора по БД
  SELECT
    d.name,
    d.recovery_model
  FROM
    sys.databases d
  ORDER BY
    d.name

Возвращает следующий набор:
namerecovery_model
Admin1
BIInterfaceRTL3
BSOInterfaceRTL3
distribution3
Interface1
master3
MIO1
model3
msdb3
RTL1
RTLAgentIntfAdmin3
RTLAgentIntfDB3
SQLInterface3
Temp3
tempdb3


При запуске джоба или при запуске скрипта из ssms делаются бэкапы только для Admin, Interface либо только для Admin. При этом ошибок никаких не возвращает. Остальные БД с моделью FULL остаются не у дел.

Куда копать? Что смореть?

P.S.: такое поведение замечено на разных серверах, но закономерности не выявлено.
1 окт 13, 10:39    [14905170]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Куда копать? Что смореть?

Копать в сторону того, что вы получаете в
-- Курсор по БД
DECLARE DB_Curs CURSOR FOR
SELECT
d.name,
d.recovery_model
FROM
sys.databases d
ORDER BY
d.name

потому что все бэкапы делаются по этому курсору.
1 окт 13, 10:42    [14905189]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Так в том и дело, что запрос выдаёт правильные данные. Они приведены выше. Для тех БД, у которых модель FULL - делается бэкап, для остальных - шринк. Почему он выходит из цикла по курсору не пройдя по всем БД?
1 окт 13, 10:49    [14905229]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Так в том и дело, что запрос выдаёт правильные данные.

Это вы выполнение джоба мониторили на каждом сервере? Или просто запустили код в своем коннекте ?

BuKTaP
Почему он выходит из цикла по курсору не пройдя по всем БД?

Вот интересно, а откуда вы знаете
- сколько итераций цикла должно было быть ?
- и что их выполнилось меньше ?

Сообщение было отредактировано: 1 окт 13, 10:52
1 окт 13, 10:51    [14905238]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Гость333
Member

Откуда:
Сообщений: 3683
BuKTaP
Существует multi-job для бэкапирования БД, модель которых стоит FULL
    -- LOG
    BACKUP LOG @DBName TO DISK='NUL:'

Бэкапим весело, задорно, с огоньком!
А зачем вам модель восстановления FULL, вообще?

BuKTaP
На одном из серверов запрос для курсора по БД
...

Возвращает следующий набор:

Запрос, запущенный под какой учёткой?
1 окт 13, 10:52    [14905245]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Вот интересно, а откуда вы знаете
- сколько итераций цикла должно было быть ?
- и что их выполнилось меньше ?

Пробовал так. Писал PRINT после каждого оператора и отслеживал, но опять же каждый раз получал разное поведение. К примеру, последняя запись от PRINT-а была не последней БД, которая должна была обработаться. Или как нужно? Прелождите свой вариант.

Запрос, запущенный под какой учёткой?

Под sa. Owner джоба тоже sa.
1 окт 13, 11:18    [14905434]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Пробовал так. Писал PRINT после каждого оператора и отслеживал, но опять же каждый раз получал разное поведение. К примеру, последняя запись от PRINT-а была не последней БД, которая должна была обработаться. Или как нужно? Прелождите свой вариант.

Вот как вам PRINT вывел, сколько записей _всего_ в курсоре. Расскажите
1 окт 13, 11:19    [14905452]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Под sa. Owner джоба тоже sa.

Владелец джоба - это не тот логин, под которым будут выполняться шаги джоба.
1 окт 13, 11:21    [14905466]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
И к чему повторять тему ?
https://www.sql.ru/forum/1048150/ne-otrabatyvaet-job?hl=
1 окт 13, 11:22    [14905474]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Glory
BuKTaP
Пробовал так. Писал PRINT после каждого оператора и отслеживал, но опять же каждый раз получал разное поведение. К примеру, последняя запись от PRINT-а была не последней БД, которая должна была обработаться. Или как нужно? Прелождите свой вариант.

Вот как вам PRINT вывел, сколько записей _всего_ в курсоре. Расскажите


Ну вот если так, к примеру:
DECLARE @cnt INT
SET @cnt = 0
-- Курсор по БД
DECLARE DB_Curs CURSOR FOR
  SELECT
    d.name,
    d.recovery_model
  FROM
    sys.databases d
  ORDER BY
    d.name

OPEN DB_Curs
FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel

WHILE @@FETCH_STATUS = 0
BEGIN
  SET @cnt = @cnt + 1
  FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel
END

-- Закрытие курсора
CLOSE DB_Curs
DEALLOCATE DB_Curs

SELECT @cnt

Это правильное получение количества записей в курсоре?

И к чему повторять тему ?

Там ошибка была в другом. Моя вина, что не написал что к чему (сейчас исправлюсь). В том топике я для упрощения убрал одну проверку, собственно по причине которой не работало.
IF NOT EXISTS (SELECT TOP 1
                 1
               FROM
                 OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;',
                            ' exec msdb..sp_help_job @execution_status = 1') AS a
               WHERE
                 (UPPER(a.name) LIKE '%BACKUP%'))

И джоб, который к моменту проверки был уже запущен, попадал под это условие, т.к. в его имени присутствовало слово 'BACKUP'.
Собственно всё, что после этого и не выполнялось.

В этом варианте такой проверки нет, т.к. это первый бэкап в сутки.
1 окт 13, 11:37    [14905605]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
В этом варианте такой проверки нет, т.к. это первый бэкап в сутки.

Автор кода все равно тот же.

BuKTaP
Это правильное получение количества записей в курсоре?

Поставьте куда нибудь вывод результата
SELECT
d.name,
d.recovery_model
FROM
sys.databases d
ORDER BY
d.name
1 окт 13, 11:41    [14905642]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Ставил до и после закрытия/открытия курсора

Ставил до и после
  SET @cnt = @cnt + 1
  FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel


Ставил и в начале, и в конце.
Результат тот же.
1 окт 13, 11:48    [14905709]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Ставил до и после закрытия/открытия курсора

Мда.
Вы опять пытаетесь уверить, что сервер криво выполняет ваш прекрасный код ?

BuKTaP
Ставил до и после
  SET @cnt = @cnt + 1
  FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel



Ставил и в начале, и в конце.

И это показывает, что число выполненных итераций меньше числа записей в курсоре ?
1 окт 13, 11:53    [14905746]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Как мне тогда посчитать количество итераций в курсоре?
1 окт 13, 11:55    [14905771]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Как мне тогда посчитать количество итераций в курсоре?

Мда.
Вы прнимаете ответы вообще ?
Проблема не в том, как подсчитать число интераций. А как сравнить число выполненных итераций с общим цислом итераций в цикле.
Потому точ вы уверяете, что сервер делает меньше итераций, чем должен.
1 окт 13, 11:58    [14905798]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Ок. Подскажите тогда, как сравнить число выполненных итераций с общим цислом итераций в цикле?
1 окт 13, 12:09    [14905879]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
Перечитать ответы
1 окт 13, 12:10    [14905887]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
автор
Поставьте куда нибудь вывод результата
SELECT
d.name,
d.recovery_model
FROM
sys.databases d
ORDER BY
d.name


Можно указать пальцем в какое конкретно место это поставить, а не "куда-нибудь"?
1 окт 13, 12:18    [14905960]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Можно указать пальцем в какое конкретно место это поставить, а не "куда-нибудь"?

Вам знакома команда INSERT ? Вы умеете добавлять данные запросов в таблицы ? А изменять данные в таблицах командой UPDATE
1 окт 13, 12:23    [14906003]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
DECLARE @ttt TABLE (dbname VARCHAR(64), rec_mod INT, rrr NVARCHAR(100))
DECLARE @DBName       VARCHAR(64)
DECLARE @RecoverModel INT
-- Курсор по БД
DECLARE DB_Curs CURSOR FOR
  SELECT
    d.name,
    d.recovery_model
  FROM
    sys.databases d
  ORDER BY
    d.name

OPEN DB_Curs
FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel

WHILE @@FETCH_STATUS = 0
BEGIN
IF @RecoverModel = 1
  BEGIN
    INSERT INTO @ttt (dbname, rec_mod, rrr)
    VALUES (@DBName, @RecoverModel, 'Бэкап нужен')
  END
ELSE
  BEGIN
    INSERT INTO @ttt (dbname, rec_mod, rrr)
    VALUES (@DBName, @RecoverModel, 'Бэкап не нужен')
  END
	
  FETCH NEXT FROM DB_Curs INTO @DBName, @RecoverModel
END

-- Закрытие курсора
CLOSE DB_Curs
DEALLOCATE DB_Curs

SELECT * FROM @ttt


Результат:
dbname rec_mod rrr
Admin1Бэкап нужен
BIInterfaceRTL3Бэкап не нужен
BSOInterfaceRTL3Бэкап не нужен
distribution3Бэкап не нужен
Interface1Бэкап нужен
master3Бэкап не нужен
MIO1Бэкап нужен
model3Бэкап не нужен
msdb3Бэкап не нужен
RTL1Бэкап нужен
RTLAgentIntfAdmin3Бэкап не нужен
RTLAgentIntfDB3Бэкап не нужен
SQLInterface3Бэкап не нужен
Temp3Бэкап не нужен
tempdb3Бэкап не нужен


И что мне это дало?
1 окт 13, 12:36    [14906162]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Max_Хацкер
Member

Откуда: Челябинск
Сообщений: 154
Воспользуйся этим чтобы узнать сколько записей вернул SELECT.
1 окт 13, 12:36    [14906165]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
И что мне это дало?

То, что ошибка, прерывающая цикл опять где-то внури ваших процедур
1 окт 13, 12:40    [14906198]     Ответить | Цитировать Сообщить модератору
 Re: multi-job по бэкапированию  [new]
Max_Хацкер
Member

Откуда: Челябинск
Сообщений: 154
А почему команды запускаются через sp_executesql?
1 окт 13, 13:18    [14906560]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить