Na verdade, quero me livrar das restrições existentes no banco de dados, o que sei que parece loucura, mas estamos atualizando nosso aplicativo para uma nova estrutura que depende dos nomes de restrição de chave estrangeira, além de fazermos várias limpezas e renomeações de campos, tabelas etc
Suponho que uma maneira melhor de enquadrar a questão é que, dado um banco de dados existente, precisa passar pelo seguinte:
- Crie todas as novas restrições de chave estrangeira com nomes que funcionem dentro da estrutura
- As tabelas serão renomeadas e/ou reestruturadas massivamente, incluindo a renomeação de campos que atualmente fazem parte de relacionamentos de chave estrangeira existentes
Qual é o melhor jeito de concluir isso?
Minhas soluções até agora foram:
- Crie um script de conversão (em php) que executará DROP FOREIGN KEY para todas as restrições no banco de dados. Isso resultou em erros estranhos ocorrendo durante as etapas posteriores do processo ao tentar ALTER TABLES e adicionar as novas restrições. Além disso, as restrições foram removidas, mas recebo erros se tento DROP as próprias chaves.
- Em vez de usar PHP e PDO, escreva o script de conversão usando SQL direto e use um CURSOR para DROP as restrições.
- Em vez de descartar as próprias restrições, converta as tabelas em MyIsam e DROP as chaves e, em seguida, converta de volta para Innodb antes de continuar com o restante do processo de conversão.
- Crie um novo esquema do zero e mova os dados do esquema antigo para o novo.
Gostaria de saber qual dessas abordagens seria considerada a mais válida? Ou se existe uma maneira melhor de fazer isso?
ATUALIZAÇÃO (essa informação foi solicitada na sala de bate-papo, então pensei em adicioná-la aqui):
- O esquema atual tem 68 tabelas, o novo esquema será mais próximo de 55.
- A maior tabela tem pouco mais de 800.000 linhas e, em geral, nossas tabelas estão na casa das dezenas de milhares.
- O banco de dados inteiro tem aproximadamente 240 MB, mas a maior parte está em uma única tabela que armazena um grande campo de texto. Estaremos comprimindo isso durante a conversão.
Chega um ponto em que uma limpeza passo a passo se torna mais trabalhosa do que uma lousa limpa e uma abordagem de migração. A disponibilidade do sistema e o tempo para migrar podem influenciar a decisão ao lidar com volumes maiores, mas nesse tamanho, não é um problema.
Os principais fatores para mim aqui são:
Nessa situação, eu ficaria muito tentado a projetar um novo esquema que se ajustasse ao modelo que você agora precisa e criar os scripts necessários para migrar os dados (sua opção 4).
Não sei sobre o ideal, mas pode valer a pena tentar uma conversão rápida para escrever um script bash que segue uma lógica simples:
CONSTRAINT
linhas no arquivoCONSTRAINT
nome existe como uma CHAVE, se houver, remova-o do arquivoMuito importante: Tenha um backup do seu banco de dados.
Bom dia, Sr. Phelps (quero dizer Sr. Goodrich).
Você tem restrições de chave estrangeira que gostaria de ignorar. Aqui está o seu itinerário para esta tarefa:
SET GLOBAL UNIQUE_CHECKS = 0;
SET GLOBAL FOREIGN_KEY_CHECKS = 0;
Sua missão, caso decida excetuá-la, é realizar essas etapas com a esperança de que a Etapa 04 não seja necessária.
Como sempre, se algum de seus dados for capturado ou eliminado, o DBA StackExchange negará qualquer conhecimento de suas ações.
Esta não é uma fita, portanto não se autodestruirá em 5 segundos.
ATUALIZAÇÃO 2011-10-19 12:50 EDT
Eu gosto da sua opção 3. Parece a mais rápida e suja. Aqui está como você pode fazer isso:
Passo 01) mysqldump tudo para /root/MySQLData.sql
Etapa 02) Elimine todos os bancos de dados
Etapa 03) adicione isso a /etc/my.cnf
Passo 04)
service mysql stop
Passo 05)
rm -f /var/lib/mysql/ib_logfile[01] /var/lib/mysql/ibdata1
Passo 06)
service mysql start
Passo 07)
mysql -uroot -p -A < /root/MySQLData.sql
Passo 08) Remova
skip-innodb
de /etc/my.cnfPasso 09)
service mysql restart
Após o passo 7, todos os dados estão em MyISAM
Após o passo 9
Agora, aqui está como converter em massa todas as tabelas MyISAM de volta para InnoDB:
O script converterá todas as tabelas MyISAM em ordem de tamanho, da menor para a maior.
De uma chance !!!