Do lượng người dùng không gian CN2 ngày càng tăng, nên quá trình Mysql luôn gặp sự cố vào nửa đêm gần đây. Tôi đã kiểm tra nhật ký lỗi Mysql và lời nhắc là: [ERROR] Lỗi khi chấp nhận: Hóa ra là có quá nhiều tệp đang mở. là do các tập tin đang mở không đủ khiến cơ sở dữ liệu bị treo, đặc biệt là khi hệ thống DirectAdmin được sao lưu vào ban đêm.

Tệp mở mặc định trong hệ thống Linux là 1024. Bạn có thể sử dụng ulimit -a để xem nó. Ngoài ra, tệp mở mặc định trong mysql cũng là 1024. Trong nhiều trường hợp, giá trị này không thể đáp ứng được của chúng tôi. nhu cầu xây dựng trang web, đặc biệt là những trang web lớn. Trong các trang web và trung tâm cơ sở dữ liệu khổng lồ, Quá nhiều tệp mở có thể dễ dàng xảy ra.

Bài viết này chia sẻ cách khắc phục lỗi: [ERROR] Lỗi chấp nhận: Quá nhiều tệp đang mở. Để biết thêm thông tin về tối ưu hóa máy chủ và giải quyết vấn đề, vui lòng tham khảo:

  1. Hãy để những hình ảnh bay một lúc! Cài đặt chuyển đổi hàng loạt định dạng WebP hình ảnh trang web và trải nghiệm hiệu ứng tăng tốc
  2. Sử dụng khéo léo Youpai Cloud FTP và Nut Cloud WebDAV để tạo bản sao lưu tập tin cá nhân và lưu trữ dữ liệu trên đám mây
  3. Bảo vệ an ninh máy chủ và máy chủ VPS: Sửa đổi cổng SSH, bổ sung danh sách trắng, chỉ đăng nhập bằng khóa

1. Chi tiết sự cố cơ sở dữ liệu

Kiểm tra nhật ký lỗi cơ sở dữ liệu Nếu bạn đang sử dụng bảng DirectAdmin, đường dẫn nhật ký liên quan như sau:

#DirectAdmin:
/var/log/directadmin/error.log
/var/log/directadmin/errortaskq.log
/var/log/directadmin/system.log
/var/log/directadmin/security.log


#Apache:
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpd/suexec_log
/var/log/httpd/fpexec_log
/var/log/httpd/domains/domain.com.error.log
/var/log/httpd/domains/domain.com.log
/var/log/messages (generic errors)


#Proftpd:
/var/log/proftpd/access.log
/var/log/proftpd/auth.log
/var/log/messages (generic errors)


#PureFTPd:
/var/log/pureftpd.log


#Dovecot and vm-pop3d:
/var/log/maillog
/var/log/messages


#named (bind):
/var/log/messages


#exim:
/var/log/exim/mainlog
/var/log/exim/paniclog
/var/log/exim/processlog
/var/log/exim/rejectlog

#(on FreeBSD, they have "exim_" in front of the filenames)

#mysqld:
#RedHat:
/var/lib/mysql/server.hostname.com.err

#FreeBSD and Debian:
/usr/local/mysql/data/server.hostname.com.err


#crond:
/var/log/cron


#To view a log file, run:
less /var/log/filename

#Where /var/log/filename is the path of the log you wish to view.  If the log is too large you can use the "tail" command:
tail -n 30 /var/log/filename

#Where 30 is the number of lines from the end you wish to view.

Mở nhật ký lỗi Mysql và lỗi sau thường sẽ được nhắc:

190902  3:16:52 [ERROR] Error in accept: Too many open files
190902  3:21:08 [ERROR] Error in accept: Too many open files
190902  3:25:24 [ERROR] Error in accept: Too many open files
190902  3:29:40 [ERROR] Error in accept: Too many open files
190902  3:33:56 [ERROR] Error in accept: Too many open files
190902  3:38:12 [ERROR] Error in accept: Too many open files
190902  3:42:28 [ERROR] Error in accept: Too many open files
190902  3:46:44 [ERROR] Error in accept: Too many open files
190902  3:51:00 [ERROR] Error in accept: Too many open files
190902  3:55:16 [ERROR] Error in accept: Too many open files
190902  3:59:32 [ERROR] Error in accept: Too many open files
190902  4:03:48 [ERROR] Error in accept: Too many open files
190902  4:08:04 [ERROR] Error in accept: Too many open files
190902  4:12:20 [ERROR] Error in accept: Too many open files
190902  4:16:37 [ERROR] Error in accept: Too many open files
190902  4:20:53 [ERROR] Error in accept: Too many open files
190902  4:25:09 [ERROR] Error in accept: Too many open files
190902  4:29:25 [ERROR] Error in accept: Too many open files
190902  4:33:41 [ERROR] Error in accept: Too many open files
190902  4:37:57 [ERROR] Error in accept: Too many open files
190902  4:42:13 [ERROR] Error in accept: Too many open files
190902  4:46:29 [ERROR] Error in accept: Too many open files
190902  4:50:45 [ERROR] Error in accept: Too many open files

