ฉันใช้ Ubuntu 20.04.03 กับ Mysql 8.0.27 ฉันได้ติดตั้ง LAMP ใหม่ตั้งแต่ต้นหลายครั้ง และตอนนี้ฉันมี WordPress 3 ไซต์เท่านั้น แต่ฉันได้ทดสอบเพียง 1 และ 2 ไซต์เท่านั้นด้วย เพิ่ม RAM เป็น 2GB และ 3GB Swap

ดูเหมือนว่าจะไม่มีอะไรทำงานเพราะ Mysql 8.0.27 หยุดทำงานทำให้เกิดปัญหาการเชื่อมต่อฐานข้อมูลในทุกไซต์ทุกคืนแม้ว่าจะเป็นไซต์ใหม่ทั้งหมดโดยไม่มีการรับส่งข้อมูล เมื่อฉันกำลังแก้ไขโพสต์หรือเรียกดูเว็บไซต์ใด ๆ ที่ MySql ขัดข้องอีกครั้ง บางครั้งมันไม่ขึ้นต้นด้วยsystemctl restart mysql.

บันทึกข้อผิดพลาด Apache ไม่แสดงสิ่งสำคัญ:

/usr/sbin/mysqld (mysqld 8.0.27-0ubuntu0.20.04.1) starting as process 1524639

InnoDB initialization has started.

InnoDB initialization has ended.

Starting XA crash recovery... XA crash recovery finished.

A deprecated TLS version TLSv1 is enabled for channel mysql_main

A deprecated TLS version TLSv1.1 is enabled for channel mysql_main

CA certificate ca.pem is self signed.

Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.

X Plugin ready for connections. Bind-address: '127.0.0.1' port: 33060, socket: /var/run/mysqld/mysqlx.sock

ฉันได้ตรวจสอบแล้วว่าการกำหนดค่ากำลังโหลดเวอร์ชัน TLS ทั้งหมดว่ายอมรับได้ ดังนั้นจึงไม่มีข้อผิดพลาดจริง

journalctl -u mysql บันทึกวารสารล่าสุด:

Jan 28 10:29:37 www.ignicion.org systemd[1]: mysql.service: Failed with result 'signal'.
Jan 28 10:29:37 www.ignicion.org systemd[1]: mysql.service: Scheduled restart job, restart counter is at 5.
Jan 28 10:29:37 www.ignicion.org systemd[1]: Stopped MySQL Community Server.
Jan 28 10:29:37 www.ignicion.org systemd[1]: Starting MySQL Community Server...
Jan 28 10:29:43 www.ignicion.org systemd[1]: mysql.service: Main process exited, code=killed, status=9/KILL
Jan 28 10:29:43 www.ignicion.org systemd[1]: mysql.service: Failed with result 'signal'.
Jan 28 10:29:43 www.ignicion.org systemd[1]: Failed to start MySQL Community Server.
Jan 28 10:29:43 www.ignicion.org systemd[1]: mysql.service: Scheduled restart job, restart counter is at 6.
Jan 28 10:29:43 www.ignicion.org systemd[1]: Stopped MySQL Community Server.
Jan 28 10:29:43 www.ignicion.org systemd[1]: Starting MySQL Community Server...
Jan 28 10:29:50 www.ignicion.org systemd[1]: Started MySQL Community Server.

ฉันรู้ว่ามันเป็นปัญหาหน่วยความจำ แต่ทำไม? ไม่เหมือนเซิฟเวอร์ทำอะไรมากมาย ฉันได้ตรวจสอบกระบวนการแล้วและ Mysql เป็นกระบวนการที่ใช้หน่วยความจำทั้งหมด ฐานข้อมูลใหม่แบบเดียวกันนี้ทำงานได้ดีบน ubuntu 18 ดังนั้นฉันจึงไม่มีความคิดจริงๆ และไม่สามารถหาวิธีแก้ไขปัญหาที่เกี่ยวข้องซึ่งพบในฟอรัมได้ โซลูชันบางอย่างที่ฉันพบกำลังพูดถึงความเสียหายของฐานข้อมูล/ตาราง แต่นี่เป็นฐานข้อมูลใหม่และความผิดปกติของฮาร์ดแวร์ถูกยกเลิกโดย Digital Ocean Support

