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 / 91223
Accepted
toryan
toryan
Asked: 2015-02-06 12:11:19 +0800 CST2015-02-06 12:11:19 +0800 CST 2015-02-06 12:11:19 +0800 CST

Restaurar automaticamente o banco de dados do SQL Server a partir do arquivo de outro servidor

  • 772

Temos uma tarefa diária de sobrescrever vários bancos de dados de desenvolvimento usando backups dos bancos de dados de produção associados. Os backups são produzidos por planos de manutenção no servidor de produção e depois transferidos para o servidor de desenvolvimento por FTP. Todos os dias, executamos uma instrução SQL semelhante a esta para sobrescrever cada banco de dados:

RESTORE DATABASE [Database1] 
FROM DISK = N'D:\path\to\Database1_backup_2015_02_05_190004_7401803.bak'
WITH FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10
GO

Cada vez que executamos isso, temos que substituir o nome do arquivo pelo arquivo correto mais recente. Eu gostaria de automatizar isso de alguma forma para minimizar a chance de erro do operador. O problema é que não podemos controlar o nome do .bakarquivo (embora o formato seja consistente - nome do banco de dados, data, hora e qualquer que seja o número de sete dígitos), e a pasta geralmente contém vários dias de backups.

sql-server maintenance
  • 3 3 respostas
  • 18779 Views

3 respostas

  • Voted
  1. Best Answer
    RLF
    2015-02-06T12:36:00+08:002015-02-06T12:36:00+08:00

    Como todos os detalhes dos backups são mantidos no banco de dados msdb, você deve apenas extrair o nome do arquivo de backup do servidor de origem.

    Você pode criar um servidor vinculado a partir do seu servidor de desenvolvimento para acessar o banco de dados msdb do servidor de produção. Ou você pode usar OPENQUERY para consultar os mesmos dados. (OPENQUERY pode ser mais rápido, pois a consulta está realmente sendo executada no servidor de produção.)

    Por exemplo:

    SELECT * from OPENQUERY([LinkToPRD], 
         'EXEC database.dbo.ExecDailyRestore');
    

    Isso mostra a execução de um procedimento armazenado sem parâmetros, o que pode se adequar ao seu plano de restauração diário.

    Se você pesquisar "gerar automaticamente scripts de restauração do banco de dados do servidor SQL", encontrará muitos scripts. Um exemplo de Paul Brewer é sp_RestoreGeneque você pode usar como está ou como base para criar seu próprio ExecDailyRestoreprocedimento armazenado.

    https://paulbrewer.wordpress.com/sp_restoregene/

    Aqui estão os parâmetros suportados por sp_restoregene:

        @Database SYSNAME = NULL,
        @TargetDatabase SYSNAME = NULL,
        @WithMoveDataFiles VARCHAR(2000) = NULL,
        @WithMoveLogFile  VARCHAR(2000) = NULL,
        @FromFileFullUNC VARCHAR(2000) = NULL,
        @FromFileDiffUNC VARCHAR(2000) = NULL,
        @FromFileLogUNC VARCHAR(2000) = NULL,
        @StopAt DATETIME = NULL,
        @StandbyMode BIT = 0,
        @IncludeSystemDBs BIT = 0,
        @WithRecovery BIT = 0,
        @WithCHECKDB BIT = 0,
        @WithReplace BIT = 0,
        @UseDefaultDatabaseBackupPath BIT = 0,
        @Log_Reference VARCHAR (250) = NULL,
        @LogShippingVariableDeclare BIT = 1,
        @LogShippingStartTime DATETIME = NULL,
        @LogShippingLastLSN VARCHAR(25) = NULL
    

    E aqui está um script de amostra:

    RESTORE DATABASE db_workspace 
    FROM DISK = 'X:\Backups\Temp\db_workspace.bak' WITH REPLACE, 
    FILE = 1,CHECKSUM,NORECOVERY, STATS=10
    , MOVE 'db_workspace' TO 'x:\data\db_workspace.mdf'
    , MOVE 'db_workspace_log' TO 'x:\data\db_workspace_log.ldf'
    , MOVE 'db_workspace_FG2' TO 'x:\data\db_workspace_FG2.ndf'
    , MOVE 'db_workspace_FG1' TO 'x:\data\db_workspace_FG1.ndf'
    
    • 10
  2. Zane
    2015-02-06T12:46:26+08:002015-02-06T12:46:26+08:00

    Os DBAs aqui provavelmente vão jogar ovos e tomates em mim, mas vou jogar isso de qualquer maneira.

    Você pode usar um trabalho de serviços de integração para executar isso. Primeiro, crie um loop para cada arquivo e configure-o para ser executado para cada arquivo nesse local. Cópia de segurança

    Mapeie o resultado para uma variável. Variável

    Em seguida, crie e execute a tarefa SQL dentro do contêiner. Husa

    Consulta de mapa

    Feito isso, você poderá criar um trabalho SQL e agendá-lo adequadamente. Não estou dizendo que esta é a melhor solução, mas deve funcionar.

    FreeHand

    • 8
  3. cberthold
    2015-02-06T14:22:41+08:002015-02-06T14:22:41+08:00

    Isso deve resolver o problema para você exatamente. Obviamente, se você estiver restaurando para um banco de dados em que o mdf/ldf tenha nomes diferentes, talvez seja necessário ajustar ligeiramente o comando de restauração final. Isso funciona apenas listando os backups em um diretório e escolhendo com base em um padrão. Acho que poderia ter feito do padrão uma variável também, mas você entendeu.

         DECLARE @FileName varchar(255), @PathToBackup varchar(255), @RestoreFilePath varchar(1000)
    
         DECLARE @Files TABLE (subdirectory varchar(255), depth int, [file] int)
    
         SET NOCOUNT ON
    
         SET @PathToBackup = 'D:\path\to'
    
         -- insert into our memory table using dirtree and a single file level
         INSERT INTO @Files
         EXEC master.dbo.xp_DirTree @PathToBackup,1,1
    
         SELECT TOP 1 
            @FileName = [subdirectory]
         FROM 
            @Files
         WHERE
            -- get where it is a file
            [file] = 1
         AND    
            subdirectory LIKE 'Database1_backup%.bak'
         ORDER BY
            -- order descending so newest file will be first by naming convention
            subdirectory DESC
    
        IF LEFT(REVERSE(@PathToBackup), 1) != '\'
        BEGIN
            SET @PathToBackup = @PathToBackup + '\'
        END
    
        SET @RestoreFilePath = @PathToBackup + @FileName
    
        SELECT @RestoreFilePath
    
        RESTORE DATABASE [Database1] 
        FROM DISK = @RestoreFilePath
        WITH FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10
    
    • 5

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