tabla - ¿Cómo puedo clonar una base de datos de SQL Server en el mismo servidor en SQL Server 2008 Express?
que significa compatibilidad de base de datos (13)
Tengo un sistema MS SQL Server 2008 Express que contiene una base de datos que me gustaría ''copiar y renombrar'' (para propósitos de prueba) pero no conozco una forma sencilla de lograrlo.
Noté que en la versión R2 de SQL Server hay un asistente de copia de base de datos, pero lamentablemente no puedo actualizar.
La base de datos en cuestión es alrededor de un concierto. Intenté restaurar una copia de seguridad de la base de datos que quiero copiar en una nueva base de datos, pero sin suerte.
Instale Microsoft SQL Management Studio, puede descargarlo gratis desde el sitio web de Microsoft:
Versión 2008
Microsoft SQL Management Studio 2008 es parte de SQL Server 2008 Express con servicios avanzados
Versión 2012
Haga clic en el botón de descarga y verifique ENU / x64 / SQLManagementStudio_x64_ENU.exe
Versión 2014
Haga clic en el botón de descarga y verifique MgmtStudio 64BIT / SQLManagementStudio_x64_ENU.exe
Abra Microsoft SQL Management Studio
- Copia de seguridad de la base de datos original en el archivo (db -> Tarea -> Copia de seguridad).
- Crear base de datos vacía con nuevo nombre (clonar).
- Haga clic para clonar la base de datos y abrir el cuadro de diálogo de restauración (ver imagen)
- Seleccione Dispositivo y agregue el archivo bakcup del paso 1.
- Cambiar el destino para probar la base de datos
- Cambie la ubicación de los archivos de la base de datos, debe ser diferente del original. Puede escribir directamente en el cuadro de texto, simplemente agregue postfix. (NOTA: el orden es importante. Seleccione la casilla de verificación y luego cambie los nombres de los archivos).
- Verifique CON REEMPLAZAR Y CON MANTENER REEMPLAZO
En SQL Server 2008 R2, haga una copia de seguridad de la base de datos como un archivo en una carpeta. Luego, elija la opción de restauración que aparece en la carpeta "Base de datos". En el asistente, ingrese el nuevo nombre que desea en la base de datos de destino. Y elija restaurar archivo desde y use el archivo que acaba de crear. Lo logré y fue muy rápido (mi base de datos era pequeña, pero aún así) Pablo.
Este es el script que uso. Un poco complicado pero funciona. Probado en SQL Server 2012.
DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);
SET @sourceDb = ''db1''
SET @sourceDb_log = @sourceDb + ''_log''
SET @backupPath = ''E:/tmp/' + sourceDb + ''.bak'' --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = ''E:/DB SQL/MSSQL11.MSSQLSERVER/MSSQL/DATA/'
SET @destDb = ''db2''
SET @destMdf = @sqlServerDbFolder + @destDb + ''.mdf''
SET @destLdf = @sqlServerDbFolder + @destDb + ''_log'' + ''.ldf''
BACKUP DATABASE @sourceDb TO DISK = @backupPath
RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
MOVE @sourceDb TO @destMdf,
MOVE @sourceDb_log TO @destLdf
La solución, basada en este comentario: https://.com/a/22409447/2399045 . Solo configure los ajustes: nombre de DB, carpeta temporal, carpeta de archivos db. Y después de ejecutar, tendrá la copia de la base de datos con nombre en el formato "sourceDBName_yyyy-mm-dd".
-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = ''MyDbName'';
declare @tmpFolder nvarchar(50) = ''C:/Temp/'
declare @sqlServerDbFolder nvarchar(100) = ''C:/Databases/'
-- Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + ''_'' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + ''.bak''
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + ''.mdf''
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + ''_log'' + ''.ldf''
SET @sourceDbFile = (SELECT top 1 files.name
FROM sys.databases dbs
INNER JOIN sys.master_files files
ON dbs.database_id = files.database_id
WHERE dbs.name = @sourceDbName
AND files.[type] = 0)
SET @sourceDbFileLog = (SELECT top 1 files.name
FROM sys.databases dbs
INNER JOIN sys.master_files files
ON dbs.database_id = files.database_id
WHERE dbs.name = @sourceDbName
AND files.[type] = 1)
BACKUP DATABASE @sourceDbName TO DISK = @backupPath
RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
MOVE @sourceDbFile TO @destMdf,
MOVE @sourceDbFileLog TO @destLdf
Ninguna de las soluciones aquí mencionadas funcionó para mí, estoy usando SQL Server Management Studio 2014.
En su lugar, tuve que desmarcar la casilla de verificación "Realizar copia de seguridad del registro de cola antes de restaurar" en la pantalla "Opciones": en mi versión está marcada de forma predeterminada e impide que se complete la operación de restauración. Después de desmarcarlo, la operación de restauración se realizó sin problemas.
Otra forma de hacer el truco con el asistente de importación / exportación , elegir el origen es su servidor con la base de datos de origen, y luego, en el destino, elija el mismo servidor con la base de datos de destino (primero debe crear la base de datos vacía) y luego presione finalizar.
Creará todas las tablas y transferirá todos los datos a la nueva base de datos,
Puede crear una nueva base de datos y luego ir a tareas, importar datos e importar todos los datos de la base de datos que desea duplicar a la base de datos que acaba de crear.
Puede intentar separar la base de datos, copiar los archivos a nuevos nombres en un símbolo del sistema y luego adjuntar ambas bases de datos.
En SQL:
USE master;
GO
EXEC sp_detach_db
@dbname = N''OriginalDB'';
GO
En el símbolo del sistema (he simplificado las rutas de archivo para este ejemplo):
copy c:/OriginalDB.mdf c:/NewDB.mdf
copy c:/OriginalDB.ldf c:/NewDB.ldf
En SQL otra vez:
USE master;
GO
CREATE DATABASE OriginalDB
ON (FILENAME = ''C:/OriginalDB.mdf''),
(FILENAME = ''C:/OriginalDB.ldf'')
FOR ATTACH;
GO
CREATE DATABASE NewDB
ON (FILENAME = ''C:/NewDB.mdf''),
(FILENAME = ''C:/NewDB.ldf'')
FOR ATTACH;
GO
Resulta que había intentado restaurar de una copia de seguridad incorrectamente.
Inicialmente, creé una nueva base de datos y luego intenté restaurar la copia de seguridad aquí. Lo que debería haber hecho, y lo que funcionó al final, fue abrir el cuadro de diálogo de restauración y escribir el nombre de la nueva base de datos en el campo de destino.
Entonces, en resumen, restaurar desde una copia de seguridad hizo el truco.
Gracias por todos los comentarios y sugerencias chicos.
Script basado en la respuesta de Joe ( separar, copiar archivos, adjuntar ambos ).
- Ejecute Managment Studio como cuenta de administrador.
No es necesario, pero tal vez el error de acceso denegado en la ejecución.
- Configurar el servidor SQL para ejecutar xp_cmdshel
EXEC sp_configure ''show advanced options'', 1
GO
RECONFIGURE
GO
EXEC sp_configure ''xp_cmdshell'', 1
GO
RECONFIGURE
GO
- Ejecute el script, pero escriba sus nombres de
@dbName
@copyDBName
variables@dbName
y@copyDBName
antes.
USE master;
GO
DECLARE @dbName NVARCHAR(255) = ''Products''
DECLARE @copyDBName NVARCHAR(255) = ''Products_branch''
-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC(''
INSERT INTO ##DBFileNames([FileName])
SELECT [filename] FROM '' + @dbName + ''.sys.sysfiles'')
-- drop connections
EXEC(''ALTER DATABASE '' + @dbName + '' SET OFFLINE WITH ROLLBACK IMMEDIATE'')
EXEC(''ALTER DATABASE '' + @dbName + '' SET SINGLE_USER'')
-- detach
EXEC(''EXEC sp_detach_db @dbname = '''''' + @dbName + '''''''')
-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''''
DECLARE
@oldAttachCommand NVARCHAR(MAX) =
''CREATE DATABASE '' + @dbName + '' ON '',
@newAttachCommand NVARCHAR(MAX) =
''CREATE DATABASE '' + @copyDBName + '' ON ''
DECLARE curs CURSOR FOR
SELECT [filename] FROM ##DBFileNames
OPEN curs
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0
BEGIN
SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX(''/', REVERSE(@filename),1))+1))
SET @ext = RIGHT(@filename,4)
SET @copyFileName = @path + @copyDBName + @ext
SET @command = ''EXEC master..xp_cmdshell ''''COPY "'' + @filename + ''" "'' + @copyFileName + ''"''''''
PRINT @command
EXEC(@command);
SET @oldAttachCommand = @oldAttachCommand + ''(FILENAME = "'' + @filename + ''"),''
SET @newAttachCommand = @newAttachCommand + ''(FILENAME = "'' + @copyFileName + ''"),''
FETCH NEXT FROM curs INTO @filename
END
CLOSE curs
DEALLOCATE curs
-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + '' FOR ATTACH''
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + '' FOR ATTACH''
-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)
-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)
DROP TABLE ##DBFileNames
Si la base de datos no es muy grande, puede consultar los comandos ''Base de datos de script'' en SQL Server Management Studio Express, que se encuentran en un menú contextual fuera del elemento de la base de datos en el explorador.
Puedes elegir lo que todo a script; quieres los objetos y los datos, por supuesto. Luego guardará el script completo en un solo archivo. Luego puedes usar ese archivo para volver a crear la base de datos; solo asegúrese de que el comando USE
en la parte superior esté configurado en la base de datos adecuada.
Usando MS SQL Server 2012, necesita realizar 3 pasos básicos:
Primero, genere el archivo
.sql
que contiene solo la estructura de la base de datos de origen- haga clic derecho en la base de datos de origen y luego en Tareas y luego genere secuencias de comandos
- siga el asistente y guarde el archivo
.sql
localmente
Segundo, reemplace la base de datos de origen con la de destino en el archivo
.sql
- Haga clic con el botón derecho en el archivo de destino, seleccione Nueva consulta y Ctrl-H o ( Editar - Buscar y reemplazar - Reemplazo rápido )
Finalmente, rellenar con datos.
- Haga clic derecho en la base de datos de destino, luego seleccione Tareas e Importar datos
- El menú desplegable de la fuente de datos está establecido en " .net framework proveedor de datos para el servidor SQL " + establece el campo de texto de la cadena de conexión en DATOS ej:
Data Source=Mehdi/SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
- haz lo mismo con el destino
- marque la tabla que desea transferir o marque la casilla junto a "fuente: ..." para marcarlos todos
Estás listo.
Haga clic derecho en la base de datos para clonar, haga clic en Tasks
, haga clic en Copy Database...
Sigue al mago y listo.