MySQL은 서버를 업데이트 한 후 파일을 열 수 없습니다 : errno : 24


16

우분투 : 12.04 LTS (Linux mysql02 3.2.0-40 제네릭 # 64- 우분투 SMP 월요일 3 월 25 일 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux)

MySQL : 우분투 배포판 5.5.31

복장 : 제거되었습니다!

서버는 1 년 넘게 견실 히 운영되고 있습니다. 그런 다음 월요일에 MySQL이 실패하기 시작했습니다. 업데이트로 문제가 발생하여 문제를 파악할 수 없습니다. 심지어 MySQL 5.5.30으로 롤백하려고 시도했지만 운이 없습니다. 우리는 5.5.31에 돌아 왔습니다.

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)

ulimit 문제가 발생했습니다. APPARMOR을 완전히 제거했습니다. /etc/security/limits.conf를렸지만 여전히 운이 없습니다 :

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

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

그리고 limits.conf 가 작동 하고 있음을 보여주기 위해 :

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

그리고 여기 my.cnf 의 중요한 항목이 있습니다

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

하나:

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

우리는 완전히 무너졌다. 도움을 주시면 감사하겠습니다.


1
열린 파일이 너무 많기 전에 로그에 어떤 오류 메시지가 표시됩니까? open_files_limit를 변경 한 후 mysqld를 다시 시작 했습니까?
Bert

예, 변경할 때마다 MySQL을 다시 시작했습니다. 우리는 누락 된 것으로보고 된 하나의 테이블을 가지고 있습니다 (그리고 어떤 이유로 든). .ibd '!
Van

참고로, 사용자를 다른 마스터 (듀얼 마스터 설정) 서버 (01)로 옮겼으며 이제 동일한 증상이 나타납니다. 이 서버 (01)는이 장애 서버 (02)와 동일한 구성을 가지고 있으며이 서버 (02)가 죽으면 장애 조치 마스터입니다. 글쎄요, 그 계획에 너무 많은. 우리는 이것이 OS 문제라는 것을 확신합니다.
Van

나는 이것이 Original Poster에서 작동하지 않았다고 확신하지만 보안 업데이트 후에이 문제가 발생했으며 mysql을 다시 시작하면 충분합니다.
Kzqai 2016 년

답변:


19

운영체제 : Ubuntu (Debian) deployment

MySQL 서버 옵션 : open-files-limit

데비안 upstart/etc/security/limits.conf에 정의 된 파라미터를 사용하지 않는 것 같습니다 . 따라서 서비스 명령을 통해 mysql을 시작하면 (upstart에서) 정의 된 한계를 무시하고 기본 1024를 사용합니다 .

이 솔루션은 수정하는 것입니다 mysql.conf의 가에 위치하고 있으며, 신출내기 서비스를 정의 파일을 /etc/init/mysql.conf 다음과 같은 라인을 추가 하기 전에 사전 시작 블록 :

# 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

참고 문헌 :


이 점에 실망하는 것은 어딘가에 명확하게 문서화되어 있지 않습니다. :( 우리는 방금 serverfault에 David의 포스트에 일어났다.
Van

그리고 이것은 버그가 아닙니다 : bugs.launchpad.net/mysql-server/+bug/938669
Van

테이블에 파티션을 추가 한 후에 갑자기 파일이 커질 수 있습니다.
markdwhite

이것은 우분투 15.10에서 나를 위해 일했습니다. 나에게 두통을 많이하고 시간을 절약하기위한 (백만을 감사 : 업그레이드 패키지 내 모든 사이트를 부러 오류 메시지, '파일을 열 수'의 톤을 얻었다 후.
엠마누엘

누구나 "사전 시작"블록이 ​​무엇인지 설명 할 수 있습니까? 우분투 (16)을 실행하고이 문제가 발생하지만, 설정 파일은 이전과 다르게 표시 될거야
billynoah

4

우분투 15.10에서 같은 문제가있었습니다.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758- 솔루션을 가져 왔습니다.

  1. /lib/systemd/system/mysql.service 또는 /lib/systemd/system/mysqld.service가 있는지 확인하십시오.
  2. (필자의 경우) /lib/systemd/system/mysql.service를 작성하고이 파일의 내용을 https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/에 복사 하십시오. 의견 / 11 및 파일 어딘가에 두 줄 추가

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. 하나 또는 두 개의 파일이 모두 존재하면이 두 줄이 포함되어 있는지 확인하십시오.

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. 실행하다 systemctl daemon-reload

... 그리고 모든 것이 잘되어야합니다.


1

위의 어느 것도 나를 위해 문제를 해결하지 않았기 때문에 (메모리가 부족한 시스템으로 만 이어짐) 내가 찾은 해결책은 다음과 같습니다.

에서 /etc/mysql/my.conf당신은 MySQLs에게 internal open_files_limit을 증가해야합니다. 따라서 이것을 일시적으로 구성에 추가하고 MySQL을 다시 시작하십시오.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

너무 많은 열린 파일 오류가 발생 하는 작업을 실행 한 후 구성을 기본값으로 다시 변경하고 MySQL을 다시 시작할 수 있습니다.


이것은 Ubuntu 16.04에서 나를 위해 일했습니다. 감사합니다 :)
Richard Frank

0

해결 방법에 감사드립니다. 그러나 나 에게이 문제는 다른 두 가지 사실에 의해 어두워졌습니다.

  1. 내 데이터 디렉토리가 기본 설치와 다릅니다. 여러 가지 이유로 역사적과 기술적 측면이 있습니다.
  2. 나는 아주 오래된 설치에서 업그레이드를했는데, 그것은 많은 백 포트 및 포워드 포트를 통과했습니다. 새로 설치된 MySQL 5.5를 처음 시작할 때 InnoDB 엔진이 활성화되지 않았으며 (내부 구현은 구성 파일에서 비활성화되었지만 이전 버전에서 사용 가능한 플러그인은 5.5에 없음) 실제로 업그레이드하지 않고 업그레이드 표시가 작성되었습니다 모든 테이블.

InnoDB 문제를 해결 한 후에도 여전히 뱉어졌습니다.

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

루트 콘솔에서 mysqld를 시작하고 수동으로 다시 시작해야했습니다.

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

그런 다음 서버가 데이터베이스를 표시하기 시작했지만 일부 테이블에 액세스 할 수 없습니다. 한계가 증가한 문제는 나머지 문제를 해결했습니다. 감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.