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

Откуда:
Сообщений: 23
Добрый день, гуру скуля.
Я в этом деле новичок, нужна ваша помощь. Помогите разобраться со скриптом:

USE [master]
GO
DECLARE @DBName nvarchar(50), @DBNameBackup nvarchar(50), @DBName_mdf varchar(500),  @DBName_ldf varchar(500), @MyDBNamelog varchar(500);
DECLARE @InstallDbPath nvarchar(max), @InstallDbPathLog nvarchar(max), @RestoreDbPath nvarchar(max), @RestoreDbPathLog nvarchar(max), @DBNamelog nvarchar(max),@BackupFolder nvarchar(max), @FullBackupPath nvarchar(max), @BackupFolderRecovery nvarchar(max), @FullBackupPathRecovery nvarchar(max);
--Формирование даты для бэкапа
DECLARE @BackupDate nvarchar(max) = CONVERT(varchar(10),GETDATE(),105);
--Каталог для бэкапа
DECLARE @BackupPath nvarchar(500) = 'D:\Backup';
SET @DBName = '$(varDBdatabase_recovery)';  --'$(varDBName)';  -- параметр из PowerShell
SET @DBNameBackup = '$(varDBdatabase_backup)';--'$(varDBNameBackup)';  -- параметр из PowerShell

SET @InstallDbPath = 'E:\DATA\' + @DBName + '.mdf';--база в которую заливаем
SET @InstallDbPathLog = 'U:\LOG\' + @DBName + '_log.ldf';
SET @RestoreDbPath = 'E:\DATA\' + @DBNameBackup + '.mdf';--база из которой заливаем
SET @RestoreDbPathLog = 'U:\LOG\' + @DBNameBackup + '_log.ldf';
SET @DBNamelog = @DBNameBackup+'_log';

        Declare @SQLCmd as nvarchar(max);
        Declare @SQLCmd5 as nvarchar(max);

        IF EXISTS ( SELECT * FROM sysdatabases WHERE name = @DBName)
        BEGIN
	Declare @SQLCmd1 as nvarchar(max);
	set @SQLCmd1 = 'USE master; ALTER DATABASE ' + @DBName + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'; 
	exec (@SQLCmd1);
	PRINT N'База переведена в монопольный режиме';
	
	SET @BackupFolder = @BackupPath + '\' + @DBNameBackup;
        SET @FullBackupPath = @BackupFolder + '\' + @DBNameBackup + '_' + @BackupDate + '.bak';
	SET @BackupFolderRecovery = @BackupPath + '\' + @DBName;
	SET @FullBackupPathRecovery = @BackupFolderRecovery + '\' + @DBName + '_' + @BackupDate + '.bak';
	--PRINT N'База существует';
        set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH  FILE = 1;
	select @SQLCmd5;
        exec (@SQLCmd5);
	
	set @SQLCmd = 'RESTORE DATABASE ' + @DbName + ' FROM  DISK = N''' + @FullBackupPath + ''' WITH  FILE = 1,  
	MOVE N'''+@DBNameBackup+''' TO N'''+@InstallDbPath+''',  MOVE N'''+@DBNamelog+''' TO N'''+@InstallDbPathLog+''', NOUNLOAD,  REPLACE,  STATS = 5';
	select @SQLCmd;
	exec (@SQLCmd);
	PRINT N'База восстановлена';
	
	Declare @SQLCmd2_2 as nvarchar(max);
	set @SQLCmd2_2 = 'USE ' + @DBName + '; CREATE USER [user1c_ats] FOR LOGIN [user1c_ats] WITH DEFAULT_SCHEMA=[dbo]'; 
	exec (@SQLCmd2_2);
	PRINT N'Создали пользователя user1c_ats у базы - '+ @DBName;
	
	Declare @SQLCmd2 as nvarchar(max);
	set @SQLCmd2 = 'USE ' + @DBName + '; exec sp_changedbowner ''user1c_ats'''; 
	exec (@SQLCmd2);
        PRINT N'Пользователя user1c_ats сделали владельцем базы';
	
	Declare @SQLCmd2_1 as nvarchar(max);
	set @SQLCmd2_1 = 'USE ' + @DBName + '; ALTER ROLE db_owner ADD MEMBER user1c_ats'; 
	exec (@SQLCmd2_1);
        PRINT N'У пользователя user1c_ats добавили права db_owner к базе';
	
	Declare @SQLCmd3 as nvarchar(max);
	set @SQLCmd3 = 'USE master; ALTER DATABASE ' + @DBName + ' SET MULTI_USER'; 
	
	exec (@SQLCmd3);
	
	Declare @SQLCmd4 as nvarchar(max);
	set @SQLCmd4 = 'USE master; ALTER DATABASE ' + @DBName + ' SET RECOVERY SIMPLE'; 
	exec (@SQLCmd4);
	PRINT N'База переведена в многопользовательский режим';
        PRINT N'Режим восстановления базы переведен в Simple';
	
END
ELSE
BEGIN
	PRINT N'База не существует';
END
GO



При выполнении скрипта ошибки:

