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?

dat789
fonte
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.

RolandoMySQLDBA
fonte
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