(5-2) Maneiras de migrar uma grande tabela SQL

1. Introdução


Olá pessoal! Este é o meu primeiro artigo e estou escrevendo em nome de um engenheiro de desenvolvimento júnior em C #. Portanto, não haverá informações detalhadas sobre SQL, apenas informações práticas e pensamentos sobre como resolver um problema bastante óbvio que eu tive que enfrentar pelos mesmos recém-chegados que eu.

Primeiro, descreverei a formulação do meu problema como um exemplo, no qual há uma necessidade real de mover uma tabela grande.

Então, digamos que você tenha um serviço da Web e um banco de dados SQL (MS-SQL) com uma tabela de letras html que seu serviço envia aos usuários. As cartas são armazenadas por vários anos e não podem ser excluídas, pois são necessárias para a coleta de estatísticas e análises. No entanto, a cada ano o número de letras aumenta, o banco de dados aumenta e o espaço no servidor SQL está diminuindo (no nosso caso, outro fator foi restaurar o banco de dados no site de teste, porque o tempo aumentou proporcionalmente) e algo precisa ser feito com isso fazer. Felizmente, no nosso caso, há um servidor gratuito com muito espaço livre (na realidade, pode não ser, e é claro que essa é uma solução temporária, mas está além do escopo do artigo). Portanto, surgiu o problema de mover uma mesa grande (e dizer “grande”, quero dizer uma mesa muito grande, tudo o que vi enquanto procurava soluções semelhantes estava na região de 60 a 100 GB, no nosso caso, a mesa pesava mais de 300 GB).

Vamos considerar várias maneiras de resolver esse problema, mas nem todas elas se relacionam à transferência do tipo servidor-servidor. Às vezes, pode ser necessário transferir uma tabela entre bancos de dados no mesmo servidor. Além disso, alguns métodos são puramente teóricos, eu não os testei todos na prática, mas provavelmente deveriam funcionar.

Método -1. Dados


Não importa o quão óbvio pareça, mas você deve saber quais dados você irá transferir. Na maioria das vezes, os dados não são armazenados da maneira mais ideal e o excesso de informações também pode ser armazenado. É provável que, no seu caso particular, você possa fazer isso sem transferir todos os dados.

Em primeiro lugar, excluir uma coluna provavelmente pode ajudá-lo, mas esta é uma operação de bloqueio e nem sempre é possível interromper um serviço da web. E em Habré há um artigo no qual é contado como pode ser realizado.

Em segundo lugar, não se esqueça da normalização. Talvez alguns dados possam ser transferidos para o dicionário (no caso das letras, foi possível armazenar não os corpos das letras, mas modelos com os dados inseridos lá) e apenas o ID desses elementos pode ser armazenado em uma tabela grande, o que pode liberar muito espaço para você.

Método 0. SELECT INTO


Piada =) Então você só pode se colocar como base. No entanto, se estivermos falando sobre o tamanho pequeno da tabela (o que você está fazendo aqui), tente transferir o banco de dados usando esta instrução. Além disso, se você tiver uma base de teste, poderá realizar um experimento para avaliar o tempo total de transferência usando este método "na testa".

Método 1. Backup


A maneira mais "canônica", foi essa que se tornou a solução para o meu problema. Fazemos um backup do banco de dados que contém nossa tabela, restauramos em outro servidor e limpamos tudo desnecessário. Além disso, se for possível interromper o serviço da web, você pode reimplementá-lo configurando o registro na tabela transferida e excluir o antigo * * (aqui provavelmente haverá um momento em que será necessário escrever consultas nele com junções, para este google como vincular sql- servidores). Se isso não for possível, fixamos o ID da última letra (para sincronização), e precisamos excluir * todas as letras transferidas (continuaremos escrevendo na tabela antiga).

* Ao remover um tópico separado para conversação, pode parecer que é muito mais rápido do que transferir, mas não é assim e, no caso geral, aconselho a exclusão de partes.

Método 2: MS-SQL Management Studio


Se você possui este estúdio, pode tentar usar a ferramenta interna para exportar e importar dados. Pessoalmente, eu li no estouro da pilha que essa coisa estava pendurada em uma mesa de 60 GB e não arriscava.

Método 3. Partição


Método de testa aprimorado. A idéia é transferir dados da maneira usual com um timer entre iterações. Você divide todas as linhas em partes (por exemplo, 100k cada), transfere a parte (e pode excluí-la imediatamente, mas não tem certeza de quão segura é), depois adormece e assim por diante. É melhor transferir do final para que você não precise sincronizar dados no final. O método é obviamente muito lento, mas dessa forma você transferirá tudo sem interromper o serviço da web. Provavelmente, será mais conveniente implementá-lo não com um script SQL, mas com a ajuda de algum ORM.

Sumário


O processo de transferência de uma grande quantidade de dados sempre leva um certo tempo, e você deve estar preparado para isso. Não existe uma maneira mágica de resolver instantaneamente o seu problema. Em cada caso, você precisa desenvolver seus volumes e limitações. Se nenhum dos métodos funcionar para você, considere se você pode usar qualquer combinação deles.

No final, gostaria de acrescentar 2 pontos importantes.

Qualquer processo de transferência / exclusão de linhas no SQL é registrado no log de transações para a capacidade de reverter tudo no caso de um erro (eu anteriormente assumi que isso é realizado apenas dentro da estrutura de uma transação). Além disso, o tamanho do log é um pouco mais do que a quantidade de dados. Verifique se você possui a quantidade necessária de espaço ou desative o log, mas isso não é seguro.

Antes de transferir, você precisa garantir que o arquivo de dados e o arquivo de log tenham o tamanho certo, porque as operações de expansão gastam uma quantidade considerável de tempo e as configuram adequadamente, dessa forma você otimiza a migração.
Obrigado a todos que leram! Ficarei feliz em receber críticas, comentários e esclarecimentos. Compartilhe suas maneiras e técnicas para trabalhar com big data, como frequentemente, essas são informações muito importantes e necessárias que não são tão fáceis de encontrar.

Source: https://habr.com/ru/post/pt434800/


All Articles