-
쉘 스크립트와 mysqlTIL 2021. 1. 30. 22:25
일단 글 작성을 하게 된 배경은 DB에 대용량의 데이터를 넣기 위해서이다.
쉘도 익숙지 않은데 뭔가를 하자니 막막했지만 그 과정을 글로 작성하겠다.
일단 환경은 로컬 환경이 아닌 도커 컨테이너 안에서 진행이 됐으며 컨테이너 안에서 쉘을 작성해 컨테이너 안에 있는 mysql에 값을 추가한다.
처음에는 하나하나 값을 만들어 각자 insert를 보냈지만 그럼 시간이 수십 시간이 걸릴 거 같았다.
그래서 2가지 방안을 생각해 냈는데 첫째는 sql문을 insert 하는 게 아니라 프러시 저를 쉘에서 만들어 프러시 저 자체를 전해주는 방법 (해보진 않았다.) 두 번째는 파일 형태로 결과물을 만들어 그 파일을 사용해 insert 하는 방법
결론은 2번째 방법을 사용했다. 그렇게 하는 4분 내로 대용량 데이터를 넣을 수 있었다. 4분은 데이터를 만드는데 들었던 시간이고 insert시간은 1초도 안 걸렸다.
그럼 순차적으로 정리하겠다.
쉘에서 mysql에 데이터 넣기
mysql -h127.0.0.1 -ugisung -ppassword DockerTestDB -e "insert into ~~"
mysql -h서버주소 -u아이디 -p패스워드 디비명 -e "쿼리문"형태로 값을 넣는다.
zetawiki.com/wiki/Bash%EC%97%90%EC%84%9C_MySQL_%EC%82%AC%EC%9A%A9
근데 문제는 password를 문자열 형태로 사용하다 보니 warning이 뜬다.
처음에는 백만 건을 직접 다 insert 했으니 저 warning이 백만 번 나올 기세였다.
문제를 해결하기 위해 찾아보니 mysql 5.6.6 버전 이후부터는 mysql_config_editor라는 tool을 제공해서
이 것을 이용해서 id, password, host정보를 먼저 입력시켜놔서(alias로 묶어서 관리) 저 warning을 나타나지 않게 할 수 있었다.
먼저 등록을 해야 한다.
mysql_config_editor set --login-path=gisung --host=127.0.0.1 --user=gisung --password=password
mysql_config_editro set --login-path=별명 --host=주소 --user=유저이름 --password=비번그럼 sql을 보내는 방식이 바뀐다
mysql --login-path=gisung DockerTestDB -e "insert into ~~"
mysql --login-path=별명 디비명 -e "sql문"등록할 때의 별명을 이용해 쉽게 접근이 가능해진다.
삭제는 다음과 같다.
mysql_config_editor remove --login-path=gisung
그럼 이제 대용량 데이터를 넣어보자
근데 여태 위에서 알아본 구문들은 mysql에 쿼리를 날리는 것들인데 대용량 데이터는 저리 하면 시간이 오래 걸린다고 말했다. 그래서 파일을 만들어 그곳에 값들을 넣고 mysql에 load data 하는 쿼리를 날리는 게 좋을 거 같아 그렇게 했다.
파일을 만들고 데이터를 적재하기
파일에 이름 넣는 함수 작성
echo "이름을 만드는 함수들 작성" >> allNanme.txt
touch allName.txt
for~~
do
$(이름 넣는 함수 이름)
done이렇게 리다이렉션을 통해 이어쓰기를 한다.
그럼 파일을 만들고 mysql에서 load data를 하려고 하니
mysql은 보안상 특정 폴더 아래에 있는 파일만 load data를 할 수 있었다. 그래서 정책을 따라서 특정 폴더 밑으로 보내줬다.
특정 폴더를 알려면
mv allName.txt /var/lib/mysql-files/
이제 mysql에 들어가 쿼리를 입력하던가 쉘에서 load data 쿼리를 여기서 날려주던가 해야 하는데
본인은 쉘에서 쿼리를 날려줬다.
load data 알아보기(bulk insert)
allName.txt 파일에 들어있는 이름들은 이름 중간에 , 문자가 들어가 있어 그것을 제거하고 차례대로 DB 칼럼 순서에 맞게 들어가야 된다.
load data infile문법은 다음과 같다.
load data infile '/var/lib/mysql-file/allName.txt' into table user_log fields terminated by ',';
load data infile 'insert할 데이터 위치' into table 넣을테이블;
위에 기본 문장이고 , 를 구분점으로 데이터를 넣으려면
load data infile 'insert할 데이터 위치' into table 넣을테이블 fields terminated by ',';blog.naver.com/sd8039/60154256265
www.youtube.com/watch?v=qYM6d-0gW4w&ab_channel=DavidJung
쉘에서 다른 쉘 실행시키기
source ./anothor.sh
'TIL' 카테고리의 다른 글
쉘 스크립트 사용법(날짜) (0) 2021.01.31 2021.01.31 기록장 (0) 2021.01.30 Docker란? (0) 2021.01.30 동기비동기, 스레드풀 (0) 2021.01.30 2021.01.30 기록장 (0) 2021.01.29