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 / 27153
Accepted
NeuronQ
NeuronQ
Asked: 2012-10-19 03:39:23 +0800 CST2012-10-19 03:39:23 +0800 CST 2012-10-19 03:39:23 +0800 CST

Alterar tabela em bancos de dados de produção ao vivo

  • 772

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?

mysql postgresql
  • 6 6 respostas
  • 53496 Views

6 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2012-10-19T03:48:05+08:002012-10-19T03:48:05+08:00

    Quando você emitir um ALTER TABLEno PostgreSQL , será necessário um ACCESS EXCLUSIVEbloqueio que bloqueia tudo, incluindo arquivosSELECT . No entanto, esse bloqueio pode ser bastante breve se a tabela não exigir reescrita, nenhum novo UNIQUE, CHECKou FOREIGN KEYas 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 TABLEse 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 te deseja alterar a coluna customercode integer NOT NULLpara textporque o cliente decidiu que todos os códigos de cliente devem agora começar com um X, você pode escrever:

    ALTER TABLE t ALTER COLUMN customercode TYPE text USING ( 'X'||customercode::text );
    

    ... 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:

    ALTER TABLE t ADD COLUMN customercode_new text;
    BEGIN;
    LOCK TABLE t IN EXCLUSIVE MODE;
    UPDATE t SET customercode_new = 'X'||customercode::text;
    ALTER TABLE t DROP COLUMN customercode;
    ALTER TABLE t RENAME COLUMN customercode_new TO customercode;
    COMMIT;
    

    Isso só impedirá gravações durante o tprocesso; o nome do bloqueio EXCLUSIVEé um pouco enganoso, pois exclui tudo , excetoSELECT ; o ACCESS EXCLUSIVEmodo é 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 pelo ALTER 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 tque sempre que um INSERTou UPDATEentra, preenche automaticamente customercode_newde customercode.

    Também existem ferramentas integradas como CREATE INDEX CONCURRENTLYe que ALTER TABLE ... ADD table_constraint_using_indexsã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_reorgferramenta ou sua sucessora pg_repacktambém pode ser usada para algumas operações de reestruturação de tabelas.

    • 25
  2. RolandoMySQLDBA
    2012-10-19T08:05:07+08:002012-10-19T08:05:07+08:00

    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

    • Verificações de sanidade
    • Chunking
    • Alteração de esquema on-line
      • Criar e alterar tabela temporária
      • Capturar alterações da tabela para a tabela temporária
      • Copiar linhas da tabela para a tabela temporária
      • Sincronize a tabela e a tabela temporária
      • Troque/renomeie a tabela e a tabela temporária
      • Limpar
    • 8
  3. A-K
    2012-10-19T05:58:33+08:002012-10-19T05:58:33+08:00

    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:

    • Certifique-se de que todos os módulos que acessam a mesa estejam bem cobertos com testes automatizados.
    • Crie uma nova tabela. Altere todos os procedimentos que modificam a tabela antiga, para que modifiquem as tabelas antigas e novas.
    • Migre os dados existentes para a nova estrutura. Faça isso em lotes pequenos, para que não afete seriamente o desempenho geral do servidor.
    • Verifique se a migração de dados foi bem-sucedida.
    • Redirecione alguns dos procedimentos de seleção da tabela antiga para as novas. Use testes automatizados para garantir que os módulos alterados ainda estejam corretos. Certifique-se de que seu desempenho seja aceitável. Implante os procedimentos alterados.
    • Repita a etapa anterior até que todos os relatórios usem a nova tabela.
    • Altere os procedimentos que modificam as tabelas, para que acessem apenas a nova tabela.
    • Arquive a tabela antiga e remova-a do sistema.

    Usamos essa abordagem muitas vezes para alterar grandes tabelas de produção ao vivo sem tempo de inatividade, sem problemas.

    • 7
  4. Marlin Pierce
    2012-10-19T03:44:51+08:002012-10-19T03:44:51+08:00

    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.

    • 2
  5. Brian Leishman
    2018-09-26T07:39:06+08:002018-09-26T07:39:06+08:00

    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

    • 0
  6. SchmitzIT
    2012-10-19T03:45:32+08:002012-10-19T03:45:32+08:00

    Para abordar a questão sobre o que acontece com uma ALTER TABLEdeclaraçã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.

    • -1

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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