Engine InnoDB desativado no MySQL

O cliente reclamou que todas as tabelas estavam como MyISAM, sendo que na origem eram InnoDB.


Verifiquei então no MySQL que o Storage InnoDB estava desabilitado.
-bash-3.2$ mysql -u root -pxxxxxx
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 60934
Server version: 5.1.45-community-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show engines;

+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         |

| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |

| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |

| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |

+------------+---------+----------------------------------------------------------------+--------------+------+------------+
7 rows in set (0.00 sec)
mysql> exit
Bye
Como esta instalação foi feita a partir de RPMs, o InnoDB já devia vir habilitado por padrão.

Outro motivo que podia fazer com que o InnoDB estivesse indisponível seria iniciar o MySQL com a opção –skip-innodb, no script de inicialização ou no arquivo /etc/my.cnf. Verifiquei, e não era esse o motivo.

Reiniciei então o MySQL, para verificar se havia alguma informação no Log. Quando tudo der errado, faça o certo: olhe o Log.
-bash-3.2$ /etc/init.d/mysql restart

Shutting down MySQL...                                     [  OK  ]
rm: imposível remover `/var/lock/subsys/mysql': Permissão negada
Starting MySQL.                                            [  OK  ]

-bash-3.2$ tail /var/lib/mysql/mysqld.log
InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 536870912 bytes!
100813  7:20:38 [ERROR] Plugin 'InnoDB' init function returned error.
100813  7:20:38 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
A causa foi que o /etc/my.cnf foi copiado de outro servidor, por já ser um arquivo de configuração otimizado. Mas como o MySQL do destino foi instalado por RPMs, o tamanho padrão dos Logs (ib_logfileN) é de 5MB – aliás, um tamanho sofível para qualquer carga de gravação. No arquivo otimizado, o tamanho dos Logs era 512M.

Neste caso a solução é fácil, basta remover os arquivos de Log – com o MySQL parado – e o InndoDB os recriará do tamanho correto.

-bash-3.2$ cd /var/lib/mysql
-bash-3.2$ ls -lh ib*
-rw-rw---- 1 mysql mysql  10M Ago 11 22:29 ibdata1
-rw-rw---- 1 mysql mysql 5,0M Ago 11 22:34 ib_logfile0
-rw-rw---- 1 mysql mysql 5,0M Ago 11 22:26 ib_logfile1
-bash-3.2$ /etc/init.d/mysql stop
Shutting down MySQL.                                       [  OK  ]

rm: imposível remover `/var/lock/subsys/mysql': Permissão negada
-bash-3.2$ mv ib_logfile0 ib_logfile0.old
-bash-3.2$ mv ib_logfile1 ib_logfile1.old
-bash-3.2$ /etc/init.d/mysql start
Starting MySQL.............................................[  OK  ]............
-bash-3.2$ vi /var/lib/mysql/mysqld.log
-bash-3.2$ mysql -u root -pxxxxxx

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.1.45-community-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |

+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |

| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |

| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |

| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         |

+------------+---------+----------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.00 sec)
mysql> exit
Bye
-bash-3.2$ tail -f /var/lib/mysql/mysqld.log
100813 07:21:50 mysqld_safe mysqld from pid file /var/lib/mysql/mysqld.pid ended
100813 07:22:39 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
100813  7:22:39 [Warning] Could not increase number of max_open_files to more than 1024 (request: 65534)

100813  7:22:39 [Note] Plugin 'FEDERATED' is disabled.
100813  7:22:40  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 512 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100 200 300 400 500
100813  7:23:07  InnoDB: Log file ./ib_logfile1 did not exist: new to be created

InnoDB: Setting log file ./ib_logfile1 size to 512 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100 200 300 400 500
100813  7:23:32  InnoDB: Log file ./ib_logfile2 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile2 size to 512 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100 200 300 400 500

InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
100813  7:24:01  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...

100813  7:24:04  InnoDB: Started; log sequence number 0 44556
100813  7:24:04 [Note] Event Scheduler: Loaded 0 events
100813  7:24:04 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.1.45-community-log'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Obs.: o MySQL subiu sem o InnoDB porque em versões mais recentes da árvore 5.1 (estamos utilizando a 5.1.45) este Engine é um Plugin, e não mais uma parte fixa do código. Em versões anteriores este erro seria detectado prontamente, pois o MySQL nem subiria. Outra observação importante é que o Dump continha a informação que as tabelas deviam utilizar o InnoDB, mas como este não existia, ao invés de um erro, o MySQL as criou como MyISAM. Este é um comportamente padrão do MySQL em praticamente tudo o que ele faz, que deve ser levado em consideração em casos de Troubleshooting: ele sempre tenta resolver sozinho as coisas – você pede banana, se ele não tiver banana, ele te dá uma maçã mesmo, goela abaixo.

Nenhum comentário:

Postar um comentário