Respuestas:
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 DATABASE
comando:
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 IMMEDIATE
echar 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í .
MODIFY FILE
orden 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.
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 DETACH
hacerlo, mover los archivos y luego ATTACH
.
Properties
Files
pestañaPath
y FileName
de los archivos MDF y LDF . Este paso es importante en caso de que no desee terminar buscando archivos faltantes ...Tasks -> Detach
Databases
nodo de su servidorAttach
Add
botónOK
Deberías estar bien ahora. Información sobre el DETACH
- ATTACH
proceso se puede encontrar aquí .
En el enlace acerca de DETACH
- ATTACH
hay una recomendación de usar la ALTER DATABASE
declaració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.
Para mover archivos de la base de datos del sistema, siga estos pasos:
Inicie sesión como usuario en SSMS
Realice una copia de seguridad de la base de datos creada por el usuario por seguridad.
Elimine todas las sesiones conectadas al servidor desde SSMS.
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.
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
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\
Detenga la instancia de SQL Server.
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).
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.
Inicie sesión como sa
usuario 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.
Lo haces paso a paso:
cerrar todas las conexiones
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK INMEDIATE
establecer base de datos con estado fuera de línea
ALTER DATABASE MyDB SET OFFLINE
A nueva ruta
ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Filename = 'N: \ DATA \ MyDB.MDF')
establecer base de datos con estado en línea
ALTER DATABASE MyDB SET ONLINE
establecer multiusuario
ALTER DATABASE MyDB SET MULTI_USER
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
Siga estos simples 4 pasos:
CurrentLocation
columna.
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
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');
Ahora, detenga el servidor haciendo clic derecho sobre el Server_Name
que puede ver en el Explorador de objetos (lado izquierdo).
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.
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.
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.
master
está exento, ya que su ruta está determinada por las opciones de inicio de SQL Server (consulte, por ejemplo, esta respuesta para más detalles).
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