Estou tentando adicionar uma nova coluna em uma tabela e a consulta está me dando esse erro 1114.
O tamanho da minha instância do RDS é pequeno. 1,7 GB de memória, 1 ECU (1 núcleo virtual com 1 ECU) A tabela que estou tentando modificar tem 5 milhões de linhas e 7 GB de tamanho. O tamanho do disco da instância é de 15 GB (40% gratuito).
É um momento crítico para nós, pois estamos presos, o AWS RDS não permite acesso a todos os parâmetros das configurações do mysql. Como me livrar deste problema?
Aqui está o problema : Sempre que você executa
ALTER TABLE
, deve haver uma tabela temporária usada. A tabela temporária não está sendo gravada em sua pasta de dados. É mais provável que seja escrito para/rdsdbdata/tmp
. Por favor, esta consultaIsso lhe dará uma ideia de onde está essa pasta. Novamente, por padrão, é
/rdsdbdata/tmp
.Por que isso interromperia as coisas para o mysqld? A culpa é do MyISAM . Por que MyISAM? Aqui está algo a considerar: De acordo com o MySQL 5.0 Certification Study Guide ,
o marcador nº 11 diz o seguinte nas páginas 408.409, seção 29.2:
Quando você ficar sem espaço em disco, não desligue ou mate o mysql. A contagem de identificadores de arquivos abertos em qualquer MyISAM atualmente usado não será apagada. Assim, a tabela MyISAM é marcada como travada. Se você puder liberar espaço em disco no volume de dados com o mysqld ainda rodando, o mysqld irá continuar assim que o espaço em disco for disponibilizado. Por favor, note que o próprio mysqld não travou. Ele simplesmente entra em um estado de animação suspensa até que o espaço livre se materialize.
No seu caso, basta matar o
ALTER TABLE
. A tabela temporária, que usa MyISAM, simplesmente bloqueou o espaço em disco dos arquivos/rdsdbdata/tmp
. Matar oALTER TABLE
irá se livrar da tabela temporária e liberar o mysqld para continuar com a vida como de costume.Já expliquei isso nos meus posts anteriores:
Mar 15, 2012
: Por que as tabelas MySQL falham? Como faço para prevenir?Apr 25, 2012
: Arquivos de log muito grandesO QUE VOCÊ PODE FAZER?
Você pode ter que executar a
ALTER TABLE
si mesmo em etapas manuais.Por exemplo, vamos supor que você tenha esta tabela:
e você quer correr
ALTER TABLE ADD COLUMN field3 CHAR(5);
Aqui estão as etapas para fazer isso dentro do seu datadir:
Observe que
datadir
ALTER TABLE
Estas são coisas que o mysqld faz internamente com o
ALTER TABLE
. Essas etapas simplesmente emulam isso e fazem essa emulação nodatadir
.De uma chance !!!
Se você tiver apenas 40% de 15 GB = 6 GB livres, não poderá ter duas cópias de uma tabela de 7 GB na instância ao mesmo tempo, seja usando
ALTER TABLE
(o que geralmente cria uma cópia inteira do a tabela e então substitui a tabela existente por ela, como explicou RolandoMySQLDBA) ou crie outra tabela e insira os dados.Parece que sua instância também não tem armazenamento suficiente.
Você deve conseguir aumentar o armazenamento disponível em uma instância em execução no console de gerenciamento selecionando a instância, escolhendo "Modificar", alterando a quantidade de armazenamento alocada e clicando em "ok". Ver:
http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_ScalingStorage.html
Não sei como o RDS lida com isso em segundo plano, portanto, não sei se seu banco de dados ficará indisponível por um curto período de tempo durante a alteração.Esta operação irá avisá-lo sobre a possível degradação do desempenho enquanto a instância estiver sendo modificada, mas você deve descobrir que a instância permanece disponível e acessível e que em alguns minutos a operação é concluída sem qualquer interrupção da disponibilidade de sua instância.