Bagaimana saya bisa mengkloning database SQL Server pada server yang sama di SQL Server 2008 Express?

272

Saya memiliki sistem MS SQL Server 2008 Express yang berisi database yang saya ingin 'salin dan ganti nama' (untuk tujuan pengujian) tetapi saya tidak mengetahui cara sederhana untuk mencapai ini.

Saya perhatikan bahwa dalam SQL Server versi R2 ada penyihir basis data salin, tapi sayangnya saya tidak bisa memutakhirkan.

Basis data yang dimaksud adalah sekitar manggung. Saya berusaha memulihkan cadangan database yang ingin saya salin ke database baru, tetapi tidak berhasil.

Sergio
sumber
2
Memulihkan cadangan harus berfungsi. Bisakah Anda memberikan detail lebih lanjut tentang bagaimana itu gagal?
Ed Harper
7
Saya menyadari bahwa saya membuat kesalahan ketika memulihkan dari cadangan. Saya membuat DB kosong baru pertama dan mencoba mengembalikan cadangan dari sana. Apa yang seharusnya saya lakukan adalah membuka dialog restore dan ketik nama database baru di sana alih-alih membuatnya terlebih dahulu. Melakukan ini dengan mengkloning basis data dengan baik!
Sergio

Jawaban:

372
  1. Instal Microsoft SQL Management Studio, yang dapat Anda unduh secara gratis dari situs web Microsoft:

    Versi 2008

    Microsoft SQL Management Studio 2008 adalah bagian dari SQL Server 2008 Express dengan Layanan Lanjutan

    Versi 2012

    Klik tombol unduh dan periksaENU\x64\SQLManagementStudio_x64_ENU.exe

    Versi 2014

    Klik tombol unduh dan periksa MgmtStudio64BIT\SQLManagementStudio_x64_ENU.exe

  2. Buka Microsoft SQL Management Studio .

  3. Cadangkan database asli ke file .BAK (db -> Task -> Backup).
  4. Buat database kosong dengan nama baru (klon). Catat komentar di bawah karena ini opsional.
  5. Klik untuk mengkloning basis data dan membuka dialog pengembalian (lihat gambar) pulihkan dialog
  6. Pilih Perangkat dan tambahkan file cadangan dari langkah 3. tambahkan file cadangan
  7. Ubah tujuan untuk menguji basis data Ubah tujuan
  8. Ganti lokasi file basis data, pasti berbeda dengan aslinya. Anda dapat mengetik langsung ke kotak teks, cukup tambahkan postfix. (CATATAN: Urutan penting. Pilih kotak centang, lalu ubah nama file.) ganti lokasi
  9. Periksa DENGAN REPLACE dan DENGAN KEEP_REPLICATION dengan ganti
Tomas Kubes
sumber
84
1. Jangan membuat database kosong dan mengembalikan file .bak ke dalamnya. 2. Gunakan opsi 'Kembalikan Database' yang dapat diakses dengan mengklik kanan cabang "Databases" dari SQL Server Management Studio dan berikan nama database sambil menyediakan sumber untuk dipulihkan. ref: stackoverflow.com/questions/10204480/…
taynguyen
1
Microsoft SQL Management Studio - gratis
Tomas Kubes
4
Tidak berfungsi - "Akses Eksklusif tidak dapat diperoleh karena database sedang digunakan".
Emanuele Ciriachi
5
Saya juga harus menghapus centang "Ambil cadangan tail-log sebelum mengembalikan". Ini diperiksa secara default dan menghasilkan kesalahan "Akses Eksklusif tidak dapat diperoleh karena database sedang digunakan".
Turnip
3
Database asli saya macet di "Memulihkan"
Divi perdomo
114

Klik kanan database untuk mengkloning, klik Tasks, klik Copy Database.... Ikuti wizard dan Anda selesai.

