Hoe kan ik een SQL Server-database klonen op dezelfde server in SQL Server 2008 Express?

Ik heb een MS SQL Server 2008 Express-systeem dat een database bevat die ik zou willen ‘kopiëren en hernoemen’ (voor testdoeleinden), maar ik ben niet op de hoogte van een eenvoudige manier om dit te bereiken.

Ik merk dat in de R2-versie van SQL Server er een kopie-database-wizard is, maar helaas kan ik niet upgraden.

De betreffende database is rond een optreden.
Ik heb geprobeerd een back-up van de database te herstellen die ik wil kopiëren in een nieuwe database, maar zonder geluk.


Antwoord 1, Autoriteit 100%

  1. Installeer Microsoft SQL Management Studio, die u gratis kunt downloaden van de website van Microsoft:

    versie 2008

    Microsoft SQL Management Studio 2008 is onderdeel van SQL Server 2008 Express met geavanceerde services

    versie 2012

    Klik op download knop en controleer ENU\x64\SQLManagementStudio_x64_ENU.exe

    versie 2014

    Klik op Download-knop en controleer MGMTStudio 64BIT\SQLManagementStudio_x64_ENU.exe

  2. Open Microsoft SQL Management Studio .

  3. Back-up originele database naar .bak bestand (DB – & GT; taak – & gt; back-up).
  4. Maak een lege database met nieuwe naam (kloon). Opmerking Opmerkingen hieronder, omdat dit optioneel is.
  5. Klik om de database te klonen en dialoogvenster Restauratie openen (zie afbeelding)
  6. Selecteer Apparaat en voeg het back-upbestand toe vanaf stap 3.
  7. Bestemming wijzigen in testdatabase
  8. Verander de locatie van databasebestanden, deze moet anders zijn dan het origineel. U kunt rechtstreeks in het tekstvak typen, voeg gewoon postfix toe. (OPMERKING: Volgorde is belangrijk. Selecteer het selectievakje en wijzig vervolgens de bestandsnamen.)
  9. Controleer WITH REPLACE en WITH KEEP_REPLICATION

Antwoord 2, autoriteit 28%

Klik met de rechtermuisknop op de database die u wilt klonen, klik op Tasks, klik op Copy Database.... Volg de wizard en je bent klaar.


Antwoord 3, autoriteit 24%

Je zou kunnen proberen de database los te koppelen, de bestanden naar een nieuwe naam te kopiëren bij een opdrachtprompt en vervolgens beide DB’s te koppelen.

In SQL:

USE master;
GO 
EXEC sp_detach_db
    @dbname = N'OriginalDB';
GO

Bij de opdrachtprompt (ik heb de bestandspaden vereenvoudigd omwille van dit voorbeeld):

copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf

Opnieuw in SQL:

USE master;
GO
CREATE DATABASE OriginalDB
    ON (FILENAME = 'C:\OriginalDB.mdf'),
       (FILENAME = 'C:\OriginalDB.ldf')
    FOR ATTACH;
GO
CREATE DATABASE NewDB
    ON (FILENAME = 'C:\NewDB.mdf'),
       (FILENAME = 'C:\NewDB.ldf')
    FOR ATTACH;
GO

Antwoord 4, autoriteit 8%

Het bleek dat ik verkeerd had geprobeerd om een back-up te herstellen.

In eerste instantie heb ik een nieuwe database en vervolgens geprobeerd om de back-up hier opnieuw aanvragen.
Wat ik had moeten doen, en wat werkte op het einde, was het brengen van de te herstellen dialoogvenster en typ de naam van de nieuwe database op het gebied van bestemming.

Dus, kortom, het herstellen van een back-up heeft de truc.

Bedankt voor alle feedback en suggesties jongens


Antwoord 5, autoriteit 5%

Dit is het script dat ik gebruik. Een beetje lastig, maar het werkt. Getest op SQL Server 2012.

DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);
SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\Backup\' + @sourceDb + '.bak'    --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'
BACKUP DATABASE @sourceDb TO DISK = @backupPath
RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDb     TO @destMdf,
   MOVE @sourceDb_log TO @destLdf

Antwoord 6, Autoriteit 3%

Geen van de oplossingen die hier genoemd werkte voor mij -. Ik ben met behulp van SQL Server Management Studio 2014

In plaats daarvan moest ik het vinkje uit het “Take staart-log backup voordat herstellen” checkbox in het scherm “Opties”: in mijn versie is standaard ingeschakeld en voorkomt dat de Restore operatie te voltooien.
Na unchecking het, de Restore operatie verliep zonder problemen.


Antwoord 7, Autoriteit 2%

MS SQL Server 2012 gebruiken, moet u 3 basisstappen uitvoeren:

  1. eerste, genereer .sql-bestand met alleen de structuur van de bron DB

    • Klik met de rechtermuisknop op de bron DB en vervolgens Taken Dan GENEIDENDE scripts
    • Volg de wizard en sla de .sqlBestand lokaal
  2. Ten tweede, vervang de bron DB met de bestemming in de .sqlBestand

    • Klik met de rechtermuisknop op het bestemmingsbestand, selecteer Nieuwe query en CTRL-H of (EDIT - Zoeken en vervangen - Snel vervangen )
  3. Ten slotte, vul met gegevens

    • Klik met de rechtermuisknop op de bestemming DB en selecteer vervolgens TAKEN en Gegevens import
    • Data Source Drop Down Set in op ".NET Framework Data Provider voor SQL Server " + SET het Tekstveld van de verbinding String onder Gegevens Ex: Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • Doe hetzelfde met de bestemming
    • Controleer de tabel die u wilt overbrengen of selecteren naast "Bron: ..." om ze allemaal te controleren

