25년 DB 공부 (1) 환경설정, 로컬에 docker로 MySQL 띄우기

서론

회사에서 aws 위의 Aurora MySQL cluster의 업그레이드를 준비하면서, DB 자체에 대한 공부가 부족한 것을 느꼈다.

늘 공부해도 다른 부분에서 부족한 것 같은 느낌이 든다.
무튼, 매번 새로운 걸 하더라도 할 때 제대로 공부하고 넘어가는 게 중요하다고 느끼게 돼서 광복절을 낀 휴가기간 동안 로컬에 mySQL을 띄워보고 과정에서 궁금했던 것들을 공부해보려 한다.

 


 

실습용 mysql DB docker로 생성

docker-compose.yml 파일 생성

전체 mysql 뼈대를 생성하기 위해, 원하는 폴더에 아래와 같이 docker-compose.yml 파일을 생성해준다.
Primary, Replica 각 한대씩을 만들 예정이며, 각각 mysql1, mysql2로 이름 붙였다.

프라이머리 DB의 포트는 13306으로 빼줬고, 레플리카 DB 포트는 13307로 빼주려한다.

version: "3.8"

services:
  mysql1:
    image: mysql:8.4     # MySQL LTS
    container_name: mysql1
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    ports:
      - "13306:13306"
    volumes:
      - ./mysql1/conf.d/my.cnf:/etc/mysql/conf.d/my.cnf:ro
      - ./mysql1/data:/var/lib/mysql

  mysql2:
    image: mysql:8.4
    container_name: mysql2
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    ports:
      - "13307:13306"
    depends_on:
      - mysql1
    volumes:
      - ./mysql2/conf.d/my.cnf:/etc/mysql/conf.d/my.cnf:ro
      - ./mysql2/data:/var/lib/mysql

 

mysql1 설정값 파일 생성

mysql1을 Primary DB로 사용할 것으로, DB에 설정할 값들을 모아뒀다.

  • bin log는 활성화하며, INSERT/UPDATE/DELETE가 실제로 어떤 행이 어떻게 바뀌었는지 기록을 남기고, 실습해보기 위해 ROW로 설정한다.
  • ROW 이미지 수준은 FULL로 하였는데, 이렇게 하면 DML 전후 모든 칼럼이 기록에 남는다고 한다. MINIMAL과 추후 비교 예정이다.
  • binlog 보관주기는 하루(86400초)로 하였다. 실습용이기에 하루로 잡았고, 회사 운영으로 보았을 때 보통 3일~7일로 두는 게 정석인 것 같다.

경로는 mysql1/conf.d/my.cnf 이다.

[mysqld]
server_id=1
# --- binlog 기본 ---
log_bin=/var/lib/mysql/binlog
binlog_format=ROW
binlog_row_image=FULL
binlog_checksum=CRC32
# --- GTID ---
gtid_mode=ON
enforce_gtid_consistency=ON
# --- 유지/회전 ---
binlog_expire_logs_seconds=86400
# --- 보기 편하게 (한국시간) ---
default_time_zone='+09:00'

 

mysql2 설정값 파일 생성

경로는 mysql2/conf.d/my.cnf 이다.

[mysqld]
server_id=2
log_bin=/var/lib/mysql/binlog
relay_log=/var/lib/mysql/relay-bin
gtid_mode=ON
enforce_gtid_consistency=ON
default_time_zone='+09:00'

 

⭐️ 오류 및 해결

처음에 첫 설정부터 read only 및 super read only를 ON으로 하고 띄웠더니 ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement 와 같은 오류를 뱉으면서 컨테이너가 바로 죽어버렸다. 이는 처음부터 read only로 해두면 초기에 서버 설정을 하지 못해 벌어지는 일로, 처음에는 read only 설정을 빼고 해야한다.

그리고 이렇게 이미 돌린 후 다시 돌릴 땐 반드시 data를 지우고 돌려야한다. 즉, 아래처럼 down을 하고 data 부분을 날리고 돌려야 처음부터 적용이 되어 뜬다.

1. docker compose down

2. rm -rf ./mysql2/data

3. docker compose up


docker 실행 및 확인

이 상태로 docker compose up -d 를 해 준다.
그럼 아래와 같이 이미지 땡겨와서 컨테이너가 뜨고 있다. (기차라... 넘 느림...)

 

무튼, 완료되면 아래와 같이 컨테이너 두개가 뜨는 것을 확인할 수 있다.

 

아래와 같이, docker exec 통해서 mysql 접속 명령어를 쳐보면, 제대로 올라왔는 지도 확인 가능하다.

  • docker exec -it mysql1 mysql -uroot -prootpass
  • docker exec -it mysql2 mysql -uroot -prootpass

 

무튼, 여기까지 하면 초기 MySQL 환경 설정 완료!

'DevOps' 카테고리의 다른 글

25년 DB 공부 (2) MySQL 기본 DML 해보기  (2) 2025.08.16