segunda-feira, 5 de maio de 2014

MySQL ERROR 1118 (42000) MySQL 5.0 para o MySQL 5.5 ou superior

Original post: http://anothermysqldba.blogspot.com/2014/05/mysql-error-1118-42000-mysql-50-to.html 

Então, eu tive recentemente um banco de dados TBs que que eu tinha que atualizar a partir do MySQL 5.0 para o MySQL 5.5. 
Este blog vai tocar no seguinte: 
  • sql_mode
  • innodb_strict_mode
  • SLAVE IO_THREAD
Durante o processo de mysql_upgrade (que faz um mysqlcheck) eu rapidamente percebi o seguinte erro: 

ERROR 1118 (42000) at line 23: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

Então eu comecei eu tinha que verificar algumas coisas primeiro. 

# The master DB was > select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
New DB foi 
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+ 
OK Eu preferiria ter algo para sql_mode sobre um valor vazio. 
Então eu deixar isso passar. 
# MASTER SERVER
select @@innodb_strict_mode;
ERROR 1193 (HY000): Unknown system variable 'innodb_strict_mode'

# NEW SERVER mysql> select @@innodb_strict_mode;
+----------------------+
| @@innodb_strict_mode |
+----------------------+
| 1 |
+----------------------+
Você pode ler mais sobre essa configuração aqui: 
http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-other-changes-strict-mode.html 
mysql> SET GLOBAL innodb_strict_mode=0;

O comando acima me permitiu atualizar pelo menos mysql uma verificação das tabelas. Para ser seguro eu ainda criar um script para descarregar e carregar todas as tabelas. (Sim toda a TBS deles) 

Não tome um corte curto e assumir tudo está ok. 

Se você estiver recebendo erros mysqldump e recarregar os arquivos. É melhor prevenir do que remediar depois. 

Uma vez que os dados são carregados em 5.5 + posso rever e ajustar as variáveis. 

Escusado será dizer que vai levar algum tempo para descarregar e carregar TBs de dados. Eu quero dar a todos a oportunidade de escravos que puder para alcançar o mais rápido possível.Enquanto meus scripts shell são dumping e carregamento dos dados, não há razão para o banco de dados não podem ser reunir os logs binários no mesmo período. 

mysql> START SLAVE IO_THREAD ; 
Então, agora, enquanto o meu processlist mostrará: 

SELECT /*!40001 SQL_NO_CACHE */ * 
a condição de escravo mostra: 
Slave_IO_Running: Sim 
Slave_SQL_Running: Nenhuma 

Então, eu estou reunindo registros enquanto eu limpar o banco de dados. 
Isso deve permitir que o banco de dados para apanhar rapidamente uma vez que eu estou pronto para ir.