MySQL - 파라미터 설정 비교 및 RDS Parameter Group 복제하기

Share

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


관련된 다른 글

 

 

 

 

 

 

 

                  

4
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x