ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL my.cnf
    Database 2023. 9. 11. 09:24
    728x90
    반응형

    소개

    my.cnf 라는 이름은 MySQL 의 설정파일의 이름입니다.

    cnf 라는 확장자명은 유닉스 환경에서 사용되는 MySQL 설정 파일의 확장자이며,

    윈도우 계열에서는 my.ini 라고합니다.

     

    설정 파일은 mysql 의 설정을 위한 내용을 포함하는데요.

    mysql 을 구성하는 여러가지 요소들이 존재하기 때문에 각각의 구성요소 별로 설정이 가능합니다.

     

    예를 들어,

    [client]
    default-character-set = utf8
    socket=/var/run/mysqld/mysqld.sock
    
    [mysqld]
    bind-address = 0.0.0.0
    soket = /var/mysql/mysql.sock
    port = 3306

    위 예시는 client mysqld 의 설정을 각 block 별로 적용합니다.

     

     

    my.cnf 파일들의 우선순위

    my.cnf 파일들은 여러 위치에 존재할 수 있습니다.

    /etc/my.cnf , /etc/mysql/my.cnf 등등의 설정 파일들이 존재하는데요.

    각 파일들의 설정 우선순위에 대해서 알아보겠습니다.

     

    아래와 같은 명령어를 수행하면 여러 위치에 존재하는 my.cnf 파일을 조회하는 순서를 설명해줍니다.

    mysql --help | grep 'given order' -A 5
    
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 
    The following groups are read: mysql client
    The following options may be given as the first argument:
    --print-defaults        Print the program argument list and exit.
    --no-defaults           Don't read default options from any option file,

     

    1. /etc/my.cnf

    2. /etc/mysql/my.cnf

    3. /usr/etc/my.cnf 

    4. ~/.my.cnf 순서로 조회를 합니다.

     

    /etc/my.cnf 가 존재하지 않을 때, /etc/mysql/my.cnf 를 사용하는가?

    강제로 /etc/my.cnf 를 없애고, /etc/mysql/my.cnf 를 생성해보겠습니다.

    
    // mysql 실행
    docker run -p 3306 --name mysql-source -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysql:8 
    
    // /etc/my.cnf 을 /etc/mysql/my.cnf 로 이동
    docker exec mysql-source mv /etc/my.cnf /etc/mysql/my.cnf
    
    // /etc/mysql/my.cnf 에 bind-address 추가 
    docker exec mysql-source cat /etc/mysql/my.cnf
    matched_line=$(echo $(docker exec mysql-source grep -Fn '[mysqld]' /etc/mysql/my.cnf) | sed 's/[:].*$//g')
    docker exec mysql-source sed -i $((matched_line + 1))' i bind-address=127.0.0.2' /etc/mysql/my.cnf
    docker exec mysql-source cat /etc/mysql/my.cnf
    
    // mysql 재시작
    docker restart mysql-source
    docker exec -it mysql-source mysql -u root -p
    show variables like 'bind_address';
    
    +---------------+-----------+
    | Variable_name | Value     |
    +---------------+-----------+
    | bind_address  | 127.0.0.2 |
    +---------------+-----------+
    1 row in set (0.01 sec)

    설정 파일의 위치를 /etc/mysql/my.cnf 로 변경하고, bind-address 에 127.0.0.2 를 추가하였습니다.

    해당 mysql 를 실행하면 /etc/mysql/my.cnf 설정파일을 기반으로 실행됨을 알 수 있습니다.

     

     

    /etc/my.cnf 와 /etc/mysql/my.cnf 가 동시에 존재하고, bind-address 설정이 다를 때,

     

    /etc/my.cnf 와 /etc/mysql/my.cnf 이 동시에 존재하고

    /etc/my.cnf 에는 bind-address = 127.0.0.9

     /etc/mysql/my.cnf 에는 bind-address = 127.0.0.2 인 상황입니다.

     

    이때, /etc/mysql/my.cnf 에 있는 설정이 적용됩니다.

     

    // mysql 실행
    docker run -p 3306 --name mysql-source -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysql:8 
    
    // /etc/my.cnf 을 /etc/mysql/my.cnf 로 복사
    docker exec mysql-source cp /etc/my.cnf /etc/mysql/my.cnf
    
    // /etc/mysql/my.cnf 에 bind-address 추가 
    docker exec mysql-source cat /etc/my.cnf
    matched_line=$(echo $(docker exec mysql-source grep -Fn '[mysqld]' /etc/my.cnf) | sed 's/[:].*$//g')
    docker exec mysql-source sed -i $((matched_line + 1))' i bind-address=127.0.0.9' /etc/my.cnf
    
    docker exec mysql-source cat /etc/mysql/my.cnf
    matched_line=$(echo $(docker exec mysql-source grep -Fn '[mysqld]' /etc/mysql/my.cnf) | sed 's/[:].*$//g')
    docker exec mysql-source sed -i $((matched_line + 1))' i bind-address=127.0.0.2' /etc/mysql/my.cnf
    docker exec mysql-source cat /etc/mysql/my.cnf
    
    // mysql 재시작
    docker restart mysql-source
    docker exec -it mysql-source mysql -u root -p
    show variables like 'bind_address';
    
    +---------------+-----------+
    | Variable_name | Value     |
    +---------------+-----------+
    | bind_address  | 127.0.0.2 |
    +---------------+-----------+
    1 row in set (0.01 sec)

     

     

     

    /etc/my.cnf 와 /etc/mysql/my.cnf 가 동시에 존재하고, /etc/my.cnf 만 bind-address 설정이 있을 때

    /etc/my.cnf 에 bind-address = 127.0.0.9 설정이 있고,

    /etc/mysql/my.cnf 에는 bind-address 설정이 없습니다.

    이런 경우에는 /etc/my.cnf 의 bind-address 설정이 적용됩니다.

    // mysql 실행
    docker run -p 3306 --name mysql-source -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysql:8 
    
    // /etc/my.cnf 을 /etc/mysql/my.cnf 로 복사
    docker exec mysql-source cp /etc/my.cnf /etc/mysql/my.cnf
    
    // /etc/mysql/my.cnf 에 bind-address 추가 
    docker exec mysql-source cat /etc/my.cnf
    matched_line=$(echo $(docker exec mysql-source grep -Fn '[mysqld]' /etc/my.cnf) | sed 's/[:].*$//g')
    docker exec mysql-source sed -i $((matched_line + 1))' i bind-address=127.0.0.9' /etc/my.cnf
    
    // mysql 재시작
    docker restart mysql-source
    docker exec -it mysql-source mysql -u root -p
    show variables like 'bind_address';
    
    +---------------+-----------+
    | Variable_name | Value     |
    +---------------+-----------+
    | bind_address  | 127.0.0.9 |
    +---------------+-----------+
    1 row in set (0.01 sec)

     

    my.cnf 설정

    my.cnf 의 각 설정에 대해서 알아보겠습니다

     

    server-id

    server id 는 master - slave 구조에서 각 서버의 식별값으로 사용됩니다.
    통상적으로 master 는 server-id = 1 를 사용하며
    그외 slave 서버들을 다른 숫자를 사용합니다.

     

    log-bin

    bin log 의 파일명을 설정합니다.

    bin-log=binlog 인 경우에,

    show variables like '%log_bin%';
    +------------------+-----------------------+
    | Variable_name    | Value                 |
    +------------------+-----------------------+
    | log_bin_basename | /var/lib/mysql/binlog |
    +------------------+-----------------------+
    
    show binary logs;
    +---------------+-----------+-----------+
    | Log_name      | File_size | Encrypted |
    +---------------+-----------+-----------+
    | binlog.000001 |   3039831 | No        |
    | binlog.000002 |       180 | No        |
    | binlog.000003 |       180 | No        |
    | binlog.000004 |       180 | No        |
    | binlog.000005 |       157 | No        |
    +---------------+-----------+-----------+

    binlog.XXX 로 로그파일명이 설정됩니다.

     

     

    bin-log 변경하기

    
    docker run -p 3306 --name mysql-source -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysql:8 
    docker exec mysql-source cat /etc/my.cnf
    matched_line=$(echo $(docker exec mysql-source grep -Fn '[mysqld]' /etc/my.cnf) | sed 's/[:].*$//g')
    docker exec mysql-source sed -i $((matched_line + 1))' i log-bin=test' /etc/my.cnf
    
    docker restart mysql-source
    docker exec -it mysql-source mysql -u root -p
    show variables like '%log_bin_basename%';
    +------------------+---------------------+
    | Variable_name    | Value               |
    +------------------+---------------------+
    | log_bin_basename | /var/lib/mysql/test |
    +------------------+---------------------+
    
    
    show binary logs;
    +-------------+-----------+-----------+
    | Log_name    | File_size | Encrypted |
    +-------------+-----------+-----------+
    | test.000001 |       157 | No        |
    +-------------+-----------+-----------+

     

     

    expire-logs-day

     

    반응형

    'Database' 카테고리의 다른 글

    MySQL Lock 이해하기  (0) 2023.09.20
    MySQL Replication  (0) 2023.09.11
    MySQL mysqldump 알아보기  (0) 2023.05.18
    Mysql Procedure  (0) 2023.05.15
    MySQL Tablespace 알아보기  (0) 2023.05.12
Designed by Tistory.