Ketika saya ingin membuat salinan dari database, saya selalu membuat database baru kosong, dan kemudian mengembalikan cadangan dari database yang ada ke dalamnya. Namun, saya'm bertanya-tanya apakah ini benar-benar yang paling rawan kesalahan, paling rumit, dan paling efisien cara untuk melakukan ini?
Itu adalah mungkin untuk melewatkan langkah membuat database kosong. Anda dapat membuat database baru sebagai bagian dari proses pemulihan.
Ini sebenarnya yang paling mudah dan cara terbaik yang saya tahu untuk mengkloning sebuah database. Anda dapat menghilangkan kesalahan dengan skrip backup dan restore proses daripada berjalan melalui SQL Server Management Studio
Ada dua pilihan lain yang bisa anda jelajahi:
Saya sarankan menempel dengan backup dan restore dan mengotomatisasi jika diperlukan.
Berikut ini's script sql dinamis I've yang digunakan di masa lalu. Hal ini dapat dimodifikasi lebih lanjut tapi itu akan memberi anda dasar-dasar. Saya lebih suka scripting untuk menghindari kesalahan-kesalahan yang anda dapat membuat dengan menggunakan Management Studio:
Menyatakan @OldDB varchar(100)
Menyatakan @NewDB varchar(100)
Menyatakan @vchBackupPath varchar(255)
Menyatakan @query varchar(8000)
/Kode uji coba untuk melaksanakan
Pilih @OldDB = 'Pub'
Pilih @NewDB = 'Pubs2'
Pilih @vchBackupPath = '\dbserver\C$\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\pub.bak'
/
SET NOCOUNT ON;
Pilih @query = 'Membuat Database ' + @NewDB
exec(@query)
Pilih @query = '
Menyatakan @vBAKPath varchar(256)
menyatakan @oldMDFName varchar(100)
menyatakan @oldLDFName varchar(100)
menyatakan @newMDFPath varchar(100)
menyatakan @newLDFPath varchar(100)
menyatakan @restQuery varchar(800)
pilih @vBAKPath = ''' + @vchBackupPath + '''
pilih @oldLDFName = nama dari ' + @OldDB +'.dbo.sysfiles di mana nama file seperti ''%.ldf%''
pilih @oldMDFName = nama dari ' + @OldDB +'.dbo.sysfiles di mana nama file seperti ''%.mdf%''
pilih @newMDFPath = physical_name dari ' + @NewDB +'.sys.database_files mana type_desc = ''BARIS''
pilih @newLDFPath = physical_name dari ' + @NewDB +'.sys.database_files mana type_desc = ''LOG''
pilih @restQuery = ''RESTORE DATABASE ' + @NewDB +
' DARI DISK = N'' + '''''''' + @vBAKpath + '''''''' +
'' DENGAN BERGERAK N'' + '''''''' + @oldMDFName + '''''''' +
'' UNTUK N'' + '''''''' + @newMDFPath + '''''''' +
'', BERGERAK N'' + '''''''' + @oldLDFName + '''''''' +
'' UNTUK N'' + '''''''' + @newLDFPath + '''''''' +
'', NOUNLOAD, MENGGANTI, STATISTIK = 10''
exec(@restQuery)
--print @restQuery'
exec(@query)
The Mempublikasikan ke Penyedia fungsi-fungsi yang telah bekerja besar bagi saya. Lihat Scott Gu's Blog Entry.
Jika anda membutuhkan sesuatu yang benar-benar kuat melihat redgate software's alat-alat di sini...jika anda melakukan banyak SQL pada semua, ini adalah bernilai $$.
::================ BackUpAllMyDatabases.cmd ============= START
::BackUpAllMyDatabases.cmd
:: COMMAND LINE BATCH SCRIPT FOR TAKING BACKUP OF ALL DATABASES
::RUN THE SQL SCRIPT VIA THE COMMAND LINE WITH LOGGING
sqlcmd -S localhost -e -i "BackUpAllMyDatabases.sql" -o Result_Of_BackUpAllMyDatabases.log
::VIEW THE RESULTS
Result_Of_BackUpAllMyDatabases.log
::pause
::================ BackUpAllMyDatabases.cmd ============= END
--=================================================BackUpAllMyDatabases.sql start
DECLARE @DBName varchar(255)
DECLARE @DATABASES_Fetch int
DECLARE DATABASES_CURSOR CURSOR FOR
select
DATABASE_NAME = db_name(s_mf.database_id)
from
sys.master_files s_mf
where
-- ONLINE
s_mf.state = 0
-- Only look at databases to which we have access
and has_dbaccess(db_name(s_mf.database_id)) = 1
-- Not master, tempdb or model
--and db_name(s_mf.database_id) not in ('Master','tempdb','model')
group by s_mf.database_id
order by 1
OPEN DATABASES_CURSOR
FETCH NEXT FROM DATABASES_CURSOR INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
declare @DBFileName varchar(256)
set @DBFileName = @DbName + '_' + replace(convert(varchar, getdate(), 112), '-', '.') + '.bak'
--REMEMBER TO PUT HERE THE TRAILING \ FOR THE DIRECTORY !!!
exec ('BACKUP DATABASE [' + @DBName + '] TO DISK = N''D:\DATA\BACKUPS\' +
@DBFileName + ''' WITH NOFORMAT, INIT, NAME = N''' +
@DBName + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 100')
FETCH NEXT FROM DATABASES_CURSOR INTO @DBName
END
CLOSE DATABASES_CURSOR
DEALLOCATE DATABASES_CURSOR
--BackUpAllMyDatabases==========================end
--======================RestoreDbFromFile.sql start
-- Restore database from file
-----------------------------------------------------------------
use master
go
declare @backupFileName varchar(100), @restoreDirectory varchar(100),
@databaseDataFilename varchar(100), @databaseLogFilename varchar(100),
@databaseDataFile varchar(100), @databaseLogFile varchar(100),
@databaseName varchar(100), @execSql nvarchar(1000)
-- Set the name of the database to restore
set @databaseName = 'ReplaceDataBaseNameHere'
-- Set the path to the directory containing the database backup
set @restoreDirectory = 'ReplaceRestoreDirectoryHere' -- such as 'c:\temp\'
-- Create the backup file name based on the restore directory, the database name and today's date
@backupFileName = @restoreDirectory + @databaseName + '-' + replace(convert(varchar, getdate(), 110), '-', '.') + '.bak'
-- set @backupFileName = 'D:\DATA\BACKUPS\server.poc_test_fbu_20081016.bak'
-- Get the data file and its path
select @databaseDataFile = rtrim([Name]),
@databaseDataFilename = rtrim([Filename])
from master.dbo.sysaltfiles as files
inner join
master.dbo.sysfilegroups as groups
on
files.groupID = groups.groupID
where DBID = (
select dbid
from master.dbo.sysdatabases
where [Name] = @databaseName
)
-- Get the log file and its path
select @databaseLogFile = rtrim([Name]),
@databaseLogFilename = rtrim([Filename])
from master.dbo.sysaltfiles as files
where DBID = (
select dbid
from master.dbo.sysdatabases
where [Name] = @databaseName
)
and
groupID = 0
print 'Killing active connections to the "' + @databaseName + '" database'
-- Create the sql to kill the active database connections
set @execSql = ''
select @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '
from master.dbo.sysprocesses
where db_name(dbid) = @databaseName
and
DBID <> 0
and
spid <> @@spid
exec (@execSql)
print 'Restoring "' + @databaseName + '" database from "' + @backupFileName + '" with '
print ' data file "' + @databaseDataFile + '" located at "' + @databaseDataFilename + '"'
print ' log file "' + @databaseLogFile + '" located at "' + @databaseLogFilename + '"'
set @execSql = '
restore database [' + @databaseName + ']
from disk = ''' + @backupFileName + '''
with
file = 1,
move ''' + @databaseDataFile + ''' to ' + '''' + @databaseDataFilename + ''',
move ''' + @databaseLogFile + ''' to ' + '''' + @databaseLogFilename + ''',
norewind,
nounload,
replace'
exec sp_executesql @execSql
exec('use ' + @databaseName)
go
-- If needed, restore the database user associated with the database
/*
exec sp_revokedbaccess 'myDBUser'
go
exec sp_grantdbaccess 'myDBUser', 'myDBUser'
go
exec sp_addrolemember 'db_owner', 'myDBUser'
go
use master
go
*/
--======================RestoreDbFromFile.sql