Last Updated on 2월 28, 2023 by Jade(정현호)
안녕하세요~
이번 포스팅에서는 MySQL와 AWS RDS(+Aurora MySQL) 에서 사용중인 파라미터를 조회하는 여러가지 방법과 파라미터 설정 내역에 대한 비교 등을 확인 하는 몇가지의 방법에 대해서 전반적으로 확인 해보도록 하겠습니다.
• 포스팅 시스템의 DB 버전
AWS Aurora MySQL 3.02.10
AWS RDS for MySQL 8.0.23
온프레미스 MySQL 8.0.23
파라미터 현황 확인
먼저 파라미터 와 값을 확인 하는 여러가지 방법에 대해서 부터 살펴보도록 하겠습니다.
MySQL 에서 사용중인 파라미터의 값을 확인 하는 것은 가장 기본적으로 show variables 명령어를 사용하는 것 입니다.
mysql> show variables\G < ... 내용 중략 ...> 608 rows in set (0.00 sec)
8.0.23 버전 기준으로 608개 정도가 확인 되고 있습니다.
AWS RDS for MySQL 또는 Aurora MySQL 에서 모든 파라미터를 확인 하는 방법으로 먼저 사용중인 파라미터 그룹 자체를 확인 하는 방법 입니다.
파라미터 그룹에서 파라미터를 확인 하는 과정에서는 직접 파라미터 그룹을 찾아가는 방법이 있을 것 입니다.
파라미터 그룹은 RDS 메뉴 -> 파라미터 그룹 메뉴로 이동하여 파라미터 그룹을 직접 선택하여 내용을 확인 할 수 있습니다.
또는 RDS 인스턴스를 선택하여, 현재 사용중인 파라미터 그룹으로 찾아가는 방법도 있습니다.
AWS RDS 를 사용한다면 또 다른 방법으로 aws cli 를 통해서 조회 해볼 수 있습니다.
aws cli 에 대한 설치 및 기본 설정은 아래 글 목록에서 확인 하시면 됩니다.
- https://hoing.io/archives/1238#EC2
=> 에서 "AWS CLI 설치" 을 참조
- https://hoing.io/archives/1238#AWS_CLI
AWS Vault에 대한 부분은 아래 내용을 참조하시면 됩니다.
- https://hoing.io/archives/1238#aws-vault
파라미터 그룹 목록 조회
aws cli 셋팅을 완료 되었다면 aws cli 조회 옵션 중에서 describe-db-parameter-groups 를 통해서 profile 에 설정된 리전에 해당하는 모든 파라미터 그룹을 조회할 수 있습니다.
aws rds describe-db-parameter-groups \ --no-cli-pager
Note
aws cli 로 조회시 기본적으로 페이징 기능이 활성화 되어있습니다(eg more 명령어 사용과 유사)
모든 결과를 페이징 처리 없이 모두 출력 하고 싶다면 --no-cli-pager 옵션을 사용하면 됩니다
위와 같은 파라미터 출력 결과에서 --query 옵션을 사용하여 커스텀하게 원하는 유형으로 출력할 수 있습니다.
-- mysql8.0 의 파라미터 그룹만 출력 aws rds describe-db-parameter-groups \ --no-cli-pager \ --query "DBParameterGroups[?DBParameterGroupFamily == 'mysql8.0'].{DBParameterGroupName: DBParameterGroupName, DBParameterGroupFamily:DBParameterGroupFamily,Description: Description}" \ --output table -- aurora-mysql8.0 의 파라미터 그룹만 출력 aws rds describe-db-parameter-groups \ --no-cli-pager \ --query "DBParameterGroups[?DBParameterGroupFamily == 'aurora-mysql8.0'].{DBParameterGroupName: DBParameterGroupName, DBParameterGroupFamily:DBParameterGroupFamily,Description: Description}" \ --output table -- aurora-mysql8.0 과 mysql8.0 의 default 파라미터가 아닌 파라미터만 출력 aws rds describe-db-parameter-groups \ --no-cli-pager \ --query "DBParameterGroups[?(DBParameterGroupName != 'default.mysql8.0' && DBParameterGroupName != 'default.aurora-mysql8.0')].{DBParameterGroupName: DBParameterGroupName, DBParameterGroupFamily:DBParameterGroupFamily,Description: Description}" \ --output table
"aurora-mysql8.0 과 mysql8.0 의 default 파라미터가 아닌 파라미터만 출력" 에서 다른 종류의 rds 와 버전을 제외 하려면 && 를 사용하여 조건을 추가하여 조회하면 됩니다.
AWS Aurora DB 의 경우 DB Parameter Group 이외에 Cluster DB Parameter Group 이 별도로 존재 합니다. Cluster DB Parameter Group 는 describe-db-cluster-parameter-groups 으로 조회를 해야 합니다.
## 전체 Cluster DB Parameter Group 목록 조회 aws rds describe-db-cluster-parameter-groups \ --no-cli-pager \ ## default aurora mysql 파라미터가 아닌 파라미터만 출력 aws rds describe-db-cluster-parameter-groups \ --no-cli-pager \ --query "DBClusterParameterGroups[?(DBClusterParameterGroupName != 'default.aurora-mysql8.0' && \ DBClusterParameterGroupName != 'default.aurora-mysql5.7' \ && DBClusterParameterGroupName != 'default.aurora-postgresql13' \ )].{DBClusterParameterGroupName: DBClusterParameterGroupName, DBParameterGroupFamily:DBParameterGroupFamily,Description: Description}" \ --output table
다른 종류의 클러스터 db 파라미터를 제외 하려면 && 를 사용하여 조건을 추가하여 조회하면 됩니다.
파라미터 와 값 조회
이전 단계에서 파라미터 그룹을 조회 하였습니다. 그 다음으로 파라미터 그룹의 상세 내역을 조회를 해보도록 하겠습니다.
먼저 특정 DB Parameter group 안의 모든 파라미터 내역을 조회 하기 위해서는 아래와 같이 조회할 파라미터 그룹명을 이용하여 조회를 시도 하면 됩니다.
aws rds describe-db-parameters \ --db-parameter-group-name test-aurora-mysql-instance \ --no-cli-pager { "Parameters": [ { "ParameterName": "activate_all_roles_on_login", "ParameterValue": "0", "Description": "Automatically set all granted roles as active after the user has authenticated successfully.", "Source": "engine-default", "ApplyType": "dynamic", "DataType": "boolean", "AllowedValues": "0,1", "IsModifiable": true, "ApplyMethod": "pending-reboot" }, (... 내용 중략 ... )
기본 출력 format 은 json 임으로 key 와 1개 이상의 value 로 구성될 수 있습니다.
describe-db-parameters 의 조회결과가 모든 파라미터가 동일한 format으로 출력되는 것은 아니며, default 값을 그대로 사용한 파라미터는 ParameterValue 키와 value가 표현되지 않습니다.
파라미터 명 과 값(value) 이외에 더 많은 정보가 표기되어있어서 보는 환경에 따라서 table 형태의 output 보다 json format이 보기가 더 편할 수도 있습니다.
여러 항목중에서 특정 항목만 보고 싶다면 아래와 같이 query 절을 통해서 key(컬럼) 를 지정할 수 있습니다.
아래는 ParameterName 과 ParameterValue 만 출력한 것으로 default 값에서 변경하지 않은 파라미터의 value 는 null 로 표기 됩니다.
aws rds describe-db-parameters \ --db-parameter-group-name test-aurora-mysql-instance \ --no-cli-pager \ --query 'Parameters[].{ParameterName: ParameterName,ParameterValue: ParameterValue}'
위에서 설명한 것과 같이 값이 변경 되지 않은(default value) 파라미터는 ParameterValue 키의 값이 null 로 표시가 됩니다.
그렇다면 ParameterValue 키 값이 null 인 항목을 제외하게 된다면 그 리스트는 기본 파라미터에서 변경한 항목의 파라미터가 되는 것 입니다.
기본 값에서 변경한 파라미터 리스트는 아래와 같이 조회할 수 있습니다.
aws rds describe-db-parameters \ --db-parameter-group-name test-aurora-mysql-instance \ --no-cli-pager \ --query 'Parameters[?ParameterValue!='null'].[ParameterName, ParameterValue]'
위의 조회 내용은 DB Parameter Group 에 대한 내용으로 Aurora DB의 경우 Cluster DB Parameter Group 에 대한 조회도 필요 할 수 있습니다.
이전 단계에서 설명한 내용과 같이 Cluster DB Parameter Group 에 대한 목록은 describe-db-cluster-parameter-groups 으로 조회하며 Cluster DB Parameter 의 파라미터 정보는 describe-db-cluster-parameters 를 통해서 확인 할 수 있습니다.
위의 describe-db-parameters 조회 방법과 유사하게 describe-db-cluster-parameters 옵션을 사용하여 아래와 같이 조회할 수 있습니다.
## ParameterName 와 ParameterValue 필드만 조회 aws rds describe-db-cluster-parameters \ --db-cluster-parameter-group-name pg-an2-autolease-auroramysql-cluster \ --no-cli-pager \ --query 'Parameters[].[ParameterName, ParameterValue]' --output table ## ParameterValue 가 NULL 아닌 것만 추출 , 즉 변화된 것만 추출, 이것이 맞는 명령어임 aws rds describe-db-cluster-parameters \ --db-cluster-parameter-group-name pg-an2-autolease-auroramysql-cluster \ --no-cli-pager \ --query 'Parameters[?ParameterValue!='null'].[ParameterName, ParameterValue]'
파라미터 비교
MySQL 인스턴스 간의 파라미터 비교 또는 RDS 의 경우 파라미터 그룹 간의 차이점 등을 확인 해보는 몇 가지 내용에 대해서 확인 해 보도록 하겠습니다.
파라미터 그룹 비교
AWS RDS 를 사용하는 환경에서 파라미터 그룹 간의 비교를 해볼수 있을 것 같습니다. 파라미터 그룹 간의 파라미터 내용 비교는 RDS 콘솔 메뉴에서 진행할 수 있습니다.
RDS 콘솔 -> 파라미터 그룹 -> 비교를 원하는 파라미터 체크 -> 파라미터 그룹 작업(Parameter group actions) 메뉴를 통해서 진행할 수 있습니다. 메뉴 항목에서 비교(Compare) 를 클릭(선택) 합니다
아래와 같이 파라미터 그룹 간의 차이에 대해서 결과를 확인 할 수 있습니다.
운영 환경 마다 기준 또는 표준 파라미터가 있을 것이고, 해당 표준 파라미터를 복사해서 클러스터 별로 인스턴스 별로 사용을 할 것으로 예상되며, 표준 파라미터 대비 특정 파라미터 그룹은 무엇이 차이가 나는지, 또는 인스턴스 별로 사용 중인 파라미터 그룹 간에는 어떠한 차이가 있는지 등을 확인 해보고자 할때 유용하게 사용할 수 있습니다.
위와 같이 AWS 콘솔에서 확인 해볼 수도 있지만, aws cli 를 통해서도 확인 해볼수 있으며 이전 단계에서 확인해본 describe-db-parameters 와 diff(OS 명령어) 을 조합 및 응용하여 다른 점을 확인 해볼 수 있습니다.
명령어) diff -s \ <(aws rds describe-db-parameters --db-parameter-group-name company-rds-mysql8-default-parameter --query 'Parameters[].[ParameterName, ParameterValue]' --output table) \ <(aws rds describe-db-parameters --db-parameter-group-name test-rds-mysql8-inst --query 'Parameters[].[ParameterName, ParameterValue]' --output table ) 결과) 497c497 < | sync_binlog | 1 | --- > | sync_binlog | 0 |
비교한 파라미터 그룹의 값이 모두 값다면 아래와 같은 출력 형태가 나타나게 됩니다.
$ Files /dev/fd/?? and /dev/fd/??? are identical
pt-config-diff
AWS RDS 내의 비교가 아닌 RDS 와 온프레미스 MySQL 간의 파라미터 비교 또는 온프레미스 MySQL 간의 파라미터 비교를 해야하는 경우도 있을 수 있습니다.
이럴 경우 Percona Toolkit 에 포함된 pt-config-diff 유틸리티를 사용하면 비교를 간편하게 할 수 있습니다.
Percona Toolkit 는 MySQL 을 운영/사용하는 과정에서 필요한 유용한 도구(유틸리티)의 모음 입니다
Percona Toolkit 설치 및 툴에 대한 관련 정보는 이전 포스팅을 참조하시면 됩니다.
pt-config-diff 유틸리티를 사용하는 방법은 여러가지 유형이 있습니다.
• 서버안의 my.cnf 파일을 비교할 경우
pt-config-diff \ /usr/local/mysql-8.0.25-linux-glibc2.12-x86_64/my.cnf \ /usr/local/mysql-8.0.23-linux-glibc2.12-x86_64/my.cnf
위의 경우는 같은 서버내에서 여러개의 MySQL 을 사용하거나 또는 서버에 존재하는 여러 my.cnf 파일들 간에 비교를 할 수 있습니다.
(my.cnf 을 변경하기전에 날짜별로 백업을 받아 둔다던지 하는 형태로 파일이 여러개 존재 하는 케이스)
실행 결과는 아래와 같은 유형으로 출력 됩니다.
8 config differences Variable ...-x86_64/mysql_8025.cnf ...libc2.12-x86_64/my.cnf ========================= ========================= ========================= datadir /usr/local/mysql-8.0.2... /usr/local/mysql-8.0.2... innodb_data_home_dir /usr/local/mysql-8.0.2... /usr/local/mysql-8.0.2... innodb_ft_min_token_size 1 2 log_bin wm-binlog wm-binlog-8023 log_error /usr/local/mysql-8.0.2... /usr/local/mysql-8.0.2... pid_file /usr/local/mysql-8.0.2... /usr/local/mysql-8.0.2... server_id 1 38023 socket /usr/local/mysql-8.0.2... /usr/local/mysql-8.0.2...
• 온프레미스 MySQL 과 RDS 파라미터 그룹 비교
온프레미스 MySQL 과 RDS 파라미터의 비교도 가능하고 아래와 같이 사용할 수 있습니다.
pt-config-diff --ask-pass \ /usr/local/mysql-8.0.23-linux-glibc2.12-x86_64/my.cnf \ h=test-rds-mysql8.cweacjg5pv9n.ap-northeast-2.rds.amazonaws.com,u=admin,P=3306 16 config differences Variable my.cnf rds ========================= ========================= ========================= bind_address 0.0.0.0 * collation_server utf8mb4_general_ci utf8mb4_0900_ai_ci datadir /usr/local/mysql-8.0.2... /rdsdbdata/db/ init_connect SET NAMES 'utf8mb4' CO... innodb_buffer_pool_size 612368384 268435456 innodb_data_file_path ib_system:100M:autoextend ibdata1:12M:autoextend innodb_data_home_dir /usr/local/mysql-8.0.2... /rdsdbdata/db/innodb innodb_ft_min_token_size 2 3 local_infile on ON log_error /usr/local/mysql-8.0.2... /rdsdbdata/log/error/m... log_timestamps SYSTEM UTC max_connections 1000 63 pid_file /usr/local/mysql-8.0.2... /rdsdbdata/log/mysql-3... secure_file_priv ON /secure_file_priv_dir/ server_id 38023 166132046 socket /usr/local/mysql-8.0.2... /tmp/mysql.sock
테스트로 확인 하였을 때 아래와 같이 remote의 DB 를 조회할 경우 패스워드 입력을 한번만 받다보니 2개의 계정 중에서 1개의 계정정보가 틀려서 조회가 안되는 케이스가 있는 것으로 확인 됩니다.
pt-config-diff --ask-pass \ h=접속주소1,u=admin \ h=접속주소2,u=root
이럴 경우 아래와 같이 커맨드 라인에 패스워드를 같이 기재 하면 정상적으로 실행할 수 있습니다.
pt-config-diff \ h=접속주소1,u=admin,p=패스워드,P=3306 \ h=접속주소2,u=root,p=패스워드,P=3306
Reference
Reference URL
• amazon.com/desc-db-parameter-group
• amazon.com/desc-db-parameters
• amazon.com/cli-usage
• amazon.com/cli-usage-output
• percona.com/pt-config-diff
관련된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io
보기 쉽게 좋은 정보 정리 감사합니다~
질문도 받아주실까요?
aurora사용중인데 text type컬럼도 2개가 있어서 평균 row사이즈가 큰 테이블에 insert/update쿼리가 빈번히 수행되어서인지 io/aurora_redo_log_fulsh wait 이 대부분 차지하는 경우 어떤 해결책이 있을까요?
innodb_log_file_size의 값이 디폴트 값이어서 이 값을 좀 늘려줘봐야하나 했는데, aurora에서는 수정은 안되는 값이네요
위와 같은 상황에서 성능을 높이기 위해 잦은 commit대시 배치처리한다...뭐 이런거 빼고 봐야할게 뭐가 있을지요?
안녕하세요
먼저 댓글 감사합니다.
알고 계신것처럼 Aurora MySQL 에서는 innodb_log_file_size 는 조정이 불가능 하고요
일단은 aws 에서 배치 commit 형태로 트랜잭션 조정을 가이드 하고 있습니다.
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/ams-waits.io-auredologflush.html
그외에 원론적인 것은 DB레벨에서의 분기(샤딩)/분리를 통해 IO 부하를 줄이는 방법이 있을 것 같고요
일단 먼저 퀵하고 코멘트를 드리고 저도 관심이 생기는 부분으로 조금 더 고민하고 좋은 방법이 있다면 메일이나 코멘트 다시 드리겠습니다
좋은 하루 되세요 감사합니다.
빠른 답변 감사드립니다
저도 관련 글은 확인했었고...업무 특성상 배치 commit처리가 안되는 경우라면
어떻게 처리해야할지 궁금하여 문의드리게 되었습니다.
샤딩이 있군요
일단 제가 생각한건 text type 으로 저장되는 데이터가 반드시 DB에 저장되어야하는지...파일로 관리하면 안되는 데이터인지 확인하려 합니다.
안녕하세요
업무가 좀 있어서 회신이 늦었네요
"text type 으로 저장되는 데이터가 반드시 DB에 저장되어야하는지...파일로 관리하면 안되는 데이터인지 확인하려 합니다."
의견 주신 이부분은 애플리케이션에서 테이블과 데이터를 사용하는 부분 그리고 업무적인 부분이라서 이것을 제가 이것이 된다 혹은 이렇게도 된다를 말씀드리기는 어려울것으로 보입니다.
io/aurora_redo_log_fulsh wait 부분은 낭중에라도 좋은 방향이 있다면 메일로 드리도록 할게요
감사합니다.