none
Inner join con tablas de los backups RRS feed

  • Pregunta

  • Buenas,

      Amigos, estoy intentando ejecutar un query para armar una sentencia T-SQL, para unos restores de bases de datos. Como es por FilesGroups necesito que después del MOVE, pueda concatenar el nombre del DATAFILE. Les adjunto el query, que no me devuelve datos.

    SELECT BS.backup_set_id, BS.database_name, 'RESTORE DATABASE '+ BS.database_name + ' FILEGROUP = ' + '''' +LTRIM(SUBSTRING(BS.name,CHARINDEX(':',BS.name)+1,LEN(BS.name))) + '''' + ' FROM DISK = ' + '''' + 'Z:\RESPALDO FULL'+LTRIM(SUBSTRING(BMF.physical_device_name,CHARINDEX('Full\',BMF.physical_device_name)+4,LEN(BMF.physical_device_name))) + '''' + ','
          + 'WITH NORECOVERY' + ',' + 'MOVE' + ' ' + BKF.logical_name
    FROM msdb.dbo.backupset AS BS
          INNER JOIN msdb.dbo.backupfile AS BKF
    	  ON BS.backup_set_id = BKF.backup_set_id
    	  INNER JOIN msdb.dbo.backupmediafamily AS BMF
    	  ON BS.media_set_id = BMF.media_set_id
    	  AND BKF.backup_set_id = BMF.media_set_id
    WHERE database_name = 'ATVDMDB' and CAST(BS.backup_start_date AS DATE) > '2018-02-01'
    AND   type = 'F'
    ORDER BY database_name ASC, backup_start_date DESC 
    

    Agradezco sus comentarios.


    Jose Miguel Salas C

    jueves, 8 de febrero de 2018 22:34

