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 / 1927
Accepted
Michael McGowan
Michael McGowan
Asked: 2011-03-28 11:47:38 +0800 CST2011-03-28 11:47:38 +0800 CST 2011-03-28 11:47:38 +0800 CST

Por que o MySQL diz que estou sem memória?

  • 772

Eu estava tentando executar um bastante grande INSERT...SELECTno MySQL com JDBC e recebi a seguinte exceção:

Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

Como não estou retornando um objeto ResultSet, pensei que o espaço de heap Java não deveria ser um problema. No entanto, tentei aumentar de qualquer maneira e não adiantou. Tentei então executar a instrução no MySQL Workbench e obtive essencialmente a mesma coisa:

Error Code 5: Out of memory (Needed 1073741816 bytes)

Devo ter bastante RAM para concluir essas operações (o suficiente para caber em toda a tabela da qual estou selecionando), mas acho que há várias configurações que preciso ajustar para aproveitar toda a minha memória. Estou executando uma instância extragrande dupla de alta memória do Amazon EC2 com uma AMI do Windows Server 2008. Tentei mexer no arquivo my.ini para usar configurações melhores, mas, pelo que sei, posso ter piorado as coisas. Aqui está um dump desse arquivo:

[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_additional_mem_pool_size=26M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=13M
innodb_buffer_pool_size=23G
innodb_log_file_size=622M
innodb_thread_concurrency=18
innodb_file_per_table=TRUE
join_buffer_size=4G
max_heap_table_size = 10G

Então, isso é apenas uma questão de alterar as configurações acima para funcionar melhor no meu ambiente? Se sim, quais configurações devo usar? Eu sou o único que usa essa instância; Eu o uso para meu projeto de hobby pessoal que envolve análise estatística de grandes conjuntos de dados. Como tal, estou livre para deixá-lo consumir todos os recursos disponíveis para minhas próprias consultas.

Se não for uma questão de alterar essas configurações, qual é o problema? Obrigado por qualquer ajuda que você possa oferecer sobre como configurar melhor tudo.

mysql windows
  • 4 4 respostas
  • 46674 Views

4 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-03-29T07:46:14+08:002011-03-29T07:46:14+08:00

    Dado que esta é uma instalação do Windows, o @DTest ainda forneceu a direção inicial adequada.

    Aplique a seguinte fórmula:

    A maioria das pessoas usa isso:

    Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + (read_buffer_size + sort_buffer_size) X max_connections
    

    Eu prefiro isso:

    Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)
    

    Essas variáveis ​​são as que você precisa ajustar até que a fórmula produza 80% de RAM instalada ou menos.

    sort_buffer_size
    read_buffer_size
    read_rnd_buffer_size
    join_buffer_size
    max_connections
    
    • 9
  2. Derek Downey
    2011-03-28T12:20:16+08:002011-03-28T12:20:16+08:00

    Eu tentaria diminuir seus tamanhos de buffer. Torná-los tão grandes quanto você vai causar problemas. Quanta memória você tem disponível para executar estes valores:

    query_cache_size=1024M
    myisam_max_sort_file_size=100G
    myisam_sort_buffer_size=10G
    key_buffer_size=5000M
    bulk_insert_buffer_size = 4000M
    read_buffer_size=8000M
    read_rnd_buffer_size=8000M
    sort_buffer_size=1G
    innodb_buffer_pool_size=23G
    

    Alguns dos tamanhos de buffer são alocados por thread, por exemplo, myisam_sort_buffer_size de 10G aloca 10G para cada thread.

    Eu primeiro reduziria esses valores drasticamente e, em seguida, investigaria quais valores você realmente precisa para ter essa quantidade de RAM alocada (se houver).

    • 4
  3. RolandoMySQLDBA
    2011-03-28T13:47:07+08:002011-03-28T13:47:07+08:00

    Uma maneira rápida de determinar quanta memória o MySQL pensa que poderia alocar é a seguinte:

    wget mysqltuner.pl

    perl mysqltuner.pl

    Quando você executa este script, ele lhe dirá qual porcentagem da RAM instalada o MySQL pensa que pode alocar com segurança. Se a resposta for superior a 100%, você definitivamente precisa diminuir o tamanho do buffer. Os principais a serem focados são:

    sort_buffer_size
    read_buffer_size
    read_rnd_buffer_size
    join_buffer_size
    max_connections key_buffer_size
    (não é realmente eficaz após 4G)

    @DTest já definiu a direção para você na resposta dele, então +1 para a resposta dele. O script perl lhe dirá o que acontece se você não o definir ou se alterar qualquer valor. Aqui está um exemplo:

    Um cliente meu tem
    read_buffer_size=128K
    read_rnd_buffer_size=256K
    sort_buffer_size=2M
    join_buffer_size=128K
    max_connections=1050

    Aqui está a saída do mysqltuner.pl:

    MySQLTuner 1.2.0 - Major Hayden
    Relatórios de bugs, solicitações de recursos e downloads em http://mysqltuner.com/
    Execute com '--help' para opções adicionais e filtragem de saída
    Por favor, digite seu login administrativo do MySQL: lwdba
    Por favor, digite seu login administrativo do MySQL senha:

    -------- Estatísticas Gerais ---------------------------------------- ----------
    [--] Verificação de versão ignorada para script MySQLTuner
    [OK] Atualmente executando o MySQL suportado versão 5.0.51a-community-log
    [!!] Mudar para SO de 64 bits - o MySQL não pode usar atualmente toda a sua RAM

    -------- Estatísticas do mecanismo de armazenamento --------------------------------------- ----
    [--] Status: +Arquivo -BDB +Federado +InnoDB -ISAM -NDBCluster
    [--] Dados em tabelas MyISAM: 319M (Tabelas: 108)
    [--] Dados em tabelas InnoDB: 2M (Tabelas: 5)
    [!!] Total de tabelas fragmentadas: 22

    -------- Métricas de desempenho ---------------------------------------- ---------
    [--] Até: 52d 23h 15m 57s (72M q [15.875 qps], 241K conn, TX: 2B, RX: 1B)
    [--] Leituras / Gravações: 59% / 41%
    [--] Total de buffers: 34,0M global + 2,7M por thread (máximo de 1050 threads)
    [!!] Alocação > 2 GB de RAM em sistemas de 32 bits pode causar instabilidade do sistema
    [!!] Uso máximo de memória possível: 2,8 G (72% da RAM instalada)
    [OK] Consultas lentas: 0% (54/72M)
    [OK] Maior uso de conexões disponíveis: 6% (65/1050)
    [OK] Tamanho do buffer de chave / índices MyISAM totais: 8,0M/ 82,1M
    [OK] Taxa de acerto do buffer de chave: 100,0% (4B em cache / 1M de leituras)
    [!!] O cache de consulta está desabilitado
    [OK] Classificações que exigem tabelas temporárias: 0% (0 classificações temporárias / classificações de 948K)
    [OK] Tabelas temporárias criadas no disco: 3% (11K no disco / 380K no total)
    [!!] O cache de thread está desabilitado
    [!!] Taxa de acerto do cache da tabela: 0% (64 aberto / 32K aberto)
    [OK] Abrir arquivo limite usado: 2% (125/5K)
    [OK] Bloqueios de tabela adquiridos imediatamente: 99% (30M imediatos / 30M bloqueios)
    [OK] Tamanho de dados InnoDB / buffer pool: 2,7M/8,0M

    -------- Recomendações ----------------------------------------- ------------
    Recomendações gerais:
    Execute OPTIMIZE TABLE para desfragmentar tabelas para melhor desempenho
    Habilite o log de consulta lenta para solucionar problemas de consultas incorretas
    Defina thread_cache_size como 4 como um valor inicial
    Aumente table_cache gradualmente para evitar limites de descritor de arquivo
    Variáveis para ajustar:
    query_cache_size (>= 8M)
    thread_cache_size (começar em 4)
    table_cache (> 64)

    Observe nas métricas de desempenho

    [--] Total de buffers: 34,0 M globais + 2,7 M por thread (máximo de 1050 threads)

    que o MySQL pode alocar até 72% da RAM instalada com base nas configurações em /etc/my.cnf.

    O 34M é baseado em innodb_buffer_pool_size e key_buffer_size combinados

    Os 2,7 milhões por thread foram baseados em read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size.

    Múltiplos de 2,7 milhões são baseados em max_connections.

    Portanto, você deve ajustar esses parâmetros até que o relatório de métricas de desempenho diga que você tem menos de 100% (de preferência menos de 80%) de RAM instalada.

    • 4
  4. Rick James
    2011-06-09T16:45:18+08:002011-06-09T16:45:18+08:00

    Você não disse quanta memória RAM você tem? Eu suponho que seja pelo menos 32 GB.

    innodb_buffer_pool_size - 23G

    Bom para tanta RAM.

    query_cache_size = 1G

    Muito grande. É ineficiente quando é grande. Recomendar não mais do que 50M.

    key-buffer_size = 5G

    Pode haver um limite rígido de 4G (ainda) no Windows, tinha um limite rígido de 4G. Seu 5G pode ter se transformado em 1G. De qualquer forma, se todas as suas tabelas são InnoDB, por que desperdiçar a memória ram. Defina-o para 50M.

    Como a mensagem de erro tinha exatamente 1G, cheira a sort_buffer_size. 32M pode ser razoável.

    • 1

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 você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

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

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +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
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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