CN2 स्पेस उपयोगकर्ताओं में वृद्धि के कारण, Mysql प्रक्रिया हाल ही में आधी रात में क्रैश हो गई है। मैंने Mysql त्रुटि लॉग की जाँच की और संकेत मिला: [त्रुटि] स्वीकार करने में त्रुटि: बहुत सारी खुली हुई फ़ाइलें खुली फाइलों के कारण अपर्याप्तता के कारण डेटाबेस हैंग हो जाता है, खासकर जब डायरेक्टएडमिन सिस्टम का रात में बैकअप लिया जाता है।

लिनक्स सिस्टम में डिफ़ॉल्ट ओपन फाइल 1024 है। आप इसे देखने के लिए ulimit -a का उपयोग कर सकते हैं। यह एक सिस्टम-स्तरीय सीमा है। इसके अलावा, mysql में डिफ़ॉल्ट ओपन फाइल भी 1024 है। कई मामलों में, यह मान हमारे अनुरूप नहीं हो सकता है वेबसाइट निर्माण की ज़रूरतें, विशेष रूप से बहुत अधिक खुली फ़ाइलों की समस्याएँ वेबसाइटों और विशाल डेटाबेस केंद्रों में आसानी से हो सकती हैं।

यह लेख त्रुटि को हल करने के तरीके को साझा करने के लिए है: [त्रुटि] स्वीकार करने में त्रुटि: बहुत सारी खुली फ़ाइलें। सर्वर अनुकूलन और समस्या समाधान के बारे में अधिक जानकारी के लिए, कृपया देखें:

  1. थोड़ी देर के लिए चित्रों को उड़ने दो! वेबसाइट छवि वेबपी प्रारूप बैच रूपांतरण सेटिंग्स और त्वरित प्रभाव अनुभव
  2. व्यक्तिगत फ़ाइल बैकअप और डेटा क्लाउड स्टोरेज बनाने के लिए चतुराई से Youpai Cloud FTP और Nut Cloud WebDAV का उपयोग करें
  3. वीपीएस होस्ट और सर्वर सुरक्षा सुरक्षा: एसएसएच पोर्ट संशोधन, श्वेतसूची जोड़, केवल कुंजी लॉगिन

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 प्रतिबंध देखें

स्थानीय मशीन के open_files_limit: को देखने के लिए कमांड का उपयोग करें: urimit -a

[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 सीमाएँ संशोधित करें.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 द्वारा खोली गई फ़ाइल डिस्क्रिप्टर सीमा लिनक्स ऑपरेटिंग सिस्टम की फ़ाइल डिस्क्रिप्टर सीमा है, यानी डिफ़ॉल्ट 1024 है, और इसका Mysql कॉन्फ़िगरेशन फ़ाइल में open_files_limit सेटिंग से कोई लेना-देना नहीं है। इसलिए, यदि आप open_files_limit को संशोधित करना चाहते हैं, तो आपको पहले ऑपरेटिंग सिस्टम के open_files_limit को संशोधित करना होगा।

बेशक, यदि आप सिस्टम सेटिंग्स को संशोधित नहीं करना चाहते हैं, तो आप रूट खाते का भी उपयोग कर सकते हैं, MySQL शुरू करने के लिए mysqld_safe स्क्रिप्ट चला सकते हैं (या शुरू करने के लिए mysql.server का उपयोग कर सकते हैं), और कमांड जोड़ें: -ओपन-फाइलें- सीमा को सफलतापूर्वक सेट किया जा सकता है, क्योंकि जब 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 |
+------------------+-------+

उत्तर छोड़ दें