نظرًا للزيادة في عدد مستخدمي مساحة CN2، فقد تعطلت عملية Mysql دائمًا في منتصف الليل مؤخرًا، وقد قمت بمراجعة سجل أخطاء Mysql وكانت المطالبة: [خطأ] خطأ في القبول: تبين أن هناك عددًا كبيرًا جدًا من الملفات المفتوحة يكون بسبب عدم كفاية الملفات المفتوحة، مما يؤدي إلى تعليق قاعدة البيانات، خاصة عند عمل نسخة احتياطية لنظام DirectAdmin ليلاً.

الملف المفتوح الافتراضي في نظام Linux هو 1024. يمكنك استخدام ulimit -a لعرضه، وهذا حد على مستوى النظام بالإضافة إلى ذلك، فإن الملف المفتوح الافتراضي في MySQL هو أيضًا 1024. في كثير من الحالات، لا يمكن لهذه القيمة أن تلبي متطلباتنا. احتياجات بناء مواقع الويب، خاصة تلك الكبيرة، يمكن أن تحدث بسهولة مشكلات كثيرة في الملفات المفتوحة في مواقع الويب ومراكز قواعد البيانات الضخمة.

تهدف هذه المقالة إلى مشاركة كيفية حل الخطأ: [خطأ] خطأ في القبول: عدد كبير جدًا من الملفات المفتوحة لمزيد من المعلومات حول تحسين الخادم وحل المشكلات، يرجى الرجوع إلى:

  1. دع الصور تطير لبعض الوقت! إعدادات تحويل دفعة تنسيق WebP لصورة موقع الويب وتجربة التأثير المتسارع
  2. استخدم Youpai Cloud FTP وNut Cloud WebDAV بذكاء لإنشاء نسخة احتياطية للملفات الشخصية وتخزين البيانات على السحابة
  3. حماية أمان مضيف VPS والخادم: تعديل منفذ SSH وإضافة القائمة البيضاء وتسجيل الدخول بالمفتاح فقط

1. تفاصيل مشكلة قاعدة البيانات

تحقق من سجل أخطاء قاعدة البيانات إذا كنت تستخدم لوحة DirectAdmin، فسيكون مسار السجل ذي الصلة كما يلي:

#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.

افتح سجل أخطاء Mysql، وستتم مطالبتك بالخطأ التالي بشكل عام:

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. تحليل مشكلة قاعدة البيانات

2.1 عرض القيود

استخدم الأمر: ulimit -a لعرض open_files_limit: الخاص بالجهاز المحلي.

[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

أو استخدم الأمر التالي لعرض open_files_limit فقط لعملية معينة:

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

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

#仅查看Mysql的open files limits:

su mysql ulimit -a

2.2 تعديل Limits.conf

الطريقة الأولى:

يمكنك استخدام الأمر التالي لتعديل الملف /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',请根据自己的实际情况来设定数字

أو قم بتسجيل الدخول باستخدام الحساب الجذر، ثم استخدم الأمر التالي لتعديل /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

الطريقة الثانية:

افتح الملف vi /etc/security/limits.conf وأضف سطرًا في الملف: * - nofile 32768، وبالتالي قم بضبط الملفات المفتوحة إلى bpt3 >32768.

2.3 تعديل ملف my.cnf

تحرير: vi /etc/my.cnf، أضف الكود التالي أدناه [mysqld]:

[mysqld]
open_files_limit = 1024000

ثم أعد تشغيل Mysql كما يلي:

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

2.4 التحقق من سريان مفعوله

قم بتنفيذ الأمر التالي:

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

يمكنك أن ترى أنه تم تعديل open_files_limit بنجاح:

3. مشكلة الفشل بعد إعادة التشغيل

إذا وجدت أن الملفات المفتوحة قد عادت إلى 1024 بعد إعادة تشغيل النظام، فقم بتعديل التكوين وفقًا للأمر التالي:

#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. ملخص

حد واصف الملف الذي يفتحه MySQL هو حد واصف الملف لنظام التشغيل Linux، أي أن الافتراضي هو 1024، ولا علاقة له بإعداد open_files_limit في ملف تكوين Mysql. لذلك، إذا كنت تريد تعديل open_files_limit، فيجب عليك أولاً تعديل open_files_limit لنظام التشغيل.

بالطبع، إذا كنت لا ترغب في تعديل إعدادات النظام، يمكنك أيضًا استخدام الحساب الجذر، وتشغيل البرنامج النصي mysqld_safe لبدء MySQL (أو استخدام mysql.server للبدء)، وإضافة الأمر: –open-files- يمكن تعيين الحد بنجاح، لأنه عندما يقوم mysqld_safe بتشغيل MySQL، في الواقع، قبل بدء تشغيل برنامج mysqld، يتم استدعاء ulimit -n $open_files لتنفيذ قيود واصف الملف.

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

اترك رد