Existe uma maneira mais segura de parar o mysql (d)?

4

Estou executando um script php muito difícil em minha máquina virtual barata, que tem cerca de meio milhão de page views por semana, então é um pouco problemático. Eu reinicio meu mysql duas vezes por dia. Isso não seria problema, mas ao reiniciar o mysql

/etc/init.d/mysql restart

ele reinicia e, em seguida, às vezes diz que Table './forum/phpbb_posts' is marked as crashed and last (automatic?) repair failed

Esta tabela não tem nada a ver com aquele script rígido, no entanto, é uma tabela de 250.000 (1.8 gig) que parece falhar. Demora cerca de 14 minutos para reparar esse.

Existe uma maneira mais segura de parar o mysql? Eu sei que eu deveria fazer backups, e eu faço isso, mas apenas uma vez por dia e dados ainda estão crescendo (não rápido nos dias de hoje)

Atualmente em execução no Debian GNU / Linux 6.0

    
por genesis 07.10.2011 / 23:06

3 respostas

2

503 o site para parar a atividade (modo de manutenção .htaccess) e iniciar top para monitorar o uso do cpu do mysqld

mysqladmin -p liberar tabelas

assista a atividade do mysql (pode levar vários minutos, dependendo da sua instalação) e quando ela diminui

mysqladmin -p liberar tabelas

para apenas ter certeza e, em seguida,

mysqladmin -p shutdown

Essa sequência garante que o seu site pare de criar mais solicitações de banco de dados, diz ao mysql para liberar dados na memória e arquivos de log de transações para as tabelas do banco de dados e iniciar um desligamento apropriado do daemon de banco de dados.

    
por 08.10.2011 / 06:08
4

Desligar o mysqld pode ser uma tarefa demorada. Uma das maiores preocupações é que todos os dados sejam corretamente liberados e todas as tabelas fechadas.

Existem duas maneiras de garantir o fechamento correto dos dados. Ela cai em duas categorias básicas:

CATEGORIA # 1: Todos os dados são MyISAM

Se absolutamente todos os dados são MyISAM, você deve se certificar de que o InnoDB está totalmente desativado com isso

[mysqld]
skip-innodb

Usando esta opção na inicialização, ignore todos os protocolos InnoDB para ciclos de recuperação de falhas que são normalmente executados na inicialização. Combine isso com o fato de que os dados do MyISAM nunca são armazenados em cache. Apenas as páginas de índice são armazenadas no MyISAM Key Cache (dimensionado por key_buffer_size). Assim, você tem uma inicialização rápida e um desligamento rápido.

CATEGORIA # 2: Todos ou a maioria dos dados é InnoDB

Se a maioria ou todos os dados forem InnoDB, você deve observar a quantidade de espaço que você configurou para innodb_buffer_pool_size. Quanto maior o innodb_buffer_pool_size, mais tempo levará para eliminar páginas sujas.

Sidenote : Realizar o mysqldumps de tabelas InnoDB irá disparar automaticamente o flush de quaisquer páginas sujas remanescentes no Buffer Pool que pertençam à tabela sendo descartada.

Se você está mysqldumping todas as tabelas InnoDB ou simplesmente está encerrando o mysql, existe apenas uma para acelerar o processo de liberação de páginas sujas.

Você deve definir os innodb_max_dirty_pages_pct . Por padrão, é 90 para o MySQL 5.0 / 5.1. Para o MySQL 5.5, o padrão é 75. Surpreendente, basta configurar innodb_max_dirty_pages_pct como 0. Isso manterá o número de páginas sujas no Buffer Pool no mínimo. Isso pode aumentar levemente a E / S do disco, mas ainda dentro de níveis toleráveis.

Você deve fazer duas coisas:

Por favor, coloque-o em /etc/my.cnf

[mysqld]
innodb_max_dirty_pages_pct=0

Em segundo lugar, você não terá que reiniciar o mysql. Basta executar isso como o usuário root:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

O carregamento do servidor pode aumentar um pouco e permanecer assim até o conjunto de buffers ter menos de 1% de páginas sujas.

Experimente!

ATUALIZAÇÃO 2013-03-04 21:31 EST

Você também deve executar este comando MySQL primeiro

SET GLOBAL innodb_fast_shutdown = 0;

Isso causará um flush completo de tudo nos logs de transações do InnoDB (ib_logfile0, ib_logfile1) seguido por

service mysql stop
    
por 09.10.2011 / 00:53
0

Que tal acabar com o stop e começar o regimento? Talvez a reinicialização não esteja dando ao banco de dados tempo suficiente para chegar a uma parada quiescente antes de iniciar uma partida?

i.e.

/etc/init.d/mysql stop;
sync;
sleep 30;
/etc/init.d/mysql start
    
por 07.10.2011 / 23:16