MySQL에서 왜 메모리가 부족하다고 말합니까?


9

INSERT...SELECTJDBC를 사용하여 MySQL에서 상당히 큰 크기를 실행하려고 했지만 다음 예외가 발생했습니다.

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

실제로 ResultSet 객체를 반환하지 않기 때문에 Java 힙 공간이 문제가되지 않아야한다고 생각했습니다. 그러나 어쨌든 나는 그것을 시도했지만 좋지 않았다. 그런 다음 MySQL Workbench에서 명령문을 실행하려고 시도했지만 본질적으로 동일한 내용을 얻었습니다.

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

이 작업을 완료하려면 충분한 RAM이 있어야합니다 (선택하는 전체 테이블에 맞을 수 있음).하지만 모든 메모리를 활용하기 위해 조정해야 할 다양한 설정이 있다고 생각합니다. Windows Server 2008 AMI와 함께 Amazon EC2 고용량 이중 초대형 인스턴스 를 실행하고 있습니다. 더 나은 설정을 사용하기 위해 my.ini 파일을 다루려고 시도했지만 모든 것이 더 나빠질 수 있음을 알고 있습니다. 해당 파일의 덤프는 다음과 같습니다.

[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

내 환경에서 더 잘 작동하도록 위의 설정을 변경하는 것입니까? 그렇다면 어떤 설정을 사용해야합니까? 저는이 인스턴스를 사용하는 유일한 사람입니다. 대규모 데이터 세트의 통계 분석과 관련된 개인 취미 프로젝트에 사용합니다. 따라서 본인의 쿼리에 사용 가능한 모든 리소스를 자유롭게 사용할 수 있습니다.

이러한 설정을 변경해도 문제가되지 않으면 어떤 문제가 있습니까? 모든 것을 더 잘 구성하는 방법에 대한 도움을 주셔서 감사합니다.


1g 쿼리 캐시를 사용하는 사람은 무엇을하고 있는지 전혀 모릅니다.

@winmutt 당신은 매우 정확할 수도 있지만, 당신의 의견은 더 이상의 설명이없는 사람에게는 도움이되지 않습니다. 당신의 감정에 대한 이유를 제시하여 우리를 도와 주시겠습니까?
Michael McGowan

시작하기 편리한 도구는 tools.percona.com/wizard
KCD

답변:


9

이것이 Windows 설치이기 때문에 @DTest는 여전히 초기의 올바른 방향을 제공했습니다.

다음 공식을 적용하십시오.

대부분의 사람들이 이것을 사용합니다 :

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

나는 이것을 선호한다 :

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)

이러한 변수는 수식이 설치된 RAM의 80 % 이하가 될 때까지 조정해야하는 변수입니다.

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections

4

버퍼 크기를 줄이려고합니다. 그것들을 당신이 가진만큼 크게 만드는 것은 문제를 일으킬 것입니다. 이 값을 실행할 수있는 메모리 양은 다음과 같습니다.

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

버퍼 크기 중 일부는 스레드별로 할당됩니다. 예를 들어 10G의 myisam_sort_buffer_size는 각 스레드에 10G를 할당합니다.

먼저 이러한 값을 크게 줄인 다음이 RAM을 할당해야하는 값 (있는 경우)을 조사합니다.


4

MySQL이 할당 할 수있는 메모리 양을 결정하는 빠른 방법은 다음과 같습니다.

wget mysqltuner.pl

펄 mysqltuner.pl

이 스크립트를 실행하면 설치된 RAM MySQL의 비율이 안전하게 할당 할 수 있다고 생각하는 비율이 표시됩니다. 주어진 답변이 100 %를 초과하면 버퍼 크기를 줄여야합니다. 집중해야 할 주요 내용은 다음과 같습니다.

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections
key_buffer_size (실제로는 4G보다 효과적이지 않음)

@DTest는 이미 답변에 당신을위한 방향을 설정 했으므로 그의 대답은 +1입니다. 펄 스크립트는 설정하지 않거나 값을 변경하면 어떻게되는지 알려줍니다. 예를 들면 다음과 같습니다.

내 클라이언트는
read_buffer_size = 128K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
join_buffer_size = 128K
max_connections = 1050

다음은 mysqltuner.pl의 출력입니다.

- MySQLTuner 1.2.0 주요 헤이든
에서 버그 리포트, 기능 요청 및 다운로드 http://mysqltuner.com/를
필터링 추가 옵션 및 출력을위한 '--help'와 실행
lwdba가 : MySQL의 관리 로그인을 입력하십시오
행정 MySQL의를 입력하십시오 암호:

-------- 일반 통계 ---------------------------------------- ----------
[-] MySQLTuner 스크립트 버전 건너 뛰기 버전 확인
[확인] 현재 실행중인 지원되는 MySQL 버전 5.0.51a-community-log
[!!] 64 비트 OS로 전환-현재 MySQL을 사용할 수 없음 모든 RAM