U bent klaar.


Antwoord 8

Als de database niet erg groot is, kunt u kijken naar de opdrachten 'Scriptdatabase' in SQL Server Management Studio Express, die zich in een contextmenu bevinden in de database-item zelf in de Explorer.

U kunt kiezen wat allen naar script; U wilt natuurlijk de objecten en de gegevens. Je zult het hele script op een enkel bestand opslaan. Dan kunt u dat bestand gebruiken om de database opnieuw te maken; Zorg ervoor dat de USEopdracht bovenaan gebruiken is ingesteld op de juiste database.


Antwoord 9

In SQL Server 2008 R2, maak een back-up van de database als een bestand in een map.
Kies vervolgens de optie Herstellen die in de map "Database" wordt weergegeven.
Voer in de wizard de nieuwe naam in die u in de doeldatabase wilt.
En kies FROM-bestand herstellen en gebruik het bestand dat u zojuist hebt gemaakt.
Ik heb het gedaan en het was erg snel (mijn db was klein, maar toch)
Pablo.


Antwoord 10

De oplossing, op basis van deze opmerking: https://stackoverflow.com/a/22409447/2399045 .
Gewoon instellingen instellen: DB-naam, TEMP-map, DB-bestandenmap.
En na het uitvoeren heeft u de kopie van DB met naam in "SourcedBname_Yyyy-MM-DD" -formaat.

-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'
--  Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'
SET @sourceDbFile = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 0)
SET @sourceDbFileLog = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 1)
BACKUP DATABASE @sourceDbName TO DISK = @backupPath
RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDbFile     TO @destMdf,
   MOVE @sourceDbFileLog  TO @destLdf

Antwoord 11

Script gebaseerd op het antwoord van Joe (losmaken, bestanden kopiëren, beide bijvoegen).

  1. Voer Management Studio uit als beheerdersaccount.

Het is niet nodig, maar het kan zijn dat de toegang geweigerd wordt bij het uitvoeren.

  1. Sql-server configureren voor execute xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. Voer script uit, maar typ eerst uw db-namen in @dbNameen @copyDBNamevariabelen.
USE master;
GO 
DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'
-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
    INSERT INTO ##DBFileNames([FileName])
    SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')
-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')
EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')
-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')
-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE 
    @oldAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @dbName + ' ON ', 
    @newAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @copyDBName + ' ON '
DECLARE curs CURSOR FOR 
SELECT [filename] FROM ##DBFileNames
OPEN curs  
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0  
BEGIN
    SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
    SET @ext = RIGHT(@filename,4)
    SET @copyFileName = @path + @copyDBName + @ext
    SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
    PRINT @command
    EXEC(@command);
    SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
    SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'
    FETCH NEXT FROM curs INTO @filename
END
CLOSE curs 
DEALLOCATE curs
-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'
-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)
-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)
DROP TABLE ##DBFileNames

Antwoord 12

U kunt gewoon een nieuwe database maken en vervolgens naar taken gaan, gegevens importeren en alle gegevens importeren uit de database die u wilt dupliceren naar de database die u zojuist hebt gemaakt.


Antwoord 13

Van SSMS:

1 - Maak een back-up van de originele database naar een .BAK-bestand (your_source_db -> Task -> Back-up).

2 - Klik met de rechtermuisknop op 'Databases' en 'Database herstellen'

3 - Apparaat > ... (knop) > > toevoegen selecteer de uw_source_db.bak

4 - Hernoem op het tabblad 'Algemeen' in het gedeelte 'Bestemming' in 'Database' uw_bron_db naar nieuwe_naam_db

5 - Vink op het tabblad 'Bestanden' de optie 'Alle bestanden naar map verplaatsen' aan,

  • Hernoem in de kolom 'Herstellen als' de twee lignes om consistentie te behouden met new_name_db (.mdf, _log.ldf)

6 - Vink op het tabblad 'Opties' in het gedeelte 'Opties voor herstellen' twee eerste opties aan ('Overschrijven...', 'Behouden...') en voor 'Herstelstatus': 'HERSTEL MET HERSTEL'

  • Zorg er ook voor dat de opties in het gedeelte 'Tail-Log back-up' niet zijn aangevinkt om te voorkomen dat de bron-db in de 'herstelstatus' blijft!

Antwoord 14

Een andere manier die het lukt door gebruik te maken van import/export wizard, maak eerst een lege database aan, kies dan de bron die uw server is met de brondatabase, en kies dan in de bestemming hetzelfde server met de doeldatabase (gebruik de lege database die u eerst hebt gemaakt), en druk vervolgens op voltooien

Het zal alle tabellen maken en alle gegevens overbrengen naar de nieuwe database,

Other episodes