Changed database context to 'master'.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 38
Incorrect syntax near ' + @DbName + '.
Msg 319, Level 15, State 1, Server VM-EDIC-TAN, Line 38
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 45
Incorrect syntax near ';
exec (@SQLCmd2_2);
PRINT N'.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 50
Incorrect syntax near 'user1c_ats'.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 55
Incorrect syntax near ';
exec (@SQLCmd2_1);
PRINT N'.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 60
Incorrect syntax near ' + @DBName + '.
Msg 195, Level 15, State 7, Server VM-EDIC-TAN, Line 60
'MULTI_USER' is not a recognized SET option.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 65
Incorrect syntax near ' + @DBName + '.
Msg 195, Level 15, State 7, Server VM-EDIC-TAN, Line 65
'RECOVERY' is not a recognized SET option.
Msg 132, Level 15, State 1, Server VM-EDIC-TAN, Line 90
The label 'D' has already been declared. Label names must be unique within a query batch or stored procedure.
Msg 132, Level 15, State 1, Server VM-EDIC-TAN, Line 90
The label 'E' has already been declared. Label names must be unique within a query batch or stored procedure.
Msg 132, Level 15, State 1, Server VM-EDIC-TAN, Line 90
The label 'U' has already been declared. Label names must be unique within a query batch or stored procedure.
Msg 105, Level 15, State 1, Server VM-EDIC-TAN, Line 90
Unclosed quotation mark after the character string ', NOUNLOAD, REPLACE, STATS = 5

GO*/
'.


Скрипт выполнялся нормально, пока не добавил:

set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH FILE = 1;
select @SQLCmd5;
exec (@SQLCmd5);

Сообщение было отредактировано: 13 окт 17, 13:58
13 окт 17, 10:25    [20866438]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
LoopN
Guest
set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH FILE = 1;[b]'[/b]

