當我想創建一個數據庫副本時,我總是創建一個新的空數據庫,然後將現有數據庫的備份恢復到它。但是,我想知道這是否是最容易出錯的,最簡單並且最有效的方式?什麼是複製數據庫的最佳方法?
22
A
回答
2
備份和恢復是我知道的最直接的方式。由於安全憑證不與恢復的數據庫一起提供,因此您必須在服務器之間謹慎。
6
可以跳過創建空數據庫的步驟。您可以創建新數據庫作爲還原過程的一部分。
這實際上是我知道克隆數據庫的最簡單和最好的方法。您可以通過腳本備份消除錯誤和恢復過程,而不是運行它通過SQL Server Management Studio中
還有其他兩個選項,你可以探索:
- 分離數據庫,複製.mdf文件和重新連接。
- 使用SQL Server集成服務(SSIS)所有對象在
我建議用備份堅持和恢復,如有必要自動複製。
5
這是我過去使用的動態sql腳本。它可以進一步修改,但它會給你的基本知識。我喜歡它編寫腳本,以避免您可以使用Management Studio中的錯誤:
Declare @OldDB varchar(100)
Declare @NewDB varchar(100)
Declare @vchBackupPath varchar(255)
Declare @query varchar(8000)
/*Test code to implement
Select @OldDB = 'Pubs'
Select @NewDB = 'Pubs2'
Select @vchBackupPath = '\\dbserver\C$\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\pubs.bak'
*/
SET NOCOUNT ON;
Select @query = 'Create Database ' + @NewDB
exec(@query)
Select @query = '
Declare @vBAKPath varchar(256)
declare @oldMDFName varchar(100)
declare @oldLDFName varchar(100)
declare @newMDFPath varchar(100)
declare @newLDFPath varchar(100)
declare @restQuery varchar(800)
select @vBAKPath = ''' + @vchBackupPath + '''
select @oldLDFName = name from ' + @OldDB +'.dbo.sysfiles where filename like ''%.ldf%''
select @oldMDFName = name from ' + @OldDB +'.dbo.sysfiles where filename like ''%.mdf%''
select @newMDFPath = physical_name from ' + @NewDB +'.sys.database_files where type_desc = ''ROWS''
select @newLDFPath = physical_name from ' + @NewDB +'.sys.database_files where type_desc = ''LOG''
select @restQuery = ''RESTORE DATABASE ' + @NewDB +
' FROM DISK = N'' + '''''''' + @vBAKpath + '''''''' +
'' WITH MOVE N'' + '''''''' + @oldMDFName + '''''''' +
'' TO N'' + '''''''' + @newMDFPath + '''''''' +
'', MOVE N'' + '''''''' + @oldLDFName + '''''''' +
'' TO N'' + '''''''' + @newLDFPath + '''''''' +
'', NOUNLOAD, REPLACE, STATS = 10''
exec(@restQuery)
--print @restQuery'
exec(@query)
0
的發佈到供應商功能爲我偉大的工作。見Scott Gu's Blog Entry。
如果你需要一些真正強大的看redgate軟件的工具here ......如果你在做很多的SQL,這些都值得$$。
0
::================ 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
相關問題
- 1. 複製版本控制庫的最佳方法是什麼?
- 2. 複製/複製RethinkDB數據庫的最簡單方法是什麼?
- 3. 什麼是製作字典數據庫的最佳方式
- 4. 在數據庫中存儲IP的最佳方法是什麼?
- 5. 用H2數據庫測試JPA的最佳方法是什麼?
- 6. 什麼是Android的最佳數據庫?
- 7. 製作UIButton複選框的最佳方法是什麼?
- 8. 複製列表的最佳方法是什麼?
- 9. 複製/克隆畫筆的最佳方法是什麼?
- 10. C#複製BindingList的最佳方法是什麼?
- 11. 複製數據庫的最佳方法(SQL Server 2008)
- 12. 實現數據庫複製的兩種方法中最好的是什麼?
- 13. 對數據庫數據進行歷史比較的最佳方法是什麼?
- 14. Solr中索引數據庫表數據的最佳方法是什麼?
- 15. 將獨立數據導入數據庫的最佳方法是什麼?
- 16. 什麼是實時從數據庫中獲取數據的最佳方法?
- 17. 建立我的數據庫的最佳方式是什麼
- 18. 什麼是使用Delphi的Web數據庫的最佳方式?
- 19. 編寫訪問數據庫的方法的最佳方式是什麼?
- 20. 管理數據,類或數組的最佳方法是什麼?
- 21. 什麼是「洗牌」數據庫記錄表的最佳方式?
- 22. 在Rails中建立數據庫的最佳方式是什麼?
- 23. 連接android和oracle數據庫的最佳方式是什麼?
- 24. 記錄mysql數據庫的最佳方式是什麼?
- 25. 什麼是歸檔postgres數據庫的最佳方式?
- 26. 用PHP搜索MySQL數據庫的最佳方式是什麼?
- 27. 從silverlight訪問oracle數據庫的最佳方式是什麼?
- 28. 什麼是重構數據庫程序的最佳方式?
- 29. 什麼是保護數據庫查詢的最佳方式?
- 30. 處理SQLite數據庫的最佳方式是什麼?