Lorsque je souhaite créer une copie de base de données, je crée toujours une nouvelle base de données vide, puis restaure une sauvegarde de la base de données existante. Cependant, je me demande si c'est vraiment la façon la moins sujette aux erreurs, la moins compliquée et la plus efficace de le faire?Quel est le meilleur moyen de copier une base de données?
Répondre
Sauvegarder et restaurer est le moyen le plus simple que je connaisse. Vous devez faire attention entre les serveurs car les informations d'identification de sécurité ne sont pas fournies avec la base de données restaurée.
Il est possible de passer l'étape de création de la base de données vide. Vous pouvez créer la nouvelle base de données dans le cadre du processus de restauration.
C'est en fait le moyen le plus simple et le meilleur que je connaisse pour cloner une base de données. Vous pouvez éliminer les erreurs de scripts de sauvegarde et de restauration processus plutôt que de l'exécuter à travers le SQL Server Management Studio
Il y a deux autres options que vous pouvez explorer:
- Détacher la base de données, copiez le fichier .mdf et ré-attacher.
- Utiliser SQL Server Integration Services (SSIS) pour copier tous les objets sur
Je suggère coller avec la sauvegarde et la restauration et l'automatisation si nécessaire.
Voici un script SQL dynamique que j'ai utilisé par le passé. Il peut être modifié, mais il vous donnera les bases. Je préfère élaborer le script pour éviter les erreurs que vous pouvez faire en utilisant le 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)
Le Publish au fournisseur fonctionnalité a beaucoup travaillé pour moi. Voir Scott Gu's Blog Entry. Si vous avez besoin de quelque chose de vraiment robuste regardez les outils du logiciel Redgate here ... si vous faites beaucoup de SQL du tout, cela vaut le $$.
::================ 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. Quel est le meilleur moyen de copier une liste?
- 2. En C#, quel est le meilleur moyen de déterminer si une base de données est opérationnelle?
- 3. Quel est le meilleur moyen d'ajouter des utilisateurs à plusieurs groupes dans une base de données?
- 4. Quel est le meilleur moyen de copier récursivement le contenu en C#?
- 5. Quel est le meilleur moyen d'extraire des données d'une base de données avec une mise à jour si nécessaire?
- 6. Quel est le meilleur moyen de communication interprocesseur sous Linux?
- 7. Quel est le meilleur moyen de stocker des données de modèle dans une application jQuery?
- 8. Quel est le meilleur moyen de conserver les données dans une application Java Desktop?
- 9. Quel est le meilleur système de construction pour construire une base de données?
- 10. Quel est le meilleur moyen de synchroniser 2 structures de données en PHP?
- 11. Quel est le meilleur moyen de gérer QUERY_STRING en PHP?
- 12. Quel est le meilleur moyen de faire throbber en C#?
- 13. Quel est le meilleur moyen de fermer un thread WCF?
- 14. Quel est le meilleur moyen de déployer des applications Web?
- 15. Quel est le meilleur moyen de comparer plusieurs propriétés javabéennes?
- 16. Quel est le moyen le plus sec d'obtenir des données de ma base de données?
- 17. Quel est le meilleur moyen de redimensionner un objet BitmapData?
- 18. Quel est le meilleur moyen de regrouper, d'agréger et de sommer des données d'arbre?
- 19. Quel est le meilleur moyen de renvoyer une erreur à un processus TSQL?
- 20. Meilleur moyen de rechercher base de données sqlite
- 21. Quel algorithme d'exploration de données est le meilleur?
- 22. Quel est le meilleur moyen de mettre des données tabulaires en python?
- 23. Quel est le meilleur moyen de dupliquer des données dans un modèle django?
- 24. Quel est le meilleur paquet de liste de diffusion? (Linux)
- 25. Quel est le meilleur: mysql_connect ou mysql_pconnect
- 26. En R, quel est le meilleur moyen d'agréger des données de type chaîne?
- 27. Quel est le meilleur moyen de mettre en ligne une petite application ruby?
- 28. Quel est le meilleur moyen de poster une date/heure dans une vue django?
- 29. Quel est le meilleur moyen de trouver une chaîne spécifique dans le vecteur?
- 30. Quel est le meilleur moyen de stocker et de rechercher dans les transactions d'objets?