Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
Moriarti
Member

Откуда: Ultima Thule
Сообщений: 744
Как известно, в редакции SQL Express 2005 отсутствует важный компонент: SQL Agent, что, естесственно не дает создавать на этих серверах так называемый Database Maintenance Plan, то бишь обслуживание: переиндексацию, проверку баз и снятие бакапов.

Однако, ситуация, вообще говоря, не катастрофическая, потому что механизм запуска набора SQL команд на определенном сервере по расписанию, реализуем без особых проблем.

Предлагаю на всеобщее обсуждение ряд своих наработок по этому вопросу,
возможно кому-то они пригодяться. Так же выслушаю любые замечания по поводу моего скрипта.

Часть I.
Снятие Backup'ов


Эту задачу, я реализовывал через запуск bat'ника по расписанию уже довольно давно. Все что мне оставалось - это "причесать" ее и немного адаптировать.
Кстати, работоспособность скрипта не только SQL Express - а любой SQL Server 2000/2005

Вот, что получилось:

backup.cmd - исполняемый bat файл, формат запуска:
BACKUP {Имя базы данных} {Логин} {Пароль}

Внимание!
Для нормального функционирования необходимо:

  • Архиватор WinRar. Скачать можно здесь -> http://www.rarlab.com/rar/wrar351ru.exe
  • Утилиту из Windows Resource Kit forfiles.exe. Скачать можно здесь -> ftp://ftp.microsoft.com/ResKit/y2kfix/x86/forfiles.exe
  • Внести исправления в текст backup.cmd, указав правильные параметры (они определяются в начале файла)

    Немного о том, что же делает этот скрипт, с учетом того, что он правильно настроен, конечно:

  • Это серверный скрипт, его нужно запускать непосредственно на SQL Server'e. Теоретически, можно было сделать и серверо-независимый скрипт снятия бакапа, но мне показалось это решение было бы неправильным, потому что скрипты обслуживания сервера должны находиться на самом сервере
  • Итак, скрипт cmd (он же bat) - создает backup device для указанной базы и делает в нем ее полный backup, формируя имя файла следующим образом:
    Имя_базы_ДД_ММ_ГГГ.bcp
  • Запаковывает ее архиватором rar (расположение rar.exe указывается переменной %rar%. В перспективе, думаю можно рассмотреть вопрос перехода на какой-нибудь freeware архиватор, к примеру 7-Zip, а так же закрытие архива паролем)
  • Копирует созданный архив на два указанных источника хранения архивов: %Path01% и %Path02%. Если путь не указан, копирование архива не производится. По поводу целесообраности копирования на удаленные компьютеры можно конечно поспорить, однако мой опыт говорит о необходимости дублирования важной информации на разных компьютерах.
    - Удаляет "старые" архивы, старше определенного "возраста". (Используя утилиту из RKit'a forfiles.exe)


    @echo off 
    rem Важно !!! Кодировка DOS !!!
    rem ************************************************ 
    rem * Backup.cmd - архивирование базы              * 
    rem * Последние изменения : 21.03.2006 г., 19:18   * 
    rem * (с) 2003,2004,2006 Бочкарев Николай          * 
    rem ************************************************ 
    
    set Database=%1 
    set Login=%2 
    set Password=%3 
    
    if '%Database%'=='' goto :Usage 
    if '%Database%'=='/?' goto :Usage 
    
    rem !!!! В случае длинных имен - указывать БЕЗ КАВЫЧЕК !!! 
    
    rem Путь к каталогу бакапов на сервере 
    set Backup=D:\MSSQL\BACKUP 
    rem Microsoft SQL Server Command Line Tool 
    set ISQL=C:\PROGRA~1\MICROS~3\90\TOOLS\BINN\osql.exe 
    rem Имя SQL Server'a 
    set SQLServer=ALPHA 
    set BackupUser=%Login% 
    rem Утилита архивирования командной строки 
    set RAR=C:\PROGRA~1\WINRAR\rar.exe 
    rem Утилита forfiles - для запуска процедуры удаления дла старых бакапов 
    set FORFILES=C:\Scripts\forfiles.exe 
    rem Удалять бакапы, старше этого количества дней 
    set Days=90 
    
    rem Сетевые ресурсы для резервного копирования 
    rem В случае, если копирование по сети не нужно, установите пути пустыми 
    Set Path01=\\ALPHA\D$\Backups 
    Set Path02=\\CHICAGO\Disk\Backups 
    rem Лог файл о результатах копирования, в случае, если копирование не ведется, не используется 
    set Log=c:\backup_log.txt 
    
    rem Проверки 
    IF NOT EXIST "%ISQL%" (echo Microsoft SQL Server Command Line Tool "%ISQL%" не найден! 
    echo Поправьте значение переменной ISQL в командном файле! 
    goto :EOF) 
    IF NOT EXIST "%RAR%" (echo Архиватор "%RAR%" не найден! 
    echo Поправьте значение переменной RAR в командном файле! 
    goto :EOF) 
    IF NOT EXIST "%FORFILES%" (echo Утилита "%FORFILES%" не найдена! 
    echo Поправьте значение переменной FORFILES в командном файле! 
    goto :EOF) 
    IF NOT EXIST "%backup%" (echo Каталог бакапов "%Backup%" не найден! 
    echo Поправьте значение переменной BACKUP в командном файле! 
    goto :EOF) 
    
    if NOT '%Path01%'=='' (IF NOT EXIST "%Path01%" (echo Каталог бакапов "%Path01%" не найден! 
      echo Поправьте значение переменной Path01 в командном файле! 
      echo %date% %time% Поправьте значение переменной Path01 в командном файле! >> %log% 
      set Path01=) 
    ) 
    if NOT '%Path02%'=='' (IF NOT EXIST "%Path02%" (echo Каталог бакапов "%Path02%" не найден! 
      echo Поправьте значение переменной Path02 в командном файле! 
      echo %date% %time% Поправьте значение переменной Path02 в командном файле! >> %log% 
      set Path02=) 
    ) 
    
    for /f "tokens=1-4 delims=. " %%i in ('date /t') do set longdate=%%i%%j%%k 
    set temp=C:\TEMP 
    
    set FileName=%longdate:~0,2%_%longdate:~2,2%_%longdate:~4,4% 
    rem дата в формате 2003_04_12 
    echo Дата: %Filename% 
    echo SQL Server: %SQLServer% 
    echo База данных: %Database% 
    echo. 
    
    echo 1. Снятие Backup... 
    set ArcSQL=%temp%\arcsrv.sql 
    echo USE master > %ArcSQL% 
    
    echo EXEC sp_addumpdevice 'disk', '%Database%_Backup', '%BACKUP%\%Database%_%FileName%.bcp' >> %ArcSQL% 
    echo BACKUP DATABASE %DataBase% TO %Database%_Backup >> %ArcSQL% 
    echo exec sp_dropdevice '%Database%_Backup' >> %ArcSQL% 
    
    "%ISQL%"  -S %SQLServer% -d master -U %BackupUser% -P %Password% -i %ArcSQL% -n 
    
    echo 2. Упаковка backup'а... 
    cd "%BACKUP%" 
    "%RAR%" a "%BACKUP%\%Database%_%FileName%" "%BACKUP%\*%Filename%.bcp" -rr -c -ep -av -idp -id -idc 
    
    
    echo 2. Копирование резервных копий в сети... 
    
    if not '%Path01%'=='' Call :CopyProc "%Path01%" 
    if not '%Path02%'=='' Call :CopyProc "%Path02%" 
    
    echo 3. Лог результата копирования 
    set i=0 
    IF EXIST "%BACKUP%\%Database%_%FileName%.rar" (set /a i=%i%+1) 
    IF EXIST "%Path01%\%Database%_%FileName%.rar" (set /a i=%i%+1) 
    IF EXIST "%Path02%\%Database%_%FileName%.rar" (set /a i=%i%+1) 
    echo %Date% %time% - Backup %Database% завершен! Готово архивов: %i% из 3 >> %log% 
    echo. 
    echo Backup complete 
    
    if /i %i% NEQ 0 (Call :Delete) 
    goto :EoF 
    
    :Delete 
    :удаляю все что старше... 
    "%forfiles%"  -p"%Backup%"  -s -m*.rar -d-%Days% -c"CMD /C del @PATH\@FILE" 
    if not '%Path01%'=='' ("%forfiles%"  -p"%Path01%"  -s -m*.rar -d-90 -c"CMD /C del @PATH\@FILE") 
    if not '%Path02%'=='' ("%forfiles%"  -p"%Path02%"  -s -m*.rar -d-90 -c"CMD /C del @PATH\@FILE") 
    del "%backup%\*.bcp" 
    goto :eof 
    
    :CopyProc 
    echo Копирование... %1 
    copy "%BACKUP%\%Database%_%FileName%.rar" %1 
    goto :eof 
    
    :usage 
    echo. 
    echo   Использование: 
    echo          BACKUP {Имя базы данных} {Логин} {Пароль} 
    goto :eof 
    
    :eof

    После настройки этого скрипта,
    необходимо проверит его работоспособность, запустив из командной строки (например из FAR'a :-) на SQL Server'e
    BACKUP {Имя базы данных} {Логин} {Пароль}
    Причем user {Логин} должен иметь право снимать бакапы, или sa, а затем, добавить "Панель управления"->"Назначенные задания"
    эту команду c параметрами, указав нужное время выполнения
  • 23 мар 06, 21:40    [2483795]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Алексей Коркин
    Member

    Откуда:
    Сообщений: 1
    Доброго времени суток.
    у меня вышло следующее сообщение:

    C:\temp\Alexey\batniki>backup
    Непредвиденное появление: '==.

    запускал с командной строки.
    Что я не так сделал.
    8 июл 06, 09:32    [2857637]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Moriarti
    Member

    Откуда: Ultima Thule
    Сообщений: 744
    Закоментируйте или уберите @echo off в батнике и напишите результат выполнения.

    Из известных проблем использования этого скрипта могу отметить проблему концевых пробелов в переменных и путях.

    Например, при вставке пути из FAR'a,
    к пути всегда прибавляется пробел и получается
    "set Backup=D:\MSSQL\BACKUP ",
    что приводт к ошибкам.
    8 июл 06, 23:27    [2858597]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    MARINA_MAL
    Member

    Откуда:
    Сообщений: 287
    Молодец!
    А почему больше никто ме продолжил тему?
    14 июл 06, 09:04    [2879455]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Onix-JCV
    Member

    Откуда:
    Сообщений: 17
    скажи пожалуйста, автор
    а если используем Windows Autentification?
    как быть в таком случае?
    21 мар 07, 16:15    [3925209]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Moriarti
    Member

    Откуда: Ultima Thule
    Сообщений: 744
    Onix-JCV
    скажи пожалуйста, автор
    а если используем Windows Autentification?
    как быть в таком случае?


    В таком случае нужно модифицировать скрипт- в месте где запускается osql.exe, добавив включ -E

    автор
    If you specify -E, osql requests a Windows Authentication connection using your current Windows login account. This is the most secure option for connecting to an instance of SQL Server.


    http://msdn2.microsoft.com/en-us/library/aa213088(SQL.80).aspx
    7 май 07, 14:24    [4108289]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    SanyL
    Member

    Откуда: Москва
    Сообщений: 4540
    У меня подобное выполняют 3и хранимые процедуры, правда неархивирую изначально (так задумано), бэкапят, делают проверку бэкапа а потом по результатам удаляют старые накопившиеся логи транзакций, причем пути стоит брать из БД msdb.

    Из замечаний - путь к утилите ISQL на мой взгляд лучше не указывать... так как к ней можно обратиться просто по ее имени, и при переустановке MSSQL в новое место люди часто забывают поправить окружение, т.е. указание пути может стать некоторой проблемкой...

    скрипты выложить не могу - потому как сейчас нахожусь не на работе а в университете...
    7 май 07, 17:20    [4109627]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Глюкман
    Member

    Откуда: Бийск
    Сообщений: 426
    ошибки почему-то выдает!

    формирует файл:
    USE master 
    EXEC sp_addumpdevice 'disk', 'BK-SQL_Backup', 'D:\BackUpSQL\BK-SQL_29_05_2007.bcp' 
    BACKUP DATABASE 'BK-SQL' TO 'BK-SQL_Backup' 
    exec sp_dropdevice 'BK-SQL_Backup' 

    выдаёт ошибку:
    Сообщение 102, уровень 15, состояние 1, сервер SERVER\SQLEXP, строка 3
    Неправильный синтаксис около конструкции "BK-SQL".

    rem Имя SQL Server'a 
    set SQLServer=SERVER\SQLEXP

    запуск делаю так:

    backup BK-SQL

    что не так?
    29 май 07, 08:46    [4196378]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Глюкман
    Member

    Откуда: Бийск
    Сообщений: 426
    главное открываю созданный скрипт в "Studio Express"
    меняю ' на " и запускаю, всё работает

    если же меняю в самом батнике, то выдаёт туже ошибку:
    Сообщение 102, уровень 15, состояние 1, сервер SERVER\SQLEXP, строка 3
    Неправильный синтаксис около конструкции "BK-SQL".
    29 май 07, 08:59    [4196414]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Knyazev Alexey
    Member

    Откуда: Екб -> Мск
    Сообщений: 10233
    Блог
    Глюкман
    главное открываю созданный скрипт в "Studio Express"
    меняю ' на " и запускаю, всё работает

    если же меняю в самом батнике, то выдаёт туже ошибку:
    Сообщение 102, уровень 15, состояние 1, сервер SERVER\SQLEXP, строка 3
    Неправильный синтаксис около конструкции "BK-SQL".


    - - это недопустимый символ,
    поэтому замените BK-SQL на [BK-SQL]
    29 май 07, 09:05    [4196429]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Глюкман
    Member

    Откуда: Бийск
    Сообщений: 426
    блин, точно, спасибо)

    С таким ником можно горы свернуть в сети!
    (С) Programmer_Ortodox
    29 май 07, 11:48    [4197735]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    я
    Guest
    -- This script make a full backup for all databases

    declare @dirPath varchar(260)
    declare @dirPathDatabase varchar(260)
    declare @fileName varchar(260)
    declare @destFilePath varchar(260)
    declare @timeStamp varchar(30)
    declare @CMD2000 varchar(260)

    select @dirPath = 'D:\Backups'

    IF SUBSTRING(@@version,23,4)='2000'
    DECLARE databases_cursor CURSOR
    FOR SELECT name FROM master.dbo.sysdatabases
    WHERE (status & 32 <> 32)
    AND (status & 64 <> 64)
    AND (status & 128 <> 128)
    AND (status & 256 <> 256)
    AND (status & 512 <> 512)
    and name != 'tempdb'
    ELSE
    DECLARE databases_cursor CURSOR
    FOR SELECT name from master.sys.databases
    WHERE state=0 and name != 'tempdb'



    select @timeStamp = convert(char(8),getdate(),112) + '_' + replace(convert(char(8),getdate(),8),':','_')

    OPEN databases_cursor
    DECLARE @DatabaseName sysname
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    select @fileName = @DatabaseName + '_Backup_' + @timeStamp
    select @destFilePath = @dirPath + '\' + @DatabaseName + '\' + @filename + '.bak'
    select @dirPathDatabase = @dirPath + '\'+ @DatabaseName

    IF SUBSTRING(@@version,23,4)='2000'
    BEGIN
    select @CMD2000 = 'mkdir ' + @dirPathDatabase
    exec master.dbo.xp_cmdshell @CMD2000
    END
    ELSE
    EXECUTE master.dbo.xp_create_subdir @dirPathDatabase
    BACKUP DATABASE @DatabaseName TO DISK = @destFilePath WITH NOFORMAT, NOINIT,NAME = @fileName, SKIP, REWIND, NOUNLOAD, STATS = 10
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    END
    CLOSE databases_cursor
    DEALLOCATE databases_cursor
    29 май 07, 11:57    [4197807]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    я
    Guest
    -- This script make a transaction LOG backup for all databases in FULL or BULK LOGGED model

    declare @dirPath varchar(260)
    declare @dirPathDatabase varchar(260)
    declare @fileName varchar(260)
    declare @destFilePath varchar(260)
    declare @timeStamp varchar(30)
    declare @CMD2000 varchar(260)

    select @dirPath = 'D:\Backups'

    IF SUBSTRING(@@version,23,4)='2000'
    DECLARE databases_cursor CURSOR
    FOR SELECT name FROM master.dbo.sysdatabases
    WHERE (status & 32 <> 32)
    AND (status & 64 <> 64)
    AND (status & 128 <> 128)
    AND (status & 256 <> 256)
    AND (status & 512 <> 512)
    and name != 'tempdb'
    and (DATABASEPROPERTYEX( name , 'Recovery' ) = 'FULL'
    or
    DATABASEPROPERTYEX( name , 'Recovery' ) = 'BULK_LOGGED')
    ELSE
    DECLARE databases_cursor CURSOR
    FOR SELECT name from master.sys.databases
    WHERE state=0
    and name != 'tempdb'
    and (recovery_model_desc = 'FULL'
    or
    recovery_model_desc = 'BULK_LOGGED')


    select @timeStamp = convert(char(8),getdate(),112) + '_' + replace(convert(char(8),getdate(),8),':','_')

    OPEN databases_cursor
    DECLARE @DatabaseName sysname
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    select @fileName = @DatabaseName + '_Backup_' + @timeStamp
    select @destFilePath = @dirPath + '\' + @DatabaseName + '\' + @filename + '.trn'
    select @dirPathDatabase = @dirPath + '\'+ @DatabaseName

    IF SUBSTRING(@@version,23,4)='2000'
    BEGIN
    select @CMD2000 = 'mkdir ' + @dirPathDatabase
    exec master.dbo.xp_cmdshell @CMD2000
    END
    ELSE
    EXECUTE master.dbo.xp_create_subdir @dirPathDatabase
    BACKUP LOG @DatabaseName TO DISK = @destFilePath
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    END
    CLOSE databases_cursor
    DEALLOCATE databases_cursor
    29 май 07, 11:58    [4197820]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    я
    Guest
    -- This script check integrity for all databases

    IF SUBSTRING(@@version,23,4)='2000'
    DECLARE databases_cursor CURSOR
    FOR SELECT name FROM master.dbo.sysdatabases
    WHERE (status & 32 <> 32)
    AND (status & 64 <> 64)
    AND (status & 128 <> 128)
    AND (status & 256 <> 256)
    AND (status & 512 <> 512)
    and name != 'tempdb'
    ELSE
    DECLARE databases_cursor CURSOR
    FOR SELECT name from master.sys.databases
    WHERE state=0 and name != 'tempdb'

    OPEN databases_cursor
    DECLARE @DatabaseName sysname
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    -- PRINT 'Database: ' + @DatabaseName
    EXECUTE ('DBCC CHECKDB (''' + @DatabaseName + ''') ')
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    END
    CLOSE databases_cursor
    DEALLOCATE databases_cursor
    29 май 07, 12:01    [4197832]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    я
    Guest
    -- this script clean up old backups for all databases
    -- NOTE Please change retention period in variable @DayKeep
    -- Please change fullbackup/logbackup in variable @ext


    declare @DayKeep int
    select @DayKeep = 2

    declare @ext varchar(3)
    select @ext = 'bak'
    -- select @ext = 'trn'

    declare @dirPath varchar(260)
    declare @dirPathDatabase varchar(260)
    declare @fileName varchar(260)
    declare @destFilePath varchar(260)
    declare @timeStamp varchar(30)
    declare @CMD2000 varchar(260)
    declare @timeStampDayKeep varchar(30)


    select @timeStampDayKeep = DateAdd(Day, -@DayKeep, getdate())
    select @timeStamp = convert(char(8),DateAdd(Day, -@DayKeep, getdate()),112) + '_??_??_??'
    select @dirPath = 'D:\Backups'

    IF SUBSTRING(@@version,23,4)='2000'
    DECLARE databases_cursor CURSOR
    FOR SELECT name FROM master.dbo.sysdatabases
    WHERE (status & 32 <> 32)
    AND (status & 64 <> 64)
    AND (status & 128 <> 128)
    AND (status & 256 <> 256)
    AND (status & 512 <> 512)
    and name != 'tempdb'
    ELSE
    DECLARE databases_cursor CURSOR
    FOR SELECT name from master.sys.databases
    WHERE state=0 and name != 'tempdb'


    OPEN databases_cursor
    DECLARE @DatabaseName sysname
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    select @dirPathDatabase = @dirPath + '\'+ @DatabaseName
    IF SUBSTRING(@@version,23,4)='2000'
    BEGIN
    select @fileName = @DatabaseName + '_Backup_' + @timeStamp
    select @destFilePath = @dirPath + '\' + @DatabaseName + '\' + @filename + '.' + @ext
    select @CMD2000 = 'Del'+' '+ @destFilePath + ' /F /Q'
    exec master.dbo.xp_cmdshell @CMD2000
    END
    ELSE
    EXECUTE master.sys.xp_delete_file 0, @dirPathDatabase, @ext, @timeStampDayKeep

    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    END
    CLOSE databases_cursor
    DEALLOCATE databases_cursor
    29 май 07, 12:03    [4197844]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    я
    Guest
    -- this script reindex all indexes in all tables for all databases
    -- NOTE indexed views are not touched by this script


    IF SUBSTRING(@@version,23,4)='2000'
    DECLARE databases_cursor CURSOR
    FOR SELECT name FROM master.dbo.sysdatabases
    WHERE (status & 32 <> 32)
    AND (status & 64 <> 64)
    AND (status & 128 <> 128)
    AND (status & 256 <> 256)
    AND (status & 512 <> 512)
    and name != 'tempdb'
    ELSE
    DECLARE databases_cursor CURSOR
    FOR SELECT name from master.sys.databases
    WHERE state=0 and name != 'tempdb'

    OPEN databases_cursor
    DECLARE @DatabaseName sysname
    DECLARE @tablename sysname
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    PRINT '**** Database: ' + @DatabaseName

    IF SUBSTRING(@@version,23,4)='2000'
    EXECUTE ('DECLARE reindex_cursor CURSOR FOR SELECT ''[' + @DatabaseName + ']'' + ''.'' + Su.name + ''.'' + SO.name as name FROM [' + @DatabaseName + '].dbo.sysobjects SO left join [' + @DatabaseName + '].dbo.sysusers SU on so.uid = su.uid WHERE type = ''U''')
    ELSE
    EXECUTE ('DECLARE reindex_cursor CURSOR FOR SELECT ''[' + @DatabaseName + ']'' + ''.'' + SS.name + ''.'' + SO.name as name FROM [' + @DatabaseName + '].dbo.sysobjects SO left join ' + @DatabaseName + '.sys.schemas SS on SO.uid = SS.schema_id WHERE SO.type = ''U''')

    OPEN reindex_cursor
    FETCH NEXT FROM reindex_cursor INTO @tablename
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    PRINT '* Table: ' + @tablename
    EXECUTE ('DBCC DBREINDEX (''' + @tablename + ''','''') WITH NO_INFOMSGS')
    -- EXECUTE ('DBCC DBREINDEX (''' + @tablename + ''','''')')
    FETCH NEXT FROM reindex_cursor INTO @tablename
    END
    CLOSE reindex_cursor
    DEALLOCATE reindex_cursor
    FETCH NEXT FROM databases_cursor INTO @DatabaseName
    END
    CLOSE databases_cursor
    DEALLOCATE databases_cursor
    29 май 07, 12:05    [4197852]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    я
    Guest
    Ничего вроде не забыл, да? И скрипты работают как на 2000 так и на 2005
    29 май 07, 12:06    [4197864]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Yareg
    Guest
    DECLARE @base_name varchar(max);
    DECLARE @sub_dir varchar(max);
    SET @base_name = N'test_basa';
    SELECT @sub_dir = N'D:\BackUp\SQL\'+ @base_name;
    EXECUTE master.dbo.xp_create_subdir @sub_dir
    GO
    результат
    Msg 22048, Level 15, State 0, Line 0
    Error executing extended stored procedure: Invalid Parameter
    Не могу понять - что не так?!
    12 сен 07, 10:05    [4653798]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Moriarti
    Member

    Откуда: Ultima Thule
    Сообщений: 744
    На sql.ru нельзя редактировать свои сообщения,
    поэтому сообщаю, что свежая (исправленная) версия скрипта
    всегда лежит у меня на форуме:

    http://www.economicsoft.ru/forums/viewtopic.php?t=3098
    12 сен 07, 11:30    [4654642]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Moriarti
    Member

    Откуда: Ultima Thule
    Сообщений: 744
    Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
    12 сен 07, 11:42    [4654785]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Rem
    Member

    Откуда:
    Сообщений: 261
    Есть ли у кого готовый скрипт для бэкапа (экспорта) только структуры (create...) всех пользовательских таблиц, вьюшек, индексов, кода хранимок, функций и т.п.?
    Полный дамп базы с данными не нужен.
    12 сен 07, 12:11    [4655133]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Moriarti
    Member

    Откуда: Ultima Thule
    Сообщений: 744
    А что мешает сделать "Generate SQL Script" по правой мыхе?
    14 сен 07, 10:41    [4667409]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Roman S. Golubin
    Member

    Откуда: 140002
    Сообщений: 11541
    Я сделал несколько по другому. Я взял C# 2008 Express Edition и написал на нем программу в три строки. Дальше как обычно - компилируем, добавляем в шедулер и вперед. Исходники смотри программы в аттаче.

    К сообщению приложен файл (fotolab backup.zip - 75Kb) cкачать
    30 ноя 07, 12:29    [4986750]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Crimean
    Member

    Откуда:
    Сообщений: 13147
    ужос-то какой.. берем что-то типа isql и делаем как-то так для локального сервера:

    isql -S . -E -n -Q "backup database [mydb] to disk = 'c:\1.bak' with init, format"

    потом ЭТО ставим на AT и ... все! если бакап надо жать - ставим лайтспид. девелоперский стоит чо-то аж под $50. экономия времени (и места) двухкратная сразу же практически

    а про копирование по сети рассказывать даже не смешно. но вот только батник получается строк в 5, даже если проверки результатов детально расписать
    30 ноя 07, 13:26    [4987246]     Ответить | Цитировать Сообщить модератору
     Re: Пишем Database Maintenance Plan для SQL Express 2005. Часть I. Backup  [new]
    Roman S. Golubin
    Member

    Откуда: 140002
    Сообщений: 11541
    Crimean
    ужос-то какой.. берем что-то типа isql и делаем как-то так для локального сервера:

    isql -S . -E -n -Q "backup database [mydb] to disk = 'c:\1.bak' with init, format"

    Вы исходники, которые я выложил не смотрели? Там тоже самое, только каждому баку в имя дата добавляется.
    30 ноя 07, 13:41    [4987429]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить