Loading...
MySQL 9.5 Reference Manual 9.5의 8.2.21 Setting Account Resource Limits의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL 서버 리소스에 대한 클라이언트 사용을 제한하는 한 가지 방법은 글로벌 max_user_connections 시스템 변수를 0이 아닌 값으로 설정하는 것입니다. 이는 특정 계정이 만들 수 있는 동시 연결 수를 제한하지만, 일단 연결된 후 클라이언트가 무엇을 할 수 있는지에 대해서는 아무 제한도 두지 않습니다. 또한 max_user_connections를 설정하더라도 개별 계정에 대한 관리 기능을 제공하지는 않습니다. 두 가지 형태의 제어 모두 MySQL 관리자에게 중요합니다.
이러한 우려를 해결하기 위해, MySQL은 개별 계정에 대해 다음과 같은 서버 리소스 사용에 대한 제한을 허용합니다:
계정이 시간당 발행할 수 있는 쿼리 수
계정이 시간당 발행할 수 있는 업데이트 수
계정이 서버에 시간당 연결할 수 있는 횟수
계정이 서버에 가질 수 있는 동시 연결 수
클라이언트가 발행할 수 있는 모든 문장은 쿼리 제한에 포함됩니다. 데이터베이스나 테이블을 수정하는 문장만 업데이트 제한에 포함됩니다.
이 문맥에서의 “계정”은 mysql.user 시스템 테이블의 한 행에 해당합니다. 즉, 연결은 해당 연결에 적용되는 user 테이블 행의 User 및 Host 값에 따라 평가됩니다. 예를 들어, 'usera'@'%.example.com' 계정은 user 테이블에서 User와 Host 값이 각각 usera와 %.example.com인 행에 해당하여, usera가 example.com 도메인 내의 어떤 호스트에서든 접속할 수 있도록 허용합니다. 이 경우 서버는 이 행에 있는 리소스 제한을 example.com 도메인 내의 어떤 호스트에서든 usera에 의해 이루어지는 모든 연결에 대해 통합적으로 적용합니다. 왜냐하면 그러한 모든 연결이 동일한 계정을 사용하기 때문입니다.
계정 생성 시점에 계정에 대한 리소스 제한을 설정하려면 CREATE USER 문장을 사용하십시오. 기존 계정에 대한 제한을 수정하려면 ALTER USER를 사용하십시오. 제한할 각 리소스를 이름으로 지정하는 WITH 절을 제공합니다. 각 제한의 기본값은 0(무제한)입니다. 예를 들어, customer 데이터베이스에 접근할 수 있지만 제한된 방식으로만 사용 가능한 새 계정을 생성하려면 다음과 같은 문장을 발행합니다:
1mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank' 2 -> WITH MAX_QUERIES_PER_HOUR 20 3 -> MAX_UPDATES_PER_HOUR 10 4 -> MAX_CONNECTIONS_PER_HOUR 5 5 -> MAX_USER_CONNECTIONS 2;
제한 유형들은 모두 WITH 절에서 이름을 지정할 필요는 없으며, 지정된 항목들은 어떤 순서로든 존재할 수 있습니다. 각 시간당 제한에 대한 값은 시간당 횟수를 나타내는 정수여야 합니다. MAX_USER_CONNECTIONS의 경우, 제한은 해당 계정에 허용되는 최대 동시 연결 수를 나타내는 정수입니다. 이 제한이 0으로 설정된 경우, 동시 연결 수는 글로벌 max_user_connections 시스템 변수 값에 의해 결정됩니다. max_user_connections 역시 0이면, 해당 계정에 대한 제한은 존재하지 않습니다.
기존 계정에 대한 제한을 수정하려면 ALTER USER 문장을 사용하십시오. 다음 문장은 francis의 쿼리 제한을 100으로 변경합니다:
1mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
이 문장은 지정된 제한 값만 수정하며, 그 외 계정 특성은 변경하지 않습니다.
제한을 제거하려면 그 값을 0으로 설정하십시오. 예를 들어, francis가 시간당 서버에 연결할 수 있는 횟수에 대한 제한을 제거하려면 다음 문장을 사용합니다:
1mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
앞서 언급했듯이, 계정에 대한 동시 연결 제한은 MAX_USER_CONNECTIONS 제한과 max_user_connections 시스템 변수에서 결정됩니다. 글로벌 max_user_connections 값이 10이고 세 개의 계정에 대해 개별 리소스 제한이 다음과 같이 지정되어 있다고 가정합니다:
1ALTER USER 'user1'@'localhost' WITH MAX_USER_CONNECTIONS 0; 2ALTER USER 'user2'@'localhost' WITH MAX_USER_CONNECTIONS 5; 3ALTER USER 'user3'@'localhost' WITH MAX_USER_CONNECTIONS 20;
user1은 MAX_USER_CONNECTIONS 제한이 0이므로 글로벌 max_user_connections 값인 10의 연결 제한을 가집니다. user2와 user3은 0이 아닌 MAX_USER_CONNECTIONS 제한을 가지므로 각각 5와 20의 연결 제한을 가집니다.
서버는 계정에 대한 리소스 제한을 해당 계정에 해당하는 user 테이블 행에 저장합니다. max_questions, max_updates, max_connections 컬럼은 시간당 제한을, max_user_connections 컬럼은 MAX_USER_CONNECTIONS 제한을 저장합니다. (참고: Section 8.2.3, “Grant Tables”.)
어떤 계정에라도 어떤 리소스 사용에 대해 0이 아닌 제한이 부여되면 리소스 사용량 카운팅이 수행됩니다.
서버가 실행되는 동안 각 계정이 리소스를 사용한 횟수를 카운트합니다. 계정이 지난 한 시간 동안 연결 수에 대한 제한에 도달하면, 서버는 그 시간이 끝날 때까지 해당 계정의 추가 연결을 거부합니다. 마찬가지로, 계정이 쿼리 또는 업데이트 수에 대한 제한에 도달하면 서버는 그 시간이 끝날 때까지 추가 쿼리 또는 업데이트를 거부합니다. 이러한 모든 경우에 서버는 적절한 에러 메시지를 발생시킵니다.
리소스 카운팅은 클라이언트별이 아니라 계정별로 수행됩니다. 예를 들어, 귀하의 계정에 쿼리 제한이 50으로 설정되어 있다면, 두 개의 클라이언트 연결을 서버에 동시에 만들어 제한을 100으로 늘릴 수 없습니다. 두 연결에서 발행된 쿼리는 함께 카운트됩니다.
현재 시간당 리소스 사용량 카운트는 모든 계정에 대해 전역적으로, 또는 특정 계정에 대해 개별적으로 리셋할 수 있습니다:
모든 계정에 대해 현재 카운트를 0으로 리셋하려면 FLUSH USER_RESOURCES 문장을 발행하십시오. 또한 그랜트 테이블을 리로드하여 (for example, FLUSH PRIVILEGES 문장이나 mysqladmin reload 명령을 사용하여) 카운트를 리셋할 수 있습니다.
개별 계정에 대한 카운트를 0으로 리셋하려면, 해당 계정에 대한 제한 중 하나를 다시 설정하십시오. 이때 계정에 현재 할당된 값과 동일한 제한 값을 지정합니다.
시간당 카운터 리셋은 MAX_USER_CONNECTIONS 제한에는 영향을 주지 않습니다.
모든 카운트는 서버가 시작될 때 0에서 시작합니다. 카운트는 서버 재시작 시점에 이월되지 않습니다.
MAX_USER_CONNECTIONS 제한과 관련하여, 해당 계정이 현재 허용된 최대 연결 수만큼 연결을 열고 있는 경우 엣지 케이스가 발생할 수 있습니다: 연결 해제 직후에 이어지는 빠른 연결은, 서버가 연결 해제를 완전히 처리하기 전에 연결이 발생하면 에러(ER_TOO_MANY_USER_CONNECTIONS 또는 ER_USER_LIMIT_REACHED)를 유발할 수 있습니다. 서버가 연결 해제 처리를 완료하면, 또 다른 연결이 다시 허용됩니다.
8.2.20 Account Locking
8.2.22 Troubleshooting Problems Connecting to MySQL