Respuestas

  • ?que necesitas exactamente? si es saber de donde sacar el nombre físico, en la tabla sys.sysaltfiles tienes todos los nombres físicos, pero si tu base de datos ya existe, creo que el comando move puedes ahorrártelo (no hay que cambiar los datos de sitio)

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    viernes, 9 de febrero de 2018 7:09
    Moderador
  • Hola,

      Si necesito el Move, ya que son DataFiles que van a diferentes rutas.    Al final lo encontré esta instrucción:

    SELECT 'RESTORE' + CASE type
    		WHEN 'D'
    			THEN ' DATABASE ' + database_name
    		WHEN 'I'
    			THEN ' DATABASE ' + database_name
    		WHEN 'L'
    			THEN ' LOG ' + database_name
    		WHEN 'F'
    			THEN ' DATABASE ' + database_name + ' ' + CHAR(10) + (
    					SELECT stuff((
    								SELECT ', ' + 'FILEGROUP= ''' + filegroup_name + '''' + CHAR(10)
    								FROM msdb.dbo.backupfile BF
    								WHERE BF.backup_set_id = BS.backup_set_id AND backed_up_page_count > 0
    								FOR XML PATH('')
    								), 1, 2, '')
    					)
    		WHEN 'P'
    			THEN ' DATABASE ' + database_name
    		ELSE ' DATABASE ' + database_name
    		END + 'FROM ' + (
    		SELECT stuff((
    					SELECT ', ' + ISNULL(logical_device_name, 'DISK=''' + 'Z:\RESPALDO FULL\' + RIGHT(physical_device_name, CHARINDEX('\', REVERSE(physical_device_name)) - 1) + '''') + CHAR(10) FROMmsdb.dbo.backupmediafamily BMF WHEREBMF.media_set_id = BS.media_set_id
    					FOR XML PATH('')
    					), 1, 2, '')
    		) + 'WITH' + CASE type
    		WHEN 'D'
    			THEN ''
    		WHEN 'I'
    			THEN ''
    		WHEN 'L'
    			THEN ''
    		WHEN 'F'
    			THEN ''
    		WHEN 'P'
    			THEN ' PARTIAL, '
    		ELSE ' DATABASE '
    		END + ' NORECOVERY ,STATS = 5,' + CHAR(10) + (
    		SELECT stuff((
    					SELECT ', ' + 'MOVE ''' + logical_name + ''' TO ''' + physical_name + '''' + CHAR(10)
    					FROM msdb.dbo.backupfile BF WHEREBF.backup_set_id = BS.backup_set_id ANDbacked_up_page_count > 0 ANDfilegroup_nameISNOTNULL FORXMLPATH('')
    					), 1, 2, '')
    		)
    FROM msdb.dbo.backupset BS WHERE TYPE = 'F'
    AND database_name = 'MyDB' ANDCAST(BS.backup_start_date ASDATE) > '2018-02-06' ORDER BY backup_set_id ASC


    Jose Miguel Salas C

    • Marcado como respuesta JoseSalas domingo, 11 de febrero de 2018 5:09
    domingo, 11 de febrero de 2018 5:09

Todas las respuestas

  • ?que necesitas exactamente? si es saber de donde sacar el nombre físico, en la tabla sys.sysaltfiles tienes todos los nombres físicos, pero si tu base de datos ya existe, creo que el comando move puedes ahorrártelo (no hay que cambiar los datos de sitio)

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    viernes, 9 de febrero de 2018 7:09
    Moderador
  • Hola,

      Si necesito el Move, ya que son DataFiles que van a diferentes rutas.    Al final lo encontré esta instrucción:

    SELECT 'RESTORE' + CASE type
    		WHEN 'D'
    			THEN ' DATABASE ' + database_name
    		WHEN 'I'
    			THEN ' DATABASE ' + database_name
    		WHEN 'L'
    			THEN ' LOG ' + database_name
    		WHEN 'F'
    			THEN ' DATABASE ' + database_name + ' ' + CHAR(10) + (
    					SELECT stuff((
    								SELECT ', ' + 'FILEGROUP= ''' + filegroup_name + '''' + CHAR(10)
    								FROM msdb.dbo.backupfile BF
    								WHERE BF.backup_set_id = BS.backup_set_id AND backed_up_page_count > 0
    								FOR XML PATH('')
    								), 1, 2, '')
    					)
    		WHEN 'P'
    			THEN ' DATABASE ' + database_name
    		ELSE ' DATABASE ' + database_name
    		END + 'FROM ' + (
    		SELECT stuff((
    					SELECT ', ' + ISNULL(logical_device_name, 'DISK=''' + 'Z:\RESPALDO FULL\' + RIGHT(physical_device_name, CHARINDEX('\', REVERSE(physical_device_name)) - 1) + '''') + CHAR(10) FROMmsdb.dbo.backupmediafamily BMF WHEREBMF.media_set_id = BS.media_set_id
    					FOR XML PATH('')
    					), 1, 2, '')
    		) + 'WITH' + CASE type
    		WHEN 'D'
    			THEN ''
    		WHEN 'I'
    			THEN ''
    		WHEN 'L'
    			THEN ''
    		WHEN 'F'
    			THEN ''
    		WHEN 'P'
    			THEN ' PARTIAL, '
    		ELSE ' DATABASE '
    		END + ' NORECOVERY ,STATS = 5,' + CHAR(10) + (
    		SELECT stuff((
    					SELECT ', ' + 'MOVE ''' + logical_name + ''' TO ''' + physical_name + '''' + CHAR(10)
    					FROM msdb.dbo.backupfile BF WHEREBF.backup_set_id = BS.backup_set_id ANDbacked_up_page_count > 0 ANDfilegroup_nameISNOTNULL FORXMLPATH('')
    					), 1, 2, '')
    		)
    FROM msdb.dbo.backupset BS WHERE TYPE = 'F'
    AND database_name = 'MyDB' ANDCAST(BS.backup_start_date ASDATE) > '2018-02-06' ORDER BY backup_set_id ASC


    Jose Miguel Salas C

    • Marcado como respuesta JoseSalas domingo, 11 de febrero de 2018 5:09
    domingo, 11 de febrero de 2018 5:09