¿Cómo muevo los archivos de la base de datos de SQL Server?

103

Tengo una base de datos y quiero mover los archivos .mdfy .ldfa otra ubicación. Pero no quiero detener el MSSQLSERVERservicio y no quiero exportar a otro servidor.

¿Cómo puedo hacer esto?

Mike Fal
fuente

Respuestas:

155

No tiene que detener el servicio de SQL Server para mover archivos de base de datos, pero sí tiene que desconectar la base de datos específica. Esto se debe a que no puede mover archivos mientras se accede a ellos y al desconectar la base de datos se detiene la utilización de los archivos por parte de la aplicación SQL Server.

El proceso para moverlos es bastante simple. Separar / Adjuntar ya se describió, pero no es tan complejo.

Cambie las ubicaciones de los archivos con un ALTER DATABASEcomando:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

Tenga en cuenta que no necesita declarar la ubicación anterior en este comando. Cambiar esta ruta no surte efecto de inmediato, pero se usará la próxima vez que se inicie la base de datos.

Establecer la base de datos fuera de línea

(Solía WITH ROLLBACK IMMEDIATEechar a todos y deshacer todas las transacciones abiertas actualmente)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Mover / copiar los archivos a la nueva ubicación

Simplemente copie los archivos utilizando su método favorito (haga clic y arrastre, XCopy, Copiar elemento, Robocopy)

Poner la base de datos en línea

ALTER DATABASE foo SET ONLINE;

Puede ver esto descrito con más detalle aquí .

Mike Fal
fuente
13
Esto funcionó para mí. En mi caso, también tuve que mover el archivo LDF usando el primer comando: por ejemplo USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees
1
También se puede usar para mover los archivos de índice de texto completo simplemente actualizando el nombre del archivo para que coincida con lo que ve en el cuadro de diálogo de archivos.
DShook
24
Asegúrese de, después de mover los archivos de la base de datos, que el usuario "NT SERVICE \ MSSQLSERVER" tiene permisos o obtendrá errores al intentar volver a conectar la base de datos.
Demonslay335
¿Qué se supone que es "nombre"? En la documentación tiene "nombre_lógico". ¿Qué quieren decir?
Johnny
2
@mlhDev En realidad, en mi caso, el MODIFY FILEorden se puede cambiar. Si ejecuta MODIFY FILE primero, le dirá que el comando se ejecuta con éxito y que la ubicación cambiará después de una operación fuera de línea (la redacción es diferente, pero se entiende). Sin embargo, el pedido Fuera de línea-> Mover archivos-> En línea es importante por razones obvias. Marque también la nota de Demonslay335. El permiso de archivo es importante.
Lionet Chen
50

Los archivos MDF y LDF están protegidos y no se pueden mover mientras la base de datos está en línea.

Si no le importa detener el funcionamiento de la base de datos, puede DETACHhacerlo, mover los archivos y luego ATTACH.

  • Haga clic derecho sobre el nombre de la base de datos.
  • Seleccionar Properties
  • Ir a la Filespestaña
  • Hacer una nota de la Pathy FileNamede los archivos MDF y LDF . Este paso es importante en caso de que no desee terminar buscando archivos faltantes ...
  • Haga clic derecho en el nombre de la base de datos
  • Seleccionar Tasks -> Detach
  • Mueve los archivos a donde quieras
  • Haga clic derecho en el Databasesnodo de su servidor
  • Seleccionar Attach
  • Haga clic en el Addbotón
  • Señalar la nueva ubicación
  • Hacer clic OK

Deberías estar bien ahora. Información sobre el DETACH- ATTACHproceso se puede encontrar aquí .

En el enlace acerca de DETACH- ATTACHhay una recomendación de usar la ALTER DATABASEdeclaración si se mantiene la base de datos en la misma instancia de SQL Server. Más referencia en Mover bases de datos de usuario .

Si desea mantenerlo en funcionamiento mientras se mueve, entonces haga un BACKUP- RESTORE. En el proceso de restauración, puede definir la nueva ubicación de los archivos de la base de datos.

Giannis Paraskevopoulos
fuente
3
Recomiendo abrir SQL Management Studio como administrador para evitar problemas de acceso a los archivos al volver a conectarlos
Simon_Weaver
6

