컴퓨터를 포맷하게 되면서 모든 세팅을 새롭해 해야했다.
그러면서 db파일 세팅, 데이터 넣기 등 다 하나하나 설정을 해줘야 했다.
프로그램이 실행될 때 mysql 데이터베이스 파일과 더미데이터를 자동으로 넣고 싶었다.
결론은 Docker를 실행할 때 mysql 데이터베이스 파일을 만들고 더미데이터를 넣는 것으로 해결했다.
- mysql.yml
파일을 만들어서 두고
version: '3'
services:
mysql:
image: mysql:latest
container_name: my-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 1234
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
- ./Aladin_Weekly_Best_Sellers_Domestic_Books.csv:/var/lib/mysql-files/data.csv
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- test-net
volumes:
mysql-data:
networks:
test-net:
external: true
volumes:
./mysql-data:/var/lib/mysql
호스트의 ./mysql-data 디렉토리를 MySQL 컨테이너의 /var/lib/mysql 디렉토리에 마운트한다.
이 볼륨은 MySQL 데이터베이스 데이터를 저장하여 컨테이너가 재시작되더라도 데이터가 유지되도록 한다.
./Aladin_Weekly_Best_Sellers_Domestic_Books.csv:/var/lib/mysql-files/data.csv
호스트의 ./Aladin_Weekly_Best_Sellers_Domestic_Books.csv 파일을 컨테이너의 /var/lib/mysql-files/data.csv 경로에 마운트한다.
이 설정을 통해 LOAD DATA INFILE 명령이 이 파일을 읽을 수 있도록 한다.
./init.sql:/docker-entrypoint-initdb.d/init.sql
호스트의 ./init.sql 파일을 컨테이너의 /docker-entrypoint-initdb.d/init.sql 경로에 마운트한다.
MySQL 컨테이너가 시작될 때 이 스크립트를 실행하여 초기 설정을 수행한다.
init.sql 을 확인해보자!
- init.sql
-- init.sql 파일 내용
CREATE DATABASE IF NOT EXISTS villion_user;
CREATE DATABASE IF NOT EXISTS villion_book;
CREATE DATABASE IF NOT EXISTS villion_rental;
USE villion_book
CREATE TABLE books (
PRIMARY KEY (id),
id INT,
category VARCHAR(20),
bookName VARCHAR(255),
itemId VARCHAR(20),
isbn13 VARCHAR(20),
additionalCode VARCHAR(20),
author VARCHAR(100),
publisher VARCHAR(100),
publicationDate DATE,
originalPrice VARCHAR(100),
sellingPrice VARCHAR(100),
mainGenre VARCHAR(100),
englishMainGenre VARCHAR(100),
productGroup VARCHAR(100)
);
LOAD DATA INFILE '/var/lib/mysql-files/data.csv' // 👀 mysql.yml volumes에서 경로를 지정해줬다.
INTO TABLE books
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
SHOW VARIABLES LIKE 'secure_file_priv';
💡 '/var/lib/mysql-files/data.csv' 더미파일을 /var/lib 에 넣어둔 이유?
참고링크 MySQL 데이터 추출 및 --secure-file-priv 옵션
내가 원하는 폴더에 넣어서 읽어오게 하면--secure-file-priv
옵션에 의한 에러가 발생한다.
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
이와 같은 에러는 --secure-file-priv 옵션이 MySQL 서버가 파일을 읽거나 쓸 수 있는 디렉토리를 제한하기 때문에 발생한다.
TROUBLE SHOOTING
secure_file_priv 가 가리키는 Value 필드를 보면 /var/lib/mysql-files/ 와 같이 디렉토리 형식으로 출력이 된 것을 볼 수 있는데, 이 디렉토리가 secure_file_priv 옵션이 허용한 MySQL 서버가 읽고 쓸 수 있는 디렉토리이다.
즉, INTO OUTPUT 문 다음의 디렉토리를 이 곳으로 쓰면 된다.
SOLUTION
쿼리문에서 추출할 디렉토리를 secure_file_priv 가 허용하는 곳으로 변경하면된다.
- Docker compse
mysql.yml을 읽어온다
docker-compose -f mysql.yml up -d
'Project > Collabo Project' 카테고리의 다른 글
[Villion] MSA 구조 어떻게 해야 보기 좋을까..? (0) | 2024.07.12 |
---|---|
[Villion] 찜한 상품 폴더 만들기(Gson 사용) (0) | 2024.06.25 |
[Villion] 마이크로 서비스 간의 통신을 위해 Feign Client vs. Kafka 중 어떤 것을 사용할까? (0) | 2024.05.02 |
[동물전쟁] 아이템 합성 서비스(Kafka 사용) (1) | 2023.11.09 |
[동물전쟁] Socket으로 전체 공개 채팅 만들기(MySQL저장) (0) | 2023.10.22 |