рд╕рднреА MS SQL рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╢реАрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╕рднреА рд╡рд╛рддрд╛рд╡рд░рдг (SQL рд╕рд░реНрд╡рд░ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ SQL рд╕рд░реНрд╡рд░ рдХреЗ 50 рдЙрджрд╛рд╣рд░рдг) рдХреЛ SQL рд╕рд░реНрд╡рд░ рдХреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рд╕реНрдерд┐рдд рдерд╛ред рдореИрдВ рдореИрдиреБрдЕрд▓ рд╢реНрд░рдо рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЕрд╕реНрд╡реАрдХрд░рдг


рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рджреЗрд╡ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИ, рдПрдХ рд╕рд░рд▓ рд░рд┐рдХрд╡рд░реА рдореЙрдбрд▓, рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд▓реЗрдирджреЗрди рд▓реЙрдЧ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХ рд╣реА рдвреЗрд░ рдкрд░ рд╣реИрдВред

рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП (рдЕрдкрдиреА рд╢рд░реНрддреЛрдВ) рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирдП-рдлрдВрд╕реЗ STRING_AGG рдФрд░ рдЕрдиреНрдп рдЕрдЪреНрдЫреА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ SQL рд╕рд░реНрд╡рд░ 2008 (рдпрд╛ 2008 R2 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмреИрдХрдЕрдк рд╕рдВрдкреАрдбрд╝рди рдХрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛)ред рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмреИрдХрдЕрдк рдХрдорд╛рдВрдб рд╕реЗ COMPRESSION рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИ - "рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЛ рдХреИрд╕реЗ рдХрд░реЗрдВ"ред рдпрд╣ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдХрд┐ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрддрд┐рд╢реАрд▓ SQL рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдбрд┐рд╕реНрдХ рд╢реЗрд▓реНрдл рдХреЛ рдирдП рд╕рд░реНрд╡рд░ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛ред рдбрд┐рдЯреИрдЪ - рдХреЙрдкреА рдХрд░рдирд╛ - рдЕрдЯреИрдЪ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЪреИрдирд▓ рдХрд╛рдлреА рд╕рдВрдХреАрд░реНрдг рдерд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдПрдХ рдЕрд╕рдореНрдкреАрдбрд┐рдд рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдордп рдХреА рдПрдХ рд▓рдВрдмреА рдЕрд╡рдзрд┐ рд▓реЗрдЧрд╛ред

рдирддреАрдЬрддрди, рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдирдП рд╕рд░реНрд╡рд░ рдкрд░ рдЧреЗрдВрдж рдкрд░ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдХрдЕрдк рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╕реНрдерд╛рди рджреЛрдиреЛрдВ рдореЗрдВ рд▓реЛрд╣рд╛ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИ, рдмреИрдХрдЕрдк рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИ, рд╕рдордп рд▓рд╛рдн рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред

рддреЛ "рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрдирд░реЗрдЯрд░" рд▓рд┐рдЦрд╛ рдерд╛:

DECLARE @unc_backup_path AS varchar(max) = '\\newServer\backup_share\'
	, @local_backup_path AS varchar(max) = 'E:\Backup\'
	, @new_data_path as varchar(max) = 'D:\SQLServer\data\';