Para mover archivos de la base de datos del sistema, siga estos pasos:

  1. Inicie sesión como usuario en SSMS

  2. Realice una copia de seguridad de la base de datos creada por el usuario por seguridad.

  3. Elimine todas las sesiones conectadas al servidor desde SSMS.

  4. Ejecute el siguiente comando para verificar la ubicación actual del archivo de las bases de datos del sistema:

    USE master;
    SELECT * FROM sys.master_files;

Identifique la ruta y anote la ruta actual de los archivos.

  1. Use TSQL para cambiar la ruta del archivo para toda la base de datos excepto el maestro:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

P.ej:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

Ahora se ha cambiado la ubicación del archivo.

Asegúrese de mover los archivos ldf y mdf

  1. En SSMS, haga clic derecho en el servidor y seleccione propiedades. Las propiedades internas van a Configuración de la base de datos. Cambie las ubicaciones predeterminadas de la base de datos para Datos y Registro a la ruta de destino. Cerrar sesión del servidor.

    Por ejemplo: cambiar C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\aE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Detenga la instancia de SQL Server.

  3. Copie el archivo o archivos a la nueva ubicación. Use Robocopy para mover los archivos para copiar los permisos de acceso a la carpeta de destino. Abra cmd y ejecútelo como administrador y use el siguiente comando:

    robocopy / sec sourceFolder destinationFolder

Es mejor ir a la ubicación de origen para ejecutar el comando. Elimine otros archivos que no sean los archivos de la base de datos del sistema que se copian. P.ej:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Aquí estamos moviendo todos los archivos de la base de datos del sistema a una nueva ubicación).

  1. En el menú Inicio, seleccione Todos los programas, seleccione Microsoft SQL Server, seleccione Herramientas de configuración y haga clic en Administrador de configuración de SQL Server.

Realice los siguientes pasos en el Administrador de configuración de SQL Server:

En el nodo Servicios de SQL Server, haga clic con el botón derecho en la instancia de SQL Server (por ejemplo, SQL Server (MSSQLSERVER)) y elija Propiedades. En el cuadro de diálogo Propiedades de SQL Server (nombre_instancia), haga clic en la pestaña Parámetros de inicio. En el cuadro Parámetros existentes, seleccione el parámetro –d para mover el archivo de datos maestros. Haga clic en Actualizar para guardar el cambio. En el cuadro Especificar un parámetro de inicio, cambie el parámetro a la nueva ruta de la base de datos maestra. En el cuadro Parámetros existentes, seleccione el parámetro –l para mover el archivo de registro maestro. Haga clic en Actualizar para guardar el cambio. En el cuadro Especificar un parámetro de inicio, cambie el parámetro a la nueva ruta de la base de datos maestra.

El valor del parámetro para el archivo de datos debe seguir el parámetro -d y el valor para el archivo de registro debe seguir el parámetro -l. El siguiente ejemplo muestra los valores de los parámetros para la ubicación predeterminada del archivo de datos maestros.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Si la reubicación planificada para el archivo de datos maestros es E: \ SQLData, los valores de los parámetros se cambiarían de la siguiente manera:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Detenga la instancia de SQL Server haciendo clic con el botón derecho en el nombre de la instancia y eligiendo Detener. Reinicie la instancia de SQL Server.

  1. Inicie sesión como sausuario en SSMS y verifique la ubicación de los archivos de la base de datos ejecutando la siguiente consulta:

    USE master;
    SELECT * FROM sys.master_files;

Todo listo.

abhay sreekumar
fuente
Puede usar la función SQL para automatizar tareas para todas las bases de datos: stackoverflow.com/a/19505918/439524
amuliar el
3

Lo haces paso a paso:

  1. cerrar todas las conexiones
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK INMEDIATE

  2. establecer base de datos con estado fuera de línea
    ALTER DATABASE MyDB SET OFFLINE

  3. A nueva ruta
    ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Filename = 'N: \ DATA \ MyDB.MDF')

  4. establecer base de datos con estado en línea
    ALTER DATABASE MyDB SET ONLINE

  5. establecer multiusuario
    ALTER DATABASE MyDB SET MULTI_USER

Nguyễn Hải Đăng
fuente
3

