MySQL không thể mở tệp sau khi cập nhật máy chủ: errno: 24


16

Ubuntu: 12.04 LTS (Linux mysql02 3.2.0-40-generic # 64-Ubuntu SMP Mon Mar 25 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux)

MySQL: Bản phân phối Ubuntu 5.5.31

Apparmor: KHÁM PHÁ !

Máy chủ đã hoạt động ổn định trong hơn một năm. Sau đó, thứ hai này MySQL đã bắt đầu thất bại. Một bản cập nhật đã gây ra vấn đề và chúng tôi không thể tìm ra nó là gì. Chúng tôi thậm chí đã cố gắng quay trở lại MySQL 5.5.30 nhưng không có may mắn. Chúng tôi trở lại vào 5.5.31.

Các mục nhật ký lỗi của MySQL:

130430  7:55:46 [ERROR] Error in accept: Too many open files
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fclvod.frm' (errno: 24)
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fcnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcont.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcontv.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/frcfcl.frm' (errno: 24)

Có vẻ như chúng ta đang chạy vào vấn đề ulimit. Chúng tôi đã loại bỏ hoàn toàn APPARMOR. Chúng tôi đã tăng /etc/security/limits.conf và vẫn không gặp may:

# Out of desperation....
* soft  nofile  49152
* hard  nofile  65536

# No effect!?!!?
#mysql  soft  nofile  49152
#mysql  hard  nofile  65536

Và để hiển thị các giới hạn. Thông tin đang hoạt động:

root@mysql02:/etc/security# ulimit -Sa | grep "open files"
open files                      (-n) 49152

root@mysql02:/etc/security# ulimit -Ha | grep "open files"
open files                      (-n) 65536

Và đây là những mục quan trọng trong my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Tuy nhiên:

root@mysql02:/etc/mysql# mysqladmin -u root -pThePassword variables| grep open_files_limit
open_files_limit                                  | 1024

Chúng tôi hoàn toàn bối rối và suy sụp. Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao.


1
Có thông báo lỗi nào trong nhật ký TRƯỚC một thông báo về Quá nhiều tệp đang mở? Bạn đã khởi động lại mysqld kể từ khi thay đổi open_files_limit, phải không?
Bert

vâng, chúng tôi đã khởi động lại MySQL mỗi khi chúng tôi thực hiện thay đổi. Chúng tôi có một bảng bị thiếu (và vì lý do nào đó): 30430 8:36:39 InnoDB: Lỗi: cố mở bảng, nhưng không thể InnoDB: mở tệp không gian bảng './oti_lw_prod/apinvoice_chargees .ibd '!
Văn

FYI, chúng tôi đã chuyển người dùng của chúng tôi sang chủ nhân khác (thiết lập chủ đấu tay đôi) sever (01) và hiện tại nó đang biểu hiện các triệu chứng chính xác tương tự. Nó (01) có cấu hình chính xác giống như máy chủ bị lỗi này (02) và là lỗi của chúng tôi đối với chủ nhân nếu cái này (02) chết. Chà, rất nhiều cho kế hoạch đó. Chúng tôi khá chắc chắn rằng đây là một vấn đề hệ điều hành.
Văn

Tôi chắc chắn rằng điều này không hoạt động cho Poster gốc, nhưng đối với tôi điều này đã xảy ra sau khi cập nhật bảo mật và khởi động lại mysql là đủ.
Kzqai

Câu trả lời:


19

HĐH: Triển khai Ubuntu (Debian)

Tùy chọn máy chủ MySQL: giới hạn tệp mở

Có vẻ như Debian upstart không sử dụng các tham số được xác định trong /etc/security/limits.conf , vì vậy khi bạn khởi chạy mysql thông qua lệnh dịch vụ (và do đó, dưới sự khởi đầu), nó sẽ ghi đè các giới hạn đã xác định đó và sử dụng 1024 mặc định .

Giải pháp là để thay đổi mysql.conf tập tin định nghĩa các dịch vụ mới nổi, nó nằm trong /etc/init/mysql.conf và thêm những dòng sau đây trước khi các pre-start khối:

# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000

Người giới thiệu:


Thất vọng điều này không được ghi lại rõ ràng ở đâu đó. :( Chúng tôi chỉ tình cờ thấy bài đăng của David trên serverfault.
Van

Và đây không phải là một lỗi, theo điều này: bug.launchpad.net/mysql-server/+orms/938669
Van

Điều này có thể trở nên đột ngột và đáng báo động, rõ ràng sau khi thêm phân vùng vào các bảng có thể gây ra sự gia tăng các tệp đang mở.
markdwhite 17/2/2016

Điều này làm việc cho tôi trên Ubuntu 15.10. Sau khi nâng cấp các gói có hàng tấn thông báo lỗi 'Không thể mở tệp', đã phá vỡ tất cả các trang web của tôi: (... Cảm ơn một triệu người đã tiết kiệm cho tôi rất nhiều đau đầu và thời gian.
Emmanuel

bất cứ ai có thể giải thích khối "trước khi bắt đầu" là gì? Tôi đang chạy Ubuntu 16 và gặp sự cố này nhưng tệp cấu hình trông khác so với trước đây
billynoah

4

Có vấn đề tương tự trên Ubuntu 15.10.

https://bugs.launchpad.net/ubfox/+source/mysql-5.6/+orms/1434758 - đã mang đến giải pháp:

  1. kiểm tra xem /lib/systemd/system/mysql.service hoặc /lib/systemd/system/mysqld.service đã tồn tại chưa
  2. (trong trường hợp của tôi) nếu không, hãy tạo /lib/systemd/system/mysql.service và sao chép nội dung của tệp này https://bugs.launchpad.net/ubfox/+source/mysql-5.6/+orms/1434758/ Nhận xét / 11 và thêm hai dòng ở đâu đó trong tệp

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. nếu có một hoặc cả hai tệp, hãy kiểm tra xem hai dòng này có được bao gồm không:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. hành hình systemctl daemon-reload

... Và mọi thứ sẽ ổn thôi.


1

Vì không có vấn đề nào ở trên khắc phục được sự cố cho tôi (chỉ dẫn đến hệ thống hết bộ nhớ), đây là giải pháp tôi tìm thấy:

Trong /etc/mysql/my.confbạn cần tăng MySQL nội bộ open_files_limit. Vì vậy, tạm thời thêm nó vào cấu hình và khởi động lại MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Sau khi chạy thao tác cung cấp cho bạn quá nhiều lỗi mở tệp , bạn có thể thay đổi cấu hình của mình trở lại mặc định và khởi động lại MySQL.


cái này hiệu quả với tôi trên Ubuntu 16.04, cảm ơn :)
Richard Frank

0

Cảm ơn bạn đã giải quyết. Nhưng đối với tôi, vấn đề đã bị lu mờ bởi hai sự thật khác.

  1. Thư mục dữ liệu của tôi khác với cài đặt mặc định. Vì nhiều lý do, cả lịch sử và kỹ thuật.
  2. Tôi đã nâng cấp từ một bản cài đặt rất cũ, trải qua một số cổng quay lại và chuyển tiếp. Khi bắt đầu một MySQL 5.5 mới được cài đặt, công cụ InnoDB không được kích hoạt (triển khai nội bộ đã bị vô hiệu hóa trong tệp cấu hình, nhưng plugin có sẵn trong các phiên bản trước không có trong 5.5) và dấu nâng cấp đã được tạo mà không thực sự nâng cấp bất kỳ bảng.

Sau khi sửa lỗi InnoDB, nó vẫn còn nhổ

mysql> SHOW DATABASES;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 24)

Tôi đã phải khởi động mysqld trong bảng điều khiển gốc và tự khởi động lại

/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --force

Sau đó, máy chủ bắt đầu hiển thị cơ sở dữ liệu, nhưng không thể truy cập vào một số bảng. Cách giải quyết của bạn với các giới hạn tăng đã khắc phục các vấn đề còn lại, cảm ơn bạn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.