AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 343419
Accepted
Marcello Miorelli
Marcello Miorelli
Asked: 2024-11-05 21:24:52 +0800 CST2024-11-05 21:24:52 +0800 CST 2024-11-05 21:24:52 +0800 CST

como obter a localização do backup também? você pode usar múltiplas colunas pivotando ou qualquer outra maneira!

  • 772

Recebi esta ótima consulta que mostra o backup mais recente para cada banco de dados existente .

SELECT
    M.name,
    [Recovery Model] = 
        M.recovery_model_desc,
    [State] = 
        M.state_desc,
    [Last Full Backup] = 
        FORMAT(ISNULL(M.D, '19000101'), 'dd-MM-yyyy hh:mm'),
    [Last Differential Backup] = 
        FORMAT(ISNULL(M.I, '19000101'), 'dd-MM-yyyy hh:mm'),
    [Last log Backup] = 
        FORMAT(ISNULL(M.L, '19000101'), 'dd-MM-yyyy hh:mm')
FROM
(
    SELECT
        db.name,
        db.state_desc,
        db.recovery_model_desc,
        a.type,
        a.backup_finish_date
    FROM master.sys.databases AS db
    LEFT OUTER JOIN msdb.dbo.backupset AS a
      ON a.database_name = db.name
) AS Sourcetable
PIVOT
(
    MAX(backup_finish_date)
    FOR type IN
    (
        D,
        I,
        L
    )
) AS M --ostRecentBackup
WHERE name NOT IN
(
    N'master',
    N'msdb',
    N'model',
    N'tempdb'
);

Notei que ele usa pivotamento. E se eu tivesse que adicionar o local também? Seriam várias colunas .

Seja dinamizando usando múltiplas colunas ou desdinamizando , como eu poderia adicionar a localização de cada tipo de backup à consulta acima?

basicamente onde está o último backup completo, onde está o último diff e o último log (se houver).

este é o script que uso para ver a localização do backup:

SELECT   
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
   msdb.dbo.backupset.database_name,  
   msdb.dbo.backupset.TYPE,
   msdb.dbo.backupset.backup_start_date,  
   msdb.dbo.backupset.backup_finish_date, 
   msdb.dbo.backupset.expiration_date, 
   msdb.dbo.backupset.backup_size,  
   msdb.dbo.backupset.backup_size * 1.024 /1024/1024 as [Backup size in MB],
   msdb.dbo.backupmediafamily.logical_device_name,  
   msdb.dbo.backupmediafamily.physical_device_name,   
   msdb.dbo.backupset.name AS backupset_name, 
   msdb.dbo.backupset.description 
FROM   msdb.dbo.backupmediafamily  
   INNER JOIN msdb.dbo.backupset 
           ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  
--WHERE msdb.dbo.backupset.database_name = 'PivCRM_Prod_Online_ED'
--AND TYPE = 'D'  -- L D and I
ORDER BY msdb.dbo.backupset.backup_start_date DESC

a questão é:

como eu adicionaria o local do backup (cada tipo) à primeira consulta?

sql-server
  • 1 1 respostas
  • 38 Views

1 respostas

  • Voted
  1. Best Answer
    Tuyen Nguyen
    2024-11-06T05:00:01+08:002024-11-06T05:00:01+08:00

    Fiz vários ajustes para que funcionasse. Optei por não usar a sintaxe PIVOT, em vez disso, utilizei cláusulas CASE WHENwith GROUP BYpara pivotar várias colunas.

    1. Consulta mais interna: recupera informações sobre backups (incluindo data e local) para todos os bancos de dados de usuários. Ela usa uma função ROW_NUMBER(), particionada por nome do banco de dados e tipo de backup, para atribuir um número de linha exclusivo a cada entrada de backup, ordenado pela data de término do backup em ordem decrescente (para que o backup mais recente tenha rn=1).

    2. Segunda consulta interna: filtra para reter apenas o backup mais recente por banco de dados e tipo de backup, selecionando linhas com rn = 1.

    3. Consulta externa: usa instruções CASE WHEN para dinamizar os dados, permitindo que várias colunas (como data de término e local) por tipo de backup sejam exibidas para cada linha do banco de dados.

    -- The outer query to pivot using CASE WHEN
    SELECT name,
        [Recovery Model] = recovery_model_desc,
        [State] = state_desc,
        FORMAT(ISNULL(MAX(CASE WHEN type = 'D' THEN backup_finish_date END), '19000101'), 'dd-MM-yyyy hh:mm') AS [Last Full Backup],
        MAX(CASE WHEN type = 'D' THEN physical_device_name END) AS [Last Full Backup Physical Location],
        MAX(CASE WHEN type = 'D' THEN logical_device_name END) AS [Last Full Backup Logical Location],
        FORMAT(ISNULL(MAX(CASE WHEN type = 'L' THEN backup_finish_date END), '19000101'), 'dd-MM-yyyy hh:mm') AS [Last Log Backup],
        MAX(CASE WHEN type = 'L' THEN physical_device_name END) AS [Last Log Backup Physical Location],
        MAX(CASE WHEN type = 'L' THEN logical_device_name END) AS [Last Log Backup Logical Location],
        FORMAT(ISNULL(MAX(CASE WHEN type = 'I' THEN backup_finish_date END), '19000101'), 'dd-MM-yyyy hh:mm') AS [Last Differential Backup],
        MAX(CASE WHEN type = 'I' THEN physical_device_name END) AS [Last Differential Physical Backup Location],
        MAX(CASE WHEN type = 'I' THEN logical_device_name END) AS [Last Differential Logical Backup Location]
    FROM
    (
        -- The second inner select to select the latest backup for each database type of each db 
        SELECT Name,
               recovery_model_desc,
               state_desc,
               type,
               backup_finish_date,
               physical_device_name,
               logical_device_name
        FROM
        (
            -- The first inner select to select all backup details
            SELECT
                db.Name,
                db.recovery_model_desc,
                db.state_desc,
                a.type,
                a.backup_finish_date,
                b.physical_device_name,
                b.logical_device_name,
                ROW_NUMBER() OVER (PARTITION BY db.Name, a.type ORDER BY a.backup_finish_date DESC) rn
            FROM master.sys.databases AS db
            LEFT OUTER JOIN msdb.dbo.backupset AS a
                ON a.database_name = db.name
            LEFT JOIN msdb.dbo.backupmediafamily b
                ON a.media_set_id = b.media_set_id
            WHERE db.Name NOT IN
            (
                N'master',
                N'msdb',
                N'model',
                N'tempdb'
            ) 
        ) Backups
        WHERE rn = 1
    ) LatestBackups
    GROUP BY name
        , recovery_model_desc
        , state_desc
    ORDER BY name
    

    A tabela de resultados fica assim:A tabela de resultados da consulta

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve