[mysql] InnoDB : mmap (x 바이트) 실패로 인해 Amazon EC2, mysql 중단 시작 오류 번호 12

여기에서 읽은 내용을 기반으로 EC2에 마이크로 인스턴스 서버를 설정했습니다.

mysql 서버가 자주 실패하고 세 번째로 mysql 서버가 사라졌습니다. 로그는

120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120423  9:14:27 [Note] Plugin 'FEDERATED' is disabled.
120423  9:14:27 InnoDB: The InnoDB memory heap is disabled
120423  9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120423  9:14:27 InnoDB: Compressed tables use zlib 1.2.3
120423  9:14:27 InnoDB: Using Linux native AIO
120423  9:14:27 InnoDB: Initializing buffer pool, size = 512.0M
InnoDB: mmap(549453824 bytes) failed; errno 12
120423  9:14:27 InnoDB: Completed initialization of buffer pool
120423  9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120423  9:14:27 [ERROR] Plugin 'InnoDB' init function returned error.
120423  9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120423  9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB
120423  9:14:27 [ERROR] Aborting

정말로 무엇입니까 failed; errno 12? 그리고 어떻게하면 더 많은 공간 / 메모리 또는이 문제를 해결하는 데 필요한 모든 것을 제공 할 수 있습니다.

매번 전체 시스템을 재부팅하고 모든 로그를 삭제하고 mysql 서버를 다시 시작하여이 문제를 해결합니다. 하지만 내 구성에 문제가 있다는 것을 알고 있습니다.

