Iniciar / Parar MySQL


8

Estou procurando ajuda para entender o que acontece quando a seguinte linha de comando é executada:

root@prodn$ service mysqld stop

Sim, ele desliga o servidor MySQL, portanto, o acesso a ele não fica mais disponível até que o serviço seja iniciado novamente. No entanto, mais especificamente, existe algo mais que acontece quando o serviço é interrompido? Perdoe meu novato aqui, mas quando o mysqld é reiniciado, isso significa que os logs foram liberados, alguma memória liberada, caches esvaziados etc.?

O motivo pelo qual pergunto é o seguinte:

Nosso banco de dados DB é um banco de dados MySQL e, nos últimos 4 meses, levou em média 8,5 horas.

Na quarta-feira passada, parei o serviço mysql e o reiniciei após 30 minutos. Desde então, começo a notar uma grande melhoria no desempenho geral - os processos SELECT / INSERT / UPDATE / DELETE eram mais eficientes. O DW terminou quase 4 horas antes com o mesmo número de linhas de dados

No entanto, a cada dia que passa, de 15 a 20 minutos são adicionados à hora de término. Portanto, suspeito que talvez seja necessário reiniciar o serviço semanalmente.

Existe uma explicação para esse comportamento? Não sei que outras questões são relevantes, mas seria brilhante saber o que acontece quando o mysqldserviço é reiniciado.

Alguém pode esclarecer isso, por favor?


11
tente perguntar em serverfault ou dba.
Gbjbaanb


11
Parece que você tem muitos dados na memória confirmados. dev.mysql.com/doc/refman/5.0/en/server-shutdown.html
ethrbunny

@ dat789, o lugar certo para procurar as respostas já é dado por ethrbunny. esse é o primeiro lugar que você deve procurar.
Mrigesh Raj Shrestha

Respostas:


2

Quando você emite service mysql stop, muito mais acontece do que apenas interromper o DB Connectivity. O link no comentário de @ethrbunny já explica o que acontece.

Eu gostaria de focar em um aspecto específico: o InnoDB Buffer Pool. O InnoDB precisa liberar as páginas sujas do buffer pool do InnoDB. Se você quiser saber quanto, execute isso antes do desligamento:

SELECT CONCAT(dpbytes/power(1024,expo),' ',SUBSTR(units,expo*2+1,2)) DirtyPages FROM
(SELECT dpbytes,FLOOR(LOG(dpbytes)/LOG(1024)) expo FROM
(SELECT dirty_pages*page_size dpbytes FROM
(SELECT VARIABLE_VALUE dirty_pages FROM information_schema.global_status
WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty') AAA,
(SELECT VARIABLE_VALUE page_size FROM information_schema.global_status
WHERE VARIABLE_NAME='Innodb_page_size') BBB) AA) A,(SELECT ' BKBMBGBTB' units) B;

Isso informará a quantidade de dados que precisa ser liberada do InnoDB Buffer Pool.

Lembre-se de que o InnoDB possui muitas partes móveis no espaço de tabela do sistema (o arquivo ibdata1). Clique aqui para ver a representação pictórica de toda a infraestrutura do InnoDB .

Algumas informações transacionais são gravadas de maneira que o Crash Recovery seja executado quando você executa service mysql start.

OPCIONAL

É possível obter todos os dados liberados e todas as transações confirmadas corretamente do ibdata1 e dos Logs de transações ( ib_logfile0, ib_logfile1) executando este

SET GLOBAL innodb_fast_shutdown = 0;

antes de correr

service mysql stop

De uma chance !!!

UPDATE 2013-04-24 07:17 EDT

Como você tem o MyISAM como o principal mecanismo de armazenamento, a única coisa que acontece é a liberação das alterações de índice em todos os .MYIarquivos com alterações pendentes.

Eu também gostaria de recomendar que, no próximo encerramento do mysqld, execute isso de antemão em outra sessão:

tail -f /var/log/mysqld.log

e observe as mensagens que passam e veja o que diz o que o mysqld está fazendo com qualquer mecanismo de armazenamento. Se você não tem absolutamente nenhuma tabela do InnoDB em uso, pense em desativar o InnoDB com

[mysqld]
skip-innodb

pois isso permitirá uma inicialização mais rápida e, possivelmente, um desligamento mais rápido.


Obrigado por isso. Eu deveria ter sido mais específico sobre outro aspecto que não mencionei - estamos usando o mecanismo MyISAM na maioria de nossas tabelas. Isso faz alguma diferença em comparação com o InnoDB? Existe uma maneira de fazer o mesmo sem reiniciar o mysqld? Caso contrário, isso significaria que eu teria que incomodar nossos administradores de sistemas de tempos em tempos. Além disso, o motivo é bastante simples - após cada dia que passou desde a última reinicialização, as operações SELECT / UPDATE / INSERT parecem ter atrasado de 25 a 40 minutos. Uma reinicialização retorna ao seu tempo 'otimizado'. Não sei explicar o porquê.
precisa saber é o seguinte

Eu acredito fortemente que o InnoDB já estava desativado. Veja extrato: 130422 15:35:31 mysqld_safe Iniciando o daemon mysqld com bancos de dados em / srv / mysqldb / mysql 130422 15:35:33 [Nota] O plug-in 'FEDERATED' está desabilitado. 130422 15:35:33 [Nota] O plug-in 'InnoDB' está desativado. 130422 15:35:33 [Nota] Agendador de Eventos: Carregado 0 eventos 130422 15:35:33 [Nota] / usr / libexec / mysqld: pronto para conexões. Versão: soquete '5.5.17': porta '/srv/mysqldb/mysql/mysql.sock': 3306 MySQL Community Server (GPL) Como podemos então liberar as alterações de índice em todo o .MYI sem reiniciar? Possível?
dat789
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.