서버를 업데이트한 후 MySQL이 파일을 열 수 없습니다: 오류 번호: 24

서버를 업데이트한 후 MySQL이 파일을 열 수 없습니다: 오류 번호: 24

우분투: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:우분투 배포판 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

그리고 보여주기 위해제한.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

그리고 여기에 중요한 항목이 있습니다.내.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

운영체제:Ubuntu(Debian) 배포

MySQL 서버 옵션:열린 파일 제한

데비안인거 같은데갑자기 나타나다다음에 정의된 매개변수를 사용하지 않습니다./etc/security/limits.conf, 따라서 다음을 통해 mysql을 시작할 때서비스명령(따라서 upstart에서)은 정의된 제한을 무시하고 기본값 1024를 사용합니다.

해결책은 다음을 수정하는 것입니다.mysql.confupstart 서비스를 정의하는 파일은 다음 위치에 있습니다./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

참고자료:

답변2

Ubuntu 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/comments/11파일 어딘가에 두 줄을 추가하십시오

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

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

... 그리고 모든 것이 괜찮을 것입니다.

답변3

위의 방법 중 어느 것도 문제를 해결하지 못했기 때문에(시스템 메모리 부족으로 이어질 뿐임) 제가 찾은 해결책은 다음과 같습니다.

/etc/mysql/my.confMySQL 내부 open_files_limit를 늘려야 합니다 . 따라서 이것을 일시적으로 구성에 추가하고 MySQL을 다시 시작하십시오.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

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

답변4

해결 방법을 알려주셔서 감사합니다. 그러나 나에게 있어서 이 문제는 다른 두 가지 사실에 의해 가려졌습니다.

  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

그런 다음 서버가 데이터베이스를 표시하기 시작했지만 일부 테이블에 액세스할 수 없습니다. 제한을 늘린 해결 방법으로 나머지 문제가 해결되었습니다. 감사합니다!

관련 정보