Hay una manera de mover los archivos de datos de la base de datos (aún no estoy seguro si hay una manera de hacerlo para los archivos de registro) sin desconectar la base de datos.

Dejan Nakarada-Kordic tiene una explicación + scripts para este método aquí: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

La versión corta es que agrega otro archivo de base de datos en la nueva ubicación y luego usa DBCC Shrinkfile, con la opción EMPTYFILE para mover los datos del archivo antiguo al nuevo archivo. Cuando haya terminado, puede eliminar el archivo de datos anterior.

No es mi solución, estaba buscando esta solución y la encontré muy útil para nuestro entorno de producción.

Thorfinn

Thorfinn Thomassen
fuente
1

Siga estos simples 4 pasos:

  1. Abra SSMS y seleccione la opción Nueva consulta desde la parte superior de la ventana. Luego copie y ejecute la siguiente consulta para encontrar la ruta de la base de datos que queremos mover a la nueva ruta y anote la ruta que muestra en la CurrentLocationcolumna.

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. Ahora ve a esa ruta y anota el nombre de los archivos Database_Name.mdf & Database_Name_log.ldf . Luego ejecute las siguientes dos consultas para mover la base de datos a una ubicación específica.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. Ahora, detenga el servidor haciendo clic derecho sobre el Server_Nameque puede ver en el Explorador de objetos (lado izquierdo).

    ingrese la descripción de la imagen aquí

  2. Luego mueva ambos archivos de la ruta anterior a la nueva ruta y vuelva a iniciar el servidor haciendo clic con el botón derecho en Server_Name. Confirme la nueva ruta de la base de datos ejecutando nuevamente la consulta del primer paso.

Karan Raiyani
fuente
0

No estoy seguro de que esta sea la mejor manera (agradecería cualquier comentario que me diga cómo no), pero es muy simple (y rápido si tiene una base de datos pequeña):

Primero, haga una copia de seguridad de la base de datos en un archivo .bak. Luego, restaure la base de datos desde el mismo archivo .bak, eligiendo las nuevas ubicaciones de archivo .mdf y .ldf en las opciones de archivo para la tarea de restauración.

No lo haría en un entorno de producción fuera de una ventana de mantenimiento, ya que no puede acceder a la base de datos durante la restauración. Sin embargo, otros métodos que he visto anteriormente tendrían inconvenientes similares. Una vez realizada la tarea de restauración, no tiene que eliminar el archivo anterior. Se hace automáticamente.

Ali
fuente
1
Este escenario tiene algunos inconvenientes. Al restaurar, se debe sobrescribir o cambiar el nombre de la base de datos original. Para bases de datos grandes, el método introduce una sobrecarga de E / S grave. Mover archivos como se describe en los métodos detach-attach o alter db es mucho más rápido. Si los archivos se mueven dentro de la misma partición NTFS, es solo una operación de metadatos.
vonPryz 01 de
@Ali - Copia de seguridad y restauración. Puede tomar más tiempo, pero generalmente es un camino más seguro. Vea el análisis de Aaron Bertrand en: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups También: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF
Para bases de datos muy grandes, este enfoque (y el enfoque de desconexión / conexión) introduce un tiempo de inactividad considerable. Para evitar esto, coloque la base de datos de origen en modo de recuperación completa, luego realice la restauración de copia de seguridad inicial con la base de datos de destino no operativa. Luego, haga una copia de seguridad / restaure uno o más registros de transacciones. La base de datos deberá estar inactiva solo durante la copia de seguridad / restauración final del registro de transacciones, que puede contener un tiempo y un tamaño arbitrariamente pequeños. Obviamente, también deberá restaurar a un nombre diferente y luego realizar un cambio de nombre. Este enfoque es más o menos equivalente al envío de registros.
Brian
0

Para complementar las respuestas existentes: Aquí hay un script para crear las ALTER DATABASE ... MOVE ...declaraciones para todas las bases de datos:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

Nota:

  • Reemplace REPLACE(f.physical_name, 'C:\', 'D:\')por cualquier transformación que desee realizar en las rutas de los archivos.

  • masterestá exento, ya que su ruta está determinada por las opciones de inicio de SQL Server (consulte, por ejemplo, esta respuesta para más detalles).

Heinzi
fuente