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 / 319716
Accepted
Ross Bush
Ross Bush
Asked: 2022-11-16 06:26:18 +0800 CST2022-11-16 06:26:18 +0800 CST 2022-11-16 06:26:18 +0800 CST

Mesclar dados de tabelas idênticas de vários bancos de dados em uma tabela maior. Replicação de tabela N-1

  • 772

Existem N bancos de dados com estruturas de tabelas idênticas em um sistema multilocatário e multibanco de dados. O desejo é replicar uma tabela (s) desses bancos de dados em uma única tabela maior em um banco de dados OLAP, presumo que possa funcionar.

-Usando replicação transacional-

  1. Recrie o PK para todos os artigos de tabela no editor, incluindo um campo recém-adicionado que identifica o banco de dados.

  2. Defina a opção "Quando o artigo existir" para Não excluir e usar o filtro de linha (que inclui o identificador do banco de dados).

  3. Adicione um filtro de linha para cada tabela usando o identificador exclusivo do banco de dados.

Minha pergunta é, dado o cenário acima, se um novo instantâneo for criado para um editor, os dados obsoletos do assinante seriam removidos e apenas para esse editor? Receio que seja isso que a tabela suspensa e a recriação pretendem resolver :/

Em termos simples, se eu tiver

Tabela A
ID do banco de dados
TableAID

Se um novo instantâneo para uma publicação chamada Database007 foi reinicializado. Todos os dados da assinatura do Database007 seriam removidos e reidratados para o Database007 ou eu atingiria uma violação de PK.

Também tenho pesquisado o CDC, no entanto, isso não parece suportar um cenário de replicação N-1. Além disso, sinta-se à vontade para descartar quaisquer outras ideias.

sql-server
  • 1 1 respostas
  • 28 Views

1 respostas

  • Voted
  1. Best Answer
    AMtwo
    2022-11-16T06:55:25+08:002022-11-16T06:55:25+08:00

    Usar uma visualização

    Eu tive que resolver exatamente isso antes, e a maneira mais confiável de fazer isso é replicar para tabelas diferentes e, em seguida, criar uma exibição para unir tudo.

    • Na replicação, você pode definir o artigo para usar um nome diferente no lado do editor.
      • Você pode redirecionar as tabelas de cada local para seu próprio esquema. Dependendo do uso existente de esquemas, você pode replicar dbo.Transactionspara LocationA.Transactionsou LocA_dbo.Transactions.
      • Você pode usar esse recurso para renomear artigos de forma que dbo.Transactionsse tornem dbo.Transactions_LocationA.
      • Como alternativa à renomeação, você pode replicar cada Publicador em seu próprio banco de dados, o que evita totalmente os conflitos de nomenclatura, mas potencialmente apresenta algumas dores de cabeça de permissões relacionadas ao encadeamento de propriedade entre bancos de dados.
    • Crie uma exibição que faz uma UNION ALLde todas as tabelas separadas.
      • Isso é realmente apenas particionamento sem usar o recurso de mesmo nome.
      • Na definição da exibição, você pode adicionar uma coluna com o local de origem listado como uma constante para identificar os dados na exibição resultante.

    Alguns cuidados

    No plano acima, sugiro que você evite SELECT *a exibição por todos os motivos usuais. Se uma alteração de esquema for feita para diferentes editores em momentos diferentes, a exibição provavelmente será interrompida desde o momento em que a primeira tabela é alterada até que a tabela final seja alterada. Em vez disso, liste explicitamente as colunas e atualize a exibição apenas quando a alteração do esquema estiver em todos os lugares.

    As mesmas considerações de mudança de esquema também precisam ser feitas ao replicar em uma única tabela. Embora eu seja esse o caso, é mais provável interromper a replicação do envio, em vez de apenas interromper a visualização.

    Replicação muitos-para-um

    A maneira como o agente Snapshot funciona é basicamente automatizar o uso do BCP para exportar do editor e importar para o assinante. A opção padrão é truncar e recarregar ao reinicializar uma publicação. Você também pode alterar para usar delete em vez de truncar, mas isso usará uma única DELETEinstrução não em lote, o que pode causar bloqueio e inchaço do log de transações.

    Se seus vários editores tiverem PKs sobrepostos, você precisará unificá-los, conforme sugerido. No entanto, isso pode afetar o desempenho - potencialmente um custo significativo. Além das considerações de tamanho de adicionar a coluna a cada PK, se seu PK também for seu índice clusterizado, o unificador também será incluído em cada índice não clusterizado.

    Você também precisará garantir que o unificador seja adicionado ao END da definição de PK para não quebrar a SARGability das consultas existentes. No entanto, mesmo se você fizer isso, poderá notar alterações nos planos de consulta que causam regressões de desempenho.

    O otimizador de consulta sabe que, se IDfor uma única coluna PK, ID = @idretornará no máximo uma única linha. As mesmas regras de cardinalidade são usadas durante a otimização de consultas e junções baseadas em conjunto. Assim, você pode começar a ver mudanças nos planos de consulta, onde uma junção 1:1 agora é interpretada como uma junção 1:muitos. Isso pode ser mitigado adicionando um índice exclusivo no "antigo" PK. Você pode até optar por manter o "antigo" PK como um índice clusterizado exclusivo e tornar o "novo" PK um PK não clusterizado.

    Os vários desafios de adicionar replicação de vários destinos a uma única tabela de assinantes tornam essa solução muito desafiadora. Isso requer mudanças significativas nos bancos de dados do editor. Eu não recomendaria esta opção, exceto no desenvolvimento de campo verde, onde o esquema e o desempenho podem ser levados em consideração desde o início.

    Além disso, a inevitável necessidade de capturar novamente um editor significa excluir cuidadosamente apenas as linhas apropriadas do assinante. Usar o particionamento com uma partição por publicador pode ajudar aqui, mas apresenta um conjunto diferente de complicações. IMHO, o pseudo-particionamento é uma solução mais fácil de gerenciar a longo prazo.

    A replicação para destinos únicos garante que os editores não precisem de mudanças e testes significativos e alivia a carga de suporte contínuo que estará envolvida em um único destino de replicação 1:muitos

    • 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