#sql #tsql
#sql #tsql
Вопрос:
Ниже у меня есть тестовый скрипт для резервного копирования баз данных, который не исключен. Сначала мне нужно проверить, существуют ли эти каталоги по этому пути, а затем создать их, если они не существуют. Тогда путь резервного копирования должен был бы создавать резервные копии каждого файла в соответствующий каталог. Я немного запутался в том, как это сделать, и в соответствии с нашими требованиями среды я не могу использовать план обслуживания SSMS для этой работы. Приветствуются любые советы.
Спасибо
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @Datapath varchar(500)
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT)
-- specify database backup directory
SET @path = '\nas01Adminbbeldentest'
SET @Datapath = '\nas01Adminbbeldentest' @name
-- specify filename format
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @Path
IF NOT EXISTS (SELECT * FROM @DirTree WHERE subdirectory = @Name)
EXEC master.dbo.xp_create_subdir @DataPath
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master',
'model',
'msdb',
'tempdb',
'PracticaSd-Dallasmetro') -- exclude these databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path @name '_' @fileDate '.BAK'
BACKUP DATABASE @name TO DISK = @fileName WITH COMPRESSION
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
RESTORE VERIFYONLY FROM DISK = @FileName
Комментарии:
1. Предупреждение: Предстоящие недокументированные процедуры: Скрипт SQL Server для создания каталогов Windows
2. Я отредактировал скрипт, но я все еще не могу создать каталог
Ответ №1:
Это часть ответа
Создание каталога, который уже существует, не приводит к ошибкам или удалению файлов, поэтому продолжайте создавать его в каждом цикле независимо. Вы не потеряете никаких резервных копий, все довольны.
declare
@dirPath varchar(1024)
,@msg varchar(1024)
,@bkUp varchar(1024)
,@fileDate VARCHAR(20) = CONVERT(VARCHAR(20),GETDATE(),112)
,@name VARCHAR(128) -- database name 128 is max for sql objects
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master',
'model',
'msdb',
'tempdb',
'PracticaSd-Dallasmetro') -- exclude these databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @dirPath = '\nas01Adminbbeldentest' @name
--set @dirPath = 'D:SQL ServerMSSQLBackup' @name --my home path
begin try
exec xp_create_subdir @dirPath;
set @msg = 'Created directory: ' @dirPath
raiserror(@msg,0,0);
set @bkUp = 'backup database ' quotename(@name) ' to disk = ''' @dirPath '' @name '_' @fileDate '.bak'' with compression';
exec(@bkUp);
set @bkUp = 'RESTORE VERIFYONLY FROM DISK = ''' @dirPath '' @name '_' @fileDate '.bak''';
exec(@bkUp);
end try
begin catch
set @msg = 'something went wrong!!! with: ' @name ' ' error_message()
raiserror(@msg,0,0);
end catch
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
Это скорее комментарий с некоторым скриптом.
Также имейте в виду, что пользователь, пытающийся получить доступ / создать файлы или папки, является учетной записью службы.
для проверки вы можете
sp_configure 'advanced',1;
reconfigure;
GO
sp_configure 'xp_cmdshell', 1;
reconfigure;
GO
xp_cmdshell 'echo %USERDOMAIN%%USERNAME%';
и, как и в предыдущем первом комментарии, существует множество недокументированных хранимых процедур для операций с файловой системой.
- xp_delete_file
- xp_dirtree
- xp_fileexist
- xp_fixeddrives
- xp_subdirs
- xp_create_subdir
Комментарии:
1. Расположение — это модуль NAS, который позволяет гостям полностью контролировать эту папку. Следующая команда создаст каталог: ВЫПОЛНИТЕ master.dbo.xp_create_subdir ‘\nas01adminbbeldentesttest1’. Я просто не знаю, как заставить его создавать по одному для каждой базы данных, которую я копирую.
2. @bbelden В чем, по-видимому, проблема? Вы уже выполняете итерацию по каждой базе данных, которую хотите создать для резервного копирования. Запустите master.sys.xp_dirtree SP для каждого из них.
3. Прошу прощения. Сценарии TSQL не моя сильная сторона. Я просто не уверен, как создать эти каталоги для каждой базы данных на устройстве NAS.
4. добавлен рабочий скрипт, попробуйте, он должен соответствовать вашим заявленным целям.
5. Спасибо, это работает для создания каталога, указанного вами. Однако сейчас я сталкиваюсь с одной ошибкой. Ниже приведена следующая ошибка: Созданный каталог: \nas01AdminbbeldentestATL-OctopusDeploy что-то пошло не так!!! с помощью: ATL-OctopusDeploy Неверный синтаксис рядом с ‘-‘. Каталог будет создан, но по какой-то причине ему, похоже, не нравится дефис между двумя словами.