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

Откуда:
Сообщений: 3
MS SQL 2005

Цель: забэкапить несколько баз данных в один файл .bak. Бэкапится раз в день, так что в file/folder должно как то фиксироваться %date% . Баз около 10, в примере покажу 2(чтоб не захламлять).

Пытался сначала через Managements/Maintenance Plans/Back Up Database Task
Никак в настройках не нашел как поставить не статичное имя выходного файла.

Ок. Перешел на "Execute T-SQL Statement Task". Код:

declare @backupfile_name varchar(8000)
set @backupfile_name = 'D:\backup\test_' + CONVERT(char(8), GETDATE(), 112) +'_'+REPLACE(CONVERT(char(8), GETDATE(), 108), ':', '')+ '.bak'
BACKUP DATABASE [ads] TO DISK = @backupfile_name WITH RETAINDAYS = 14, NOFORMAT, NOINIT, NAME = N'ads_backup_20121208202632', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [ads_imagedb] TO DISK = @backupfile_name WITH RETAINDAYS = 14, NOFORMAT, NOINIT, NAME = N'ads_imagedb_backup_20121208202632', SKIP, REWIND, NOUNLOAD, STATS = 10
GO



Result:
" failed with the following error: "Необходимо объявить скалярную переменную "@backupfile_name".
Неправильный синтаксис около ключевого слова "with". Если данная инструкция является обобщенным табличным выражением или предложением xmlnamespaces, предыдущую инструкцию необходимо завершать точкой с запятой.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

После первого GO инфа о дате затирается. Как использовать переменную в разных пакетах пока не нашел.
8 дек 12, 21:07    [13601013]     Ответить | Цитировать Сообщить модератору
 Re: backup several database  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
1. Переменную в разных пакетах использовать нельзя.
2. В вашем случае все можно сделать в одном пакете.
3. Не надо складывать кучу бекапов в один файл.
8 дек 12, 21:30    [13601054]     Ответить | Цитировать Сообщить модератору
 Re: backup several database  [new]
guest123456
Guest
chameleon89,

  • Отправлять всё одним пакетом
  • Объявлять переменную в каждом пакете
  • Использовать вместо переменной временную таблицу
  • 8 дек 12, 21:31    [13601055]     Ответить | Цитировать Сообщить модератору
     Re: backup several database  [new]
    chameleon89
    Member

    Откуда:
    Сообщений: 3
    invm
    Переменную в разных пакетах использовать нельзя.


    :) я это уже понял, ищу решение

    invm
    В вашем случае все можно сделать в одном пакете.
    &
    guest123456
    Отправлять всё одним пакетом


    Если правильно понял то так (не силен в синтаксисе T SQL и терминалогии):

    declare @backupfile_name varchar(8000)
    set @backupfile_name = 'D:\backup\test_' + CONVERT(char(8), GETDATE(), 112) +'_'+REPLACE(CONVERT(char(8), GETDATE(), 108), ':', '')+ '.bak'
    BACKUP DATABASE [ads] TO DISK = @backupfile_name WITH RETAINDAYS = 14, NOFORMAT, NOINIT, NAME = N'ads_backup_20121208202632', SKIP, REWIND, NOUNLOAD, STATS = 10
    BACKUP DATABASE [ads_imagedb] TO DISK = @backupfile_name WITH RETAINDAYS = 14, NOFORMAT, NOINIT, NAME = N'ads_imagedb_backup_20121208202632', SKIP, REWIND, NOUNLOAD, STATS = 10
    GO


    Result: " failed with the following error: "Неправильный синтаксис около конструкции "GO".". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

    Надеюсь (если такое возможно) добрые люди сразу поправят код, чтоб я дальше не задавал глупых вопросов )

    invm
    Не надо складывать кучу бекапов в один файл.


    Конечно складывать все яйца в одну корзину не хорошо, но если посмотреть с другой стороны то при восстановлении баз, потребуется работать лишь с одним файлом а не с n количеством. Хочется все таки экспортнуть в один файл с %date%, без даты все работает безупречно

    guest123456
    Использовать вместо переменной временную таблицу


    Хочется что-то поизящней чем использовать таблицу для такой мелочи как работа с строковыми переменными в T SQL скрипте.
    8 дек 12, 22:46    [13601249]     Ответить | Цитировать Сообщить модератору
     Re: backup several database  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9406
    chameleon89
    Result: " failed with the following error: "Неправильный синтаксис около конструкции "GO".". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
    GO -- это не инструукция T-SQL, а разделитель пакетов в SSMS, sqlcmd и т.п.
    chameleon89
    Конечно складывать все яйца в одну корзину не хорошо, но если посмотреть с другой стороны то при восстановлении баз, потребуется работать лишь с одним файлом а не с n количеством. Хочется все таки экспортнуть в один файл с %date%, без даты все работает безупречно
    Ну да, ну да. Указывать разные файлы плохо, а указывать один файл и номер резервного набора в нем -- хорошо. Не говоря уже о том, что потеря файла ведет к потере всех бекапов в нем.
    8 дек 12, 23:38    [13601415]     Ответить | Цитировать Сообщить модератору
     Re: backup several database  [new]
    chameleon89
    Member

    Откуда:
    Сообщений: 3
    Ох блин, сколько всего советов и не одного нужного.
    Да я понимаю что хранить все бэкапы в одном файле это не безопасно. НО я не создал тему "А считаете ли вы что мой подход к резервированию данных является безопасным?". Ключевым в моей задаче является привязка даты.

    Даже если хранить в разных файлах bak. Одна база = один файл. Мне все равно нужна привязка к дате.
    Выглядеть это будет к примеру:
    D:\backup\test_ads_backup_201212091313.bak, для базы [ads]
    D:\backup\test_ads_imagedb_backup_201212091313.bak, для базы [ads_imagedb]
    ....

    но, тут опять переменные для каждой базы (path + date) и потом использовать в инструкции BACKUP

    Короче не буду больше мучить глупыми вопросами, сделаю генерацию даты в каждом пакете как советовал guest123456
    только не через формат "yyyymmddhhmm" а через "yyyymmdd", и не буду запускать в разрезе дня. + папку прикручу папку. Т.е. в результате будет так.
    D:\backup\20121208\ads.bak для базы [ads]
    D:\backup\20121208\ads_imagedb.bak для базы [ads_imagedb]
    ...

    PS: to invm Ситуация потери файла в котором все бэкапы плохо. Но еще хуже ситуация когда автоматическое резервное копирование не настроено. Ты как более опытный смотришь в даль, выявляешь нерациональность, согласен. Но мне сейчас надо добиться выполнения автоматики а потом уже оптимизировать, один ли это файл или много файлов пока не актуально. К тому же если и рассматривать ситуацию безопасности, то по хорошему (как я вижу), бэкапить надо будет на разные сетевые диски. Вдруг сетевой диск то полетит. От MS SQL сервера надо будет писать задачу рассписания бэкапа на разные сетевые диски (что не является проблемой, т.к. статичная информация), проблема привязке к дате (динамическая информация). Но хотя если не учитывать формат часов:минут, то все норм, хоть и криво
    9 дек 12, 12:37    [13602179]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить