Docker๋ฅผ ์ด์ฉํด MySQL 8.4 ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ์ค MySQL ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์์๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ก๊ทธ๋ฅผ ํ์ธํด ๋ณด๋ InnoDB ์ด๊ธฐํ ๊ณผ์ ์์ No space left on device ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์์๋ค.
์ด๋ฒ ๊ธ์์๋ macOS Docker Desktop ํ๊ฒฝ์์ ๋ฐ์ํ MySQL ๋์คํฌ ๊ณต๊ฐ ๋ถ์กฑ ์ค๋ฅ์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๋ค.
1. ๋ฌธ์ ์ํฉ
๊ฐ๋ฐ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ด์์ฒด์ : macOS
- ์ปจํ ์ด๋ ํ๊ฒฝ: Docker Desktop
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: MySQL 8.4.11
- ์คํ ๋ฐฉ์: Docker Compose
MySQL ์ปจํ ์ด๋ ์คํ ํ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ์ถ๋ ฅ๋์๋ค.
[System] MySQL Server - start.
[System] /usr/sbin/mysqld (mysqld 8.4.11) starting as process 1
[System] [InnoDB] InnoDB initialization has started.
[Warning] [InnoDB] Retry attempts for writing partial data failed.
[ERROR] [InnoDB]
Write to file ./#innodb_redo/#ib_redo16_tmp failed
at offset 1048576, 1048576 bytes should have been written,
only 0 were written.
Operating system error number 28.
[ERROR] [InnoDB]
Error number 28 means 'No space left on device'
[ERROR] [InnoDB]
Cannot resize redo log file ./#innodb_redo/#ib_redo16_tmp
to 3 MB (Failed to set size)
๊ฐ์ฅ ์ค์ํ ์ค๋ฅ ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
Error number 28 means 'No space left on device'
์ฆ, MySQL์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ค ํ์ง๋ง ์ ์ฅ ๊ณต๊ฐ์ด ๋ถ์กฑํด ํ์ผ์ ์์ฑํ๊ฑฐ๋ ํ์ฅํ์ง ๋ชปํ๋ค๋ ์๋ฏธ๋ค.
2. ์ค๋ฅ ์์ธ ๋ถ์
InnoDB Redo Log๋?
MySQL์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์ง์ธ InnoDB๋ ๋ฐ์ดํฐ์ ์์ ์ฑ๊ณผ ํธ๋์ญ์ ๋ณต๊ตฌ๋ฅผ ์ํด Redo Log๋ฅผ ์ฌ์ฉํ๋ค.
Redo Log๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํด ๋์๋ค๊ฐ ์ฅ์ ๋ฐ์ ์ ๋ณต๊ตฌ์ ํ์ฉํ๋ ๋ก๊ทธ๋ค.
MySQL 8.4์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๊ฒฝ๋ก์ Redo Log ํ์ผ์ด ์์ฑ๋๋ค.
/var/lib/mysql/#innodb_redo/
์ด๋ฒ ์ค๋ฅ์์๋ ๋ค์ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ์ง ๋ชปํ๋ค.
./#innodb_redo/#ib_redo16_tmp
MySQL์ด Redo Log ํ์ผ์ ํ์ฅํ๋ ๊ณผ์ ์์ ์ด์์ฒด์ ๋ก๋ถํฐ ์ค๋ฅ ๋ฒํธ 28์ ๋ฐํ๋ฐ์ ๊ฒ์ด๋ค.
macOS์์ ๋ฐ์ํ๋ ์ด์
macOS์ Docker Desktop์ Linux ์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํด Linux ๊ฐ์ ๋จธ์ ์ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ Docker๊ฐ ์ฌ์ฉํ๋ ์ ์ฅ ๊ณต๊ฐ๊ณผ macOS ํธ์คํธ์ ์ ์ฅ ๊ณต๊ฐ์ ๊ด๋ฆฌ ๋ฐฉ์์ด ๋ค๋ฅด๋ค.
๋ํ์ ์ธ ์์ธ์ ๋ค์๊ณผ ๊ฐ๋ค.
- macOS ํธ์คํธ ๋์คํฌ์ ์ฌ์ ๊ณต๊ฐ ๋ถ์กฑ
- Docker Desktop ๊ฐ์ ๋์คํฌ์ ์ฉ๋ ์ ํ ๋๋ฌ
- ์ฌ์ฉํ์ง ์๋ Docker ์ด๋ฏธ์ง์ ์ปจํ ์ด๋์ ๋์
- Docker ๋น๋ ์บ์์ ๊ณผ๋ํ ์ฆ๊ฐ
- MySQL ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ด ์์นํ ํ์ผ ์์คํ ์ ๊ณต๊ฐ ๋ถ์กฑ
ํนํ macOS์ ๋์คํฌ ์ฌ์ ๊ณต๊ฐ์ด ๋จ์ ์๋๋ผ๋ Docker Desktop ๋ด๋ถ ์ ์ฅ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
3. Docker ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ
๊ฐ์ฅ ๋จผ์ Docker๊ฐ ์ผ๋ง๋ ๋ง์ ๋์คํฌ ๊ณต๊ฐ์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ๋ค.
docker system df
์ด ๋ช ๋ น์ด๋ Docker ์ด๋ฏธ์ง, ์ปจํ ์ด๋, ๋ณผ๋ฅจ, ๋น๋ ์บ์์ ์ฌ์ฉ๋์ ๋ณด์ฌ์ค๋ค.
์ถ๋ ฅ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 25 8 12.5GB 8.2GB
Containers 12 3 1.2GB 800MB
Local Volumes 15 5 18.4GB 4.5GB
Build Cache 120 0 9.8GB 9.8GB
์ ์์น๋ ์ค๋ช ์ ์ํ ์์์ด๋ฉฐ ์ค์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ํญ๋ชฉ์ RECLAIMABLE์ด๋ค.
์ด๋ Docker๊ฐ ๋ฏธ์ฌ์ฉ ๋ฆฌ์์ค๋ก ํ๋จํด ์ ๋ฆฌํ ์ ์๋ ์ฉ๋์ ์๋ฏธํ๋ค.
๋ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
docker system df -v
macOS ํธ์คํธ์ ๋์คํฌ ๊ณต๊ฐ๋ ํจ๊ป ํ์ธํ๋ค.
df -h
4. Docker ๋์คํฌ ๊ณต๊ฐ ์ ๋ฆฌํ๊ธฐ
์์ธ์ ํ์ธํ ํ ๋ถํ์ํ Docker ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ค.
4.1 ์ค์ง๋ ์ปจํ ์ด๋ ์ญ์
docker container prune
ํ์ฌ ์คํ ์ค์ด์ง ์์ ์ปจํ ์ด๋๋ฅผ ์ญ์ ํ๋ค.
4.2 ์ฌ์ฉํ์ง ์๋ ์ด๋ฏธ์ง ์ญ์
docker image prune -a
์คํ ์ค์ด๊ฑฐ๋ ์ค์ง๋ ์ปจํ ์ด๋์์ ์ฐธ์กฐํ์ง ์๋ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ค.
์ญ์ ๋ ์ด๋ฏธ์ง๋ ์ดํ ํ์ํ ๋ ๋ค์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ๋น๋ํด์ผ ํ๋ค.
4.3 Docker ๋น๋ ์บ์ ์ ๋ฆฌ
docker builder prune
์ฌ์ฉํ์ง ์๋ ๋น๋ ์บ์๋ฅผ ์ญ์ ํ๋ค.
๊ฐ๋ฐ ๊ณผ์ ์์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๋ํ๋ฉด ์บ์๊ฐ ์๋นํ ์ฉ๋์ ์ฐจ์งํ ์ ์๋ค.
4.4 ๋ฏธ์ฌ์ฉ ๋ฆฌ์์ค ์ผ๊ด ์ ๋ฆฌ
์ ์์ ์ ํ ๋ฒ์ ์คํํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
docker system prune -a
์ด ๋ช ๋ น์ด๋ ์ค์ง๋ ์ปจํ ์ด๋, ์ฌ์ฉํ์ง ์๋ ๋คํธ์ํฌ์ ์ด๋ฏธ์ง, ๋ฏธ์ฌ์ฉ ๋น๋ ์บ์ ๋ฑ์ ์ ๋ฆฌํ๋ค.
์ฃผ์ํ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณผ๋ฅจ์ด๋ค.
๋ค์ ๋ช ๋ น์ด๋ค์ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
docker volume prune
docker system prune --volumes
docker compose down -v
ํนํ docker compose down -v๋ Compose ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ named volume๊น์ง ์ญ์ ํ ์ ์๋ค.
MySQL ๋ฐ์ดํฐ๋ฅผ ์ ์งํด์ผ ํ๋ค๋ฉด ๋ณผ๋ฅจ ์ญ์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ง ์๋ ๊ฒ์ด ์์ ํ๋ค.
5. Docker Desktop ๋์คํฌ ์ฉ๋ ํ์ธ
Docker ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋๋ฐ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค๋ฉด Docker Desktop์ ๋์คํฌ ์ฉ๋ ์ ํ์ ํ์ธํ๋ค.
macOS์์ Docker Desktop์ ์คํํ ๋ค ๋ค์ ๋ฉ๋ด๋ก ์ด๋ํ๋ค.
Docker Desktop → Settings → Resources → Advanced
Docker Desktop ๋ฒ์ ์ ๋ฐ๋ผ ์ค์ ํ๋ฉด์ด๋ ํญ๋ชฉ ์ด๋ฆ์ด ๋ค๋ฅผ ์ ์์ง๋ง, ๋์คํฌ ์ฌ์ฉ๋ ๋ฐ ์ฉ๋ ์ ํ ๊ด๋ จ ์ค์ ์ ํ์ธํ ์ ์๋ค.
์ค์ ๋ ๋์คํฌ ์ฉ๋์ด ๋ถ์กฑํ๋ค๋ฉด ์ฌ์ ๊ณต๊ฐ๊ณผ ํธ์คํธ ๋์คํฌ ์ฉ๋์ ๊ณ ๋ คํด ์ ํ์ ๋๋ฆฐ๋ค.
๋จ, ๋์คํฌ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ด๊ธฐํํ๋ ๊ธฐ๋ฅ์ ๊ธฐ์กด Docker ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
6. MySQL ์ปจํ ์ด๋ ๋ค์ ์คํ
๋์คํฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ค๋ฉด MySQL ์ปจํ ์ด๋๋ฅผ ๋ค์ ์คํํ๋ค.
docker compose up -d mysql
์คํ ์ํ๋ฅผ ํ์ธํ๋ค.
docker compose ps
๋ก๊ทธ๋ ํ์ธํ๋ค.
docker compose logs -f mysql
MySQL์ด ์ ์์ ์ผ๋ก ์ด๊ธฐํ๋ฅผ ์๋ฃํ๊ณ ์ฐ๊ฒฐ์ ๋ฐ์ ์ค๋น๊ฐ ๋์๋ค๋ฉด ๋ค์๊ณผ ์ ์ฌํ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
[System] [Server] /usr/sbin/mysqld: ready for connections.
์ด ๋ฉ์์ง๊ฐ ํ์ธ๋๋ฉด MySQL ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์์๋ ๊ฒ์ด๋ค.
๋จ, Compose ์๋น์ค ์ด๋ฆ์ด mysql์ด ์๋๋ผ๋ฉด ์ค์ ์๋น์ค ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
7. ์ถ๊ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ: InnoDB Redo Log ํฌ๊ธฐ ์กฐ์
๋์คํฌ ๊ณต๊ฐ์ด ์ถฉ๋ถํ๋ฐ๋ Redo Log ๊ด๋ จ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต๋๋ค๋ฉด MySQL์ Redo Log ์ค์ ์ ๊ฒํ ํ ์ ์๋ค.
MySQL 8.4์์๋ innodb_redo_log_capacity ์ต์ ์ผ๋ก Redo Log ์ ์ฒด ์ฉ๋์ ์ค์ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ 64MB๋ก ์ค์ ํ๋ ค๋ฉด Docker Compose์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
services:
mysql:
image: mysql:8.4
command:
- --innodb-redo-log-capacity=64M
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: marketing_manager
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
๋ค๋ง Redo Log ์ฉ๋์ ์ง๋์น๊ฒ ์ค์ด๋ฉด ์ฒดํฌํฌ์ธํธ ์์ ์ด ๋น๋ฒํด์ ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ธฐ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
๋ฐ๋ผ์ ์ด ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ ์ ํ๋ ์ ์ฅ ๊ณต๊ฐ์์ ์ ์คํ๊ฒ ๊ฒํ ํ ์ ์๋ ๋ณด์กฐ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๋์คํฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ ์ํฉ์ด๋ผ๋ฉด Redo Log ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ๋ณด๋ค ๋จผ์ ์ ์ฅ ๊ณต๊ฐ์ ํ๋ณดํ๋ ๊ฒ์ด ์ฐ์ ์ด๋ค.
8. Docker ๋์คํฌ ๋ถ์กฑ ๋ฌธ์ ์๋ฐฉํ๊ธฐ
Docker๋ฅผ ์ฅ๊ธฐ๊ฐ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง์ ๋น๋ ์บ์๊ฐ ๊ณ์ ๋์ ๋ ์ ์๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ๋์ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
# Docker ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ
docker system df
# ์ฌ์ฉํ์ง ์๋ ๋น๋ ์บ์ ์ ๋ฆฌ
docker builder prune
# ์ค์ง๋ ์ปจํ
์ด๋ ์ ๋ฆฌ
docker container prune
# ๋ฏธ์ฌ์ฉ ์ด๋ฏธ์ง ์ ๋ฆฌ
docker image prune
๋ํ MySQL ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ปจํ ์ด๋๋ฅผ ์ญ์ ํ๋๋ผ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋๋ก named volume์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
services:
mysql:
image: mysql:8.4
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
๋จ, named volume์ ๋ฐ์ดํฐ์ ์์์ฑ์ ์ ๊ณตํ ๋ฟ ๋ฐฑ์ ์ ๋์ฒดํ์ง๋ ์๋๋ค. ์ค์ํ ๋ฐ์ดํฐ๋ ๋ณ๋์ ๋ฐฑ์ ์ด ํ์ํ๋ค.
9. ๋ง๋ฌด๋ฆฌ
์ด๋ฒ MySQL ์ปจํ ์ด๋ ์คํ ์ค๋ฅ๋ InnoDB ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ ์ ์ฅ ๊ณต๊ฐ์ด ๋ถ์กฑํด ๋ฐ์ํ ๋ฌธ์ ์๋ค.
ํต์ฌ ์ค๋ฅ ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
Operating system error number 28
No space left on device
์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด MySQL ์ค์ ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ปจํ ์ด๋๋ฅผ ์ญ์ ํ๊ธฐ ์ ์ ๋ค์ ์์๋ก ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
- docker system df๋ก Docker ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ
- df -h๋ก macOS ํธ์คํธ ๋์คํฌ ๊ณต๊ฐ ํ์ธ
- ๋ถํ์ํ ์ด๋ฏธ์ง, ์ปจํ ์ด๋, ๋น๋ ์บ์ ์ ๋ฆฌ
- Docker Desktop ๋์คํฌ ์ฉ๋ ์ ํ ํ์ธ
- MySQL ์ปจํ ์ด๋ ์ฌ์์ ๋ฐ ๋ก๊ทธ ํ์ธ
ํนํ Docker๋ฅผ ์ด์ฉํด ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๋น๋ ์บ์์ ์ค๋๋ ์ด๋ฏธ์ง๊ฐ ์์๋ณด๋ค ๋ง์ ๋์คํฌ ๊ณต๊ฐ์ ์ฐจ์งํ ์ ์๋ค.
๋ฌด์๋ณด๋ค ์ค์ํ ๊ฒ์ MySQL ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ๋ฌด์์ ์ญ์ ํ์ง ์๋ ๊ฒ์ด๋ค.
์ ์ฅ ๊ณต๊ฐ ๋ถ์กฑ ๋ฌธ์ ๋ ๋๋ถ๋ถ ๋ถํ์ํ Docker ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ฑฐ๋ Docker Desktop์ ์ ์ฅ ๊ณต๊ฐ ์ค์ ์ ์กฐ์ ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.