ฉันจะขอบคุณข้อมูลเชิงลึกใด ๆ

อัปเดต #1 ไม่มีการสำรองข้อมูลหรืองานอื่นใดที่กำหนดเวลาไว้ เป็นเพียงการติดตั้งใหม่และฐานข้อมูลใหม่ นี่คือไฟล์ปรับแต่งของฉันใน Ubuntu 20: /etc/mysql/mysql.conf.d

[mysqld]
user            = mysql
bind-address            = 127.0.0.1
mysqlx-bind-address     = 127.0.0.1
key_buffer_size         = 16M
myisam-recover-options  = BACKUP
log_error = /var/log/mysql/error.log
max_binlog_size   = 100M
innodb_file_per_table = 1

และจากไฟล์บันทึกเคอร์เนลของฉัน (tail -100 /var/log/kern.log) ดูเหมือนว่าSIGKILL 9 Term Kill signalสัญญาณกำลังฆ่า mysql เนื่องจากการใช้หน่วยความจำมากเกินไป

Jan 28 18:12:26 www kernel: [623011.971582] oom-kill:constraint=CONSTRAINT_NONE, 
nodemask= (null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mysql.service,task=mysqld,pid=1669785,uid=113

Jan 28 18:12:26 www kernel: [623011.971617] Out of memory: Killed process 166978 
5 (mysqld) total-vm:720836kB, anon-rss:292028kB, file-rss:804kB, shmem-rss:0kB, 
UID:113 pgtables:816kB oom_score_adj:0

Jan 28 18:12:26 www kernel: [623012.005506] oom_reaper: reaped process 1669785 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

ดังนั้นฉันจึงอ่านว่าฉันควรตรวจสอบการกำหนดค่าบัฟเฟอร์ของ Mysql และนั่นคือสิ่งที่ฉันอยู่ในขณะนี้

อัพเดท #2 cat /proc/meminfo

MemTotal:        2030808 kB
MemFree:           54016 kB
MemAvailable:       3424 kB
Buffers:             240 kB
Cached:           285620 kB
SwapCached:        44532 kB
Active:          1188660 kB
Inactive:         495868 kB
Active(anon):    1187984 kB
Inactive(anon):   495088 kB
Active(file):        676 kB
Inactive(file):      780 kB
Unevictable:       19120 kB
Mlocked:           19120 kB
SwapTotal:       3145724 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:       1383352 kB
Mapped:           284872 kB
Shmem:            276064 kB
KReclaimable:      47968 kB
Slab:             171388 kB
SReclaimable:      47968 kB
SUnreclaim:       123420 kB
KernelStack:        7744 kB
PageTables:        59832 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4161128 kB
Committed_AS:    9186644 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       16512 kB
VmallocChunk:          0 kB
Percpu:             1808 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:     1335276 kB
DirectMap2M:      761856 kB


ps  -aux --sort -rss|head -5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql    1715614  6.7 18.8 1763392 383344 ?      Ssl  22:21   0:01 /usr/sbin/mysqld
aceitep+ 1686006  0.0  2.0 342620 41076 ?        S    19:44   0:02 /bin/php-cgi7.4
aceitep+ 1686009  0.0  1.9 265576 39268 ?        S    19:44   0:02 /bin/php-cgi7.4
aceitep+ 1686001  0.0  1.8 342152 38348 ?        S    19:44   0:04 /bin/php-cgi7.4


และเนื่องจากฉันคิดว่ามันเกี่ยวข้องกับตัวแปร mysql บางตัว ฉันจึงรัน MySql Tunner และนี่คือคำแนะนำ:

Variables to adjust:
    innodb_buffer_pool_size (>= 391.3M) if possible.
    innodb_log_file_size should be (=16M) if possible, so InnoDB total log files                                                                              size equals to 25% of buffer pool size.

ดังนั้นฉันจะทดสอบเพื่อเพิ่มสิ่งนี้และจะโพสต์ผลลัพธ์

อัปเดต #3 เพิ่มinnodb_buffer_pool_size = 512M ในไฟล์ของฉัน/etc/mysql/mysql.conf.d/mysqld.cnfแล้วและยังหยุดทำงาน ล็อกยังเหมือนเดิม :(

เป็นเรื่องปกติหรือไม่ที่หน่วยความจำขนาดใหญ่ทั้งหมดของฉันถูกจัดสรรให้เป็นศูนย์เมื่อฉันเรียกใช้ ShowEngine InnoDB status;

----------------------
BUFFER POOL AND MEMORY
----------------------
**Total large memory allocated 0**
Dictionary memory allocated 1009720
Buffer pool size   32765
Free buffers       29298
Database pages     3405
Old database pages 1276
Modified db pages  0

แล้วเวลาวิ่งโชว์ล่ะvariables like 'innodb_%';

innodb_buffer_pool_size           | 536870912
innodb_change_buffer_max_size    | 25

เหตุใดขนาดของบัฟเฟอร์พูลไม่ตรงกันและสิ่งนี้innodb_change_buffer_max_sizeหมายความว่าอย่างไร ฉันควรตรวจสอบตัวแปรอื่นใดบ้าง ขอบคุณอีกครั้งครับทุกคน

answer

ตกลง. แก้ได้แล้ว . ไม่มีวิธีแก้ปัญหาเฉพาะสำหรับพฤติกรรมประเภทนี้ เนื่องจากเคอร์เนลกำลังฆ่า mysql เนื่องจากใช้ RAM มากเกินไป และเมื่อคุณพยายามค้นหาสาเหตุ ไม่มีเหตุผลเฉพาะเจาะจง สิ่งเดียวที่คุณทำได้คือพยายามเล่นกับตัวแปรและทดสอบให้มาก สิ่งที่ฉันเรียนรู้:

  • ฉันมีประสบการณ์สั้น ๆ ฉันไม่รู้ว่าไฟล์กำหนดค่า Myslq (/etc/mysql/mysql.conf.d/mysqlconf.d บน Ubuntu 20.04) ไม่แสดงตัวแปรมากนักเนื่องจากตัวแปรเหล่านี้ถูกตั้งค่าโดยค่าเริ่มต้น ดังนั้นถ้าเรา ต้องการตั้งค่าที่แตกต่างกันเราต้องเพิ่มแต่ละตัวแปรด้วยตนเองในไฟล์ปรับแต่ง

  • ติดตั้งและเรียกใช้ mysql tuner (google it) เพื่อให้สามารถชี้ตำแหน่งที่จะเริ่มต้นสำหรับการตั้งค่าเฉพาะของคุณได้ ในกรณีของฉันแนะนำให้เพิ่ม innodb_buffer_pool_size และค่า innodb_log_file_size ควรเท่ากับ 25% ของค่า innodb_buffer_pool_size เพื่อประสิทธิภาพสูงสุด เช่น innodb_buffer_pool_size = 1Gb innodb_log_file_size = 0.25Gb

  • ฉันตั้งค่า innodb_buffer_pool_size = 512M เนื่องจากฉันมี RAM 2GB สิ่งนี้ทำให้เซิร์ฟเวอร์ใช้งานได้นานขึ้นเล็กน้อยก่อนที่จะหยุดทำงานอีกครั้ง นั่นคือจุดที่คุณต้องเริ่มเรียนรู้เพิ่มเติมเกี่ยวกับตัวแปร Mysql แต่ละตัว และทำการคำนวณตามขนาดฐานข้อมูลของคุณ

นี่คือไฟล์กำหนดค่า Mysql สุดท้ายของฉัน ดังนั้นคุณสามารถลองกำหนดค่านี้ได้ เพิ่งรู้ว่าฐานข้อมูลของฉันมีขนาด 394MB ในขณะนี้:


[mysqld]
skip-log-bin
user            = mysql
bind-address            = 127.0.0.1
mysqlx-bind-address     = 127.0.0.1
myisam-recover-options  = BACKUP
log_error = /var/log/mysql/error.log
general_log = on
general_log_file=/var/log/mysql/general.log

key_buffer_size                 = 1M
max_allowed_packet              = 1M
thread_stack                    = 200K
thread_cache_size               = 8
max_connect_errors              = 100
max_connections                 = 100
#table_cache                    = 64
#thread_concurrency             = 30
binlog_cache_size               = 1M
net_buffer_length               = 1M

default_storage_engine          = InnoDB
innodb_buffer_pool_instances    = 1 # Use 1 instance per 1GB of InnoDB pool size
innodb_buffer_pool_size         = 400M   # Use up to 70-80% of RAM
innodb_file_per_table           = 1
innodb_flush_log_at_trx_commit  = 0
innodb_flush_method             = O_DIRECT
innodb_log_buffer_size          = 16M
innodb_log_file_size            = 16M
innodb_stats_on_metadata        = 0
#innodb_thread_concurrency      = 0
innodb_read_io_threads          = 40
innodb_write_io_threads         = 40
innodb_buffer_pool_chunk_size   = 10
innodb_lock_wait_timeout        = 600
innodb_flush_log_at_trx_commit  = 1
innodb_io_capacity              = 3000
innodb_io_capacity_max          = 4000
innodb_buffer_pool_dump_pct     = 80
innodb_flush_neighbors          = 0
innodb_doublewrite              = 0
innodb_change_buffer_max_size   = 10
innodb_old_blocks_pct           = 70
innodb_old_blocks_time          = 5000
innodb_use_native_aio           = ON

# The number of seconds the server waits for activity on an interactive connection before closing it.
interactive_timeout             = 600

# The number of seconds the server waits for activity on a noninteractive connection before closing it.
wait_timeout                    = 600
net_read_timeout                = 300
net_write_timeout               = 300
connect_timeout                 = 1800

# Table Settings
table_definition_cache          = 1K
table_open_cache                = 2K
table_open_cache                = 2K
open_files_limit                = 4000

max_heap_table_size             = 100M
tmp_table_size                  = 100M

#
# * Query Cache Configuration
#
#query_cache_limit               = 1M
#query_cache_size                = 100M
#query_cache_size                = 0
#query_cache_type                = 0



# Buffer Settings
join_buffer_size                = 256K
read_buffer_size                = 256K
read_rnd_buffer_size            = 256K
sort_buffer_size                = 128K
performance_schema              = ON

หากขนาดฐานข้อมูลของฉันเพิ่มขึ้นตามเวลา (แน่นอนว่าจะเป็นเช่นนั้น) ฉันจะต้องเพิ่มค่านี้:


key_buffer_size = 1M
max_connections = 100
innodb_buffer_pool_size = 400M
join_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
sort_buffer_size = 128K

ฉันสามารถเพิ่ม innodb_buffer_pool_size เป็น 1Gb ได้ แต่นั่นหมายความว่าฉันจะต้องลดตัวแปรอื่นๆ และทดสอบอีกครั้งเพื่อทดสอบการตั้งค่าประสิทธิภาพที่ดีที่สุด (อย่างที่ฉันพูด ถ้าคุณไม่รู้ จำเป็นต้องมีการวิจัยจำนวนมากเกี่ยวกับตัวแปรเหล่านี้) ในทางกลับกัน ฉันสามารถปล่อยให้ค่าเดียวกันนี้แม้ว่าฐานข้อมูลของฉันจะเพิ่มขึ้นตามเวลา แต่ Mysql จะเริ่มใช้หน่วยความจำ Swamp มากขึ้น ดังนั้นแบบสอบถาม เวลาจะช้าลงเล็กน้อย

และอีกครั้ง คุณสามารถเพิ่ม RAM บนเซิร์ฟเวอร์ของคุณได้ ถ้าคุณสามารถจ่ายได้

หวังว่านี่จะช่วยใครได้ ฉันไม่มีประสบการณ์ดังนั้นฉันจึงโพสต์คำตอบนี้สำหรับการอ้างอิงในอนาคตของฉันเช่นกัน :)

ผู้ร่วมให้ข้อมูลใหม่
gallo2000sv is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.