Base de Datos vs Nombre Logico
Escrito por Javier García Quiroga   

Muchas veces nos hemos encontrados con bases de datos donde las mismas se adjuntaron a la instancia del motor mediante un restore de base de datos o mediante un attach_db

Lo mas probable es que a la hora de realizar el restore se renombre la base y los archivos físicos ya sean los .mdf, .ndf y los .ldf (archivos de datos y archivos transaccionales), pero no modificando los archivos lógicos de la base.

Voy a presentar los siguientes escenarios.

Escenario 1:

Los backups de base de datos se realizan de forma diaria, con lo cual tenemos los archivos de resguardo para realizar el restore de la base, ya que se necesita la misma estructura de la base y de los objetos para la nueva sucursal que se va abrir, con el Script 1 realizamos el backup de la Sucrusal_Callao

Script 1:

BACKUP DATABASE Sucursal_Callao
TO DISK='E:\Bases\Sucursal_Callao_1.bkp',
DISK='E:\Bases\Sucursal_Callao_2.bkp'
WITH STATS = 2

Escenario 2:

Se necesita realizar el restore de la nueva base llamada Sucursal_Florida, tengamos en cuenta que se debe contar con la nueva estructura de la base anterior, para ello usaremos el Script 2

Script 2:

RESTORE DATABASE Sucursal_Florida 
FROM DISK='E:\Bases\Sucursal_Callao_1.bkp',
DISK='E:\Bases\Sucursal_Callao_2.bkp'
WITH RECOVERY,STATS = 5,
MOVE'Sucursal_Callao'TO'C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Sucursal_Florida.mdf',
MOVE'Sucursal_Callao_log'TO'C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Sucursal_Florida_log.LDF'

El script 2 realiza el restore de la base Sucursal_Florida, el cual tiene dos archivos llamados (Sucursal_Callao_1.bkp, Sucursal_Callao_2.bkp)

La sentencia MOVE asocia los archivos logicos 'Sucursal_Callao' y 'Sucursal_Callao_log' con los archivos fisicos TO'Sucursal_Florida.mdf' y 'Sucursal_Florida_log', los cuales se renombraron, ya que se puede realizar un restore con dos archivos fisicos iguales.

Hasta aquí cerramos los dos escenarios que se presentaron, ahora que pasaria si modificamos los logical name en el Script 2 para la base Sucursal_Florida?

El SQL Server arrojara el mensaje.

Msg 3234, Level 16, State 2, Line 2
Logical file 'Sucursal_Florida' is not part of database 'Sucursal_Florida'. Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

Esto se debe a que los arhivos físicos .bkp están relacionados con los logical name de la base.

RESTORE FILELISTONLY
FROM DISK
='E:\Bases\Sucursal_Callao_1.bkp'

Bien realizaremos el restore de la base Sucursal_Florida, unicamente modificando el nuevo nombre de la base y los archivos de datos y del TRANSACTION LOG.

Si ejecutamos el siguiente sp podremos observar que los logical name difieren al nombre de la base de datos

SP_HELPDB Sucursal_Florida

Bien, esto lo podemos solucionar alterando la estructura de la base y para ello usaremos la siguiente sentencia:

ALTER DATABASE Sucursal_Florida
MODIFY FILE(
NAME='Sucursal_Callao',
NEWNAME ='Sucursal_Florida'
);

ALTER DATABASE Sucursal_Florida
MODIFY FILE
(
NAME='Sucursal_Callao_log',
NEWNAME ='Sucursal_Florida_log'
)

Si ejecutamos nuevamente el SP_HELPDB para la base Sucursal_Florida veremos que el logical name hace referencia a la base Sucursal_Florida.

SP_HELPDB Sucursal_Florida

Escenario 3:

Ahora supongamos que tenemos varias bases donde sus logical name son todos diferentes con sus nombre de base de datos, realizar esta tarea base por base se realiza bastante tedioso, con lo cual podremos utilizar el siguiente script, el cual permite realizar una ALTER de la base por cada archivo de datos y de transaction log dependiendo el tipo de archivo.

Script 3:

DECLARE @cmd nvarchar(max)
DECLARE @base nvarchar(max)
DECLARE @logical_file nvarchar(50)
DECLARE @data varchar(max)
DECLARE @type tinyint
SET @data ='_log'--seteo la variable @data para el artchivo de mdf o ldf. dependiendo del type

SET @type = 1 --seteo @type en 0 para archivo de datos, 1 para archivos del transaction log

DECLARE cursor_base CURSOR LOCAL FAST_FORWARD
FOR
SELECT s.name 'Base',m.name 'Archivo'
FROM sys.master_files m
INNER JOIN sys.sysdatabases s ON m.database_id = s.dbid
WHERE s.name NOT IN('master','msdb','model','reportserver', 'reportservertempdb','northwind','tempdb','adventureWorks','adventureWorksDW')
AND s.name NOTLIKE('%olap%')
AND m.type= @type

OPEN cursor_base
FETCH NEXT FROM cursor_base INTO @base, @logical_file
WHILE(@@FETCH_STATUS= 0)
BEGIN
IF @type = 0
PRINT 'ARCHIVO DE DATOS' + char(13)
ELSE
PRINT 'ARCHIVO DE LOG' + char(13)

SET @cmd ='alter database ' + @base +char(13)
SET @cmd = @cmd + 'modify file' + char(13)
SET @cmd = @cmd +'( name = '+''''+ @logical_file + ''',' + char(13)
SET @cmd = @cmd +' newname = '+''''+LOWER(@base)+ @data +''')'

EXEC sp_executesql @cmd
PRINT @cmd

FETCH NEXT FROM cursor_base INTO @base, @logical_file
END

CLOSE cursor_base
DEALLOCATE cursor_base

SELECT s.name 'Base', m.name 'Archivo'
FROM sys.master_files m
INNER JOIN sys.sysdatabases s ON m.database_id = s.dbid
WHERE s.name NOT IN('master','msdb','model','reportserver', 'reportservertempdb','northwind','tempdb','adventureWorks','adventureWorksDW')
AND s.name NOT LIKE('%olap%')
AND m.type= @type
 

Espacio publicitario

Links destacados:
Ermes
Ermes consulting, el socio estratégico para los negocios de alto rendimiento.
Incidencia
Incidencia.net, la consultora de Recursos Humanos estratégicos en Argentina.
Slashdot
Slashdot, News for nerds, stuff that matters...
Gantthead.com
Gantthead, el sitio en ingles mas completo para los Project Managers.