또한 내`my.cnf ‘는 다음과 같습니다.

[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# max_allowed_packet=500M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


innodb_buffer_pool_size         = 512M


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid



답변

RDS없이 마이크로 인스턴스에서 워드 프레스를 실행하려고 할 때 동일한 문제가 발생했습니다.

스왑 페이지를 추가하면 문제가 해결되었습니다.

아래 단계에 따라 스왑 공간을 설정할 수 있습니다.

그래도 작동하지 않으면 RDS 서비스 사용을 고려하십시오.

=============================================

기록을 위해 블로그 내용을 복사했습니다. 크레딧은 블로그 작성자 pmoubed 에게 갑니다 .

Amazon EC2 마이크로 인스턴스 스왑 공간-Linux

Amazon EC2 Linux Micro 인스턴스가 있습니다. 마이크로 인스턴스의 메모리는 613MB에 불과하기 때문에 MySQL은 때때로 충돌했습니다. MySQL, 마이크로 인스턴스 및 메모리 관리에 대한 긴 검색 결과 마이크로 인스턴스에 대한 기본 SWAP 공간이 없음을 발견했습니다. 따라서 충돌을 방지하려면 마이크로 인스턴스에 대한 스왑 공간을 설정해야 할 수 있습니다. 실제로 성능면에서 스왑을 활성화하는 것이 좋습니다.

아래 단계는 마이크로 인스턴스의 스왑 공간을 만드는 방법을 보여줍니다. 마이크로 인스턴스가 실행중인 AWS 계정이 있다고 가정합니다.

  1. 운영 dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. 운영 mkswap /swapfile
  3. 운영 swapon /swapfile
  4. 이 줄을 추가 /swapfile swap swap defaults 0 0/etc/fstab

재부팅 할 때마다 스왑 파일을 자동으로 활성화하려면 4 단계가 필요합니다.

SWAP 공간과 관련된 몇 가지 유용한 명령 :

$ swapon -s
$ free -k

$ swapoff -a
$ swapon  -a

참조 :

  1. http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
  2. http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instances/
  3. http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
  4. http://aws.amazon.com/ec2/instance-types/

답변

Amazon EC2 마이크로 인스턴스에서도이 문제가 발생했습니다. 다음을 추가하여 inno_db의 메모리 사용량을 줄이려고했습니다./etc/my.cnf

innodb_buffer_pool_size = 64M

작동하지 않았고, 16M으로 떨어 뜨리려고했지만 여전히 작동하지 않았습니다. 그런 다음 인스턴스에 기본적으로 여유 메모리가 없음을 깨달았습니다. 그래서 아파치를 다시 시작해 보았습니다.

sudo 시스템 httpd 다시 시작
sudo 시스템 mysqld 재시작

그리고 모든 것이 잘 작동했습니다. 어쩌면 또 다른 해결책은 어떻게 든 너무 많은 메모리를 먹지 않도록 아파치를 구성하는 것입니다.


답변

게시물에 표시된 my.cfg 파일의 innodb_buffer_pool_size에 대해 128M 의 메모리를 요청하는 것처럼 보이지만 MySQL은 512M 의 메모리를 요청한다고 생각합니다 .

버퍼 풀 초기화 중, 크기 = 512.0M

몇 줄 아래로 내려 가면 InnoDB 버퍼 풀에 대해 충분한 (512M) 메모리를 예약 할 수 없기 때문에 MySQL이 시작되지 않는다는 오류 메시지가 표시됩니다.

치명적 오류 : 버퍼 풀에 메모리를 할당 할 수 없습니다.

세 가지 질문이 있습니다.

  1. 인스턴스에 얼마나 많은 메모리가 있습니까? 512M InnoDB가 버퍼 풀을 위해 확보하려는 메모리와 MySQL이 할당하는 다른 모든 것, 애플리케이션 및 운영 체제를 수용 할 수있는 충분한 메모리가 있어야합니까?
  2. InnoDB가 생각하는 것보다 더 많은 것을 시도하는 이유는 무엇입니까?
  3. 어쨌든 MySQL이 다시 시작되는 이유는 무엇입니까?

1 번 답할 수 있습니다.

2.와 관련하여 MySQL 옵션 파일을 찾을 수있는 몇 가지 다른 위치가 있습니다. 이후에 발견 된 파일은 이전에 발견 된 파일에 지정된 옵션을 대체합니다. 보다

http://dev.mysql.com/doc/refman/5.5/en/option-files.html

문제 3. 시작 후 언젠가 발생하는 메모리 부족 상태 때문일 수 있습니다. 그럴 경우 로그에 추가로 표시되어야합니다.

마지막으로 약간 관련이 없지만 EBS 지원 인스턴스를 사용하고 있습니까? 일반적으로 데이터베이스 서버에 적극 권장됩니다 (실제로 특별한 상황을 제외하고 모든 인스턴스). 자세한 내용은

https://stackoverflow.com/a/3630707/141172


답변

저에게는이 문제가 EC2 인스턴스에 스왑 볼륨을 추가하여 바로 잡았습니다. 내 서비스는 단순히 상자의 모든 메모리를 소비하고 충돌했습니다. RedHat / CentOS 관리자로서 수년 동안 익숙한 것이 아닙니다. Anaconda는 무료 Ubuntu EC2 인스턴스가 수행하지 않는 많은 작업을 수행합니다.

웹 콘솔을 통해 2Gb 볼륨을 생성하고 인스턴스에 연결 한 다음 “mkswap / dev / [whatever]”를 수행하고 / etc / fstab을 편집하고 충돌이 중지되었습니다.

이러한 인스턴스는 우리 대부분이 익숙한 미디어 기반 OS 설치처럼 설치되지 않습니다. 패키지도, 적절한 파일 시스템도없고, AppArmor와 같은 것없이 벗겨져서 알지 못하는 경우 모든 종류의 문제가 발생합니다. 및 / 또는 구성 방법을 모릅니다.


답변

문제는 서버에 MySQL 프로세스에 할당 할 메모리가 충분하지 않다는 것입니다. 이 문제에 대한 몇 가지 해결책이 있습니다.

(1) 물리적 RAM을 늘립니다. 1GB의 추가 RAM을 추가하면 문제가 해결됩니다. (2) SWAP 공간을 할당합니다. Digital Ocean VPS 인스턴스는 기본적으로 스왑 공간을 사용하도록 구성되어 있지 않습니다. 512MB의 스왑 공간을 할당하여이 문제를 해결할 수있었습니다. 서버에 스왑 공간을 추가하려면 다음 단계를 따르십시오.

## As a root user, perform the following:
# dd if=/dev/zero of=/swap.dat bs=1024 count=512M
# mkswap /swap.dat
# swapon /swap.dat
## Edit the /etc/fstab, and the following entry.
/swap.dat      none    swap    sw      0       0 

MySQL 버퍼 풀 크기 줄이기

## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M

또한 디스크 공간을 확인하십시오. 충분한 공간이 있는지 확인하십시오.

df-h


답변

쉬운 답변 :

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

자세한 답변 :

이것은 특히 1GB 이하의 RAM과 같이 매우 작은 VPS를 사용하는 사람들에게 중요한 질문입니다. MySQL이 중단되면 서버 구성 (Apache | nginx) 또는 MySQL 구성에 문제가있을 수 있습니다. DOS 공격으로 인해 시스템 리소스 사용량이 급증 할 수 있습니다 (이미지 참조). 최종 결과는 MySQL 프로세스가 커널에 의해 종료되는 것입니다. 장기적인 솔루션의 경우 Apache 또는 MySQL 구성을 최적화해야합니다.

시스템 리소스 급증으로 인해 RAM 급증 (오후 6시 직전)이 발생하고 시스템 리소스 급증으로 인해 18 일 화요일 자정에 CPU 급증 만 발생 함

MySQL 매뉴얼 및 Percona 블로그뿐만 아니라 Stack Overflow에 대한 몇 가지 다른 토론이 있습니다.

MySQL 매뉴얼-MySQL이 메모리를 사용하는 방법 :

https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

Percona-최적의 MySQL 메모리 사용 구성을위한 모범 사례 :

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

MySQLTuner를 사용하여 MySQL 성능을 최적화하는 방법 :

https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/

Apache 메모리 사용량 구성 :

/server/254436/apache-memory-usage-optimization

성능 조정에 대한 Apache 매뉴얼 :

https://httpd.apache.org/docs/2.4/misc/perf-tuning.html

Apache 서버 조정 :

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/

그러나 원래 질문과 관련하여 예, MySQL 서비스가로드되고 활성화되었는지 확인하고로드되지 않고 활성화되지 않은 경우 MySQL을 다시 시작하는 임시 솔루션을 스크립팅 할 수 있습니다.

사용중인 운영 체제를 언급하지 않았습니다. 특정 명령을 내리는 데 도움이 될 것입니다. CentOS linux의 예를 들어 보겠습니다.
다음 명령 출력을보십시오 systemctl status mysql. 상단에서 서비스가 로드 되고 활성화 것을 볼 수 있습니다 .

[root@centos-mysql-demo ~]# systemctl status mysqld
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3353 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.

서비스가로드되지 않은 경우 다음과 같은 명령이 실행됩니다.

systemctl status mysqld || systemctl restart mysqld 

프로세스를 다시 시작하는 트릭을 수행합니다. 당신은 수있는 것을 cron과 :

* * * * * systemctl status mysqld || systemctl restart mysqld

그러나 mysql 이로 되었지만 서비스가 활성화 되지 않은 경우 크론은 아무 작업도 수행하지 않습니다. 따라서 다음과 같은 더 자세한 명령을 사용해야합니다.

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

이 경우 서비스가 로드 되었지만 DOS 공격이 mysql 서비스를 떠날 수있는 상태와 같이 비활성 상태이면 명령이 mysql도 다시 시작합니다. --quiet플래그를 사용하면 화면에 아무것도 출력하지 않고 상태 코드를 반환하는 명령 만 지정합니다. --quiet플래그 를 생략하면 active또는 다음 중 하나의 상태 출력이 표시됩니다.inactive .

다음과 같이 사용 가능한 RAM 리소스를 서버에 추가하기 위해 약간의 스왑 공간을 만들 수도 있습니다.

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h


답변

다음 솔루션 중 하나를 사용하십시오.

  1. 실제 RAM을 늘리십시오. 1GB의 추가 RAM을 추가하면 문제가 해결됩니다.

  2. 아래 구성 변경 사항을 사용하여 SWAP 공간을 할당하십시오.

구성

dd if=/dev/zero of=/extraswap bs=1024 count=512M
mkswap  /extraswap
swapon  /extraswap
## Edit the /etc/fstab, and the following entry.
/extraswap      none    swap    sw      0       0