SELECT name	
	, 'BACKUP DATABASE [' + name + '] TO DISK = ''' + @unc_backup_path + name + '.bak'' WITH INIT, COPY_ONLY, STATS = 5;' AS backup_command
	, 'ALTER DATABASE [' + name + '] SET OFFLINE WITH ROLLBACK IMMEDIATE;' AS offline_command
	, 'RESTORE DATABASE [' + name + '] FROM DISK = ''' + @local_backup_path + name + '.bak'' WITH ' 
		+ (
			SELECT 'MOVE ''' + mf.name + ''' TO ''' + 
				@new_data_path + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('\', REVERSE(mf.physical_name))-1)) +
				''', '
			FROM sys.master_files mf
			WHERE mf.database_id = d.database_id
			FOR XML PATH('')
		) + 'REPLACE, RECOVERY, STATS = 5;' AS restore_command
FROM sys.databases d
WHERE database_id > 4 AND state_desc = N'ONLINE';

рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдСрдлрд╝рд▓рд╛рдЗрди рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реБрдП, рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдмреИрдХрдЕрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрдорд╛рдВрдб рдорд┐рд▓рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреБрд░рд╛рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рди рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдирдП рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдмреИрдХрдЕрдк рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдерд╛рди рдкрд░ рд▓реЙрдЧ рд▓реЙрдЧ рдХрд░ рд╕рдХреЗрдВред )

рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдХрд┐рд╕реА рдХреЛ рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ (рдмреИрдХрдЕрдк-рдСрдлрд▓рд╛рдЗрди рд░рд┐рдХрд╡рд░реА), рдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрд╣рд▓реЗ рд╕рднреА рдмреИрдХрдЕрдк рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рд╕рдмрдХреБрдЫ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдХрдо рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмреИрдардиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЯреНрд░реИрдХ рдХрд░реЗрдВред

рдореИрдВ рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдПрдХ рдУрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрдорд╛рдВрдб рд╣реИрдВ, рдХрд░реНрд╕рд░ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛, рдкреБрд░рд╛рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рд░реНрд╡рд░ рдЬреЛрдбрд╝рд╛, рдФрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рдкрд░, EXECUTE (@sql_text) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдкрд░, EXECUTE (@sql_text) AT [рд▓рд┐рдВрдХреНрдбрдЗрди рд╕рд░реНрд╡рд░]ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ - рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдмреИрдХрдЕрдк, рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдСрдлрд╝рд▓рд╛рдЗрди рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛, рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рд╣реБрдЖ, рдЪреАрдпрд░реНрд╕, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкреНрд░рддреАрдд рд╣реБрдЖ рдХрд┐ рдпрджрд┐ рдЖрдк рдмреИрдХрдЕрдк рдФрд░ рд░рд┐рдХрд╡рд░реА рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд░реНрд╕рд░ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдХрд░реНрд╕рд░ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдмреИрдХрдЕрдк рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдСрдлрд╝рд▓рд╛рдЗрди рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ (рдореИрдВ рдорд╛рдирджрдВрдб рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛), рдЬреЛ рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдП рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ рдФрд░ рдХреБрдЫ, рдпрджрд┐ рдХреЛрдИ рд╣реИ, рддреЛ рдЙрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдлреЗрд╕рд▓рд╛


рдкреБрд░рд╛рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ ## рдХрдорд╛рдВрдбрд▓рд┐рд╕реНрдЯ рдмрдирд╛рдИ рдФрд░ рдЖрдмрд╛рдж рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдХрдорд╛рдВрдб рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдмреИрдХрдЕрдк рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рддрд╛рд▓рд┐рдХрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рддрд╛рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рддреНрд░ рд╕реЗ рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рдЖрдк рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЕрдм рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

DECLARE @unc_backup_path AS varchar(max) = 'D:\SQLServer\backup\' --       
	, @local_backup_path AS varchar(max) = 'D:\SQLServer\backup\'	--        
	, @new_data_path as varchar(max) = 'D:\SQLServer\data\';		--      ,    

SET NOCOUNT ON;

IF OBJECT_ID ('tempdb..##CommandList', 'U') IS NULL
	CREATE TABLE ##CommandList (
		dbName sysname unique			-- 
		, backup_command varchar(max)	--   
		, offline_command varchar(max)	--        
		, restore_command varchar(max)	--       
		, processed bit				-- : NULL -  , 0 -  , 1 - 
		, start_dt datetime			--  
		, finish_dt datetime			--  
		, error_msg varchar(max)		--  ,  
	);

INSERT INTO ##CommandList (dbname, backup_command, offline_command, restore_command)
SELECT name	
	, 'BACKUP DATABASE [' + name + '] TO DISK = ''' + @unc_backup_path + name + '.bak'' WITH INIT, COPY_ONLY, STATS = 5;' AS backup_command -- INIT -      
	, 'ALTER DATABASE [' + name + '] SET OFFLINE WITH ROLLBACK IMMEDIATE;' AS offline_command
	, 'RESTORE DATABASE [' + name + '] FROM DISK = ''' + @local_backup_path + name + '.bak'' WITH ' 
		+ (
			SELECT 'MOVE ''' + mf.name + ''' TO ''' + 
				@new_data_path + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('\', REVERSE(mf.physical_name))-1)) +
				''', '	
			FROM sys.master_files mf
			WHERE mf.database_id = d.database_id
			FOR XML PATH('')
		) + 'REPLACE, RECOVERY, STATS = 5;' AS restore_command	
FROM sys.databases d
WHERE database_id > 4 
	AND state_desc = N'ONLINE'
	AND name NOT IN (SELECT dbname FROM ##CommandList)
	AND name <> 'Maintenance';	--  linked server -    ,   ,    "linked server"

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реБрдЖ (SELECT # FROM ## рдХрдорд╛рдВрдбрд▓рд┐рд╕реНрдЯ):



рдмрдврд╝рд┐рдпрд╛, рд╕рднреА рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рдмреИрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ / рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд░рдЦрд░рдЦрд╛рд╡ рдбреЗрдЯрд╛рдмреЗрд╕ рдирдП рд╕рд░реНрд╡рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрдорд╛рдВрдбрд▓рд┐рд╕реНрдЯ рдЯреЗрдмрд▓ рдЗрд╕рдореЗрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА:

USE [Maintenance]
GO

CREATE TABLE CommandList (
	dbName sysname unique				-- 
	, restore_command varchar(max)		--  
	, processed bit						-- 
	, creation_dt datetime DEFAULT GETDATE()	--  
	, start_dt datetime					--  
	, finish_dt datetime					--  
	, error_msg varchar(max)				-- ,  
);

SQL рд╕рд░реНрд╡рд░ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдПрдХ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрд░рд╛рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреА рдЧрдИ рд╣реИрдВ, рдореИрдВрдиреЗ рдШрд░ рдкрд░ рд▓рд┐рдЦреА рдереАрдВ рдФрд░ рдПрдХ рдирдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдереА, рдореИрдВрдиреЗ рдПрдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЦреБрдж рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд╣реИ рдФрд░ рдЧреИрд░-рдкрде рд╕реНрдерд╛рдиреАрдп рд╣реИред

рдЕрдм рдЖрдк рдРрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдВ, рдЙрдиреНрд╣реЗрдВ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рд▓рд┐рдЦреЗрдВ:

DECLARE @dbname AS sysname
	, @backup_cmd AS varchar(max)
	, @restore_cmd AS varchar(max)
	, @offline_cmd AS varchar(max);

DECLARE MoveDatabase CURSOR
FOR 
SELECT dbName, backup_command, offline_command, restore_command
FROM ##CommandList
WHERE processed IS NULL;

OPEN MoveDatabase;

FETCH NEXT FROM MoveDatabase INTO @dbname, @backup_cmd, @offline_cmd, @restore_cmd;

WHILE @@FETCH_STATUS = 0
	BEGIN
		--    ,  :
		--  
		--   -      
		--    ,      
		--     

		--    
		UPDATE ##CommandList
		SET start_dt = GETDATE()
		WHERE dbName = @dbname;

		BEGIN TRY
			
			RAISERROR ('  %s', 0, 1, @dbname) WITH NOWAIT; --   messages   
			
			--  
			EXEC (@backup_cmd);

			RAISERROR ('    %s', 0, 1, @dbname) WITH NOWAIT;

			--    -  linked server
			INSERT INTO [(LOCAL)].[Maintenance].[dbo].[CommandList] (dbName, restore_command)
			VALUES (@dbname, @restore_cmd);

			RAISERROR (' %s  OFFLINE', 0, 1, @dbname) WITH NOWAIT;

			--    
			EXEC (@offline_cmd);

			--  ,    
			UPDATE ##CommandList
			SET processed = 0
				, finish_dt = GETDATE()
			WHERE dbName = @dbname;

		END TRY
		BEGIN CATCH
			
			RAISERROR ('    %s.   error_msg  ##CommandList', 0, 1, @dbname) WITH NOWAIT;

			--  -   ,      
			UPDATE ##CommandList
			SET processed = 1
				, finish_dt = GETDATE()
				, error_msg = ERROR_MESSAGE();

		END CATCH

		FETCH NEXT FROM MoveDatabase INTO @dbname, @backup_cmd, @offline_cmd, @restore_cmd;
	END

CLOSE MoveDatabase;

DEALLOCATE MoveDatabase;

-- 
SELECT dbName
	, CASE processed WHEN 1 THEN '' WHEN 0 THEN '' ELSE ' ' END as Status 
	, start_dt
	, finish_dt
	, error_msg
FROM ##CommandList
ORDER BY start_dt;

DROP TABLE ##CommandList;

рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ SSMS рдореЗрдВ рд╕рдВрджреЗрд╢ рдЯреИрдм рдкрд░ "рд▓реЙрдЧ рдЗрди" рд╣реЛрддреА рд╣реИ - рд╡рд╣рд╛рдВ рдЖрдк рд╡рд░реНрддрдорд╛рди рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди RAISERROR рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдХрд╛рдо рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд▓реЙрдЧ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд░рдирдЯрд╛рдЗрдо рдкрд░, рдЖрдк ## рдХрдорд╛рдВрдбрд▓рд┐рд╕реНрдЯ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рд░рдгреАрдмрджреНрдз рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗред

рдирдП рд╕рд░реНрд╡рд░ рдкрд░, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдШреВрдо рд░рд╣рд╛ рдерд╛:


SET NOCOUNT ON;

DECLARE @dbname AS sysname
	, @restore_cmd AS varchar(max);

WHILE 1 = 1	--   ,    
BEGIN
	SELECT TOP 1 @dbname = dbName, @restore_cmd = restore_command 
	FROM CommandList
	WHERE processed IS NULL; --    ,  

	IF @dbname IS NOT NULL 
	BEGIN
		--    
		UPDATE CommandList
		SET start_dt = GETDATE()
		WHERE dbName = @dbname;

		RAISERROR('  %s', 0, 1, @dbname) WITH NOWAIT;
		
		BEGIN TRY

			--  ,  -  ,  CATCH    
			EXEC (@restore_cmd);

			--   
			UPDATE CommandList
			SET processed = 0
				, finish_dt = GETDATE()
			WHERE dbName = @dbname;

			RAISERROR(' %s  ', 0, 1, @dbname) WITH NOWAIT;

		END TRY
		BEGIN CATCH

			RAISERROR('    %s', 0, 1, @dbname) WITH NOWAIT;

			UPDATE CommandList 
			SET processed = 1
				, finish_dt = GETDATE()
				, error_msg = ERROR_MESSAGE();

		END CATCH

	END
	ELSE	--   ,    
		BEGIN

			RAISERROR('waiting', 0, 1) WITH NOWAIT;

			WAITFOR DELAY '00:00:30';

		END
		
	SET @dbname = NULL;
	SET @restore_cmd = NULL;

END

рд╕рдм рдХреБрдЫ рдЬреЛ рд╡рд╣ рдХрд░рддрд╛ рд╣реИ - рдХрдорд╛рдВрдбрд▓рд┐рд╕реНрдЯ рдЯреЗрдмрд▓ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╡рд╣рд╛рдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрдЪреНрдЪрд╛ рд░рд┐рдХреЙрд░реНрдб рд╣реИ - рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо рдФрд░ рдХрдорд╛рдВрдб рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИ рдФрд░ EXEC (@sql_text) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ; рдпрджрд┐ рдХреЛрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ 30 рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдХрд░реНрд╕рд░ рдФрд░ рд▓реВрдк рджреЛрдиреЛрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдд рдирд╣реАрдВ рдмрдиреА? рд╣рдо рдЯреЗрдмрд▓ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдм рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓реМрдЯрддреЗ рд╣реИрдВред

рд░реБрдХрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд▓рд╕реА рдерд╛ред рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдХрдо рд╕реЗ рдХрдо рддреАрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ - рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ - "рд░рд┐рдХрд╡рд░реА рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ \ _ рд░рд┐рдХрд╡рд░реА рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ \ _" рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдлрд╝реНрд▓реИрдЧ \ _ "рдлрд╝реНрд▓реИрдЧ, рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдХрдорд╛рдВрдб рдХреА рд╕реВрдЪреА рдХреЛ рддреБрд░рдВрдд рднрд░рдиреЗ, рдЬрдм рдкреБрд░рд╛рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ ## рдХрдорд╛рдВрдбрд▓рд┐рд╕реНрдЯ рдХреЛ рднрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдЕрдВрджрд░ рдлреНрд▓реИрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╣рдо "рд░рд┐рдХрд╡рд░реА рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд┐рдХреЙрд░реНрдб" рдирд╣реАрдВ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рддреБрд░рдВрдд рдХрд╛рдо рдХреА рдкреВрд░реА рд░рд╛рд╢рд┐ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


рд▓реЗрдХрд┐рди рдХреЛрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА / рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдкреЛрд╕реНрдЯ рдореЗрдВ рджреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ, рдареЗрд╕ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рд╢рд┐рдкрд┐рдВрдЧ / рдбреЗрдЯрд╛рдмреЗрд╕ рдорд┐рд░рд░рд┐рдВрдЧ / рдЙрдкрд▓рдмреНрдзрддрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдПред

рдЧреЗрдВрдж рдкрд░ рдмреИрдХрдЕрдк рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╕рдордп, рдЬрд┐рд╕ рдЦрд╛рддреЗ рдХреЗ рддрд╣рдд SQL рд╕рд░реНрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ рд╡рд╣рд╛рдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдкреЛрд╕реНрдЯ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬреАрдпреВрдЖрдИ рдореЗрдВ рдорд╛рдЙрд╕ рд╕рд╣рдЬрддрд╛ рд╕реЗ рдПрдХ-рджреЛ рдорд┐рдирдЯ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдирдП рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЙрдЧрдЗрди рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдгред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдмрд╕ рдлрд┐рд░ рд╕реЗ sql logins рдмрдирд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рд╛рдЗрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВред рдореМрдЬреВрджрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рд╕рд╣реА рд╕рд╛рдЗрдб рдХреЗ рд╕рд╛рде sql рд▓реЙрдЧрд┐рди рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ msdn рдкрд░ рд╣реИ ред

All Articles