DForck42
sumber
Saya pikir itu hanya tersedia dalam rilis R2 dari SQL Server sayangnya :-(
Sergio
7
di sini adalah cara kerjanya di express: stackoverflow.com/questions/4269450/…
Th 00 mÄ s
2
Ini tidak berfungsi jika Anda memiliki objek terenkripsi di database Anda.
cjbarth
1
Saya akan mengatakan, bahwa poin utama sebenarnya adalah di mana melakukannya? Apa yang Anda jelaskan cukup intuitif. Saya telah mencoba persis di beberapa alat (0xDBE, Visual Studio SQL Server Object Explorer) sebelumnya, tetapi tidak menemukan fitur seperti itu di sana.
David Ferenczy Rogožan
3
Tidak memungkinkan! Tugas -> Tidak ada item menu untuk menyalin basis data
raiserle
95

Anda bisa mencoba untuk melepaskan basis data, menyalin file ke nama baru di prompt perintah, kemudian melampirkan kedua DB.

Dalam SQL:

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

Di Command prompt (saya telah menyederhanakan jalur file untuk kepentingan contoh ini):

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

Dalam SQL lagi:

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
Joe Stefanelli
sumber
1
sempurna! ini adalah solusi unik yang bekerja untuk saya! Terima kasih banyak!
thiagoh
9
select * from OriginalDB.sys.sysfilesuntuk menemukan lokasi file DB.
JohnLBevan
Ya, saya juga paling suka solusi ini, karena tidak memerlukan alat khusus. Tetapi saya tidak dapat membuat NewDB, katanya Permission denieddi .mdffile. Saya tidak membutuhkannya sekarang, saya hanya perlu cadangan DB asli, jadi saya bisa menimpa DB asli dengan itu nanti, saya hanya ingin tahu mengapa saya mendapatkan kesalahan seperti itu.
David Ferenczy Rogožan
2
Anda tidak perlu melepaskan basis data asli jika Anda dapat menghentikan layanan sql, menyalin file mdf dan ldf, mengganti nama mereka untuk database baru Anda, memulai layanan sql lagi dan jalankan saja perintah database create terakhir di bawah master: USE master ; GO BUAT DATABASE NewDB ON (FILENAME = 'C: \ NewDB.mdf'), (FILENAME = 'C: \ NewDB.ldf') UNTUK ATTACH; GO
danpop
1
+1 untuk cara tercepat. Selain komentar luar biasa @JohnLBevan, Anda juga dapat menggunakanexec sp_helpdb @dbname='TEMPDB';
jean
30

Ternyata saya mencoba memulihkan dari cadangan secara tidak benar.

Awalnya saya membuat database baru dan kemudian mencoba mengembalikan cadangan di sini. Apa yang seharusnya saya lakukan, dan apa yang berhasil pada akhirnya, adalah membuka dialog restore dan mengetik nama database baru di bidang tujuan.

Jadi, singkatnya, memulihkan dari cadangan berhasil.

Terima kasih untuk semua tanggapan dan saran kalian

Sergio
sumber
Ketika saya melakukan ini, dialog memberi tahu saya file berada di lokasi yang sama dengan database yang awalnya saya buat cadangannya. Jadi saya tidak punya nyali untuk mengembalikan, khawatir file-file tersebut akan ditimpa.
Niels Brinch
2
Neils, file-nya sama, secara default, dalam snapshot yang Anda ambil. Anda dapat mengubah nama mereka untuk membuat file baru untuk database yang baru bernama.
Colin Dabritz
PS: Metode ini membutuhkan layanan SQL Agent, pastikan sudah berjalan sebelum memulai operasi penyalinan db.
dvdmn
Anda sekarang telah membantu saya tiga kali dengan jawaban ini. Saya terus lupa mengetiknya alih-alih membuatnya. + bir
Piotr Kula
Ini dan mengubah nama file .mdf dan .log di jendela 'File' berhasil untuk saya.
Wollan
17

Ini skrip yang saya gunakan. Agak sulit tetapi berhasil. Diuji pada 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:\tmp\' + 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
kebiruan
sumber
2
Di lingkungan saya, nama file tidak cocok dengan nama db (yang berasal dari pemulihan lain ) jadi saya perlu SET @sourceDb_log = (SELECT files.name FROM sys.databases dbs INNER JOIN sys.master_files files ON dbs.database_id=files.database_id WHERE dbs.name=@sourceDb AND files.type=1)dan variabel terpisah untuk @sourceDb_data dengan permintaan yang sama (menggantikan files.type=0). HTH!
Dan Caseley
11

Tidak ada solusi yang disebutkan di sini yang berfungsi untuk saya - Saya menggunakan SQL Server Management Studio 2014.

Alih-alih, saya harus menghapus centang pada kotak centang "Ambil cadangan tail-log sebelum pulihkan" di layar "Opsi": dalam versi saya ini dicentang secara default dan mencegah operasi Pemulihan selesai. Setelah menghapus centang, operasi Pulihkan berjalan tanpa masalah.

masukkan deskripsi gambar di sini

Emanuele Ciriachi
sumber
2
Jawaban ini menyelamatkan hari saya.
Dilhan Jayathilake
2
Menyelamatkan hari saya juga :)
ashilon
1
Ketika tidak melakukan ini dengan SQL Server 2017, database asli tetap di "Memulihkan ...". Solusi Anda berhasil - terima kasih!
mu88
9

