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 / 33010
Accepted
Question Overflow
Question Overflow
Asked: 2013-01-17 02:09:39 +0800 CST2013-01-17 02:09:39 +0800 CST 2013-01-17 02:09:39 +0800 CST

O que deve ser feito antes de atualizar o MySQL?

  • 772

Preciso realizar uma atualização do MySQL no meu servidor web. Pode haver muitos usuários conectados ao servidor a qualquer momento, realizando consultas ou atualizações no banco de dados ou enviando arquivos para o servidor. Além de colocar uma notificação avançada de que o sistema estará em manutenção durante um determinado período de tempo, o que devo fazer para evitar o cenário de parar o serviço MySQL ou o servidor enquanto algumas operações do usuário ainda estão sendo realizadas, o que pode levar a uma corrupção do sistema de arquivos ou do banco de dados?

mysql
  • 2 2 respostas
  • 3961 Views

2 respostas

  • Voted
  1. Best Answer
    Michael - sqlbot
    2013-01-20T11:21:54+08:002013-01-20T11:21:54+08:00

    Se você interromper o processo do servidor MySQL normalmente, o sistema de arquivos e os bancos de dados não serão corrompidos.

    Aqui estão algumas coisas que eu normalmente faço:

    Verifique se innodb_fast_shutdownestá desabilitado. Se não estiver, desative-o.

    mysql> show variables like 'innodb_fast_shutdown';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | innodb_fast_shutdown | 0     |
    +----------------------+-------+
    1 row in set (0.00 sec)
    

    De acordo com a documentação , isso só é necessário ao fazer uma atualização de versão principal , mas eu mantenho que ainda é uma boa ideia - esta etapa aumenta o tempo de desligamento, mas deixa sua instância em um estado mais estável para a reinicialização.

    Em seguida, você pode bloquear todas as tabelas para impedir que os clientes façam qualquer coisa. Essa etapa também não é tecnicamente necessária, mas eu gosto dela porque me dá a sensação de saber o que está acontecendo -- e o que não está -- e quando -- e encurta a próxima parte do desligamento, já que não haverá nenhuma atividade do cliente para aguardar.

    mysql> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.00 sec)
    

    Observe que em um servidor ocupado, essa instrução não retornará tão rapidamente. Ele não retornará até que o servidor tenha fechado com sucesso todas as tabelas abertas e adquirido um bloqueio em todas as tabelas em todo o banco de dados - portanto, se você tiver consultas em execução quando emitir esta instrução, elas poderão terminar, então os bloqueios adquirido, e então é quando você receberá seu prompt de volta.

    mysql>
    

    Importante: deixe esta conexão aberta. Apenas deixe-o ficar lá e vá para uma nova janela, porque a conexão que está sendo aberta é o que mantém o bloqueio de leitura global. Se você fechar ou perder essa conexão, o bloqueio de leitura será liberado.

    Se você quiser olhar para quaisquer variáveis, a lista de processos, etc., você ainda pode usar esta conexão se quiser. Apenas não se desconecte do servidor.

    Neste ponto (desde que você recebeu seu prompt de volta), suas tabelas estão bloqueadas para novas alterações e sua camada de aplicativo pode começar a se comportar mal porque um backlog pode estar crescendo. Isso é de se esperar, já que qualquer consulta no servidor aguardará indefinidamente por esse bloqueio de leitura. O número de conexões de clientes pode estar aumentando, mas eles não poderão fazer nada.

    Em outra janela, siga seu log de erros do MySQL.

    shell> tail -f /usr/local/mysql/data/hostname.err 
    

    Em outra janela, desligue o MySQL Server:

    shell> mysqladmin shutdown
    

    Você provavelmente precisará adicionar --username --password e possivelmente outras opções a este comando. Você não verá muito desta janela, então volte e observe seu log de erros:

    O servidor diz: "vamos fazer um desligamento normal". (Não com tantas palavras, mas é isso que esta próxima entrada de log significa...)

    130119 13:29:17 [Note] /usr/local/mysql-5.5.28-solaris10-x86_64/bin/mysqld: Normal shutdown
    

    O servidor encerra todos os encadeamentos do sistema. Nesse caso, deixei o agendador de eventos e até mesmo a replicação em execução para ilustrar que um desligamento normal é realmente normal. (Sim, meu servidor foi iniciado imediatamente, incluindo a replicação, logo após eu capturar esta saída.) Na prática, pode ser melhor interromper a replicação manualmente STOP SLAVE;antes de liberar as tabelas e adquirir o bloqueio de leitura. O Agendador de eventos é um recurso opcional, que você pode ou não usar. Aqui está a saída de exemplo:

    130119 13:29:17 [Note] Event Scheduler: Killing the scheduler thread, thread id 1
    130119 13:29:17 [Note] Event Scheduler: Waiting for the scheduler thread to reply
    130119 13:29:17 [Note] Slave I/O thread killed while reading event
    130119 13:29:17 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.001539', position 849647640
    130119 13:29:17 [Note] Event Scheduler: Stopped
    130119 13:29:17 [Note] Event Scheduler: Purging the queue. 3 events
    130119 13:29:17 [Note] Slave SQL thread exiting, replication stopped in log 'mysql-bin.001539' at position 849626716
    

    O InnoDB faz sua limpeza (incluindo o "desligamento lento")...

    130119 13:29:19  InnoDB: Starting shutdown...
    130119 13:29:20  InnoDB: Waiting for 6 pages to be flushed
    130119 13:29:26  InnoDB: Shutdown completed; log sequence number 2718873505306
    

    O servidor desliga...

    130119 13:29:26 [Note] /usr/local/mysql-5.5.28-solaris10-x86_64/bin/mysqld: Shutdown complete
    

    O wrapper mysqld_safe avisa que o servidor parou de funcionar. Este processo é responsável por tentar reiniciar o servidor se ele travar, mas se o servidor tiver removido seu próprio arquivo pid, nenhuma tentativa de reinicialização é feita, porque o desligamento é considerado normal.

    130119 13:29:27 mysqld_safe mysqld from pid file /usr/local/mysql-5.5.28-solaris10-x86_64/data/psi2.pid ended
    

    Agora você está graciosamente desligado.

    • 9
  2. Julius
    2015-03-26T01:19:27+08:002015-03-26T01:19:27+08:00

    Isso tudo é bonito, mas um pouco paranóico. Dependendo do tipo de servidor que você está executando, você pode usar o ionice para garantir que a máquina não esteja fazendo nada pesado, o resto é feito pelo próprio mysql. Digamos que alguns dos scripts do meu servidor mysql sofram de vazamento de memória, descobrirei a hora do dia em que o servidor está com o uso mais baixo e, em seguida, reinicio graciosamente o mysqld quando a CPU estiver ociosa, então uso o crontab e faço o seguinte:

    # clear and clean start MySQL and httpd daily
    38 5 * * * root ionice -c3 /etc/init.d/mysqld restart > /dev/null 2>&1
    39 5 * * * root /usr/sbin/apachectl graceful > /dev/null 2>&1
    
    • 0

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 fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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

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