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 / 305465
Accepted
igelr
igelr
Asked: 2021-12-30 00:45:45 +0800 CST2021-12-30 00:45:45 +0800 CST 2021-12-30 00:45:45 +0800 CST

Os arquivos de backup são perdidos durante o backup para a URL do Azure do SQL Server 2016

  • 772

Eu tenho um script de trabalho como este que deve fazer backup do SQL Server 2016 dbs para o armazenamento de blobs do Azure com credencial de chave de armazenamento. Geralmente funciona bem, mas às vezes alguns backups são perdidos (quer dizer, não há arquivo de backup na conta de armazenamento) e não recebo nenhum tipo ou falha de trabalho ou erros no arquivo de log de trabalho. Dbs são apenas ignorados. Percebi que quando o trabalho de backup se sobrepõe aos procedimentos de manutenção, isso acontece com bastante frequência quando altero as vezes em que aconteceu uma vez por mês ou menos. Mas não tenho certeza de que a manutenção (manutenção do índice, dbcc, atualização de estatísticas) seja o motivo dessa anomalia.

Eu gostaria de saber se você teve alguma experiência anterior como essa e pode saber qual é o motivo principal?

A parte interessante é que eu restaurei o checkonly, que também pula bancos de dados. Ele não tenta restaurar esses dbs é por isso que não recebo erros de falha, apenas pula

DECLARE @dbname sysname
DECLARE @path nvarchar(120)
DECLARE @credential sysname = 'BackupStorageCredential'
DECLARE @date nvarchar(250) = CAST( GETDATE() AS Date ) 
SET @path = N'[my_storage_url]'

DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name IN ('db1','db2','db3')
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @dbname   
WHILE @@FETCH_STATUS = 0   
BEGIN   
    DECLARE @query_backupToAzBLOB   NVARCHAR(max)
    DECLARE @query_verify   NVARCHAR(max)

    SET @query_backupTOAzBLOB = 'BACKUP DATABASE [' + @dbname + '] TO  URL =''' + @path + @dbname + '/' + @dbname + '_' + @date +'.bak'' 
                            WITH CREDENTIAL = ''' + @credential + ''',NOFORMAT, NOINIT,  NAME =''' + @dbname + ''',
                            NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10, CHECKSUM'
    EXEC (@query_backupTOAzBLOB)
    SET @query_verify = 'RESTORE VERIFYONLY  FROM URL =''' + @path + @dbname + '/' + @dbname + '_' + @date +'.bak'' 
                            WITH  CREDENTIAL = ''' + @credential + ''',  FILE = 1,  NOUNLOAD,  STATS = 5'
    EXEC(@query_verify)
    FETCH NEXT FROM db_cursor INTO @dbname   
END   
CLOSE db_cursor   
DEALLOCATE db_cursor
sql-server sql-server-2016
  • 2 2 respostas
  • 226 Views

2 respostas

  • Voted
  1. Tibor Karaszi
    2021-12-30T06:09:28+08:002021-12-30T06:09:28+08:00

    Declarar um cursor sobre sys.databases é um clássico. Às vezes, por qualquer motivo, alguns bancos de dados são ignorados.

    Altere o tipo de cursor para STATIC e você provavelmente verá que isso não acontece. Para ter certeza de que esse é o motivo, registre-se em uma tabela sua usando um INSERT dentro do cursor para ter certeza absoluta de que o nome do banco de dados foi retornado (ou não) da consulta do cursor. Ou seja, exclua todos os pontos de interrogação relacionados ao backup.

    Enquanto isso, você pode querer adicionar uma condição para o banco de dados estar online. Aqui está um exemplo do meu procedimento sp_dbinfo:

    DECLARE db CURSOR STATIC FOR SELECT name FROM sys.databases WHERE state_desc = 'ONLINE'
    
    • 4
  2. Best Answer
    Charlieface
    2021-12-30T08:03:35+08:002021-12-30T08:03:35+08:00

    Há dois problemas com seu código.

    1. Seu principal problema: usar um STATICcursor não sys.databases pode fazer com que os bancos de dados sejam ignorados.

    2. Você tem vulnerabilidades de injeção de SQL. Você poderia citar todos os parâmetros usando QUOTENAME, mas BACKUPna verdade permite que tudo seja parametrizado de qualquer maneira, então você pode realmente executar BACKUPdiretamente usando parâmetros, não há necessidade de SQL dinâmico.

    DECLARE @dbname sysname;
    DECLARE @path nvarchar(120) = N'[my_storage_url]';
    DECLARE @credential sysname = 'BackupStorageCredential';
    DECLARE @date nvarchar(250) = CAST( GETDATE() AS Date );
    
    DECLARE db_cursor CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
    SELECT name FROM sys.databases
    WHERE name IN ('db1','db2','db3')
      AND state_desc = 'ONLINE';
    
    OPEN db_cursor;
    FETCH NEXT FROM db_cursor INTO @dbname; 
    WHILE @@FETCH_STATUS = 0   
    BEGIN
    
        DECLARE @fullPath nvarchar(255) = @path + @dbname + '/' + @dbname + '_' + @date +'.bak';
    
        BACKUP DATABASE @dbname
        TO URL = @fullPath 
        WITH CREDENTIAL = @credential, NOFORMAT, NOINIT, NAME = @dbname,
            NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10, CHECKSUM;
    
        RESTORE VERIFYONLY
        FROM URL = @fullPath
        WITH CREDENTIAL = @credential, FILE = 1, NOUNLOAD, STATS = 5;
    
        FETCH NEXT FROM db_cursor INTO @dbname; 
    END;
    CLOSE db_cursor; 
    DEALLOCATE db_cursor;
    

    Você provavelmente deve considerar anexar o tempo ao URL também, pois a execução disso duas vezes falhará.

    • 3

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