Amazon EC2, bắt đầu hủy bỏ mysql vì InnoDB: mmap (x byte) không thành công; errno 12


95

Tôi đã thiết lập một máy chủ phiên bản vi mô trên EC2 dựa trên những gì tôi đọc ở đây

Máy chủ mysql thường xuyên bị lỗi và lần thứ ba máy chủ mysql đã biến mất. Nhật ký chỉ hiển thị

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

Thực sự là failed; errno 12gì? Và làm cách nào tôi có thể cung cấp thêm dung lượng / bộ nhớ hoặc bất cứ thứ gì cần thiết để sửa lỗi này.

Tôi sửa lỗi này mỗi lần bằng cách khởi động lại toàn bộ hệ thống và xóa tất cả nhật ký và khởi động lại máy chủ mysql. Nhưng tôi biết có điều gì đó không ổn với cấu hình của mình.

Ngoài ra, `my.cnf 'của tôi giống như dưới đây:

[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

Tôi gặp vấn đề tương tự trên phiên bản vi EC2 của mình. Đã thử đặt innodb_buffer_pool_size = 128M và sẽ xem nó diễn ra như thế nào.
swxxii

Bạn có thể cần thêm không gian hoán đổi nếu bạn đang sử dụng một trường hợp vi: prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed

1
Trên các Phiên bản vi mô của EC2, KHÔNG có không gian hoán đổi theo mặc định và nó cần được thiết lập theo cách thủ công. Nếu không, bạn có thể thấy rất nhiều sự cố MySQL do thiếu bộ nhớ.
pmoubed

Câu trả lời:


163

Tôi đã gặp vấn đề tương tự khi cố gắng chạy một wordpress trên phiên bản vi mô của mình mà không có RDS.

Thêm một trang Hoán đổi đã giải quyết được vấn đề cho tôi.

Bạn có thể làm theo các bước dưới đây để thiết lập không gian hoán đổi.

Nếu nó vẫn không hoạt động với bạn, hãy xem xét sử dụng dịch vụ RDS.

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

Tôi đã sao chép nội dung của blog để ghi lại. Tín dụng được chuyển đến tác giả blog pmoubed :

Amazon EC2 Micro Instance Swap Space - Linux

Tôi có phiên bản Amazon EC2 Linux Micro. Vì các phiên bản Micro chỉ có 613MB bộ nhớ, nên thỉnh thoảng MySQL bị lỗi. Sau một thời gian dài tìm kiếm về MySQL, Micro Instance và Memory Managment, tôi phát hiện ra rằng không có không gian SWAP mặc định cho phiên bản Micro. Vì vậy, nếu bạn muốn tránh sự cố, bạn có thể cần thiết lập không gian hoán đổi cho phiên bản vi mô của mình. Trên thực tế, hiệu suất khôn ngoan là tốt hơn để kích hoạt hoán đổi.

Các bước dưới đây cho biết cách tạo không gian hoán đổi cho phiên bản Micro của bạn. Tôi giả sử bạn có Tài khoản AWS với phiên bản Micro đang chạy.

  1. Chạy dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. Chạy mkswap /swapfile
  3. Chạy swapon /swapfile
  4. Thêm dòng này /swapfile swap swap defaults 0 0vào/etc/fstab

Bước 4 là cần thiết nếu bạn muốn tự động bật tệp hoán đổi sau mỗi lần khởi động lại.

Một số lệnh hữu ích liên quan đến không gian SWAP:

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

Người giới thiệu:

  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/

Cảm ơn! Điều này đã giúp tôi!
Hoàn tác

8
FYI, điều này phù hợp với tôi trên giọt Digital Ocean (512 MB). Điều này không gây ngạc nhiên cho bất kỳ ai, nhưng trong trường hợp bất kỳ ai không chắc chắn, nó có thể sẽ hoạt động trên bất kỳ máy chủ nào có cùng vấn đề.
jfacemyer

Cảm ơn bạn đã cứu cuộc sống này! Cũng đang chạy một phiên bản vi mô với Ubuntu Server.
ECC-Dan

4
Đối với người dùng Digital Ocean, tôi đã làm theo hướng dẫn này và nó hoạt động như một sự quyến rũ: digitalocean.com/community/articles/…
Chris Ray

Cảm ơn rất nhiều. Đã kéo tóc tôi ra trong 24 giờ qua, chơi với tất cả các loại kích thước bộ đệm / bộ nhớ cache / truy vấn .. Bạn là một người tiết kiệm cuộc sống!
pranshus

23

Tôi cũng gặp sự cố này trên một phiên bản vi mô của Amazon EC2. Tôi đã thử giảm mức sử dụng bộ nhớ của inno_db bằng cách thêm phần sau vào/etc/my.cnf

innodb_buffer_pool_size = 64 triệu

Điều đó không hiệu quả, tôi đã thử giảm nó xuống 16M và nó vẫn không hoạt động. Sau đó, tôi nhận ra rằng phiên bản về cơ bản không có bộ nhớ trống. Vì vậy, tôi đã thử khởi động lại apache

khởi động lại hệ thống sudo httpd
khởi động lại hệ thống sudo mysqld

Và mọi thứ đều hoạt động tốt. Có thể một giải pháp khác là cấu hình apache để không chiếm quá nhiều bộ nhớ bằng cách nào đó.


2
MySQL có thể vẫn gặp sự cố vì vậy bạn có thể cần thêm không gian hoán đổi vào phiên bản vi mô của mình.
pmoubed

Cảm ơn, điều đó có ý nghĩa. Tôi nghĩ rằng tôi cũng có thể cố gắng giới hạn số luồng mà apache có thể sinh ra.
wfbarksdale

Hoạt động tuyệt vời. Tôi cũng gặp sự cố này và bằng cách khởi động lại httpd đã giải quyết được sự cố.
Lionel Chan

1
Đánh bắt tuyệt vời, cùng một chiếc thuyền ở đây. Tôi đặt apache của mình để sử dụng ít ram hơn và cũng tạo một tệp hoán đổi 512m, nhưng đặt vm.swappiness thành 10 để nó chỉ được sử dụng trong thời gian ngắn.
newz2000

Khởi động lại nginx và php-fpm cũng giải phóng đủ bộ nhớ để cho phép mysql khởi động! Cảm ơn!
msEmmaMays

4

Có vẻ như bạn đang yêu cầu 128M bộ nhớ cho innodb_buffer_pool_size trong tệp my.cfg mà bạn hiển thị trong bài đăng, nhưng MySQL cho rằng bạn đang yêu cầu 512M bộ nhớ:

Khởi tạo vùng đệm, kích thước = 512.0M

Xuống một vài dòng, thông báo lỗi cho bạn biết MySQL sẽ không khởi động vì nó không thể dành đủ bộ nhớ (512M) cho vùng đệm InnoDB:

Lỗi nghiêm trọng: không thể cấp phát bộ nhớ cho vùng đệm

Điều đó đặt ra ba câu hỏi:

  1. Có bao nhiêu bộ nhớ trên phiên bản của bạn? Liệu có đủ bộ nhớ để chứa 512M InnoDB đang cố gắng lấy cho vùng đệm, cộng với mọi thứ khác mà MySQL phân bổ, cộng với (các) ứng dụng của bạn, cùng với hệ điều hành?
  2. Tại sao InnoDB cố gắng lấy nhiều hơn bạn nghĩ?
  3. Tại sao MySQL vẫn khởi động lại?

Bạn có thể trả lời 1.

Như phần 2., có một số nơi khác nhau mà các tệp tùy chọn MySQL có thể được đặt. Các tệp được tìm thấy sau đó ghi đè các tùy chọn được chỉ định trong các tệp đã tìm thấy trước đó. Xem

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

Sự cố 3. có thể là do tình trạng hết bộ nhớ xảy ra sau khi khởi động. Bạn sẽ thấy một dấu hiệu về điều đó trong nhật ký nếu đúng như vậy.

Cuối cùng, nhưng hơi không liên quan, bạn có đang sử dụng các phiên bản được EBS hỗ trợ không? Điều đó thường rất được khuyến khích cho các máy chủ cơ sở dữ liệu (trên thực tế, đối với bất kỳ trường hợp nào trừ các trường hợp đặc biệt). Để biết thêm về điều đó, hãy xem

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


2

Đối với tôi, chính xác vấn đề này đã được khắc phục bằng cách thêm khối lượng hoán đổi vào phiên bản EC2 của tôi. Các dịch vụ của tôi chỉ đơn giản là sử dụng tất cả bộ nhớ trên hộp và sẽ bị sập. Không phải là điều tôi đã quen, là quản trị viên RedHat / CentOS trong nhiều năm - Anaconda thực hiện rất nhiều công việc mà phiên bản Ubuntu EC2 miễn phí không làm được.

Tôi chỉ cần tạo một khối lượng 2Gb thông qua bảng điều khiển web, đính kèm nó vào phiên bản của tôi và thực hiện "mkswap / dev / [anything]", chỉnh sửa / etc / fstab và sự cố đã dừng lại.

Những trường hợp này KHÔNG cài đặt giống như cài đặt hệ điều hành dựa trên phương tiện mà hầu hết chúng ta đã quen - nó bị loại bỏ hoàn toàn không có gói, không có hệ thống tệp thích hợp và những thứ như AppArmor, gây ra mọi loại vấn đề nếu bạn không biết về nó và / hoặc không biết cách cấu hình nó.


1

Vấn đề là máy chủ không có đủ bộ nhớ để cấp phát cho quá trình MySQL. Có một số giải pháp cho vấn đề này.

(1) Tăng RAM vật lý. Thêm 1GB RAM bổ sung sẽ giải quyết được vấn đề. (2) Phân bổ không gian SWAP. Phiên bản Digital Ocean VPS không được định cấu hình để sử dụng không gian hoán đổi theo mặc định. Bằng cách phân bổ 512MB dung lượng hoán đổi, chúng tôi có thể giải quyết vấn đề này. Để thêm không gian hoán đổi vào máy chủ của bạn, hãy làm theo các bước sau:

## 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 

Giảm kích thước vùng đệm MySQL

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

Ngoài ra, hãy kiểm tra Dung lượng đĩa của bạn. Đảm bảo rằng bạn có đủ không gian.

df-h


1

TRẢ LỜI DỄ DÀNG:

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

TRẢ LỜI CHI TIẾT:

Đây là một câu hỏi quan trọng đặc biệt đối với những người đang sử dụng một VPS rất nhỏ, chẳng hạn như 1GB RAM trở xuống. Nếu MySQL ngừng hoạt động, có thể là do sự cố với cấu hình máy chủ (Apache | nginx) hoặc cấu hình MySQL của bạn. Các cuộc tấn công DOS có thể gây ra sự gia tăng đột biến trong việc sử dụng tài nguyên hệ thống (xem hình ảnh). Kết quả cuối cùng là quá trình MySQL bị Kernel tắt. Đối với một giải pháp lâu dài, hãy xem xét việc tối ưu hóa cấu hình Apache hoặc MySQL của bạn.

Tài nguyên hệ thống tăng đột biến khiến RAM tăng đột biến (ngay trước 6 giờ tối) và tài nguyên hệ thống tăng đột biến chỉ khiến CPU tăng đột biến Nửa đêm ngày 18

Có một số cuộc thảo luận khác về Stack Overflow các chủ đề đó cũng như hướng dẫn sử dụng MySQL và Percona Blog:

Hướng dẫn sử dụng MySQL - Cách MySQL sử dụng bộ nhớ:

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

Percona - Các phương pháp hay nhất để định cấu hình sử dụng bộ nhớ MySQL tối ưu:

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

Cách tối ưu hóa hiệu suất MySQL bằng MySQLTuner:

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

Cấu hình sử dụng bộ nhớ Apache:

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

Hướng dẫn Apache về Điều chỉnh Hiệu suất:

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

Điều chỉnh máy chủ Apache:

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

Tuy nhiên, đối với câu hỏi ban đầu của bạn, có, bạn có thể viết một giải pháp tạm thời để kiểm tra xem dịch vụ MySQL có được tải và hoạt động hay không và sẽ khởi động lại MySQL nếu nó không được tải và hoạt động.

Bạn không đề cập đến hệ điều hành bạn đang sử dụng. Điều đó sẽ giúp cung cấp cho bạn một lệnh cụ thể. Tôi sẽ cung cấp cho bạn một ví dụ cho CentOS linux.
Nhìn vào kết quả sau của lệnh systemctl status mysql. Bạn có thể thấy ở trên cùng rằng dịch vụ đã được tảiđang hoạt động .

[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.

Nếu dịch vụ không được tải, thì một lệnh như:

systemctl status mysqld || systemctl restart mysqld 

sẽ thực hiện thủ thuật bắt đầu lại quy trình. Bạn có thể nói rằng:

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

Tuy nhiên, trong trường hợp mysql được tải nhưng dịch vụ không hoạt động , cron của bạn sẽ không làm gì cả. Vì vậy, bạn nên sử dụng một lệnh chi tiết hơn như:

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

Trong trường hợp này, nếu dịch vụ được tải nhưng không hoạt động, chẳng hạn như trạng thái mà một cuộc tấn công DOS có thể rời khỏi dịch vụ mysql của bạn, lệnh cũng sẽ khởi động lại mysql. Sử dụng --quietcờ chỉ xác định lệnh chỉ để trả về mã trạng thái, không xuất bất kỳ thứ gì ra màn hình. Nếu bạn bỏ qua --quietcờ, bạn sẽ thấy đầu ra trạng thái của một trong hai activehoặc inactive.

Bạn cũng có thể tạo một số không gian hoán đổi để thêm nhiều tài nguyên RAM khả dụng hơn vào máy chủ của mình, chẳng hạn như:

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

0

Sử dụng bất kỳ giải pháp nào sau đây:

  1. Tăng RAM vật lý. Thêm 1GB RAM bổ sung sẽ giải quyết được vấn đề.

  2. Phân bổ không gian SWAP bằng cách sử dụng các thay đổi cấu hình bên dưới:

cấu hình

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.