ฉันกำลังโฮสต์เว็บไซต์ WordPress บน DigitalOcean droplet (1GB RAM) ฐานข้อมูล MySQL ของเว็บไซต์ขัดข้องในบางครั้ง ซึ่งทำให้เว็บไซต์แสดงข้อความ "เกิดข้อผิดพลาดในการสร้างการเชื่อมต่อฐานข้อมูล" การใช้งานหน่วยความจำลดลงประมาณ 02:40 น. แสดงว่าเป็นช่วงที่ฐานข้อมูลขัดข้อง ฉันตรวจสอบไฟล์บันทึก MySQL สำหรับวันนั้น และรายการแรกสุดคือเวลา 10:47 น. นี่คือจุดเริ่มต้นของไฟล์บันทึก:
2021-12-06T10:47:14.800977Z 0 [คำเตือน] TIMESTAMP ที่มีค่า DEFAULT โดยปริยายเลิกใช้แล้ว โปรดใช้ --explicit_defaults_for_timest$
2021-12-06T10:47:14.806192Z 0 [หมายเหตุ] /usr/sbin/mysqld (mysqld 5.7.36-0ubuntu0.18.04.1) เริ่มต้นเป็นกระบวนการ 2810 ...
2021-12-06T10:47:14.819674Z 0 [หมายเหตุ] InnoDB: รองรับ PUNCH HOLE
2021-12-06T10:47:14.819711Z 0 [หมายเหตุ] InnoDB: Mutexes และ rw_locks ใช้ GCC atomic builtins
2021-12-06T10:47:14.819716Z 0 [หมายเหตุ] InnoDB: ใช้ mutexes เหตุการณ์
2021-12-06T10:47:14.819720Z 0 [หมายเหตุ] InnoDB: GCC ในตัว __atomic_thread_fence() ใช้สำหรับกั้นหน่วยความจำ
2021-12-06T10:47:14.819723Z 0 [หมายเหตุ] InnoDB: ตารางที่บีบอัดใช้ zlib 1.2.11
2021-12-06T10:47:14.819727Z 0 [หมายเหตุ] InnoDB: การใช้ AIO ดั้งเดิมของ Linux
2021-12-06T10:47:14.820551Z 0 [หมายเหตุ] InnoDB: จำนวนพูล: 1
2021-12-06T10:47:14.823342Z 0 [หมายเหตุ] InnoDB: การใช้คำสั่ง CPU crc32
2021-12-06T10:47:14.825847Z 0 [หมายเหตุ] InnoDB: กำลังเริ่มต้นบัฟเฟอร์พูล ขนาดรวม = 128M อินสแตนซ์ = 1 ขนาดก้อน = 128M
2021-12-06T10:47:14.826246Z 0 [ข้อผิดพลาด] InnoDB: mmap(137428992 ไบต์) ล้มเหลว; เออร์โน 12
2021-12-06T10:47:14.826258Z 0 [ข้อผิดพลาด] InnoDB: ไม่สามารถจัดสรรหน่วยความจำสำหรับบัฟเฟอร์พูล
2021-12-06T10:47:14.826262Z 0 [ข้อผิดพลาด] InnoDB: การเริ่มต้นปลั๊กอินถูกยกเลิกโดยมีข้อผิดพลาด ข้อผิดพลาดทั่วไป
2021-12-06T10:47:14.826270Z 0 [ข้อผิดพลาด] ฟังก์ชันเริ่มต้นของปลั๊กอิน 'InnoDB' ส่งกลับข้อผิดพลาด
2021-12-06T10:47:14.826274Z 0 [ข้อผิดพลาด] การลงทะเบียนปลั๊กอิน 'InnoDB' เป็น STORAGE ENGINE ล้มเหลว
2021-12-06T10:47:14.826278Z 0 [ข้อผิดพลาด] ไม่สามารถเริ่มต้นปลั๊กอินในตัว
2021-12-06T10:47:14.826282Z 0 [ข้อผิดพลาด] การยกเลิก
2021-12-06T10:47:14.832237Z 0 [หมายเหตุ] สิ้นสุด Binlog
2021-12-06T10:47:14.832297Z 0 [หมายเหตุ] กำลังปิดปลั๊กอิน 'CSV'
2021-12-06T10:47:14.832572Z 0 [หมายเหตุ] /usr/sbin/mysqld: การปิดระบบเสร็จสมบูรณ์
ตามไฟล์บันทึก ดูเหมือนว่า MySQL หน่วยความจำไม่เพียงพอ อย่างไรก็ตาม การใช้หน่วยความจำสำหรับหยดข้อมูลนั้นคงที่ประมาณ 73% จนกระทั่งฐานข้อมูลขัดข้องในเวลาประมาณ 02:40 น. ซึ่งลดลงเหลือ 32% ดูเหมือนว่ามีหน่วยความจำเหลือเฟือ แล้วทำไมมันถึงพังล่ะ?
แก้ไข ตามที่ร้องขอ นี่คือเนื้อหาของไฟล์กำหนดค่า MySQL ของฉัน:
/etc/mysql/conf.d/mysql.cnf
[มายเอสคิวแอล]
/etc/mysql/conf.d/mysqldump.cnf
[mysqldump]
เร็ว
อ้างชื่อ
max_allowed_packet = 16M
/etc/mysql/mysql.conf.d/mysqld.cnf
#
# ไฟล์การกำหนดค่าเซิร์ฟเวอร์ฐานข้อมูล MySQL
#
# คุณสามารถคัดลอกสิ่งนี้ไปยังหนึ่งใน:
# - "/etc/mysql/my.cnf" เพื่อตั้งค่าตัวเลือกส่วนกลาง
# - "~/.my.cnf" เพื่อตั้งค่าตัวเลือกเฉพาะผู้ใช้
#
# หนึ่งสามารถใช้ตัวเลือกยาวทั้งหมดที่โปรแกรมรองรับ
# เรียกใช้โปรแกรมด้วย --help เพื่อรับรายการตัวเลือกที่มีและด้วย
# --print-defaults เพื่อดูว่าตัวใดจะเข้าใจและใช้งานได้จริง
#
#ดูคำอธิบายได้ที่
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# สิ่งนี้จะถูกส่งไปยังไคลเอนต์ mysql ทั้งหมด
# มีรายงานว่ารหัสผ่านควรใส่เครื่องหมาย / เครื่องหมายคำพูด
# โดยเฉพาะอย่างยิ่งหากมีอักขระ "#" ...
# อย่าลืมแก้ไข /etc/mysql/debian.cnf เมื่อเปลี่ยนตำแหน่งซ็อกเก็ต
# นี่คือรายการสำหรับบางโปรแกรมเฉพาะ
# ค่าต่อไปนี้ถือว่าคุณมี ram อย่างน้อย 32M
[mysqld_safe]
ซ็อกเก็ต = /var/run/mysqld/mysqld.sock
สวย = 0
[มายเอสคิวลด์]
#
# * การตั้งค่าพื้นฐาน
#
ผู้ใช้ = mysql
ไฟล์ pid = /var/run/mysqld/mysqld.pid
ซ็อกเก็ต = /var/run/mysqld/mysqld.sock
พอร์ต = 3306
เบสซีร์ = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
ข้ามล็อคภายนอก
#
# แทนที่จะข้ามเครือข่ายค่าเริ่มต้นคือเปิดฟังเท่านั้น
# localhost ซึ่งเข้ากันได้มากกว่าและปลอดภัยไม่น้อย
ที่อยู่ผูก = 127.0.0.1
#
# * การปรับแต่งอย่างละเอียด
#
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# สิ่งนี้จะแทนที่สคริปต์เริ่มต้นและตรวจสอบตาราง MyISAM หากจำเป็น
#ครั้งแรกที่ได้สัมผัส
myisam-recover-options = สำรองข้อมูล
#max_connections = 100
#table_open_cache = 64
#thread_concurrency = 10
#
# * การกำหนดค่าแบบสอบถามแคช
#
query_cache_limit = 1M
query_cache_size = 16M
#
# * การบันทึกและการจำลองแบบ
#
# ตำแหน่งทั้งสองได้รับการหมุนโดย cronjob
# โปรดทราบว่าประเภทบันทึกนี้เป็นตัวทำลายประสิทธิภาพ
# ตั้งแต่ 5.1 คุณสามารถเปิดใช้งานบันทึกเมื่อรันไทม์!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# บันทึกข้อผิดพลาด - ควรมีรายการน้อยมาก
#
log_error = /var/log/mysql/error.log
#
# ที่นี่ คุณสามารถดูข้อความค้นหาที่มีระยะเวลานานเป็นพิเศษ
#slow_query_log = 1
#slow_query_log_file = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-query-not-use-indexes
#
# ข้อมูลต่อไปนี้สามารถใช้เป็นบันทึกสำรองซ้ำหรือทำซ้ำได้ง่าย
# หมายเหตุ: หากคุณกำลังตั้งค่า replication slave โปรดดูที่ README.Debian about
# การตั้งค่าอื่นๆ ที่คุณอาจต้องเปลี่ยน
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expier_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * อินโนดีบี
#
# InnoDB เปิดใช้งานโดยค่าเริ่มต้นด้วยไฟล์ข้อมูล 10MB ใน /var/lib/mysql/
# อ่านคู่มือสำหรับตัวเลือกเพิ่มเติมที่เกี่ยวข้องกับ InnoDB มีมากมาย!
#
# * คุณลักษณะด้านความปลอดภัย
#
# อ่านคู่มือด้วย ถ้าคุณต้องการ chroot!
# chroot = /var/lib/mysql/
#
# สำหรับการสร้างใบรับรอง SSL ฉันขอแนะนำ OpenSSL GUI "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]
syslog