Cuando quiero hacer una copia de una base de datos, siempre creo una nueva base de datos vacía, y luego restauro una copia de seguridad de la base de datos existente en ella. Sin embargo, me pregunto si esta es realmente la forma menos propensa a errores, menos complicada y más eficiente de hacer esto.¿Cuál es la mejor manera de copiar una base de datos?
Respuesta
Copia de seguridad y restauración es la forma más directa que conozco. Debe tener cuidado entre servidores ya que las credenciales de seguridad no vienen con la base de datos restaurada.
Es posible omitir el paso de crear la base de datos vacía. Puede crear la nueva base de datos como parte del proceso de restauración.
Esta es la forma más fácil y mejor que conozco de clonar una base de datos. Puede eliminar los errores de secuencias de comandos de la copia de seguridad y el proceso de restauración en lugar de ejecutarlo a través del SQL Server Management Studio
Hay otras dos opciones que podría explorar:
- Separar la base de datos, copiar el archivo .mdf y volver a adjuntar
- Use SQL Server Integration Services (SSIS) para copiar todos los objetos sobre
Sugiero pervivencia de copia de seguridad y restaurar y automatizar si es necesario.
Aquí hay un script de sql dinámico que he usado en el pasado. Se puede modificar aún más, pero te dará los conceptos básicos. Yo prefiero que las secuencias de comandos para evitar los errores que puede realizar a través del Estudio de Gestión:
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)
El Publicar como Proveedor de funcionalidad ha funcionado muy bien para mí. Ver Scott Gu's Blog Entry.
Si necesita algo realmente robusto, consulte las herramientas del software de redgate here ... si está haciendo mucho SQL, estas valen la $$.
::================ 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. ¿Cuál es la mejor manera de copiar una lista?
- 2. ¿Cuál es la mejor manera de copiar bases de datos completas en MS SQL Server?
- 3. ¿Cuál es la mejor manera de almacenar datos de tendencia?
- 4. ¿Cuál es la mejor manera de asegurar una cadena de conexión de base de datos?
- 5. ¿Cuál es la mejor manera de conectar y usar una base de datos sqlite desde C#
- 6. ¿Cuál es la mejor manera de hablar con una base de datos mientras usa Sinatra?
- 7. ¿Cuál es la mejor manera de perfilar una base de datos sqlserver 2005 para el rendimiento?
- 8. ¿Cuál es la mejor manera de almacenar archivos multimedia en una base de datos?
- 9. T-SQL: ¿la mejor manera de copiar datos de jerarquía?
- 10. ¿Cuál es la mejor manera de migrar datos en django
- 11. ¿Cuál es la mejor manera de sincronizar de una manera desde una base de datos del servidor al iPhone?
- 12. ¿Cuál es la mejor base de datos de objetos Java?
- 13. ¿Cuál es la mejor manera de almacenar un valor monetario en la base de datos?
- 14. ¿Cuál es la mejor manera de hacer conexiones de base de datos por usuario en Rails
- 15. ¿Cuál es la "mejor" base de datos para incrustado?
- 16. ¿Cuál es la mejor manera de diseñar este problema particular de base de datos/SQL?
- 17. ¿Cuál es la mejor manera de almacenar información de zona horaria en mi base de datos?
- 18. ¿Cuál es la mejor manera de construir una NSCompoundPredicate compleja?
- 19. ¿Cuál es la mejor forma de archivar datos en una base de datos Oracle?
- 20. ¿Cuál es la mejor manera de validar datos en mongo?
- 21. ¿Cuál es la mejor manera de copiar un subconjunto de las filas de una tabla de una base de datos a otra en Postgres?
- 22. Cómo copiar una tabla de una base de datos mysql a otra base de datos mysql
- 23. ¿Cuál es la mejor manera de almacenar/recuperar datos para un escritorio sin usar una base de datos?
- 24. ¿Cuál es la mejor manera de administrar la concurrencia en una aplicación de acceso a la base de datos?
- 25. ¿Cuál es la mejor manera de copiar en profundidad un hash de hashes en Perl?
- 26. ¿Cuál es la mejor forma de almacenar datos individuales no repetitivos en una base de datos?
- 27. ¿Cuál es la mejor manera de tomar una "instantánea" de una base de datos Oracle que se actualiza constantemente?
- 28. ¿Cuál es la mejor manera de almacenar datos de área para una aventura de texto?
- 29. ¿Cuál es la mejor manera de analizar una gramática simple?
- 30. ¿Cuál es la mejor manera de integrar varios sistemas?