Команда DBCC CloneDatabase доступна только из SQL Server 2014 СП2; он недоступен в предыдущих версиях. Однако, если вы хотите использовать это в версиях старше 2014 года, вы можете использовать этот скрипт.
С 2014 SP2
Всякий раз, когда возникает проблема с производительностью, вам нужна копия рабочей базы данных. Однако не обязательно, чтобы копия, которую вы создаете, содержала данные для исследования проблемы с производительностью. Поэтому Microsoft представила DBCC CLONEDATABASE в пакете обновлений 2 для SQL SERVER 2014. Эта команда DBCC поможет пользователям создавать копии рабочей базы данных только со схемой и статистикой. Обратите внимание, что эта команда будет работать только с пользовательскими базами данных и не может использоваться с системными базами данных.
До 2014 SP2
Запустите приведенный ниже скрипт на вашем SQL server старше, чем SQL 2014 SP2. Этот скрипт создаст процедуру dbcc_clonedatabase. Затем вы можете выполнить эту процедуру, передав имя исходной базы данных и имя новой базы данных в качестве параметров.
CREATE PROCEDURE dbcc_clonedatabase @olddbname VARCHAR(200) ,@newdbname VARCHAR(200) AS DECLARE @dd NVARCHAR(512) EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' ,N'Software\Microsoft\MSSQLServer\MSSQLServer' ,N'DefaultData' ,@dd OUTPUT DECLARE @dl NVARCHAR(512) EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' ,N'Software\Microsoft\MSSQLServer\MSSQLServer' ,N'DefaultLog' ,@dl OUTPUT DECLARE @db NVARCHAR(512) EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' ,N'Software\Microsoft\MSSQLServer\MSSQLServer' ,N'BackupDirectory' ,@db OUTPUT DECLARE @md NVARCHAR(512) EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' ,N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters' ,N'SqlArg0' ,@md OUTPUT SELECT @md = substring(@md, 3, 255) SELECT @md = substring(@md, 1, len(@md) - charindex('\', reverse(@md))) DECLARE @ml NVARCHAR(512) EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' ,N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters' ,N'SqlArg2' ,@ml OUTPUT SELECT @ml = substring(@ml, 3, 255) SELECT @ml = substring(@ml, 1, len(@ml) - charindex('\', reverse(@ml))) DECLARE @a VARCHAR(1000) ,@b VARCHAR(1000) ,@c VARCHAR(1000) SET @a = isnull(@dd, @md) SET @b = isnull(@dl, @ml) SET @c = isnull(@db, @ml) DECLARE @name VARCHAR(50) SET @name = @olddbname DECLARE @fileName VARCHAR(1000) SET @fileName = @c + '\' + @name + '.BAK' --select @fileName BACKUP DATABASE @name TO DISK = @fileName DECLARE @tfilelist TABLE ( cLogicalName NVARCHAR(128) ,cPhysicalName NVARCHAR(260) ,cType CHAR(1) ,cFilegroupName VARCHAR(10) ,csize INT ,cMaxSize BIGINT ,cfield INT ,ccreatelsn BIT ,cdroplsn BIT ,cuniqueid UNIQUEIDENTIFIER ,creadonlylsn BIT ,creadwritelsn BIT ,cbackupsizeinbytes BIGINT ,csourceblocksize INT ,cfilegroupid INT ,cloggroupguid UNIQUEIDENTIFIER ,cdifferentialbaselsn BIT ,cdifferentialbaseguid UNIQUEIDENTIFIER ,cisreadonly BIT ,cispresent BIT ,ctdethumbprint VARCHAR(5) ); DECLARE @bs NVARCHAR(1000) SET @bs = 'restore filelistonly from disk=''' + @fileName + '''' SELECT @bs INSERT INTO @tfilelist EXEC sp_executesql @bs DECLARE @sql NVARCHAR(1000) SELECT * FROM @tfilelist DECLARE @name2 VARCHAR(1000) ,@m VARCHAR(300) ,@mp VARCHAR(1000) ,@l VARCHAR(1000) ,@lp VARCHAR(1000) SET @m = ( SELECT clogicalname FROM @tfilelist WHERE ctype = 'D' ) SET @mp = ( SELECT cPhysicalName FROM @tfilelist WHERE ctype = 'D' ) SET @l = ( SELECT clogicalname FROM @tfilelist WHERE ctype = 'L' ) SET @lp = ( SELECT cPhysicalName FROM @tfilelist WHERE ctype = 'L' ) SET @name2 = @newdbname SET @sql = 'RESTORE database [' + @name2 + '] from disk =''' + @fileName + ''' with '; SELECT @sql = @sql + ' move ''' + @m + ''' to ''' + replace(@mp, @name, @name2) + ''',' SELECT @sql = @sql + ' move ''' + @l + ''' to ''' + replace(@lp, @name, @name2) + ''', stats = 1' SELECT @sql EXEC sp_executesql @sql; SET @sql = 'Use [' + @name2 + ']' SELECT @sql EXEC sp_executesql @sql; EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?' EXEC sp_MSForEachTable 'ИЗМЕНИТЬ ТАБЛИЦУ? NOCHECK CONSTRAINT ALL' EXEC sp_MSForEachTable 'УДАЛИТЬ ИЗ?' EXEC sp_MSForEachTable 'ИЗМЕНИТЬ ТАБЛИЦУ? CHECK CONSTRAINT ALL' EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON?'
Обратите внимание, что если вы обнаружите, что исходная база данных повреждена, когда вы собираетесь использовать dbcc clonedatabase, вы можете использовать Инструменты восстановления SQL как DataNumen SQL Recovery Исправить это.
Об авторе:
Нил Варли — эксперт по восстановлению данных в DataNumen, Inc., которая является мировым лидером в области технологий восстановления данных, включая исправить ошибку электронной почты Outlook и программные продукты для восстановления Excel. Для получения дополнительной информации посетите www.datanumen.com
Оставьте комментарий