powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
20 сообщений из 20, страница 1 из 1
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970630
Добрый день.
Воспользовался статьей из Faq " Резервное копирование MS SQL SERVER 2005 EXPRESS " http://www.sql.ru/faq/faq_topic.aspx?fid=2050

Возникли некоторые ошибки, частично исправил, но некоторые остались. Подскажите как побороть Процедура или функция ожидает параметр который не был указан.
В MS SQL SERVER 2014 EXPRESS
Падает в ошибку:
строка conn_str="Provider=SQLNCLI.1; Password=xxx;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=127.0.0.1,1433;"
Лечится conn_str="Provider=SQLNCLI11.1; Password=xxx;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=127.0.0.1,1433;"
Но остается ошибка: Ожидается параметр "@StrSaveDir"
Если процедуру запустить в ручную и ввести параметры то работает.
Если значения строк
prmStrSaveDir.Value = bcp_dir
prmStrSaveDir.Name = "@StrSaveDir"
поменять местами . То тоже работает , только к имени Базы добавляется @StrSaveDir. Как полечить до конца . ?

Заранее Спасибо за помощь.
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970662
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр5555только к имени Базы добавляется @StrSaveDirне очень понятно, что такое "к имени базы". К имени файла? Добавляется содержимое параметра @StrSaveDir или сама строка "@StrSaveDir"?
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970670
Shocker.Pro,