2. Phân tích vấn đề cơ sở dữ liệu

2.1 Hạn chế xem

Sử dụng lệnh: ulimit -a để xem open_files_limit: của máy cục bộ

[root@sc3 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15675
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15675
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Hoặc sử dụng lệnh sau để chỉ xem open_files_limit của một quy trình nhất định:

#直接查看 open files限制数字
ulimit -n

#仅查看soft 和 hard open files limits :
ulimit -Hn
ulimit -Sn

#仅查看Mysql的open files limits:

su mysql ulimit -a

2.2 Sửa đổi limit.conf

phương pháp một:

Bạn có thể sử dụng lệnh sau để sửa đổi tệp /etc/security/limits.conf:

#To set the ceiling of the limits available (the max a soft or hard limit can be set by each user).
#NOTE: this is set by a PAM during authentication, and NOT at boot. 
#编辑文件

vi /etc/security/limits.conf

#Add the following to bottom of file to set for everything *:
#添加以下谷贱伤农

* soft nofile 1024000
* hard nofile 1024000
* soft nproc 10240
* hard nproc 10240

#To set only a specific user, like mysql then put in:
#或者指定Mysql

mysql hard nofile 1024000
mysql soft nofile 1024000

#Repeat for /etc/security/limits.d/90-nproc.conf
#同样对90-nproc.conf也是一样的操作

vi /etc/security/limits.d/90-nproc.conf

#Add the following:

* soft nofile 1024000
* hard nofile 1024000
* soft nproc 10240
* hard nproc 10240

#root soft nproc unlimited
#I selected '1024000', which is fairly high; you can surely set this lower to something like '102400',请根据自己的实际情况来设定数字

Hoặc đăng nhập bằng tài khoản root, sau đó sử dụng lệnh sau để sửa đổi tạm thời /etc/security/limits.conf:

ulimit -Hn 1024000


#Edit /etc/init.d/mysqld and add this to the top, after #!/bin/sh
#或者编辑修改/etc/init.d/mysqld,加入以下代码:
ulimit -HSn 1024
ulimit -HSn 32768
ulimit -HSn 1024000

Phương pháp hai:

Mở tệp vi /etc/security/limits.conf và thêm một dòng trong tệp: * - nofile 32768, do đó điều chỉnh mở tệp thành 32768.

2.3 Sửa đổi tệp my.cnf

Chỉnh sửa: vi /etc/my.cnf, thêm đoạn mã sau vào bên dưới [mysqld]:

[mysqld]
open_files_limit = 1024000

Sau đó khởi động lại Mysql như sau:

/etc/init.d/mysqld restart
#或者
service mysqld restart

2.4 Kiểm tra xem nó có hiệu lực không

Thực hiện lệnh sau:

mysql -u root -p 
show global variables like 'open%';
#如果是DirectAdmin面板
mysql -u da_admin -p 
show global variables like 'open%';

Bạn có thể thấy rằng open_files_limit đã được sửa đổi thành công:

3. Lỗi sau khi khởi động lại

Nếu bạn thấy các tệp đang mở đã quay trở lại 1024 sau khi hệ thống khởi động lại, hãy sửa đổi cấu hình theo lệnh sau:

#One fix: simply restart mysqld after the system boots up.
#最简单的方法再次重启Mysql

service mysqld restart

#另一种方法
#Another fix is to set these values at boot time before everything else (permanent):
vi /etc/init.d/mysqld

#Add the following:
#添加以下内容:
ulimit -S -n ${DAEMON_FILES_LIMIT:-102400} >/dev/null 2>&1

#然后在 /etc/my.cnf 中添加以下内容:
[myqld_safe]
open_files_limit = 102400
#或者是
[myqld]
open_files_limit = 102400

4. Tóm tắt

Giới hạn bộ mô tả tệp do MySQL mở là giới hạn bộ mô tả tệp của hệ điều hành Linux, nghĩa là mặc định là 1024 và không liên quan gì đến cài đặt open_files_limit trong tệp cấu hình Mysql. Vì vậy, nếu bạn muốn sửa đổi open_files_limit, trước tiên bạn phải sửa đổi open_files_limit của hệ điều hành.

Tất nhiên, nếu bạn không muốn sửa đổi cài đặt hệ thống, bạn cũng có thể sử dụng tài khoản root, chạy tập lệnh mysqld_safe để khởi động MySQL (hoặc sử dụng mysql.server để khởi động nó) và thêm lệnh: –open-files -limit có thể được đặt thành công, bởi vì trên thực tế, khi mysqld_safe khởi động MySQL, trước khi bắt đầu chương trình mysqld, ulimit -n $open_files được gọi để thực hiện các hạn chế của bộ mô tả tệp.

./mysqld_safe --open-files-limit=25000 &
root@(none) 02:50:54>show variables like "%open_files_limit%";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 25000 |
+------------------+-------+

Để lại một câu trả lời