태그 보관물: mysql

mysql

VPN에서 실행중인 MySQL에서 너무 많은 연결 및 치명적인 오류를 해결하는 방법 1040) : 연결이 너무 많습니다 phpMyAdmin과 함께 서버에서

리 노드 서버에서 응용 프로그램 PHPlist를 실행하고 동시에 12 개의 PHP 스크립트를 실행하는데, 각 스크립트는 MySQL 연결을 엽니 다. 이제 PHPlist에 액세스하면 종종이 오류가 표시됩니다.

치명적인 오류 : 죄송합니다. 서버가 현재 너무 바쁩니다. 나중에 다시 시도하십시오.

phpMyAdmin에 액세스하려고하면 # 1040 오류가 표시됩니다. cron작업을 통해 실행되는 PHP 스크립트의 결과는 다음과 같습니다.

PHP 경고 : mysqli_connect () : (HY000 / 1040) : 연결이 너무 많습니다

phpMyAdmin과 함께 서버에서 LAMP 스택을 사용하고 있습니다. top터미널 의 출력은 mysqld100-130 % CPU 사용을 보여줍니다 . 이 문제를 해결하려고 할 때 몇 가지 단서가 있습니다.

  • max_connection 변수 늘리기 : 200을 사용하고 있습니다 (기본적으로 100).
  • 오픈 테이블 캐시 : 512 (기본적으로 400)

설정할 변수가 많이 있지만 특정 변수를 결정할 수 없으므로
너무 많은 연결
http://dev.mysql.com/doc/refman/5.5/en/table-cache에서 참조가 발생합니다. html

그러나 내 사용법에 따르면 메모리를 늘리는 방법과 최대 메모리는 무엇입니까?

내 서버에서 약 12 ​​개의 PHP 스크립트, 이메일 전송을위한 PHPlist 응용 프로그램 및 사용자 등록을위한 주요 데이터베이스를 사용하고 있습니다.

이 문제를 해결하도록 도와주세요.



답변

먼저이 쿼리를 실행해야합니다.

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

SUPER 권한 이있는 모든 사용자가 나열 됩니다 . 애플리케이션 관련 DB 처리를 수행하는 대부분의 사용자는이 권한이 필요하지 않습니다. MySQL Documentation 에 따르면 SUPER 권한이있는 사용자는 다음을 수행 할 수 있습니다.

  • 복제 좌표를 제어하기 위해 CHANGE MASTER TO를 실행하십시오.
  • mysqladmin kill다른 계정에 속한 스레드를 죽이거나 죽이는 행위
  • 이진 로그를 제거하여 이진 로그를 체계적으로 삭제
  • SET GLOBAL을 사용하여 구성을 변경하여 전역 시스템 변수를 수정하십시오.
  • mysqladmin 디버그 명령
  • 로깅 활성화 또는 비활성화
  • * read_only * 시스템 변수가 활성화 된 경우에도 업데이트 수행
  • 슬레이브 서버에서 복제 시작 및 중지
  • 저장된 프로그램 및보기의 DEFINER 속성에있는 계정의 스펙
  • 가장 중요한 문제는 다음과 같습니다 . : max_connections 시스템 변수에 의해 제어되는 연결 한계 에 도달 한 경우에도 한 번 연결할 수 있습니다 .

root @ localhost로 로그인하여 다음과 같이 SUPER 권한을 취소해야합니다.

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

이 작업을 수행하면 모든 사용자가 mysql 연결을 초과 할 때마다 root@localhost로그인 만 할 수 있습니다. 결국, 모든 사람과 할머니가 슈퍼 특권을 가졌다면, 이것은 root@localhost다른 사람들보다 먼저 연결되는 것을 방해 할 것입니다. max_connections가 200에 있고 mysqld를 다시 시작하지 않고 300으로 올려야하는 경우 다음 명령을 사용 하여 max_connections 를 동적으로 늘릴 수 있습니다 .

mysql> SET GLOBAL max_connections = 300;

이렇게하면 더 많은 연결을 즉시 적용 할 수 있지만 임의로 숫자를 임의로 늘리지는 않습니다. 당신은 mysql이 증가를 수용하기에 충분한 RAM을 가지고 있는지 확인해야한다.

주의 사항 : max_connections를 300으로 동적으로 변경하면 /etc/my.cnf에 넣으십시오.

[mysqld]
max_connections=300

MySQL DB 서버에서 mysqltuner.pl을 실행할 수 있습니다. 없는 경우 다음을 실행하십시오.

cd
wget mysqltuner.pl
perl mysqltuner.pl

실적 측정 항목 아래의 세 번째 줄에는

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

스레드 당 5.4M 참조? max_connections로 곱해집니다. 이 예에서는 최대 약 10.8G의 RAM이됩니다. 따라서 max_connections를 사용할 때마다 mysqltuner.pl을 실행하고 너무 많은 메모리에 대해 OS를 누르는지 확인해야합니다.

어쨌든 SUPER 권한을 가진 사람을 제한하면 그러한 사용자는 mysqld를 DB Connections로 넘치게 할 수 있습니다.


답변

  1. 전역 변수 max_connections는 MySQL에 대한 최대 동시 연결 수를 결정합니다. 이 변수의 값이 높은지 확인하십시오. 이 값을 300 또는 400으로 늘리고이 설정 후에 MySQL을 다시 시작해보십시오.
  2. MySQL 연결이 매우 짧은 시간 동안 열려 있도록 응용 프로그램을 설계하십시오.
  3. 또한 클라이언트 코드가 영구 연결 (예 : mysql_pconnect ())을 잘못 사용하고 있지 않은지 확인해야합니다.

또한 Flush status;이 값을 줄이려면 MySQl 서버에서 명령을 실행하십시오 .

이러한 제안이 도움이되기를 바랍니다.


답변

디스크가 꽉 찼는 지 확인하십시오. 동일한 오류가 발생할 수 있습니다.

df -h

각 파티션의 남은 공간이 표시되면 루트 파티션을 확인해야합니다 /(또는 추가 파티션이있는 경우 / var /).

df -h /

답변