Да, я немного не корректно написал.
Имелось в виду. Имя файла складывается из имени базы + дата. А в начале имени файла подставляется @StrSaveDir.
Получается @StrSaveDirИмябазы+дата.
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970700
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите продецуру, похоже, вы там накосячили (только оформите правилным тэгом - sql, а не vb).
Не из FAQ - а скопируйте именно свою
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970722
Хранимая процедура на SQL 2014 EXPRESS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
USE [master]
GO
/****** Object:  StoredProcedure [dbo].[TC_sp_BackupDatabases]    Script Date: 28.05.2015 15:24:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER	PROCEDURE [dbo].[TC_sp_BackupDatabases](
	@StrSaveDir  varchar(1000), @CntBcp int output
)AS
BEGIN

DECLARE @StrExec varchar(1000), @Namebase varchar(100), @NameBcp varchar(100),@StrSaveDir  varchar(1000)
set @CntBcp=0

DECLARE NamebasesCursor CURSOR FOR SELECT name from master.dbo.sysdatabases WHERE NAME NOT IN ('master', 'model', 'msdb', 'pubs', 'tempdb') --создаем курсор для имен баз из  sysdatabases 
OPEN NamebasesCursor --открываем курсор
WHILE 1=1 BEGIN --цикл 
FETCH  FROM  NamebasesCursor INTO @Namebase --получаем значение курсора в переменную

IF @@fetch_status=-1 begin --если дошли до конца 
BREAK --выход
end
IF @@fetch_status=-2 begin --если ошибка курсора
CONTINUE --продолжить
end

DBCC CHECKDB (@Namebase)
DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS
set @NameBcp=@Namebase+'_Backup'
set @StrExec=
'
USE master
EXEC sp_addumpdevice ''disk'', '''+@NameBcp+''', '''+@StrSaveDir+@Namebase+'.bak'' 
BACKUP DATABASE '+@Namebase+' TO '+@NameBcp+' 
exec sp_dropdevice '''+@NameBcp+'''
'
print  @StrExec
EXEC(@StrExec)

DBCC SHRINKDATABASE (@Namebase)
set @CntBcp=@CntBcp+1
END -- конец цикла
DEALLOCATE NamebasesCursor

Return @CntBcp
END
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970728
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с процедурой вроде ок (в плане имени), за исключением одной вещи @StrSaveDir задекларирована два раза. Не знаю, как в 2014, но, по идее, она не должна была даже скомпилироваться, не то что работать
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970731
Хранимая процедура на SQL 2014 EXPRESS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
USE [master]
GO
/****** Object:  StoredProcedure [dbo].[TC_sp_BackupDatabases]    Script Date: 28.05.2015 15:24:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER	PROCEDURE [dbo].[TC_sp_BackupDatabases](
	@StrSaveDir  varchar(1000), @CntBcp int output
)AS
BEGIN

DECLARE @StrExec varchar(1000), @Namebase varchar(100), @NameBcp varchar(100)
set @CntBcp=0

DECLARE NamebasesCursor CURSOR FOR SELECT name from master.dbo.sysdatabases WHERE NAME NOT IN ('master', 'model', 'msdb', 'pubs', 'tempdb') --создаем курсор для имен баз из  sysdatabases 
OPEN NamebasesCursor --открываем курсор
WHILE 1=1 BEGIN --цикл 
FETCH  FROM  NamebasesCursor INTO @Namebase --получаем значение курсора в переменную

IF @@fetch_status=-1 begin --если дошли до конца 
BREAK --выход
end
IF @@fetch_status=-2 begin --если ошибка курсора
CONTINUE --продолжить
end

DBCC CHECKDB (@Namebase)
DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS
set @NameBcp=@Namebase+'_Backup'
set @StrExec=
'
USE master
EXEC sp_addumpdevice ''disk'', '''+@NameBcp+''', '''+@StrSaveDir+@Namebase+'.bak'' 
BACKUP DATABASE '+@Namebase+' TO '+@NameBcp+' 
exec sp_dropdevice '''+@NameBcp+'''
'
print  @StrExec
EXEC(@StrExec)

DBCC SHRINKDATABASE (@Namebase)
set @CntBcp=@CntBcp+1
END -- конец цикла
DEALLOCATE NamebasesCursor

Return @CntBcp
END


В таком виде не работает, ожидается переменная либо подставляет к имени файла.
Пока включено так :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
USE [master]
GO
/****** Object:  StoredProcedure [dbo].[TC_sp_BackupDatabases]    Script Date: 28.05.2015 15:34:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER	PROCEDURE [dbo].[TC_sp_BackupDatabases](
	@CntBcp int output
)AS
BEGIN

DECLARE @StrExec varchar(1000), @Namebase varchar(100), @NameBcp varchar(100),@StrSaveDir  varchar(1000)
set @CntBcp=0
set @StrSaveDir='E:\MSSQL\Backup\'

DECLARE NamebasesCursor CURSOR FOR SELECT name from master.dbo.sysdatabases WHERE NAME NOT IN ('master', 'model', 'msdb', 'pubs', 'tempdb','ZUP') --создаем курсор для имен баз из  sysdatabases 
OPEN NamebasesCursor --открываем курсор
WHILE 1=1 BEGIN --цикл 
FETCH  FROM  NamebasesCursor INTO @Namebase --получаем значение курсора в переменную

IF @@fetch_status=-1 begin --если дошли до конца 
BREAK --выход
end
IF @@fetch_status=-2 begin --если ошибка курсора
CONTINUE --продолжить
end

DBCC CHECKDB (@Namebase)
DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS
set @NameBcp=@Namebase+'_Backup'
set @StrExec=
'
USE master
EXEC sp_addumpdevice ''disk'', '''+@NameBcp+''', '''+@StrSaveDir+@Namebase+'.bak'' 
BACKUP DATABASE '+@Namebase+' TO '+@NameBcp+' 
exec sp_dropdevice '''+@NameBcp+'''
'
print  @StrExec
EXEC(@StrExec)

DBCC SHRINKDATABASE (@Namebase)
set @CntBcp=@CntBcp+1
END -- конец цикла
DEALLOCATE NamebasesCursor

Return @CntBcp
END
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970736
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр5555В таком виде не работает, ожидается переменная либо подставляет к имени файла.ок, стало быть, наковыряли в скрипте - выкладывайте ВАШ вариант
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970738
Да нет. Выше пост. Раз не работало. Так подправил, на жесткую прописку в процедуре.
Убрать забыл. Вот и вводит в заблуждение. А удалить или редактировать посты нельзя.
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970755
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
'----------------------------------------------------------------------
' Стриганов С.В.  (ART-CODE)   +7(916) 611-35-16
' Скрипт резервного копирования SQL Server 2005 Express ( 06.11.20008 )
' работает совместно с хранимой процедурой на сервере
'----------------------------------------------------------------------
Dim fso, Sh, DelDiff , bcp_dir, conn_str, RAR, zip' глобальные переменные и обьекты
Set fso  = CreateObject ("Scripting.FileSystemObject")
set Sh= CreateObject("WScript.Shell")
 
  DelDiff=5 ' удалять старые архивы , старше DelDiff дней
  bcp_dir="\\Компьютер1\Backup\"  ' каталог архивов (косая черта в конце обязательно !!!!)
  bsp_dIR_Archiv="E:\MSSQL\Backup\"' Каталог выгрузки *.bak из SQL express	
'--  RAR="C:\PROGRA~1\WINRAR\rar.exe"
  zip="C:\Program Files (x86)\7-Zip\7z.exe"
  conn_str="Provider=SQLNCLI11.1; Password=ххх;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=127.0.0.1,1433"

log (" --- start ---")
bcp_del  ' удаляем старые архивы
bcp_run  ' выполняем архивирование
log ("End") ' ну вот и все, закончили :)

Sh = noting 
fso = noting 
'----------------------------------------------------------------------
sub bcp_del()   ' удаляем старые архивы
Dim dirStart, folder
dirStart  = fso.GetFolder(bcp_dir) ' ищем в каталоге архивов старые папки с архивами
set folder = fso.GetFolder( dirStart )
DeleteOldDir(folder)  ' очистка каталога от старых 
end sub

'---------------------------------------------------------------------------                           
Sub DeleteOldDir( folder )     'обработка  директории - поиск и удаление старых папок с архивами
  ' все архивы разложены по папкам, а папки структурированы по датам - поэтому удаляем сразу всю папку..
    dim file, subfolder,d,diff , del
       
   del=0
   
   if (folder.Path&"\"<>bcp_dir) then  ' мы-же не будем удалять сам каталог для ведения архивов !!!       
           d = folder.DateCreated
        diff = DateDiff("d",d,Now) 
        
        if diff>DelDiff Then
        log ("Deleted: " & folder.Path)        
            folder.Delete 
            del=1
          end if 
                
   end if     
   if  del=0 then       
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что найдется вложенная подпапка, которая была создана реньше... но всеравно проверим
        DeleteOldDir( subfolder )
    Next
    end if       
    
End Sub

'---------------------------------------------------------------------------  
sub bcp_run()   ' выполняем архивирование
Dim  BcpCnt,folder,dirStart 

BcpCnt=SQL_BCP
log ("Bacup count: " & CStr(BcpCnt))
if BcpCnt>0 then  ' если хранимая процедура вернула количество созданных архивов больше 0
dirStart  = fso.GetFolder(bsp_dIR_Archiv) ' ищем в каталоге архивов файлы *.bak 
set folder = fso.GetFolder( dirStart )
BakToRar( folder )
end	if 
end sub

'-------------------------------------------------------------------------
Sub BakToRar( folder )     'обработка  директории - ищем ".bak", упаковываем в ".zip"
dim file, subfolder,d,diff, NewBakFolder, StrRun, NewArcName

NewBakFolder = bcp_dir&fixed_len(Year(Date), 4) & "-"& fixed_len(Month(Date), 2) & "-"& fixed_len(Day(Date), 2)
if not fso.FolderExists(NewBakFolder) then
fso.CreateFolder(NewBakFolder)
end if
    
    For Each file in folder.Files
    if (InStr(file.Path, ".bak")<>0 ) then
    NewArcName=NewBakFolder & "\" & GetFileName(file.Path) & "_" & TimeNowAsFileName & ".zip "    
    StrRun="""" & zip & """ " & " a -tzip -ssw -mx5 " & NewArcName & " " & file.Path  
  
    'MsgBox StrRun   
    Sh.Run StrRun , 0, true
    log("Created: " &NewArcName)
    
    if  fso.FileExists(NewArcName) then 
    ' log("deleted: " &file.Path )
    fso.DeleteFile(file.Path)   
    end if     
        end if        
    next    
    
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что архив найдется во вложенной подпапке, но на всяк. случай оставлю эту обработку...
        
        if (subfolder.Path<>NewBakFolder) then 
         BakToRar( subfolder )
         end if         
    Next       
    
End Sub

'-------------------------------------------------------------------------
Function SQL_BCP () ' вызов хранимой процедуры на сервере, создающей файлы архива в указанном каталоге

Dim IntRetVal ' количество созданных архивов, будет возвращать эта функция
Dim c 
Dim prmStrSaveDir 
Dim prmCntBcp  ' количество созданных архивов, возвращает хранимая процедура 
Dim Cmd 

Set c = CreateObject("ADODB.Connection")
    c.Provider = "MSDASQL"
    c.CursorLocation = 3
    c.ConnectionString = conn_str
'WScript.Echo C    
    c.Open
	
'Set prmStrSaveDir = CreateObject("ADODB.Parameter")        отключил из-за ошибки
'    prmStrSaveDir.Type = 200                                            отключил из-за ошибки
'    prmStrSaveDir.Size = 1000                                           отключил из-за ошибки
'    prmStrSaveDir.Direction = 1                                          отключил из-за ошибки
'    prmStrSaveDir.Name = "@StrSaveDir"                            отключил из-за ошибки   если поменять на bcp_dir_archiv
'    prmStrSaveDir.Value = bcp_dir_archiv        отключил из-за ошибки   если поменять на "@StrSaveDir"  , то прибавляет к имени файла @StrSaveDir
	 
Set prmCntBcp = CreateObject("ADODB.Parameter")
    prmCntBcp.Type = 3
    prmCntBcp.Direction = 2
    prmCntBcp.Name = "@CntBcp"
	
Set Cmd = CreateObject("ADODB.Command")

    Cmd.ActiveConnection = c
    Cmd.CommandText = "TC_sp_BackupDatabases" ' имя хранимой процедуры на сервере
    Cmd.CommandTimeout = 60000
    Cmd.CommandType = 4

    Cmd.Parameters.Append Cmd.CreateParameter("RETURN_VALUE", 3, 4)    
	
'    Cmd.Parameters.Append prmStrSaveDir                      отключил из-за ошибки
    Cmd.Parameters.Append prmCntBcp

	Cmd.Execute
 
IntRetVal = prmCntBcp.Value

'    Set prmStrSaveDir = Nothing                                    отключил из-за ошибки
    Set prmCntBcp = Nothing  
    Set Cmd = Nothing
    Set c = Nothing

SQL_BCP = IntRetVal
End Function

'-------------------------------------------------------------------------
Sub log(sData)  ' запись логов
    Dim ts, ForAppending
    ForAppending = 8
    Set ts = fso.OpenTextFile(bcp_dir&"backup.log", ForAppending, True)
    ts.Write Date & " - "& Time() & " " & sData & chr(13) & chr(10)
    ts.Close
End Sub

'-------------------------------------------------------------------------
Function fixed_len(i, l)
  fixed_len = String(l - Len(FormatNumber(i, 0, , , False)), "0") & FormatNumber(i, 0, , , False)
End Function

'-------------------------------------------------------------------------
Function TimeNowAsFileName()
Dim  s_time
  
s_time = fixed_len(Hour(Time), 2) & "_"& fixed_len(Minute(Time), 2)& "_" & fixed_len(Second(Time), 2)
TimeNowAsFileName=s_time
End Function

'-------------------------------------------------------------------------
Function GetFileName(strFilename)
Dim intPos, prmFileName
    intPos = InStrRev(strFilename, "\")
    prmFileName = Right(strFilename, Len(strFilename) - intPos)
    prmFileName=Replace(prmFileName, ".", "_")    
GetFileName=prmFileName
End Function
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970766
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр5555
Код: vbnet
1.
2.
'    prmStrSaveDir.Name = "@StrSaveDir"                            отключил из-за ошибки   если поменять на bcp_dir_archiv
'    prmStrSaveDir.Value = bcp_dir_archiv        отключил из-за ошибки   если поменять на "@StrSaveDir"  , то прибавляет к имени файла @StrSaveDir



Что-то я не понимаю, зачем вы затеяли там что-то менять. Вы понимаете, чем отличается имя от значения? Разумеется, если подставить в качестве значения параметра "@StrSaveDir", то именно это и окажется в имени файла, ибо процедура так и работает.
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970773
' prmStrSaveDir.Name = "@StrSaveDir"
' prmStrSaveDir.Value = bcp_dir_archiv
Если как в источнике то ошибка ожидается переменная @StrSaveDir
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970780
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите профайлером, какой запрос приходит на сервер

покажите полностью тот скрипт, который выдает эту ошибку

попробуйте выполнить скрипт как программу vba из какого-нить офисного приложения
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970850
Приходит на сервер : SQL Profiler
declare @p2 int
set @p2=NULL
exec TC_sp_BackupDatabases1 default,@p2 output
select @p2

Скрипт.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
'----------------------------------------------------------------------
' Стриганов С.В.  (ART-CODE)   +7(916) 611-35-16
' Скрипт резервного копирования SQL Server 2005 Express ( 06.11.20008 )
' работает совместно с хранимой процедурой на сервере
'----------------------------------------------------------------------
Dim fso, Sh, DelDiff , bcp_dir, conn_str, RAR, zip' глобальные переменные и обьекты
Set fso  = CreateObject ("Scripting.FileSystemObject")
set Sh= CreateObject("WScript.Shell")
 
  DelDiff=5 ' удалять старые архивы , старше DelDiff дней
  bcp_dir="\\Компьютер1\Backup\"  ' каталог архивов (косая черта в конце обязательно !!!!)
  bsp_dIR_Archiv="E:\MSSQL\Backup\"' Каталог выгрузки *.bak из SQL express	
'--  RAR="C:\PROGRA~1\WINRAR\rar.exe"
  zip="C:\Program Files (x86)\7-Zip\7z.exe"
  conn_str="Provider=SQLNCLI11.1; Password=xxx;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=127.0.0.1,1433"

log (" --- start ---")
bcp_del  ' удаляем старые архивы
bcp_run  ' выполняем архивирование
log ("End") ' ну вот и все, закончили :)

Sh = noting 
fso = noting 
'----------------------------------------------------------------------
sub bcp_del()   ' удаляем старые архивы
Dim dirStart, folder
dirStart  = fso.GetFolder(bcp_dir) ' ищем в каталоге архивов старые папки с архивами
set folder = fso.GetFolder( dirStart )
DeleteOldDir(folder)  ' очистка каталога от старых 
end sub

'---------------------------------------------------------------------------                           
Sub DeleteOldDir( folder )     'обработка  директории - поиск и удаление старых папок с архивами
  ' все архивы разложены по папкам, а папки структурированы по датам - поэтому удаляем сразу всю папку..
    dim file, subfolder,d,diff , del
       
   del=0
   
   if (folder.Path&"\"<>bcp_dir) then  ' мы-же не будем удалять сам каталог для ведения архивов !!!       
           d = folder.DateCreated
        diff = DateDiff("d",d,Now) 
        
        if diff>DelDiff Then
        log ("Deleted: " & folder.Path)        
            folder.Delete 
            del=1
          end if 
                
   end if     
   if  del=0 then       
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что найдется вложенная подпапка, которая была создана реньше... но всеравно проверим
        DeleteOldDir( subfolder )
    Next
    end if       
    
End Sub

'---------------------------------------------------------------------------  
sub bcp_run()   ' выполняем архивирование
Dim  BcpCnt,folder,dirStart 

BcpCnt=SQL_BCP
log ("Bacup count: " & CStr(BcpCnt))
if BcpCnt>0 then  ' если хранимая процедура вернула количество созданных архивов больше 0
dirStart  = fso.GetFolder(bsp_dIR_Archiv) ' ищем в каталоге архивов файлы *.bak 
set folder = fso.GetFolder( dirStart )
BakToRar( folder )
end	if 
end sub

'-------------------------------------------------------------------------
Sub BakToRar( folder )     'обработка  директории - ищем ".bak", упаковываем в ".zip"
dim file, subfolder,d,diff, NewBakFolder, StrRun, NewArcName

NewBakFolder = bcp_dir&fixed_len(Year(Date), 4) & "-"& fixed_len(Month(Date), 2) & "-"& fixed_len(Day(Date), 2)
if not fso.FolderExists(NewBakFolder) then
fso.CreateFolder(NewBakFolder)
end if
    
    For Each file in folder.Files
    if (InStr(file.Path, ".bak")<>0 ) then
    NewArcName=NewBakFolder & "\" & GetFileName(file.Path) & "_" & TimeNowAsFileName & ".zip "    
    StrRun="""" & zip & """ " & " a -tzip -ssw -mx5 " & NewArcName & " " & file.Path  
  
    'MsgBox StrRun   
    Sh.Run StrRun , 0, true
    log("Created: " &NewArcName)
    
    if  fso.FileExists(NewArcName) then 
    ' log("deleted: " &file.Path )
    fso.DeleteFile(file.Path)   
    end if     
        end if        
    next    
    
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что архив найдется во вложенной подпапке, но на всяк. случай оставлю эту обработку...
        
        if (subfolder.Path<>NewBakFolder) then 
         BakToRar( subfolder )
         end if         
    Next       
    
End Sub

'-------------------------------------------------------------------------
Function SQL_BCP () ' вызов хранимой процедуры на сервере, создающей файлы архива в указанном каталоге

Dim IntRetVal ' количество созданных архивов, будет возвращать эта функция
Dim c 
Dim prmStrSaveDir 
Dim prmCntBcp  ' количество созданных архивов, возвращает хранимая процедура 
Dim Cmd 

Set c = CreateObject("ADODB.Connection")
    c.Provider = "MSDASQL"
    c.CursorLocation = 3
    c.ConnectionString = conn_str
'WScript.Echo C    
    c.Open
	
Set prmStrSaveDir = CreateObject("ADODB.Parameter")
    prmStrSaveDir.Type = 200
    prmStrSaveDir.Size = 1000
    prmStrSaveDir.Direction = 1
    prmStrSaveDir.Name = "@StrSaveDir"
    prmStrSaveDir.Value = bcp_dir_archiv
	 
Set prmCntBcp = CreateObject("ADODB.Parameter")
    prmCntBcp.Type = 3
    prmCntBcp.Direction = 2
    prmCntBcp.Name = "@CntBcp"
	
Set Cmd = CreateObject("ADODB.Command")

    Cmd.ActiveConnection = c
    Cmd.CommandText = "TC_sp_BackupDatabases1" ' имя хранимой процедуры на сервере
    Cmd.CommandTimeout = 60000
    Cmd.CommandType = 4

    Cmd.Parameters.Append Cmd.CreateParameter("RETURN_VALUE", 3, 4)    
	
    Cmd.Parameters.Append prmStrSaveDir
    Cmd.Parameters.Append prmCntBcp

	Cmd.Execute
 
IntRetVal = prmCntBcp.Value

    Set prmStrSaveDir = Nothing  
    Set prmCntBcp = Nothing  
    Set Cmd = Nothing
    Set c = Nothing

SQL_BCP = IntRetVal
End Function

'-------------------------------------------------------------------------
Sub log(sData)  ' запись логов
    Dim ts, ForAppending
    ForAppending = 8
    Set ts = fso.OpenTextFile(bcp_dir&"backup.log", ForAppending, True)
    ts.Write Date & " - "& Time() & " " & sData & chr(13) & chr(10)
    ts.Close
End Sub

'-------------------------------------------------------------------------
Function fixed_len(i, l)
  fixed_len = String(l - Len(FormatNumber(i, 0, , , False)), "0") & FormatNumber(i, 0, , , False)
End Function

'-------------------------------------------------------------------------
Function TimeNowAsFileName()
Dim  s_time
  
s_time = fixed_len(Hour(Time), 2) & "_"& fixed_len(Minute(Time), 2)& "_" & fixed_len(Second(Time), 2)
TimeNowAsFileName=s_time
End Function

'-------------------------------------------------------------------------
Function GetFileName(strFilename)
Dim intPos, prmFileName
    intPos = InStrRev(strFilename, "\")
    prmFileName = Right(strFilename, Len(strFilename) - intPos)
    prmFileName=Replace(prmFileName, ".", "_")    
GetFileName=prmFileName
End Function
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970874
гр к
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У тебя значение параметра похоже с опечаткой.
Есть bsp_dIR_Archiv="E:\MSSQL\Backup\"' Каталог выгрузки *.bak из SQL express , а передаешь bcp_dIR_Archiv
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38970878
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр5555Приходит на сервер : SQL Profiler
declare @p2 int
set @p2=NULL
exec TC_sp_BackupDatabases1 default,@p2 output
select @p2странно, не видит не только первый параметр, но и возвращаемое значение

попробуйте весь этот фрагмент
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Set prmStrSaveDir = CreateObject("ADODB.Parameter")
    prmStrSaveDir.Type = 200
    prmStrSaveDir.Size = 1000
    prmStrSaveDir.Direction = 1
    prmStrSaveDir.Name = "@StrSaveDir"
    prmStrSaveDir.Value = bcp_dir_archiv
	 
Set prmCntBcp = CreateObject("ADODB.Parameter")
    prmCntBcp.Type = 3
    prmCntBcp.Direction = 2
    prmCntBcp.Name = "@CntBcp"
	
Set Cmd = CreateObject("ADODB.Command")

    Cmd.ActiveConnection = c
    Cmd.CommandText = "TC_sp_BackupDatabases1" ' имя хранимой процедуры на сервере
    Cmd.CommandTimeout = 60000
    Cmd.CommandType = 4

    Cmd.Parameters.Append Cmd.CreateParameter("RETURN_VALUE", 3, 4)    
	
    Cmd.Parameters.Append prmStrSaveDir
    Cmd.Parameters.Append prmCntBcp


заменить на
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set Cmd = CreateObject("ADODB.Command")

    Cmd.ActiveConnection = c
    Cmd.CommandText = "TC_sp_BackupDatabases1" ' имя хранимой процедуры на сервере
    Cmd.CommandTimeout = 60000
    Cmd.CommandType = 4

    Cmd.Parameters.Refresh
    Cmd.Parameters("@StrSaveDir") = bcp_dir_archiv
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38971386
С профилер:
exec [master].[sys].sp_procedure_params_100_rowset N'TC_sp_BackupDatabases1',1,NULL,NULL
declare @p2 int
set @p2=NULL
exec TC_sp_BackupDatabases1 default,@p2 output
select @p2

Код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Function SQL_BCP () ' вызов хранимой процедуры на сервере, создающей файлы архива в указанном каталоге

Dim IntRetVal ' количество созданных архивов, будет возвращать эта функция
Dim c 
Dim prmStrSaveDir 
Dim prmCntBcp  ' количество созданных архивов, возвращает хранимая процедура 
Dim Cmd 

Set c = CreateObject("ADODB.Connection")
    c.Provider = "MSDASQL"
    c.CursorLocation = 3
    c.ConnectionString = conn_str
'WScript.Echo C    
    c.Open
	
'Set prmStrSaveDir = CreateObject("ADODB.Parameter")
'    prmStrSaveDir.Type = 200
'    prmStrSaveDir.Size = 1000
'    prmStrSaveDir.Direction = 1
'    prmStrSaveDir.Name = "@StrSaveDir"
'    prmStrSaveDir.Value = bcp_dir_archiv
	 
'Set prmCntBcp = CreateObject("ADODB.Parameter")
'    prmCntBcp.Type = 3
'    prmCntBcp.Direction = 2
'    prmCntBcp.Name = "@CntBcp"
	
Set Cmd = CreateObject("ADODB.Command")

    Cmd.ActiveConnection = c
    Cmd.CommandText = "TC_sp_BackupDatabases1" ' имя хранимой процедуры на сервере
    Cmd.CommandTimeout = 60000
    Cmd.CommandType = 4

Cmd.Parameters.Refresh
    Cmd.Parameters("@StrSaveDir") = bcp_dir_archiv

'    Cmd.Parameters.Append Cmd.CreateParameter("RETURN_VALUE", 3, 4)    
'	
'    Cmd.Parameters.Append prmStrSaveDir
'    Cmd.Parameters.Append prmCntBcp

	Cmd.Execute
 
IntRetVal = prmCntBcp.Value

    Set prmStrSaveDir = Nothing  
    Set prmCntBcp = Nothing  
    Set Cmd = Nothing
    Set c = Nothing

SQL_BCP = IntRetVal
End Function

'---------------------------------------------------------------------



Ошибка прежняя.
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38971391
Спасибо. Работает. Невнимательность одно слово.
Как и сказали опечатка в имени переменной.
Только странно почему не вылезла ошибка что переменная не декларирована.
...
Рейтинг: 0 / 0
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #38971394
Кому нужно рабочий код:
Процедура для SQL 2104 express

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE	PROCEDURE [dbo].[TC_sp_BackupDatabases](
	@StrSaveDir  varchar(1000), @CntBcp int output
)AS
BEGIN

DECLARE @StrExec varchar(1000), @Namebase varchar(100), @NameBcp varchar(100)
set @CntBcp=0

DECLARE NamebasesCursor CURSOR FOR SELECT name from master.dbo.sysdatabases WHERE NAME NOT IN ('master', 'model', 'msdb', 'pubs', 'tempdb',) --создаем курсор для имен баз из  sysdatabases 

OPEN NamebasesCursor --открываем курсор
WHILE 1=1 BEGIN --цикл 
FETCH  FROM  NamebasesCursor INTO @Namebase --получаем значение курсора в переменную

IF @@fetch_status=-1 begin --если дошли до конца 
BREAK --выход
end
IF @@fetch_status=-2 begin --если ошибка курсора
CONTINUE --продолжить
end

DBCC CHECKDB (@Namebase)
DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS --проверку базы
set @NameBcp=@Namebase+'_Backup'
set @StrExec=
'
USE master
EXEC sp_addumpdevice ''disk'', '''+@NameBcp+''', '''+@StrSaveDir+@Namebase+'.bak'' 
BACKUP DATABASE '+@Namebase+' TO '+@NameBcp+' 
exec sp_dropdevice '''+@NameBcp+'''
'
--print  @StrExec
EXEC(@StrExec)

DBCC SHRINKDATABASE (@Namebase) --  шринк базы данных для того чтобы база не росла в объеме
set @CntBcp=@CntBcp+1
END -- конец цикла
DEALLOCATE NamebasesCursor

Return @CntBcp
END



Скрипт на vbs
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
'----------------------------------------------------------------------
' Стриганов С.В.  (ART-CODE)   +7(916) 611-35-16
' Скрипт резервного копирования SQL Server 2005 Express ( 06.11.20008 )
' работает совместно с хранимой процедурой на сервере
'----------------------------------------------------------------------
Dim fso, Sh, DelDiff , bcp_dir, conn_str, RAR, zip' глобальные переменные и обьекты
Set fso  = CreateObject ("Scripting.FileSystemObject")
set Sh= CreateObject("WScript.Shell")
 
  DelDiff=5 ' удалять старые архивы , старше DelDiff дней
  bcp_dir="\\ИмяКомпьютераВсети\Backup\"  ' каталог архивов (косая черта в конце обязательно !!!!)
  bsp_DIR_Archiv="E:\MSSQL\Backup\"' Каталог выгрузки *.bak из SQL express	

'Каким архиватором будем пользоваться
'--  RAR="C:\PROGRA~1\WINRAR\rar.exe"
  zip="C:\Program Files (x86)\7-Zip\7z.exe"

'Строка подключения к серверу SQL 2014 EXPRESS
  conn_str="Provider=SQLNCLI11.1; Password=xxx;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=127.0.0.1,1433" 
' Если будет ошибка проверить в диспетчере конфигураций настройки Native Client SQL TCP должен быть включен.
' SQLNCLI 11.1 можно подстроить под своего клиента изменяя цифры на нужную версию клиента.


log (" --- start ---")
bcp_del  ' удаляем старые архивы
bcp_run  ' выполняем архивирование
log ("End") ' ну вот и все, закончили :)

Sh = noting 
fso = noting 

'----------------------------------------------------------------------
sub bcp_del()   ' удаляем старые архивы
Dim dirStart, folder
dirStart  = fso.GetFolder(bcp_dir) ' ищем в каталоге архивов старые папки с архивами
set folder = fso.GetFolder( dirStart )
DeleteOldDir(folder)  ' очистка каталога от старых 
end sub

'---------------------------------------------------------------------------                           
Sub DeleteOldDir( folder )     'обработка  директории - поиск и удаление старых папок с архивами
  ' все архивы разложены по папкам, а папки структурированы по датам - поэтому удаляем сразу всю папку..
    dim file, subfolder,d,diff , del
       
   del=0
   
   if (folder.Path&"\"<>bcp_dir) then  ' мы-же не будем удалять сам каталог для ведения архивов !!!       
           d = folder.DateCreated
        diff = DateDiff("d",d,Now) 
        
        if diff>DelDiff Then
        log ("Deleted: " & folder.Path)        
            folder.Delete 
            del=1
          end if 
                
   end if     
   if  del=0 then       
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что найдется вложенная подпапка, которая была создана реньше... но всеравно проверим
        DeleteOldDir( subfolder )
    Next
    end if       
    
End Sub

'---------------------------------------------------------------------------  
sub bcp_run()   ' выполняем архивирование
Dim  BcpCnt,folder,dirStart 

BcpCnt=SQL_BCP
log ("Bacup count: " & CStr(BcpCnt))
if BcpCnt>0 then  ' если хранимая процедура вернула количество созданных архивов больше 0
dirStart  = fso.GetFolder(bsp_dIR_Archiv) ' ищем в каталоге архивов файлы *.bak 
set folder = fso.GetFolder( dirStart )
BakToRar( folder )
end	if 
end sub

'-------------------------------------------------------------------------
Sub BakToRar( folder )     'обработка  директории - ищем ".bak", упаковываем в ".rar" или ".zip"
dim file, subfolder,d,diff, NewBakFolder, StrRun, NewArcName

NewBakFolder = bcp_dir&fixed_len(Year(Date), 4) & "-"& fixed_len(Month(Date), 2) & "-"& fixed_len(Day(Date), 2)
if not fso.FolderExists(NewBakFolder) then
fso.CreateFolder(NewBakFolder)
end if
    
    For Each file in folder.Files
    if (InStr(file.Path, ".bak")<>0 ) then

    NewArcName=NewBakFolder & "\" & GetFileName(file.Path) & "_" & TimeNowAsFileName & ".zip "    
    StrRun="""" & zip & """ " & " a -tzip -ssw -mx5 " & NewArcName & " " & file.Path  

'  NewArcName=NewBakFolder & "\" & GetFileName(file.Path) & "_" & TimeNowAsFileName & ".rar "    
'    StrRun="""" & RAR & """ " & " a -rr -c -ep -av- -idp -id -idc -inul " & NewArcName & " " & file.Path

    'MsgBox StrRun   
    Sh.Run StrRun , 0, true
    log("Created: " &NewArcName)
    
    if  fso.FileExists(NewArcName) then 
    ' log("deleted: " &file.Path )
    fso.DeleteFile(file.Path)   
    end if     
        end if        
    next    
    
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что архив найдется во вложенной подпапке, но на всяк. случай оставлю эту обработку...
        
        if (subfolder.Path<>NewBakFolder) then 
         BakToRar( subfolder )
         end if         
    Next       
    
End Sub

'-------------------------------------------------------------------------
Function SQL_BCP () ' вызов хранимой процедуры на сервере, создающей файлы архива в указанном каталоге

Dim IntRetVal ' количество созданных архивов, будет возвращать эта функция
Dim c 
Dim prmStrSaveDir 
Dim prmCntBcp  ' количество созданных архивов, возвращает хранимая процедура 
Dim Cmd 
'dim ppp

Set c = CreateObject("ADODB.Connection")
    c.Provider = "MSDASQL"
    c.CursorLocation = 3
    c.ConnectionString = conn_str
'WScript.Echo C    
    c.Open
	
Set prmStrSaveDir = CreateObject("ADODB.Parameter")
    prmStrSaveDir.Type = 200
    prmStrSaveDir.Size = 1000
    prmStrSaveDir.Direction = 1
    prmStrSaveDir.Name = "@StrSaveDir"
    prmStrSaveDir.Value = bsp_DIR_archiv
	 
Set prmCntBcp = CreateObject("ADODB.Parameter")
    prmCntBcp.Type = 3
    prmCntBcp.Direction = 2
    prmCntBcp.Name = "@CntBcp"
	
Set Cmd = CreateObject("ADODB.Command")

    Cmd.ActiveConnection = c
    Cmd.CommandText = "TC_sp_BackupDatabases" ' имя хранимой процедуры на сервере
    Cmd.CommandTimeout = 60000
    Cmd.CommandType = 4

    Cmd.Parameters.Append Cmd.CreateParameter("RETURN_VALUE", 3, 4)    
	
    Cmd.Parameters.Append prmStrSaveDir
    Cmd.Parameters.Append prmCntBcp

	Cmd.Execute
 
IntRetVal = prmCntBcp.Value

    Set prmStrSaveDir = Nothing  
    Set prmCntBcp = Nothing  
    Set Cmd = Nothing
    Set c = Nothing

SQL_BCP = IntRetVal
End Function

'-------------------------------------------------------------------------
Sub log(sData)  ' запись логов
    Dim ts, ForAppending
    ForAppending = 8
    Set ts = fso.OpenTextFile(bcp_dir&"backup.log", ForAppending, True)
    ts.Write Date & " - "& Time() & " " & sData & chr(13) & chr(10)
    ts.Close
End Sub

'-------------------------------------------------------------------------
Function fixed_len(i, l)
  fixed_len = String(l - Len(FormatNumber(i, 0, , , False)), "0") & FormatNumber(i, 0, , , False)
End Function

'-------------------------------------------------------------------------
Function TimeNowAsFileName()
Dim  s_time
  
s_time = fixed_len(Hour(Time), 2) & "_"& fixed_len(Minute(Time), 2)& "_" & fixed_len(Second(Time), 2)
TimeNowAsFileName=s_time
End Function

'-------------------------------------------------------------------------
Function GetFileName(strFilename)
Dim intPos, prmFileName
    intPos = InStrRev(strFilename, "\")
    prmFileName = Right(strFilename, Len(strFilename) - intPos)
    prmFileName=Replace(prmFileName, ".", "_")    
GetFileName=prmFileName
End Function
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
    #39313596
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во время этого обсуждения я был в отпуске и все пропустил.
А недавно сам столкнулся с ошибкой в работе скрипта на новой операционке и нашел это обсуждение.
Вот такая беда была:
BACKUP failed to complete the command BACKUP DATABASE somebase. Check the backup application log for detailed messages.
Ошибка: 3041, серьезность: 16, состояние: 1.
Исправил провайдера на SQLNCLI11.1 и все стало "ОК".
Но раз уж зашел, то добавлю несколько слов по коду.

1 - В этой строке:
BACKUP DATABASE ['+@Namebase+'] TO '+@NameBcp+'
Нужно взять в квадратные скобки имя базы, иначе будут проблемы с хитрыми именами типа: "Super-Base".

2 - На 7z я и сам давно переделал (но FAQ глючит, комменты к скрипту в нем не работают).

3 - Желательно добавить обработку ошибок
on error resume next - сообщаем, что будем сами перехватывать и обрабатывать ошибки
if err.number then - поймали ошибку, будем ее обрабатывать
типа того:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
                 
Sub DeleteOldDir( folder, control_dir )     'обработка  директории - поиск и удаление старых папок с архивами
  ' все архивы разложены по папкам, а папки структурированы по датам - поэтому удаляем сразу всю папку..
 on error resume next   
   dim file, subfolder,d,diff , del
       
   del=0
   
   if (UCase(folder.Path)&"\"<>UCase(control_dir)) then  ' мы-же не будем удалять сам каталог для ведения архивов !!!       
           d = folder.DateCreated
          diff = DateDiff("d",d,Now) 
        
        if diff>DelDiff Then      
           folder.Delete 			
		if  err.number then
                      log "ERROR DeleteOldDir - folder.Delete: " & err.description & " ("  & err.Source & "), " & folder.Path
		else
		     log("Deleted: " & folder.Path)
                     del=1
		end if	
          end if 
                
   end if     
   if  del=0 then       
   For Each subfolder in folder.SubFolders ' конечно, мало вероятно что найдется вложенная подпапка, которая была создана реньше... но всеравно проверим
        DeleteOldDir  subfolder, control_dir   
    Next
    end if       
    
End Sub


Кстати, обратите внимание - в функции DeleteOldDir теперь приводятся строки к верхнему регистру!
if ( UCase( folder.Path)&"\"<> UCase( control_dir))
Был случай, когда админ в скрипте написал путь к каталогу в одном регистре, а на диске создал папку - в другом.
Соответственно, в определенный момент (через DelDiff дней) грохнулся весь каталог бекапов :)

4 - при ошибке в работе провайдера, с которой я столкнулся - функция SQL_BCP не возвращала ни ошибок,
ни количества созданных бекапов, при том, что на диске половина бекапов все-таки делалась,
до возникновения ошибки с одной из баз данных. В этом случае конструкция
Код: vbnet
1.
if BcpCnt>0 then  ' если хранимая процедура вернула количество созданных архивов больше 0


не работала вообще, т .к. нельзя сравнить пустое значение с нулем.
Здесь нужно добавить явную проверку того, что возвращает функция:
Код: vbnet
1.
2.
3.
 if (isnull(BcpCnt)) then
' ахтунг!!! глюк провайдера.
 
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Резервное копирование MS SQL SERVER 2014 EXPRESS и VBS скрипт
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]