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