6.3.4 계정 자원 제한 설정
MySQL 서버 리소스의 사용을 제한하는 방법 중 하나는 글로벌 max_user_connections
시스템 변수를 0이 아닌 값으로 설정하는 것입니다. 이렇게하면 특정 계정에서 실행 할 수있는 동시 연결 수가 제한되지만, 일단 클라이언트가 연결되면 실행 내용에는 제한이 부과되지 않습니다. 또한 max_user_connections
을 설정해도 각 계정의 관리는 사용할 수 없습니다. 두 가지 유형의 제어도 많은 MySQL 관리자 (특히 인터넷 서비스 공급자의 직원)에게 관심이있는 것입니다.
MySQL 5.6에서는 각 계정에 대해 다음의 서버 리소스 사용을 제한 할 수 있습니다.
계정이 1 시간마다 발행 할 쿼리 수
계정이 1 시간마다 발행 할 업데이트의 수
계정이 1 시간마다 서버에 연결할 수있는 횟수
계정으로 서버에 동시 연결 수
쿼리 제한에서 클라이언트가 발행 할 수있는 문이 계산됩니다 (그 결과가 쿼리 캐시에서 제공되는 경우는 제외). 업데이트 제한에 대해 데이터베이스 또는 테이블을 변경하는 명령문 만 카운트됩니다.
이러한 맥락에서 "계정"은 mysql.user
테이블의 행에 대응하고 있습니다. 즉, 연결에 적용되는 user
테이블 행의 User
와 Host
값에 연결이 평가됩니다. 예를 들어, 계정 'usera'@'%.example.com'
는 example.com
도메인의 모든 호스트에서 연결을 usera
허용하기 위해 usera
및 %.example.com
의 User
와 Host
값을 있는 user
테이블의 행에 대응하고 있습니다. 이 경우 이러한 연결은 모두 같은 계정이 사용되기 때문에 서버는 usera
에 따르면 example.com
도메인의 모든 호스트로부터의 모든 연결이 줄 자원 제한을 정리하고 적용합니다.
MySQL 5.0.3 이전에서는 사용자의 연결 원일 실제 호스트에 대해 "계정"이 평가되어있었습니다. --old-style-user-limits
옵션을 사용하여 서버를 시작하면이 오래된 계정 방식을 선택할 수 있습니다. 이 경우 usera
가 host1.example.com
과 host2.example.com
에서 동시에 연결하면 서버는 각 연결에 개별적으로 계정 자원 제한을 적용합니다. usera
가 host1.example.com
다시 연결하면 서버는 호스트에서 기존 연결하고, 그 연결에 대한 제한을 적용합니다.
계정에 자원 제한을 설정하려면 GRANT
문을 사용합니다 ( 섹션 13.7.1.4 "GRANT 구문" 을 참조하십시오). 제한되는 각 자원의 이름을 지정하는 WITH
절을 지정합니다. 각 제한의 기본값은 영 (제한 없음)입니다. 예를 들어, 제한된 방식으로 만 customer
데이터베이스에 액세스 할 새 계정을 만들려면 다음과 같은 명령문을 발행합니다.
mysql>CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank';
mysql>GRANT ALL ON customer.* TO 'francis'@'localhost'
->WITH MAX_QUERIES_PER_HOUR 20
->MAX_UPDATES_PER_HOUR 10
->MAX_CONNECTIONS_PER_HOUR 5
->MAX_USER_CONNECTIONS 2;
제한 타입의 이름을 모두 WITH
절에 지정할 필요는 없지만, 이름을 지정한 것은 임의의 순서로 표시 할 수 있습니다. 시간별 각 제한 값은 시간당 횟수를 나타내는 정수로하도록하십시오. MAX_USER_CONNECTIONS
에서는 제한된 계정에 의한 최대 동시 연결 수를 나타내는 정수입니다. 이 제한을 제로로 설정되어있는 경우, 글로벌 max_user_connections
시스템 변수의 값에 따라 동시 연결 수가 결정됩니다. max_user_connections
도 제로인 경우는 계정에 제한이 없습니다.
계정에 대한 기존의 제약을 변경하려면 글로벌 수준 ( ON *.*
)에서 GRANT USAGE
명령문을 사용합니다. 다음 명령문은 francis
대한 쿼리 제한을 100로 변경합니다.
mysql>GRANT USAGE ON *.* TO 'francis'@'localhost'
->WITH MAX_QUERIES_PER_HOUR 100;
이 문은 지정된 제한 값만을 변경하고 다른 계정은 변경되지 않은 상태로합니다.
제한을 제거하려면 그 값을 0으로 설정합니다. 예를 들어, francis
가 연결 시간당 횟수에 대한 제한을 제거하려면 다음 문을 사용합니다.
mysql>GRANT USAGE ON *.* TO 'francis'@'localhost'
->WITH MAX_CONNECTIONS_PER_HOUR 0;
이미 설명했듯이 계정에 대한 동시 연결 제한은 MAX_USER_CONNECTIONS
제한 및 max_user_connections
시스템 변수에 의해 결정됩니다. 글로벌 max_user_connections
값이 10이고, 3 개의 계정을 GRANT
를 사용하여 지정된 자원 제한을 가지고 있다고 가정합니다.
GRANT ... TO 'user1'@ 'localhost'WITH MAX_USER_CONNECTIONS 0; GRANT ... TO 'user2'@ 'localhost'WITH MAX_USER_CONNECTIONS 5; GRANT ... TO 'user3'@ 'localhost'WITH MAX_USER_CONNECTIONS 20;
user1
의 MAX_USER_CONNECTIONS
은 제로이기 때문에 연결 제한은 10 (글로벌 max_user_connections
값)입니다. user2
및 user3
의 MAX_USER_CONNECTIONS
0이 아닌이기 때문에 연결 제한은 각각 5와 20입니다.
서버는 계정에 해당하는 user
테이블 행에 계정에 대한 자원 제한을 저장합니다. max_questions
, max_updates
또는 max_connections
컬럼에는 시간당 제한이 포함되어 max_user_connections
컬럼은 MAX_USER_CONNECTIONS
제한이 포함됩니다. 섹션 6.2.2 "권한 시스템 부여 테이블" 을 참조하십시오.
모든 계정에 의한 자원 중 하나의 사용에 제로 이외의 제한이 설정되어있는 경우 자원 사용 카운트가 발생합니다.
서버가 실행되면 각 계정이 자원을 사용하는 횟수가 계산됩니다. 지난 1 시간 이내에 계정이 연결 수에 대한 제한에 도달하면 해당 시간이 경과 할 때까지 해당 계정에 의한 이후의 연결이 거부됩니다. 마찬가지로, 계정이 쿼리 나 업데이트 횟수에 대한 제한에 도달 한 경우에도 그 시간이 경과 할 때까지 이후의 쿼리 또는 갱신이 거부됩니다. 이러한 경우는 모든 적절한 오류 메시지가 발행됩니다.
리소스 카운트는 각 클라이언트가 아닌 계정마다 실행됩니다. 예를 들어, 계정의 쿼리 제한이 50 인 경우는 서버에 두 개의 동시 클라이언트 연결을 만들어도 제한을 100으로 증가 할 수 없습니다. 두 연결에서 발행 된 쿼리를 함께 계산됩니다.
현재 1 시간마다 자원 사용 카운트는 모든 계정에 대해 전체적으로 재설정하거나 특정 계정에 대해 개별적으로 재설정 할 수 있습니다.
모든 계정에 대해 현재의 카운트를 0으로 재설정하려면
FLUSH USER_RESOURCES
문 발행합니다. 또한 (예를 들어,FLUSH PRIVILEGES
명령문 또는 mysqladmin reload 명령을 사용하여) 부여 테이블을 다시로드하여 카운트를 재설정 할 수 있습니다.각 계정의 제한 중 하나를 다시 부여하면 그 수를 0으로 설정할 수 있습니다. 이렇게는 전술 한 바와 같이
GRANT USAGE
를 사용하여 계정이 현재 가지고있는 값과 동일한 제한을 지정합니다.
카운터를 재설정해도 MAX_USER_CONNECTIONS
제한은 영향을받지 않습니다.
서버가 시작되면 모든 카운트가 제로에서 시작됩니다. 다시 시작되면 카운트가 이월되지 않습니다.
MAX_USER_CONNECTIONS
제한은 계정이 허용되는 최대 연결 수를 현재 열려있는 경우에 가장자리 경우가 발생할 수 있습니다. 연결이 발생하는 시점까지 서버에서 절단이 완전히 처리되지 않은 경우, 절단 후 바로 연결하면 오류 ( ER_TOO_MANY_USER_CONNECTIONS
또는 ER_USER_LIMIT_REACHED
)가 발생할 수 있습니다. 서버에서 절단 처리가 완료되면 다른 연결이 다시 허용됩니다.