Menggunakan MS SQL Server 2012, Anda perlu melakukan 3 langkah dasar:

  1. Pertama, buat .sqlfile yang hanya mengandung struktur DB sumber

    • klik kanan pada DB sumber dan kemudian Tugas kemudian Hasilkan Script
    • ikuti wizard dan simpan .sqlfile secara lokal
  2. Kedua, ganti DB sumber dengan yang tujuan di .sqlfile

    • Klik kanan pada file tujuan, pilih Kueri Baru dan Ctrl-Hatau ( Edit - Temukan dan ganti - Ganti cepat )
  3. Akhirnya, isi dengan data

    • Klik kanan pada DB tujuan, lalu pilih Tugas dan Impor Data
    • Sumber data drop-down diatur ke " .net framework data provider untuk SQL server " + setel bidang teks string koneksi di bawah DATA ex:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • lakukan hal yang sama dengan tujuan
    • centang tabel yang ingin Anda transfer atau centang kotak di samping "sumber: ..." untuk memeriksa semuanya

Kamu selesai.

Mehdi Benkirane
sumber
Omong-omong, saya kira Impor Data dapat membuat tabel jika tidak ada dalam tabel tujuan .. solusi sederhana +1
Khurram Ishaque
6

Dalam SQL Server 2008 R2, buat cadangan database sebagai file ke dalam folder. Kemudian pilih opsi restore yang muncul di folder "Database". Di wizard masukkan nama baru yang Anda inginkan di database target. Dan pilih pulihkan file dari file dan gunakan file yang baru saja Anda buat. Saya hanya melakukannya dan itu sangat cepat (DB saya kecil, tapi tetap saja) Pablo.

pabloelustondo
sumber
4

Jika database tidak terlalu besar, Anda mungkin melihat perintah 'Script Database' di SQL Server Management Studio Express, yang berada dalam menu konteks dari item database itu sendiri di explorer.

Anda dapat memilih apa semua untuk skrip; Anda menginginkan objek dan data, tentu saja. Anda kemudian akan menyimpan seluruh skrip ke satu file. Kemudian Anda dapat menggunakan file itu untuk membuat kembali basis data; pastikan saja USEperintah di atas diatur ke database yang tepat.

Andrew Barber
sumber
1
Terima kasih, databasenya cukup besar, (sekitar manggung) jadi saya pikir hal-hal buruk dapat terjadi :-)
Sergio
2
Baik; itu bukan cara terbaik kalau begitu. Sebagai gantinya, Anda bisa menggunakan Script Database untuk membuat struktur di database baru, dan kemudian Impor / Ekspor untuk memindahkan data. Pastikan Anda melakukan Script Database terlebih dahulu; Impor / Ekspor akan membuat tabel jika tidak ada, dan Anda mungkin tidak suka bagaimana melakukannya.
Andrew Barber
4

Solusinya, berdasarkan komentar ini: https://stackoverflow.com/a/22409447/2399045 . Cukup atur pengaturan: Nama DB, folder temp, folder file db. Dan setelah dijalankan Anda akan memiliki salinan DB dengan Nama dalam format "sourceDBName_yyyy-mm-dd".

-- 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
Pavel Samoylenko
sumber
3

Script berdasarkan jawaban Joe ( lepaskan, salin file, lampirkan keduanya ).

  1. Jalankan Managment Studio sebagai akun Administrator.

Itu tidak perlu, tapi mungkin akses ditolak kesalahan saat menjalankan.

  1. Konfigurasikan server sql untuk menjalankan xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. Jalankan skrip, tetapi ketikkan nama db Anda @dbNamedan @copyDBNamevariabel sebelumnya.
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
Evgeny Ivanov
sumber
3

Anda bisa membuat database baru dan kemudian pergi ke tugas, mengimpor data, dan mengimpor semua data dari database yang ingin Anda duplikat ke database yang baru saja Anda buat.

Filsuf teknologi
sumber
2

Cara lain yang melakukan trik dengan menggunakan impor / ekspor wizard , pertama buat database kosong, lalu pilih sumber yang merupakan server Anda dengan database sumber, dan kemudian di tujuan pilih server yang sama dengan database tujuan (menggunakan database kosong Anda buat pada awalnya), lalu tekan finish

Ini akan membuat semua tabel dan mentransfer semua data ke database baru,

Mohanad Kaleia
sumber