Tôi đang lưu trữ một trang web WordPress trên một giọt DigitalOcean (RAM 1GB). Cơ sở dữ liệu MySQL của trang web thỉnh thoảng gặp sự cố, khiến trang web hiển thị "Lỗi thiết lập kết nối cơ sở dữ liệu". Mức sử dụng bộ nhớ giảm vào khoảng 2:40 sáng, cho biết đây là lúc cơ sở dữ liệu gặp sự cố. Tôi đã kiểm tra tệp nhật ký MySQL cho ngày hôm đó và mục nhập sớm nhất là lúc 10:47 sáng. Đây là phần đầu của tệp nhật ký:
2021-12-06T10:47:14.800977Z 0 [Cảnh báo] DẤU THỜI GIAN với giá trị MẶC ĐỊNH ẩn không được dùng nữa. Vui lòng sử dụng --explicit_defaults_for_timest$
2021-12-06T10:47:14.806192Z 0 [Lưu ý] /usr/sbin/mysqld (mysqld 5.7.36-0ubuntu0.18.04.1) bắt đầu từ quy trình 2810 ...
2021-12-06T10:47:14.819674Z 0 [Lưu ý] InnoDB: hỗ trợ PUNCH HOLE khả dụng
2021-12-06T10:47:14.819711Z 0 [Lưu ý] InnoDB: Mutexes và rw_locks sử dụng nội trang nguyên tử GCC
2021-12-06T10:47:14.819716Z 0 [Lưu ý] InnoDB: Sử dụng các mutex sự kiện
2021-12-06T10:47:14.819720Z 0 [Lưu ý] InnoDB: GCC dựng sẵn __atomic_thread_fence() được sử dụng cho hàng rào bộ nhớ
2021-12-06T10:47:14.819723Z 0 [Lưu ý] InnoDB: Bảng nén sử dụng zlib 1.2.11
2021-12-06T10:47:14.819727Z 0 [Lưu ý] InnoDB: Sử dụng AIO gốc của Linux
2021-12-06T10:47:14.820551Z 0 [Lưu ý] InnoDB: Số nhóm: 1
2021-12-06T10:47:14.823342Z 0 [Lưu ý] InnoDB: Sử dụng hướng dẫn CPU crc32
2021-12-06T10:47:14.825847Z 0 [Lưu ý] InnoDB: Đang khởi tạo nhóm bộ đệm, tổng kích thước = 128M, phiên bản = 1, kích thước khối = 128M
2021-12-06T10:47:14.826246Z 0 [ERROR] InnoDB: mmap(137428992 byte) không thành công; lỗi 12
2021-12-06T10:47:14.826258Z 0 [ERROR] InnoDB: Không thể phân bổ bộ nhớ cho vùng đệm
2021-12-06T10:47:14.826262Z 0 [ERROR] InnoDB: Quá trình khởi tạo plugin bị hủy bỏ do lỗi Lỗi chung
2021-12-06T10:47:14.826270Z 0 [ERROR] Chức năng khởi tạo plugin 'InnoDB' trả về lỗi.
2021-12-06T10:47:14.826274Z 0 [ERROR] Đăng ký plugin 'InnoDB' làm CÔNG CỤ LƯU TRỮ không thành công.
2021-12-06T10:47:14.826278Z 0 [ERROR] Không thể khởi chạy plugin dựng sẵn.
2021-12-06T10:47:14.826282Z 0 [ERROR] Đang hủy bỏ
2021-12-06T10:47:14.832237Z 0 [Chú ý] Kết thúc Binlog
2021-12-06T10:47:14.832297Z 0 [Lưu ý] Tắt plugin 'CSV'
2021-12-06T10:47:14.832572Z 0 [Lưu ý] /usr/sbin/mysqld: Tắt máy hoàn tất
Dựa trên tệp nhật ký, có vẻ như MySQL sắp hết bộ nhớ. Tuy nhiên, mức sử dụng bộ nhớ cho giọt ổn định khoảng 73%, cho đến khi cơ sở dữ liệu gặp sự cố vào khoảng 2:40 sáng, khi đó nó giảm xuống còn 32%. Nó dường như có rất nhiều bộ nhớ, vậy tại sao nó bị sập?
CHỈNH SỬA Theo yêu cầu, đây là nội dung của các tệp cấu hình MySQL của tôi:
/etc/mysql/conf.d/mysql.cnf
[mysql]
/etc/mysql/conf.d/mysqldump.cnf
[mysqldump]
nhanh
trích dẫn tên
max_allowed_packet = 16M
/etc/mysql/mysql.conf.d/mysqld.cnf
#
# Tệp cấu hình máy chủ cơ sở dữ liệu MySQL.
#
# Bạn có thể sao chép cái này vào một trong:
# - "/etc/mysql/my.cnf" để đặt các tùy chọn chung,
# - "~/.my.cnf" để đặt các tùy chọn dành riêng cho người dùng.
#
# Người ta có thể sử dụng tất cả các tùy chọn dài mà chương trình hỗ trợ.
# Chạy chương trình với --help để nhận danh sách các tùy chọn có sẵn và với
# --print-defaults để xem nó thực sự hiểu và sử dụng cái nào.
#
# Để biết giải thích, hãy xem
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# Điều này sẽ được chuyển đến tất cả các máy khách mysql
# Đã có báo cáo rằng mật khẩu nên được đặt trong dấu tích/dấu ngoặc kép
# đặc biệt nếu chúng chứa ký tự "#"...
# Nhớ chỉnh sửa /etc/mysql/debian.cnf khi thay đổi vị trí ổ cắm.
# Đây là mục nhập cho một số chương trình cụ thể
# Các giá trị sau giả sử bạn có ít nhất 32M ram
[mysqld_safe]
ổ cắm = /var/run/mysqld/mysqld.sock
đẹp = 0
[mysqld]
#
# * Cài đặt cơ bản
#
người dùng = mysql
tệp pid = /var/run/mysqld/mysqld.pid
ổ cắm = /var/run/mysqld/mysqld.sock
cổng = 3306
dựa trên = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
bỏ qua khóa ngoài
#
# Thay vì bỏ qua kết nối mạng, mặc định hiện chỉ nghe trên
# localhost tương thích hơn và không kém an toàn hơn.
địa chỉ liên kết = 127.0.0.1
#
# * Tinh chỉnh
#
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# Điều này thay thế tập lệnh khởi động và kiểm tra các bảng MyISAM nếu cần
# lần đầu tiên họ được chạm vào
myisam-recover-options = SAO LƯU
#max_connections = 100
#table_open_cache = 64
#thread_concurrency = 10
#
# * Cấu hình bộ đệm truy vấn
#
query_cache_limit = 1M
truy vấn_cache_size = 16M
#
# * Ghi nhật ký và sao chép
#
# Cả hai vị trí được xoay bởi cronjob.
# Xin lưu ý rằng loại nhật ký này là kẻ giết người hiệu suất.
# Kể từ phiên bản 5.1, bạn có thể kích hoạt nhật ký khi chạy!
#General_log_file = /var/log/mysql/mysql.log
#chung_log = 1
#
# Nhật ký lỗi - nên có rất ít mục.
#
log_error = /var/log/mysql/error.log
#
# Tại đây bạn có thể thấy các truy vấn có thời lượng đặc biệt dài
#slow_query_log = 1
#slow_query_log_file = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#truy vấn nhật ký không sử dụng chỉ mục
#
# Những điều sau đây có thể được sử dụng để dễ dàng phát lại các bản ghi sao lưu hoặc để sao chép.
# lưu ý: nếu bạn đang thiết lập một nô lệ sao chép, hãy xem README.Debian về
# cài đặt khác mà bạn có thể cần phải thay đổi.
# máy chủ-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
hết hạn_logs_ngày = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * InnoDB
#
# InnoDB được bật theo mặc định với tệp dữ liệu 10 MB trong /var/lib/mysql/.
# Đọc hướng dẫn để biết thêm các tùy chọn liên quan đến InnoDB. Có nhiều!
#
# * Tính năng bảo mật
#
# Đọc hướng dẫn, nếu bạn muốn chroot!
# chroot = /var/lib/mysql/
#
# Để tạo chứng chỉ SSL, tôi khuyên dùng GUI OpenSSL "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
/etc/mysql/mysql.conf.d/mysqld_safe_syslog.cnf
[mysqld_safe]
nhật ký hệ thống