Ποιος είναι ο καλύτερος τρόπος για να αντιγράψετε μια βάση δεδομένων;

ψήφοι
23

Όταν θέλω να κάνω ένα αντίγραφο της βάσης δεδομένων, πάντα να δημιουργήσετε μια νέα κενή βάση δεδομένων, και στη συνέχεια να επαναφέρετε ένα αντίγραφο ασφαλείας της υφιστάμενης βάσης δεδομένων σε αυτό. Ωστόσο, αναρωτιέμαι αν αυτό είναι πραγματικά το λιγότερο επιρρεπής σε λάθη, τουλάχιστον πολύπλοκο και πιο αποτελεσματικός τρόπος για να γίνει αυτό;

Δημοσιεύθηκε 04/08/2008 στις 22:27
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
6

Είναι δυνατόν να παραλείψετε το βήμα της δημιουργίας του κενή βάση δεδομένων. Μπορείτε να δημιουργήσετε τη νέα βάση δεδομένων, ως μέρος της διαδικασίας επαναφοράς.

Αυτό είναι πραγματικά ο ευκολότερος και καλύτερος τρόπος που ξέρω για να κλωνοποιήσει μια βάση δεδομένων. Μπορείτε να εξαλείψει τα λάθη με scripting τη δημιουργία αντιγράφων ασφαλείας και διαδικασία επαναφοράς, αντί να τρέχει μέσα από το Server Management Studio SQL

Υπάρχουν άλλες δύο επιλογές που θα μπορούσαν να εξερευνήσετε:

  1. Αποσυνδέστε τη βάση δεδομένων, αντιγράψτε το αρχείο .mdf και την εκ νέου σύνδεση.
  2. Χρησιμοποιήστε Υπηρεσίες Ολοκλήρωσης SQL Server (SSIS) για να αντιγράψετε όλα τα αντικείμενα πάνω

Προτείνω να κολλήσει με την δημιουργία αντιγράφων ασφαλείας και την αποκατάσταση και την αυτοματοποίηση εάν είναι απαραίτητο.

Απαντήθηκε 04/08/2008 στις 22:46
πηγή χρήστη

ψήφοι
5

Εδώ είναι ένα δυναμικό σενάριο SQL που έχω χρησιμοποιήσει στο παρελθόν. Μπορεί να τροποποιηθεί περαιτέρω, αλλά αυτό θα σας δώσει τα βασικά. Προτιμώ να scripting για να αποφύγει τα λάθη που μπορείτε να κάνετε χρησιμοποιώντας το 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)





Απαντήθηκε 04/08/2008 στις 23:18
πηγή χρήστη

ψήφοι
2

Δημιουργία αντιγράφων ασφαλείας και επαναφορά είναι η πιο απλός τρόπος που ξέρω. Θα πρέπει να είστε προσεκτικοί μεταξύ servers όπως τα διαπιστευτήρια ασφαλείας δεν έρχονται με το ανακαινισμένο βάση δεδομένων.

Απαντήθηκε 05/08/2008 στις 02:31
πηγή χρήστη

ψήφοι
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
Απαντήθηκε 13/02/2009 στις 07:59
πηγή χρήστη

ψήφοι
0

Η Δημοσίευση για να Provider λειτουργικότητα έχει εργαστεί πολύ καλό για μένα. Δείτε Blog Entry Scott Γκου .

Αν χρειάζεστε κάτι πραγματικά ισχυρή ματιά εργαλεία λογισμικού Redgate είναι εδώ ... και αν κάνετε πολλά SQL σε όλα, αυτά είναι αξίζει τον $$.

Απαντήθηκε 05/08/2008 στις 02:11
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more