MySQL max_open_files มากกว่า 1024


11

ในขณะที่เริ่มต้น MariaDB ฉันได้รับ [คำเตือน] ไม่สามารถเพิ่มจำนวน max_open_files เป็นมากกว่า 1024 (คำขอ: 4607)

$ sudo systemctl status mysqld
● mysqld.service - MariaDB database server
  Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
  Active: activating (start-post) since Tue 2014-08-26 14:12:01 EST; 2s ago
Main PID: 8790 (mysqld);         : 8791 (mysqld-post)
  CGroup: /system.slice/mysqld.service
      ├─8790 /usr/bin/mysqld --pid-file=/run/mysqld/mysqld.pid
      └─control
    ├─8791 /bin/sh /usr/bin/mysqld-post
    └─8841 sleep 1

Aug 26 14:12:01 acpfg mysqld[8790]: 140826 14:12:01 [Warning] Could not increase number of max_open_files to more than 1024 (request: 4607)

ฉันพยายามแก้ไขปัญหาไฟล์ max_open_files ในไฟล์นี้ไม่สำเร็จ

$ sudo nano /etc/security/limits.conf 
mysql           hard    nofile          8192
mysql           soft    nofile          1200

ฉันรีสตาร์ทคอมพิวเตอร์อีกครั้ง แต่ฉันพบปัญหาเดียวกัน

/etc/mysql/my.cnf มีลักษณะดังนี้:

[mysql]

# CLIENT #
port                           = 3306
socket                         = /home/u/tmp/mysql/mysql.sock

[mysqld]

# GENERAL #
user                           = mysql
default-storage-engine         = InnoDB
socket                         = /home/u/tmp/mysql/mysql.sock
pid-file                       = /home/u/tmp/mysql/mysql.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

# SAFETY #
max-allowed-packet             = 16M
max-connect-errors             = 1000000
skip-name-resolve
sql-mode                       = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
sysdate-is-now                 = 1
innodb                         = FORCE
innodb-strict-mode             = 1

# DATA STORAGE #
datadir                        = /home/u/tmp/mysql/

# BINARY LOGGING #
log-bin                        = /home/u/tmp/mysql/mysql-bin
expire-logs-days               = 14
sync-binlog                    = 1

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
max-connections                = 500
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048

# INNODB #
innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 128M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 2G

# LOGGING #
log-error                      = /home/u/tmp/mysql/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /home/u/tmp/mysql/mysql-slow.log

เป็นไปได้อย่างไรที่จะแก้ไขปัญหากับ max_open_files?


คุณเริ่ม mySql ใหม่ตั้งแต่มีการเปลี่ยนแปลงข้อ จำกัด หรือไม่ โดยทั่วไปสิ่งเหล่านี้ไม่เพียง แต่นำเสนอจากการเปลี่ยนแปลงไฟล์ แต่โดยทั่วไปกระบวนการจะต้องเริ่มต้นใหม่เพื่อรับการเปลี่ยนแปลง นอกจากนี้คุณสามารถตรวจสอบข้อ จำกัด โดยใช้คำสั่ง ulimit คุณรีบูทตั้งแต่การเปลี่ยนแปลงหรือไม่?
mdpc

ฉันรีสตาร์ทคอมพิวเตอร์หลังจากฉันเปลี่ยนข้อ จำกัด ดูผลลัพธ์ ulimit การเปลี่ยนแปลงของฉันไม่ได้ผล: $ ulimit ไม่ จำกัด $ ulimit -Sa | grep "open files" open files (-n) 1024 $ ulimit -Ha | grep "open files" open files (-n) 4096. เกิดอะไรขึ้น?
user977828

คำตอบ:


17

แก้ไข/etc/security/limits.confและเพิ่มบรรทัดต่อไปนี้

mysql soft nofile 65535
mysql hard nofile 65535

จากนั้นรีบูต

จากนั้นแก้ไข/usr/lib/systemd/system/mysqld.serviceหรือ/usr/lib/systemd/system/mariadb.serviceเพิ่ม

LimitNOFILE=infinity
LimitMEMLOCK=infinity

จากนั้นรีสตาร์ทเซอร์วิส db:

systemctl reload mariadb.service

1
โปรดทราบว่าอย่างน้อยใน systemd รุ่น 209 อินฟินิตี้หมายถึง 65535 หากคุณต้องการมากกว่านั้นเพียงแค่ออกหมายเลขไม่ใช่อนันต์
sivann

3
สำหรับ Mariadb 5.5 ใน RHEL 7 อย่างน้อยความคิดเห็นในไฟล์นั้น (/usr/lib/systemd/system/mariadb.service) เตือนคุณไม่ให้แก้ไขไฟล์นั้น แต่สร้างไดเรกทอรี service.d ที่มีไฟล์ ไลค์: /etc/systemd/system/mariadb.service.d/foo.conf โปรดเพิ่ม "[บริการ]" ที่ด้านบนของไฟล์นั้นก่อนขีด จำกัด สองบรรทัด นอกจากนี้ยังแนะนำ "systemctl --system daemon-reload" หลังจากการเปลี่ยนแปลงใด ๆ รายละเอียดเหล่านี้ทำให้ฉันรู้สึกอึดอัดกับการดึงผมอีกชั่วโมง
IcarusNM

สิ่งนี้ไม่ทำงานใน Ubuntu 14.04 กับ MySQL 5.7 ไม่มีไฟล์บริการและไม่ได้ติดตั้งแพ็คเกจ systemctl
ไท

ตรวจสอบ/etc/systemd/system/mysql.service.d/limits.confหรือ/etc/systemd/system/mariadb.service.d/limits.conf มันใช้งานได้สำหรับฉันอย่างไม่มีที่ติ
ลูก้า

2

อีกเหตุผลหนึ่งคือ:
คุณต้องใส่ใจกับtable_open_cach

โค้ด MySQL mysqld.cc

wanted_files= 10 + max_connections + table_cache_size * 2;

ลองด้วยtable_open_cachค่าที่ต่ำกว่า


1

คุณสามารถดูคำแนะนำอย่างเป็นทางการในไฟล์ mariadb.service

[root@mariadb5.5 /]# cat /usr/lib/systemd/system/mariadb.service | grep exam -A 5
# For example, if you want to increase mariadb's open-files-limit to 10000,
# you need to increase systemd's LimitNOFILE setting, so create a file named
# "/etc/systemd/system/mariadb.service.d/limits.conf" containing:
#       [Service]
#       LimitNOFILE=10000

จำเป็นต้องรีบูตระบบปฏิบัติการของคุณ แม้ว่าฉันคิดว่ามันควรจะเขียนไว้ในคู่มืออย่างเป็นทางการ ...


1
ฉันไม่จำเป็นต้องรีบูทบน Fedora 28 มันขอให้ฉันทำงานsystemctl daemon-reloadเมื่อรีสตาร์ท MariaDB เท่านั้น
DanMan

0

ฉันมีปัญหาเดียวกันกับUbuntu 15.10และmysqlและแก้ไขด้วยคำตอบก่อนหน้านี้ที่มีความแตกต่างเล็กน้อย

ฉันเปลี่ยน/etc/security/limits.confเป็นครั้งแรกดังกล่าวข้างต้น

ฉันเพิ่ม (ไม่มีอะไรเพิ่มเติม)

LimitNOFILE=infinity

ถึง/lib/systemd/system/mysql.service(ความแตกต่างของตำแหน่งเล็กน้อย)

แล้วก็ทำ

systemctl daemon-reload
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.