Cuantas veces nos han dicho que para mover una base de datos en SQL Server es tan sencillo como hacer un Detach, mover archivos y luego hacer un Attach de nuevo para que la base de datos quede operacional?
La respuesta es simple : N veces. En un mundo ideal en donde existe el orden, la documentación y a planeación debería de ser así de simple, pero la realidad es otra, por este motivo es necesario el documentar la localización real de mis bases de datos para evitar sorpresas cuando requiera realizar este tipo de tareas, ya sea por migraciones, simple re localización de archivos o cual sea el motivo.
Recientemente me encontré un caso interesante. La tarea era sencilla a simple vista. El requerimiento "Necesito mover las bases de datos de unidad porque no tengo espacio"
Formas de realizar el proceso hay muchas, algunos pensarán, "Bueno si tengo respaldos de las bases de datos puedo hacer restore de las BD y listo", claro, puede ser, siempre y cuando la app no sea tan transaccional que pueda darme el lujo de restaurar un respaldo de hace unas horas o bien que pueda respaldar la BD en el preciso momento de la restauración. Aun así administrativamente es un proceso un poco mas complejo que realizar el proceso de Detach y Attach.
Para este caso utilicé una serie de queries que me permitieron documentar bien la ubicación de las bases de datos.
SELECT
name, physical_name as PhysicalPath
FROM
sys. master_files
WHERE
DB_Name(database_id)='Testdb'
Si requieren conocer las rutas de Todas las bases de datos incluyendo las de sstema pueden utilizar el siguiente query.
--Si requieren mover tambien las BD de Sistema, utilizan este query para documentar su ruta
SELECT D.name as DatabaseName,MF.name as LogicalName, physical_name as PhysicalPath FROM sys. master_files MF
INNER JOIN sys.databases D on MF.database_id=D.database_id
order by 1
Este escenario que ustedes ven en la imagen es probablemente lo que ustedes se vayan a encontrar en la vida real, no digo que en todo lugar sea así, pero al menos en un 80% de empresas si lo es, principalmente en aquellas pequeñas o medianas empresas. El query es útil si requiero documentar también la ubicación de las bases de datos de sistema (Cuyo proceso de re localización de archivos es distinto y repasaremos luego su proceso)
Ahora bien si lo que busco es únicamente conocer la ruta de las bases de datos de usuario, ejecuto el siguiente script.
--Si no requieren mover las BD de sistema, solo la TEMDB entonces se utiliza este query para documentar las rutas
SELECT D.name as DatabaseName,MF.name as LogicalName, physical_name as PhysicalPath FROM sys. master_files MF
INNER JOIN sys.databases D on MF.database_id=D.database_id
WHERE D.database_id NOT IN(1,3,4)
order by 1
Cual es la importancia de documentar? Expongamos el siguiente caso.
Supongamos que ustedes dicen conocer su ambiente de base de datos, y simplemente realizan un detach de la base de datos que desean mover, sin haber documentado su ruta original, seguidamente van a buscar la ruta en donde ustedes creen tener la Base de Datos, pasan los archivos y realizan el proceso de Attach. A los minutos comienzan a recibir llamadas que los pedidos que se han hecho en los últimos días no se ven reflejados en pantalla. En este momento ustedes se preguntan "Cómo es posible? si yo solo hice un Detach y un Attach"
Probablemente eso es cierto, pero lo hice a partir de los archivos correctos? Probablemente muchos otros DBA o personal de TI que en algún momento haya hecho tareas de DBA copió archivos de esa base datos en alguna otra ruta.
Este tipo de casos pueden suceder cuando no se tiene documentada la ruta real de las bases de datos. Dicho esto, les recomiendo la utilización de estos scripts para evitar pasar un mal rato en lo que normalmente es un simple proceso de Detach y Attach.
Saludos.