-------- 스토리지 엔진 통계 --------------------------------------- ----
[-] 상태 : + 아카이브 -BDB + Feedated + InnoDB -ISAM -NDBCluster
[-] MyISAM 테이블의 데이터 : 319M (테이블 : 108)
[-] InnoDB 테이블의 데이터 : 2M (테이블 : 5)
[!!] 총 조각 테이블 : 22

-------- 성능 지표 ---------------------------------------- ---------
[-] 최대 : 52d 23h 15m 57s (72M q [15.875 qps], 241K conn, TX : 2B, RX : 1B)
[-] 읽기 / 쓰기 : 59 % / 41 %
[-] 총 버퍼 : 34.0M 전역 + 스레드 당 2.7M (최대 스레드 최대 1050 개)
[!!] 32 비트 시스템에서 2GB RAM을 할당하면 시스템이 불안정해질 수 있습니다.
[!!] 가능한 최대 메모리 사용량 : 2.8G (설치된 RAM의 72 %)
[OK] 느린 쿼리 : 0 % (54 / 72M)
[OK] 사용 가능한 최대 연결 사용량 : 6 % (65/1050)
[OK] 키 버퍼 크기 / 총 MyISAM 인덱스 : 8.0M / 82.1M
[OK] 키 버퍼 적중률 : 100.0 % (4B 캐시 됨 / 1M 읽기)
[!!] 쿼리 캐시가 비활성화 됨
[OK] 임시 테이블이 필요한 정렬 : 0 % (0 임시 정렬 / 948K 정렬)
[확인] 디스크에서 생성 된 임시 테이블 : 3 % (디스크에서 11K / 총 380K)
[!!] 스레드 캐시를 사용할 수 없습니다
[!!] 테이블 캐시 적중률 : 0 % (64 / 32K 열림)
[OK] 파일 열기 사용 한도 : 2 % (125 / 5K)
[OK] 즉시 획득 한 테이블 잠금 : 99 % (즉시 30M / 30M 잠금)
[OK] InnoDB 데이터 크기 / 버퍼 풀 : 2.7M / 8.0M

-------- 권장 사항 ----------------------------------------- ------------
일반 권고 사항 :
실행 OPTIMIZE TABLE 조각 모음 테이블에 대한 성능 향상을 위해이
쿼리 문제 해결 불량에 슬로우 쿼리 로그 사용
시작 값으로 4로 설정 thread_cache_size를
점차 피할 파일 설명자 제한을 증가 table_cache
변수 조정하려면 :
query_cache_size (> = 8M)
thread_cache_size (4에서 시작)
table_cache (> 64)

성능 지표 아래에 유의하십시오

[-] 총 버퍼 : 34.0M 글로벌 + 스레드 당 2.7M (최대 스레드 1050)

MySQL은 /etc/my.cnf의 설정에 따라 설치된 RAM의 최대 72 %를 할당 할 수 있습니다.

34M은 innodb_buffer_pool_size 및 key_buffer_size 결합을 기반으로합니다.

스레드 당 2.7M은 read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size를 기반으로합니다.

2.7M의 배수는 max_connections를 기반으로합니다.

따라서 성능 지표 보고서에 설치된 RAM의 100 % 미만 (바람직하게는 80 % 미만)이 표시 될 때까지 이러한 매개 변수를 tweek해야합니다.


도구를 사용할 수 있는지 잘 모르겠습니다. Windows를 사용하고 있습니다. 문서는 Windows가 지원되지 않는다고 언급했지만 어쨌든 시도했습니다. 실행하려고 시도했을 때 $ PATH에서 mysqladmin을 찾을 수 없지만 MySQL의 bin 디렉토리는 실제로 $ PATH에 있습니다.
Michael McGowan

죄송합니다. Windows datadir을 눈치 채지 못했습니다. 다른 답변을 추가하겠습니다.
RolandoMySQLDBA

1

당신은 당신이 얼마나 많은 RAM을 말하지 않았습니까? 32GB 이상이라고 가정합니다.

innodb_buffer_pool_size-23G

많은 RAM에 좋습니다.

query_cache_size = 1G

너무 큽니다. 크면 비효율적입니다. 50M 이하를 권장합니다.

키 버퍼 _ 크기 = 5G

Windows에서는 하드 한계가 4G (아직도)이고 하드 한계는 4G 일 수 있습니다. 5G가 1G로 바뀌었을 수 있습니다. 어쨌든 모든 테이블이 InnoDB라면 왜 램을 낭비합니까? 50M으로 설정하십시오.

오류 메시지는 정확히 1G이므로 다음과 같은 냄새가납니다 sort_buffer_size. 32M이 합리적 일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.