апостраф (') в самом конце не указал
13 окт 17, 10:58    [20866642]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
LoopN
Guest
должно быть
set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH FILE = 1;'
select @SQLCmd5;
exec (@SQLCmd5); 
13 окт 17, 10:59    [20866651]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
LoopN, спасибо большое. Скрипт выполняется, но база не обновляется, выдает следующее сообщение:

Changed database context to 'master'.
База переведена в монопольный режиме

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RESTORE FILELISTONLY FROM DISK = N'D:\Backup\v82Doc_DVK\v82Doc_DVK_13-10-2017.bak' WITH FILE = 1;

(1 rows affected)
LogicalName PhysicalName Type FileGroupName Size MaxSize FileId CreateLSN DropLSN UniqueId ReadOnlyLSN ReadWriteLSN BackupSizeInBytes SourceBlockSize FileGroupId LogGroupGUID DifferentialBaseLSN DifferentialBaseGUID IsReadOnly IsPresent TDEThumbprint
-------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- -------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- --------------------------- --------------------------- ------------------------------------ --------------------------- --------------------------- -------------------- --------------- ----------- ------------------------------------ --------------------------- ------------------------------------ ---------- --------- ------------------------------------------
v82Doc_DVK E:\DATA\v82Doc_DVK.mdf D PRIMARY 61034070016 35184372080640 1 0 0 5166C611-0B62-4C99-BA18-B554E5AEEDD9 0 0 58104938496 512 1 NULL 5112377000000384600036 2DCC2FD4-F98E-4894-A3BD-89B04CDF47BB 0 1 NULL
v82Doc_DVK_log U:\LOG\v82Doc_DVK_log.ldf L NULL 7637368832 2199023255552 2 0 0 C0DE8274-1C5F-421E-924A-AC1F20CA3E37 0 0 0 512 0 NULL 0 00000000-0000-0000-0000-000000000000 0 1 NULL

(2 rows affected)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RESTORE DATABASE v82Doc_DVK FROM DISK = N'D:\Backup\v82Doc_DKU\v82Doc_DKU_13-10-2017.bak' WITH FILE = 1,
MOVE N'v82Doc_DKU' TO N'E:\DATA\v82Doc_DVK.mdf', MOVE N'v82Doc_DKU_log' TO N'U:\LOG\v82Doc_DVK_log.ldf', NOUNLOAD, REPLACE, STATS = 5

(1 rows affected)
Msg 3234, Level 16, State 2, Server VM-EDIC-TAN, Line 1
Logical file 'v82Doc_DKU' is not part of database 'v82Doc_DVK'. Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Server VM-EDIC-TAN, Line 1
RESTORE DATABASE is terminating abnormally.
База восстановлена
Msg 15023, Level 16, State 1, Server VM-EDIC-TAN, Line 1
User, group, or role 'user1c_ats' already exists in the current database.
Создали пользователя user1c_ats у базы - v82Doc_DVK
Msg 15110, Level 16, State 1, Server VM-EDIC-TAN, Line 1
The proposed new database owner is already a user or aliased in the database.
Пользователя user1c_ats сделали владельцем базы
У пользователя user1c_ats добавили права db_owner к базе
База переведена в многопользовательский режим
Режим восстановления базы переведен в Simple
13 окт 17, 11:33    [20866832]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
LoopN, проблема в этом "Logical file 'v82Doc_DKU' is not part of database 'v82Doc_DVK'. Use RESTORE FILELISTONLY to list the logical file names.", но так разве эту проблему не должна решать строчка:

set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH FILE = 1;'
select @SQLCmd5;
exec (@SQLCmd5);
13 окт 17, 12:17    [20866993]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
Ilnur26
Member

Откуда:
Сообщений: 15
davydovk,

RESTORE FILELISTONLY просто показывает вам файлы базы.

Вам нужно из этого списка взять логические имена файлов и подставить в @DBNameBackup и @DBNamelog сюда:
set @SQLCmd = 'RESTORE DATABASE ' + @DbName + ' FROM DISK = N''' + @FullBackupPath + ''' WITH FILE = 1, 
MOVE N'''+@DBNameBackup+''' TO N'''+@InstallDbPath+''', MOVE N'''+@DBNamelog+''' TO N'''+@InstallDbPathLog+''', NOUNLOAD, REPLACE, STATS = 5';
select @SQLCmd;
exec (@SQLCmd);


А то что вы передаете в эти переменные не соответствует логическим именам файлов базы данных.
13 окт 17, 12:35    [20867063]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
Ilnur26, Спасибо, все получилось.
13 окт 17, 16:37    [20868190]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
Подскажите, пожалуйста, еще... Скрипт первый раз после доработки выполнился без ошибок, база обновилась, НО логические имена файлов базы, которую восстанавливаем, все равно изменяются на логические имена файлов базы, с которой восстанавливаем и при повторном исполнении скрипта опять та же ошибка "Logical file 'v82Doc_DKU' is not part of database 'v82Doc_DVK'. Use RESTORE FILELISTONLY to list the logical file names." Что делать?
19 окт 17, 13:09    [20882268]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
davydovk,

так а нахрена вы тогда в инструкции RESTORE DATABASE указываете REPLACE, если вам не нужна перезапись текущей базы?

курите справку: https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql
19 окт 17, 13:36    [20882387]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
felix_ff
davydovk,

так а нахрена вы тогда в инструкции RESTORE DATABASE указываете REPLACE, если вам не нужна перезапись текущей базы?

курите справку: https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql


Добрый день.
Перезапись текущей базы требуется. Я перезаписываю одну базу бэкапом другой базы, но мне надо, чтобы логические имена файлов остались без изменений, т.к. если они перезапишутся, повторное восстановление базы не сработает.
20 окт 17, 12:15    [20885385]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
davydovk,

так вы что хотите с бэкапов базы v82Doc_DVK восстанавливать базу v82Doc_DKU без перезаписи?

так не пойдет у них разный GUID файлов. REPLACE параметр в инструкции RESTORE как раз и нужен что бы отключить проверку соотвествия GUID семейства файлов.
Это сделано специально для защиты от дурака, что бы с бэкапа другой базы нельзя было поднять бэкап в существующую.
20 окт 17, 13:36    [20885771]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
делайте после RESTORE

ALTER DATABASE  [v82Doc_DKU]
MODIFY FILE (NAME = old_logical_name, NEWNAME= new_logical_name);
20 окт 17, 13:39    [20885790]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
felix_ff, дописал в скрипт:
Declare @SQLCmd6 as nvarchar(max);
set @SQLCmd6 = 'USE ' + @DBName + '; MODIFY FILE (NAME=N'v82Doc_DVK', NEWNAME=N'v82Doc_DKU')'; 
exec (@SQLCmd6);


После выполнение скрипта выдает ошибку:
Changed database context to 'master'.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 74
Incorrect syntax near 'v82Doc_DVK'.
7 ноя 17, 13:42    [20932523]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
iiyama
Member

Откуда:
Сообщений: 642
davydovk,

set @SQLCmd6 = 'USE ' + @DBName + '; MODIFY FILE (NAME=N''v82Doc_DVK'', NEWNAME=N''v82Doc_DKU'')'; 
7 ноя 17, 13:59    [20932607]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
iiyama,
Declare @SQLCmd6 as nvarchar(max);
set @SQLCmd6 = 'USE ' + @DBName + '; MODIFY FILE (NAME=N''v82Doc_DVK'', NEWNAME=N''v82Doc_DKU'')'; 
exec (@SQLCmd6);


Теперь выдает:

Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near 'MODIFY'.
Изменили логические имена файлов
7 ноя 17, 14:16    [20932709]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
davydovk,

что это у вас за команда такая modify file отдельным стейтментом без alter database?
7 ноя 17, 14:45    [20932870]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со скриптом  [new]
davydovk
Member

Откуда:
Сообщений: 23
felix_ff, написал:

Declare @SQLCmd6 as nvarchar(max);
set @SQLCmd6 = 'USE ' + @DBName + '; ALTER DATABASE ' + @DBName + ' MODIFY FILE (NAME=' + @DBNameBackup + ', NEWNAME=' + @DBName + ')'; 
exec (@SQLCmd6);


Все заработало. Спасибо.
7 ноя 17, 18:09    [20934038]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить