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 / 11806
Accepted
Buttle Butkus
Buttle Butkus
Asked: 2012-01-28 04:50:19 +0800 CST2012-01-28 04:50:19 +0800 CST 2012-01-28 04:50:19 +0800 CST

Por que o DROP DATABASE está demorando tanto? (MySQL)

  • 772

Nova instalação do CentOS.

Eu estava executando uma importação de um banco de dados grande (arquivo sql de 2 GB) e tive um problema. O cliente SSH parecia perder a conexão e a importação parecia congelar. Eu usei outra janela para fazer login no mysql e a importação parecia estar morta, presa em uma tabela de linhas de 3M específica.

Então eu tentei

DROP DATABASE huge_db;

15-20 minutos depois, nada. Em outra janela, fiz:

/etc/init.d/mysqld restart

A janela DROP DB apresentou a mensagem: SERVER SHUTDOWN. Então eu realmente reiniciei o servidor físico.

Logado novamente no mysql, verificado e o db ainda estava lá, executei

DROP DATABASE huge_db;

novamente, e novamente estou esperando já cerca de 5 minutos.

Mais uma vez, é uma nova instalação. O huge_dbé o único db (diferente do dbs do sistema). Eu juro que deixei cair db's tão grandes antes e rapidamente, mas talvez eu esteja errado.

Eu derrubei com sucesso o banco de dados. Demorou algo como 30 minutos. Observe também que acho que me enganei quando pensei que a importação do mysqldump estava morta. A conexão do terminal foi perdida, mas acho que o processo ainda estava em execução. Eu provavelmente matei a tabela intermediária de importação (a tabela de linhas de 3M) e provavelmente 3/4 do caminho através de todo o banco de dados. Era enganoso que "top" mostrasse o mysql usando apenas 3% da memória, quando parecia que deveria estar usando mais.

Soltar o banco de dados acabou levando 30 minutos, então, novamente, talvez eu não tivesse que reiniciar o servidor e possivelmente poderia ter esperado o DROP terminar, mas não sei como o mysql reagiria ao obter uma consulta DROP para o mesmo db que está importando via mysqldump.

Ainda assim, a pergunta permanece, por que leva mais de 30 minutos para DROP um banco de dados de 2 GB quando tudo o que deveria fazer é excluir todos os arquivos db e remover todas as referências ao banco de dados de information_schema? Qual é o problema?

mysql mysqldump
  • 5 5 respostas
  • 94751 Views

5 respostas

  • Voted
  1. Best Answer
    Stefan Magnuson
    2013-03-27T21:32:50+08:002013-03-27T21:32:50+08:00

    Em vez de matar o processo, seria mais seguro se você fizesse isso no MySQL:

    $ mysqladmin processlist -u root -p
    Enter password: 
    +-----+------+-----------+-------------------+---------+------+-------+------------------+
    | Id  | User | Host      | db                | Command | Time | State | Info             |
    +-----+------+-----------+-------------------+---------+------+-------+------------------+
    | 174 | root | localhost | example           | Sleep   | 297  |       |                  |
    | 407 | root | localhost |                   | Query   | 0    |       | show processlist |
    +-----+------+-----------+-------------------+---------+------+-------+------------------+
    

    A consulta com id 174 é a que bloqueia a exclusão do banco de dados 'exemplo', portanto, antes de matar qualquer processo, deixe o MySQL tentar encerrar a consulta:

    $ mysqladmin kill 174
    

    Execute o processlistcomando acima novamente para confirmar que ele foi morto.

    Se isso não funcionar, talvez você possa tentar matar o processo errante, mas antes disso você pode tentar reiniciar o servidor MySQL.

    Você também pode executar comandos como 'SHOW FULL PROCESSLIST' e 'KILL 174' no shell do MySQL, por exemplo, se você tiver apenas o cliente MySQL instalado. O ponto principal é evitar matar o processo usando 'kill' no shell, a menos que seja absolutamente necessário.

    De um modo geral, você pode usar mysqlou mysqladmin. Você não deve precisar executar comandos como este com frequência; uma vez que você começa a matar consultas regularmente, algo está definitivamente errado e seria melhor corrigir esse problema (matar o processo de consulta é apenas tratar o sintoma).

    • 89
  2. Buttle Butkus
    2012-02-04T02:16:40+08:002012-02-04T02:16:40+08:00

    Embora eu achasse que o processo de importação havia morrido, ele provavelmente ainda estava em execução.

    O DROP DATABASEcomando provavelmente esperou que o banco de dados terminasse de importar antes de ser executado.

    Então, em vez de DROP DATABASElevar muito tempo, provavelmente foi apenas a importação.

    1.)

    Se alguém ler isso e estiver tentando cancelar uma importação de banco de dados e descartar o banco de dados, recomendo que você primeiro encontre o PID (id do processo) para a importação e execute-o em um terminal diferente:

    $ kill [PID]
    

    ...onde [PID] seria o PID real para o processo.

    Você deve ver a importação parar imediatamente se o outro terminal ainda estiver conectado.

    2.)

    Você também pode executar SHOW PROCESSLISTna guia SQL do phpMyAdmin. A tabela resultante mostra os processos em execução e clicar no 'x' ao lado da linha que você deseja eliminar deve resolver o problema. Isso teria o mesmo efeito que a resposta aceita ou mataria o mysqlprocesso na mysqllinha de comando.

    Então corra

    DROP DATABASE `database_name`;
    

    E tudo deve estar limpo.


    Outra resposta sugeriu que matar o processo dentro do mysql é melhor do que fazê-lo de fora. Eu não testei essa resposta, mas parece muito plausível. Então eu marquei como a "resposta aceita" em vez desta.

    • 11
  3. Mannoj
    2012-07-13T01:04:20+08:002012-07-13T01:04:20+08:00

    Eu enfrentei o mesmo problema. Mas desta vez eu verifiquei show processlist; ele disse verificar as permissões por mais tempo. Então descobri que mysqld_safe estava sendo executado como root, enquanto as permissões no nível da pasta eram apenas para o usuário mysql. Por isso, matei a consulta, é claro que demorou muito tempo dizendo que estava no estado morto, mas esperei que ele reagisse, então ele matou a consulta e alterou as permissões de nível de pasta para root também adicionando-o ao grupo e chmod para 770. Então eu executei o mesmo banco de dados drop blah; funcionou para mim em 2 segundos para o banco de dados de 20 GB.

    • 4
  4. Tim Brigham
    2012-01-28T05:04:34+08:002012-01-28T05:04:34+08:00

    Tente truncar as maiores tabelas em seu banco de dados antes de eliminá-lo. Eu vi um comportamento muito semelhante ao trabalhar com arquivos MySQL de tráfego de firewall e isso ajudou imensamente.

    • 3
  5. RolandoMySQLDBA
    2012-02-04T10:51:49+08:002012-02-04T10:51:49+08:00

    A primeira coisa que vem à mente é o statusChecking Permissions...

    Quando você emite DROP DATABASE mydb;tudo dentro de /var/lib/mysql/mydb é verificado para ver se as permissões do sistema operacional existem para o direito de descartar todos os arquivos.

    Alguns acharam que reduzir o número de usuários mysql pode ajudar

    • 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