Код T-SQL для резервного копирования базы данных с несколькими файлами перестал работать

Я пытаюсь записать автоматизированный сценарий, который позволит мне копировать базу данных к NAS с несколькими файлами. Я только что начал использовать T-SQL.

Моя цель состоит в том, чтобы автоматически вычислить размер базы данных и разделить его на 4 (4 ГБ), результатом будут числа файлов базы данных.

Пример:

Размер базы данных: Размер файла на 60 ГБ: 4 ГБ (Размер нескольких файлов)

Затем: 60 ГБ / 4 ГБ = 15 Файлов для резервного копирования

Я предполагаю, не возможно сделать это с ДЛЯ или, В ТО ВРЕМЯ КАК должный к коду в T-SQL.

Таким образом, я пытался выполнить код ниже, но он возвращается со следующей ошибкой:


  declare @DBName varchar(100)
declare @DBFileName varchar(256) 
declare @FolderName varchar(256)
declare @Path varchar(100) 

set @Path = '\\Backup-Server\Test\'
set @DBName = 'DayNite'

set @DBFileName = 'DayNite-Full' + '-' + (SELECT CONVERT(char(10), GetDate(),110)) + '-' + 'P'
set @FolderName =(SELECT CONVERT(char(10), GetDate(),110))
set @Path = @Path + @FolderName + '\'


EXEC master.dbo.xp_create_subdir @Path

--Calculate broken files  for BACKUP DATBASE Function
/*declare @dbsize int
set @dbsize = (SELECT ((size*8)/1024)/1000 as SizeGB FROM sys.database_files WHERE file_id = '1')
set @dbsize = @dbsize / 4
print @dbsize*/

BACKUP DATABASE [test] TO
DISK = @Path + @DBFileName + '1.bak',
DISK = @Path + @DBFileName + '2.bak',
DISK = @Path + @DBFileName + '3.bak',
DISK = @Path + @DBFileName + '4.bak',
DISK = @Path + @DBFileName + '5.bak',
DISK = @Path + @DBFileName + '6.bak',
DISK = @Path + @DBFileName + '7.bak',
DISK = @Path + @DBFileName + '8.bak',
DISK = @Path + @DBFileName + '9.bak',
DISK = @Path + @DBFileName + '10.bak',
DISK = @Path + @DBFileName + '11.bak',
DISK = @Path + @DBFileName + '12.bak',
DISK = @Path + @DBFileName + '13.bak'
WITH INIT , NOUNLOAD , NAME = 'DayNite Full Backup', NOSKIP , NOFORMAT)

Msg 102, Level 15, State 1, Line 17
Incorrect syntax near '+'.
Msg 319, Level 15, State 1, Line 30
Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon.

Я не знаю что не так.

0
задан 14 April 2015 в 21:12
1 ответ

Я бы порекомендовал решение компании Ola для резервного копирования и указания количества файлов :

DECLARE @DBFiles INT 
SET @DBFiles = 
(SELECT 
total_size_mb = CAST(SUM(size) * 8. / 1024 / 1024  AS DECIMAL(8,2))
FROM sys.master_files WITH(NOWAIT)
WHERE database_id = DB_ID() -- for current db 
GROUP BY database_id
)/4 + 1

, а затем выполнить скрипт Bla с указанным количеством файлов :

exec [DatabaseBackup] @databases = 'test', @directory = @Path, @NumberOfFiles = @dbfiles

Однако, если вы хотите свой собственный скрипт, вам нужно использовать Dynamic SQL - что-то вроде примера, приведенного ниже:

DECLARE @DBNAME VARCHAR(100)
DECLARE @DBFileName varchar(256) 
declare @FolderName varchar(256)
declare @Path varchar(100) 
set @Path = '\\Backup-Server\Test\'
set @DBName = 'DayNite'
set @DBFileName = 'DayNite-Full' + '-' + (SELECT CONVERT(char(10), GetDate(),110)) + '-' + 'P'
set @FolderName =(SELECT CONVERT(char(10), GetDate(),110))
set @Path = @Path + @FolderName + '\'
--You would probably need to format your query as dynamic sql: 
DECLARE @DSQL NVARCHAR(MAX)
DECLARE @DBFiles INT 
DECLARE @i INT = 1
SET @DBFiles = 
(SELECT 
total_size_mb = CAST(SUM(size) * 8. / 1024 / 1024  AS DECIMAL(8,2))
FROM sys.master_files WITH(NOWAIT)
WHERE database_id = DB_ID() -- for current db 
GROUP BY database_id
)/4 + 1
SET @DSQL = 'BACKUP DATABASE [test] TO ' 
WHILE (@i <= @DBFiles)
BEGIN 
SET @DSQL += 'DISK =''' +@Path + @DBFileName + CAST(@i as nvarchar(10)) + '.bak'', '
SET @i += 1 
END 
SET @DSQL = SUBSTRING (@DSQL, 1, len(@dsql) - 2)
set @DSQL += 'WITH INIT , NOUNLOAD , NAME = ''DayNite Full Backup'', NOSKIP , NOFORMAT)'
-- print for debug 
PRINT @DSQL
-- execute 
exec sp_executesql @dsql

Надеюсь, это поможет.

0
ответ дан 5 December 2019 в 12:52

Теги

Похожие вопросы