Como o sistema de banco de dados mais "popular" (MySQL, Postgres...) lida com a alteração de tabelas em bancos de dados de produção ao vivo (como adicionar, excluir ou alterar o tipo de colunas)?
Eu sei que a maneira correta é fazer backup de tudo, agendar o tempo de inatividade e fazer as alterações.
Mas... algum sistema de banco de dados atual suporta fazer essas coisas "on-line" sem parar nada? (talvez apenas atrasando as consultas que fazem referência a uma coluna que está apenas sendo alterada/excluída)
E o que acontece quando eu apenas faço um ALTER TABLE...
banco de dados em execução ao vivo? Tudo para quando isso acontece? Os dados podem ser corrompidos? etc.
Novamente, estou me referindo principalmente ao Postgres ou MySQL, pois é isso que encontro.
(E, sim, sempre que eu tive que fazer isso antes de fazer "do jeito certo", fazer backup das coisas, agendar inatividade etc. ... mas eu só quero saber se é possível fazer esse tipo e coisas "rápidas e sujo" ou se houver algum sistema de banco de dados que realmente tenha suporte para alterações de esquema "rápidas, ao vivo e sujas")
Alguém acabou de sugerir Online Schema Change for MySQL a partir do script do Facebook (com um tutorial aqui e fonte aqui ) ... parece uma boa maneira de automatizar um conjunto de maneiras "hacky" de fazer isso ... algo parecido com produção?
Quando você emitir um
ALTER TABLE
no PostgreSQL , será necessário umACCESS EXCLUSIVE
bloqueio que bloqueia tudo, incluindo arquivosSELECT
. No entanto, esse bloqueio pode ser bastante breve se a tabela não exigir reescrita, nenhum novoUNIQUE
,CHECK
ouFOREIGN KEY
as restrições precisarem de verificações caras de tabela completa para verificar etc.Em caso de dúvida, geralmente você pode apenas experimentá-lo! Todo DDL no PostgreSQL é transacional, então não há problema em cancelar um
ALTER TABLE
se demorar muito e começar a reter outras consultas. Os níveis de bloqueio exigidos por vários comandos estão documentados na página de bloqueio .Algumas operações normalmente lentas podem ser aceleradas para serem executadas com segurança sem tempo de inatividade. Por exemplo, se você tem uma tabela
t
e deseja alterar a colunacustomercode integer NOT NULL
paratext
porque o cliente decidiu que todos os códigos de cliente devem agora começar com umX
, você pode escrever:... mas isso bloquearia toda a tabela para a reescrita. O mesmo acontece com a adição de uma coluna com um
DEFAULT
. Isso pode ser feito em algumas etapas para evitar o bloqueio longo, mas os aplicativos devem ser capazes de lidar com a duplicação temporária:Isso só impedirá gravações durante o
t
processo; o nome do bloqueioEXCLUSIVE
é um pouco enganoso, pois exclui tudo , excetoSELECT
; oACCESS EXCLUSIVE
modo é o único que exclui absolutamente tudo. Consulte os modos de bloqueio . Existe o risco de que essa operação possa reverter em deadlock devido à atualização de bloqueio exigida peloALTER TABLE
, mas na pior das hipóteses você terá que fazer isso novamente.Você pode até evitar esse bloqueio e fazer tudo ao vivo criando uma função de gatilho
t
que sempre que umINSERT
ouUPDATE
entra, preenche automaticamentecustomercode_new
decustomercode
.Também existem ferramentas integradas como
CREATE INDEX CONCURRENTLY
e queALTER TABLE ... ADD table_constraint_using_index
são projetadas para permitir que os DBAs reduzam as durações de bloqueios exclusivos, fazendo o trabalho mais lentamente de maneira amigável à simultaneidade.A
pg_reorg
ferramenta ou sua sucessorapg_repack
também pode ser usada para algumas operações de reestruturação de tabelas.Percona criou sua própria ferramenta para realizar alterações de esquema online
A ferramenta é chamada pt-online-schema-change
Envolve gatilhos, portanto, leia a documentação com atenção.
De acordo com a Documentação, as principais operações realizadas são
Desligar o sistema e fazer todas as alterações de uma vez pode ser muito arriscado. Se algo der errado, e frequentemente acontece, não há um caminho fácil de volta.
Como desenvolvedor Agile, às vezes preciso refatorar tabelas sem nenhum tempo de inatividade, pois essas tabelas estão sendo modificadas e lidas.
A abordagem a seguir tem baixo risco, porque a alteração é feita em várias etapas de baixo risco que são muito fáceis de reverter:
Usamos essa abordagem muitas vezes para alterar grandes tabelas de produção ao vivo sem tempo de inatividade, sem problemas.
Sim, muitos bancos de dados modernos permitem que você apenas adicione uma coluna ou altere as características de uma coluna, como adicionar ou remover valor nulo.
Se você descartar uma coluna, os dados serão perdidos, mas não há muito medo de corrupção.
A ferramenta Percona usa gatilhos para ajudar na alteração, e não funciona bem se sua mesa já tiver gatilhos existentes. Acabei tendo que escrever um que realmente lide bem com os gatilhos existentes, pois eles são super importantes para nosso banco de dados https://github.com/StirlingMarketingGroup/smg-live-alter
Para abordar a questão sobre o que acontece com uma
ALTER TABLE
declaração, isso depende da extensão de suas alterações. Em casos específicos, se você adicionar uma nova coluna, pelo menos no MS SQL Server, o mecanismo criará uma cópia temporária da tabela, enquanto cria a nova definição de tabela e insere os dados de volta lá. Durante a mudança, a tabela ficaria inacessível aos usuários.Um exemplo das operações específicas para o servidor MSSQL está aqui: http://support.microsoft.com/kb/956176/en-us
Eu diria que outros RMDBs têm métodos semelhantes, embora a implementação exata seja algo que você teria que verificar com a documentação do fornecedor.