Estou tentando automatizar a execução de um código de aplicativo na inicialização do MySQL . A opção do servidor de arquivos init parece útil e eu preciso saber se o mysqld espera que todo o código no arquivo init seja concluído antes de disponibilizar a instância e os bancos de dados.
Tentei configurar um caso de teste rápido que parece não funcionar como eu esperava:
crie uma tabela de teste simples e um procedimento que apenas insere um registro
create table init_test_tab (x char);
delimiter $$
drop procedure init_test $$
create procedure init_test(p char(1))
begin
do sleep(300);
insert into init_test_tab VALUES(p);
END
$$
chame o procedimento de um arquivo init:
$ cat /var/lib/mysql/mysql-init.sql
call xxxx.init_test('y');
$ grep init /etc/mysql/my.cnf
init-file = /var/lib/mysql/mysql-init.sql
Reinicie o servidor para verificar os tempos e verifique o conteúdo da tabela de teste:
sessão 1 - a tabela está vazia:
[Wed Nov 28 15:54:26 2012]> select * from init_test_tab;
Empty set (0.00 sec)
sessão 2 - reinicie o mysqld:
# time service mysql restart
mysql stop/waiting
mysql start/running, process 3031
real 0m10.116s
user 0m0.024s
sys 0m0.068s
Observe que leva apenas 10s para reiniciar.
sessão 1 - conexão perdida (como esperado):
[Wed Nov 28 15:54:33 2012]> select * from init_test_tab;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ERROR:
Can't connect to the server
[Wed Nov 28 15:54:45 2012]> select * from init_test_tab;
No connection. Trying to reconnect...
Connection id: 2
Current database: xxxxx
+------+
| x |
+------+
| y |
+------+
1 row in set (0.01 sec)
[Wed Nov 28 15:54:50 2012]>
Observe que o procedimento é invocado automaticamente (como esperado), pois a tabela não está mais vazia. Mas a inserção deveria ter sido executada somente após a chamada sleep(300), não imediatamente (ou, para ser preciso, apenas em alguns segundos).
Então agora estou tentando entender:
- Se eu colocar uma chamada de procedimento (ou qualquer código de aplicativo) no arquivo init, ela será executada conforme o esperado (no meu caso de teste, a chamada de suspensão parece ter sido ignorada)?
- Eu poderia ter algum tipo de registro do que é executado (além de modificar o próprio código)?
- Se o código no arquivo init demorar, isso pode afetar a disponibilidade da instância do MySQL logo após a reinicialização?
Obrigado Dimitre