2008-08-04 12 views
22

Kiedy chcę utworzyć kopię bazy danych, zawsze tworzę nową pustą bazę danych, a następnie odtwarzam kopię istniejącej bazy danych. Zastanawiam się jednak, czy to naprawdę najmniej podatny na błędy, najmniej skomplikowany i najbardziej skuteczny sposób to zrobić?Jaki jest najlepszy sposób na skopiowanie bazy danych?

Odpowiedz

2

Tworzenie kopii zapasowych i przywracanie jest najbardziej prostym sposobem, jaki znam. Musisz zachować ostrożność między serwerami, ponieważ poświadczenia bezpieczeństwa nie pochodzą z przywróconej bazy danych.

6

Można pominąć krok tworzenia pustej bazy danych. Możesz utworzyć nową bazę danych w ramach procesu przywracania.

To jest najprostszy i najlepszy sposób na sklonowanie bazy danych. można wyeliminować błędy przez skryptów kopię zapasową i przywrócić proces raczej niż uruchomienie go przez SQL Server Management Studio

Istnieją dwie inne opcje można zbadać:

  1. odłączyć bazy danych, skopiuj plik .mdf i ponownie dołączyć.
  2. używać SQL Server Integration Services (SSIS), aby skopiować wszystkie obiekty nad

Proponuję trzymać z kopii zapasowej i przywracania i automatyzację, jeśli to konieczne.

5

Oto dynamiczny skrypt SQL, z którego korzystałem w przeszłości. Może być dalej modyfikowany, ale da ci podstawy. Wolę skryptów, aby uniknąć błędów można dokonać za pomocą 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

Publikowanie Provider funkcjonalność pracował wielki dla mnie. Zobacz Scott Gu's Blog Entry.

Jeśli potrzebujesz czegoś naprawdę solidnego spojrzeć na narzędzia redgate oprogramowania here ... jeśli robisz dużo SQL w ogóle, to są warte $$.

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