Cum să utilizați DBCC CLONEDATABASE în SQL Server Mai vechi decât 2014 SP2

Comanda DBCC CloneDatabase este disponibilă numai de la SQL Server 2014 SP2; nu este disponibil în versiunile anterioare. Cu toate acestea, dacă doriți să utilizați acest lucru pe versiuni mai vechi decât 2014, atunci puteți utiliza acest script.

Cu 2014 SP2

DBCC CloneDatabaseOri de câte ori există o problemă de performanță, aveți nevoie de o copie a bazei de date de producție. Cu toate acestea, nu este necesar ca copia pe care o creați să fie cu date pentru a investiga problema de performanță. Așa că Microsoft a introdus DBCC CLONEDATABASE în pachetul de servicii 2 pentru SQL SERVER 2014. Această comandă DBCC va ajuta utilizatorii să creeze copii ale bazei de date de producție doar cu schema și statistici. Vă rugăm să rețineți că această comandă va funcționa numai cu bazele de date de utilizatori și nu poate fi utilizată cu bazele de date de sistem.

Înainte de 2014 SP2

SQL Server 2012Rulați scriptul de mai jos pe dvs SQL server care este mai vechi decât SQL 2014 SP2. Acest script va crea o procedură dbcc_clonedatabase. Apoi puteți executa această procedură trecând numele bazei de date sursă și numele bazei de date noi ca parametri.

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 „ALTER TABLE?  NOCHECK CONSTRAINT ALL' EXEC sp_MSForEachTable 'DELETE FROM ?'
 EXEC sp_MSForEachTable „ALTER TABLE?  VERIFICAȚI CONSTRAINT ALL' EXEC sp_MSForEachTable 'ACTIVARE TRIGGER ALL ON ?'

Vă rugăm să rețineți că dacă descoperiți că baza de date sursă este coruptă atunci când sunteți pe cale să utilizați dbcc clonedatabase, atunci puteți utiliza Instrumente de recuperare SQL precum DataNumen SQL Recovery să o rezolvăm.

Introducerea autorului:

Neil Varley este un expert în recuperarea datelor DataNumen, Inc., care este lider mondial în tehnologiile de recuperare a datelor, inclusiv reparați eroarea de e-mail Outlook și produse software de recuperare Excel. Pentru mai multe informații vizitați www.datanumen.com

Lasă un comentariu

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate *