AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 29432
Accepted
Dimitre Radoulov
Dimitre Radoulov
Asked: 2012-11-29 07:07:20 +0800 CST2012-11-29 07:07:20 +0800 CST 2012-11-29 07:07:20 +0800 CST

O mysqld espera que o código do script de inicialização seja concluído antes de abrir a instância?

  • 772

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:

  1. 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)?
  2. Eu poderia ter algum tipo de registro do que é executado (além de modificar o próprio código)?
  3. 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

mysql mysql-5.5
  • 1 1 respostas
  • 2175 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-11-29T08:13:18+08:002012-11-29T08:13:18+08:00

    Tentando entender #1

    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)?

    Sim vai. No passado, eu recomendei usar init-filepara criar keycaches dedicados para tabelas MyISAM:

    • Aug 28, 2012: Índice MySQL InnoDB na troca (consulte a sugestão nº 3)
    • Mar 20, 2012: design de tabela ideal mysql com chave primária e valor varchar

    Atualmente, estou fazendo isso para clientes na empresa do meu empregador.

    Tentando entender #2

    Eu poderia ter algum tipo de registro do que é executado (além de modificar o próprio código)?

    Infelizmente não. Você teria um dos seguintes:

    1. Escreva alterações em alguma tabela MyISAM para marcar estágios
    2. Execute algo como SELECT 'DEBUG#1;'... SELECT 'DEBUG#2;'para ver se ecoa no arquivo de erro. Coloque essas consultas SELECT em lugares diferentes em seu código.

    Tentando entender #3

    Se o código no arquivo de inicialização demorar, isso pode acontecer? afetam a disponibilidade da instância do MySQL logo após a reinicialização

    Apenas pelo exemplo que você postou na pergunta, a resposta ainda seria não. No entanto, para ter certeza, você terá que deixar o mysqld lhe dizer isso. Supondo que /var/log/mysqld.logseja o seu log de erros, veja como verificar:

    • Abra uma sessão SSH (Session1) para o DB Server
    • Abra uma sessão SSH (Session2) para o DB Server
    • Na Sessão1,service mysql stop
    • Na Sessão1,tail -f /var/log/mysqld.log
    • Na Sessão2,service mysql start

    Observe a saída de Session1. Se você ver algo como

    121018 17:59:09 [Note] /usr/sbin/mysqld: ready for connections.
    

    em menos de 5 minutos (300 segundos), isso confirma que a resposta é não, a disponibilidade da instância do MySQL logo após a reinicialização não é afetada.

    Por que SLEEP () não funciona ???

    Quanto ao motivo pelo qual a SLEEPfunção parece ser ignorada, aqui está meu melhor palpite:

    No MySQL 5.0.12, o SLEEP era inserido no cache de consulta por meio de alguma otimização . Pode ser que o código interno do Stored Procedure esteja sendo otimizado e o mysqld decidiu não deixar SLEEPinterferir na formação do plano EXPLAIN e sua execução.

    O patch para ele foi aplicado no MySQL 5.0 . Esse patch poderia ter sido perdido ao passar do MySQL 5.0 para o MySQL 5.1 e além? Essa é uma possibilidade. Outra possibilidade é que SLEEPseja otimizado apesar do patch.

    Alguns usam SLEEPpara incorporar mutexing, realizar testes de estresse ou agendamento de trabalhos sofisticados

    • https://stackoverflow.com/q/4284524/491757
    • https://stackoverflow.com/q/949950/491757
    • http://forums.mysql.com/read.php?98,242758,242792#msg-242792
    • http://rpbouman.blogspot.com/2005/10/scheduling-procedure-execution-in.html

    O uso SLEEPnem sempre funciona conforme o esperado.

    ATUALIZAÇÃO 2012-11-27 15:50 EDT

    Se você realmente deseja controlar a SLEEPfunção, NÃO USE A FUNÇÃO!!!

    Crie um loop que verifica a passagem do tempo

    Em vez do seu código

    delimiter $$
    drop procedure init_test $$
    create procedure init_test(p char(1))
    begin
      do sleep(300);
      insert into init_test_tab VALUES(p);
    END
    $$
    

    incorpore o loop assim:

    delimiter $$
    drop procedure init_test $$
    create procedure init_test(p char(1))
    begin
      declare dt_now,dt_then datetime;
      declare x int;
    
      set dt_now = now();
      set dt_then = dt_now + interval 300 second;
      while dt_now < dt_then do
        set dt_now = now();
      end while;
    
      insert into init_test_tab VALUES(p);
    END
    $$
    

    Por favor, veja se essa construção funciona para você.

    • 3

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve