imhamburger 님의 블로그
데이터엔지니어 부트캠프 - 맥에서 Secure File Priv 에러 해결과 데이터베이스 생성하기 (1주차) 본문
데이터엔지니어 부트캠프 - 맥에서 Secure File Priv 에러 해결과 데이터베이스 생성하기 (1주차)
imhamburger 2024. 7. 14. 14:34지난 7일동안 데이터 엔지니어링 부트캠프에서 가장 인상깊었던 배움은 Mysql을 이용해 데이터베이스를 만들고 그 안에 빈 테이블을 만들어 가공되지 않은 데이터를 테이블 안에 올바른 데이터 형식으로 insert 한 것이다. 마치 엑셀 형태처럼 말이다.
Mysql을 이용해 데이터 파일을 가져올 때, LOAD DATA INFILE과 같은 명령문을 사용하여 파일을 로드해야하는데 사전에 파일을 로드해서 가져올 수 있는 위치를 제한시켜야 한다. 이는 무단으로 접근하거나 잠재적인 취약점을 방지하기 위함인데.. 아무나 내 파일을 보여줄 순 없으니까! 보안을 위해서 내 파일을 제한된 위치로 옮겨주는 작업을 해야한다. (안해주면 어차피 에러난다..)
STEP. 1: 제한된 디렉토리를 나타내는 'secure_file_priv' 변수값 확인하기
Mysql에 접속 후, 아래 코드를 입력하면 제한된 디렉토리를 나타내는 'secure_file_priv' 변수의 값을 반환한다.
SHOW VARIABLES LIKE 'secure_file_priv';
그.런.데 이 과정에서 문제가 터져버렸다.
맥북 사용자는 변수가 NULL 로 보여질 것이다.(나는 맥북을 사용한다..) 윈도우 사용자는 변수가 '/var/lib/mysql-files/'로 설정되어 있을 것이다.
STEP. 2: 로드할 파일을 제한된 디렉토리에 옮기기
경로가 나왔다면 로드할 파일 위치를 해당 경로로 이동시켜줘야 하며 명령어는 다음과 같다.
mv {/path/to/your/file.csv} /var/lib/mysql-files/
이렇게 해서 파일이 제한된 디렉토리에 있으면 'Secure File Priv' 오류없이 LOAD DATA INFILE과 같은 명령문을 정상적으로 실행할 수 있다.
그런데 나는 NULL 값이 나왔기 때문에... 여기서 드는 의문은, 그래서 NULL 이 의미하는 게 뭔데?! 였고 폭풍 구글링한 결과,
- NULL 값은 데이터 내보내기 또는 가져오기가 비활성화됨을 의미한다.
- 빈 값은 데이터 내보내기 또는 가져오기가 활성화됨을 의미한다.
- 데이터 내보내기 또는 가져오기가 지정된 경로에서만 활성화됨을 의미한다.
결론적으로 NULL 값을 어떠한 경로로 지정하거나 빈 값으로 남겨둬야 오류가 안난다.
STEP. 3: NULL 값을 어떠한 경로로 지정해보기
만약 tmp/ 폴더로 변경을 하려고 할 때 터미널에 아래와 같이 입력한다.
SET GLOBAL secure_file_priv = "/tmp/";
그.러.나 아래와 같은 에러가 나타났다.
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable
여기서 한숨이 절로 나오지만.. 에러 메세지를 읽어보면 secure_file_priv 값은 읽기 전용 값이라는 것이다.
STEP. 4: secure_file_priv 변수 변경하기
위의 에러를 해결하기 위해선 .my.cnf 라는 파일 안에 아래와 같은 코드를 입력해야 한다.
secure_file_priv = ""
.my.cnf 파일 안에 해당 코드를 입력 후 저장하고 mysql을 나갔다가 다시 mysql 을 실행하면 정상적으로 작동한다. (휴..)
여기서 팁!
만약 .my.cnf 파일을 못찾았다면, 다음과 같은 명령어를 입력하자!
find . -name "*.my.cnf" #현재 디렉토리(.)내 '.my.cnf'를 포함한 모든(*) 파일 검색
find / -name "*.my.cnf" #root 디렉토리(/) 내 '.my.cnf'를 포함한 모든(*) 파일 검색
find ~ -name "*.my.cnf" #홈 디렉토리(~) 내 '.my.cnf'를 포함한 모든(*) 파일 검색
보통 .my.cnf 파일은 etc 라는 디렉토리 안에 있으니 해당 디렉토리로 이동 후 검색하는 것을 추천한다.
그런데 간혹 해당 파일이 없을 수 있다. 그럼 그냥 파일을 만들어 secure_file_priv = "" 를 똑같이 입력하고 저장해주면 된다.
데이터베이스와 테이블 생성하기
여기까지 잘 해주었으면 이제 mysql에 접속하여 데이터베이스를 생성하고 에.러.없.이 데이터 파일을 가져와 테이블을 만들 수 있다.
CREATE DATABASE {이름}; -- 데이터베이스 생성
USE {데이터베이스 이름}; -- 해당 데이터베이스를 이용하겠다. 선언
CREATE TABLE abc (
dt varchar(255),
event varchar(255)
); -- abc 라는 테이블을 만들고 column(열) 이름은 dt, event 두 개의 열로 만들겠다. 선언
LOAD DATA INFILE '~/tmp/{데이터 파일명}' -- 해당 경로에서 데이터를 끌고오겠다.
INTO TABLE abc -- 그리고 abc 라는 테이블에 넣겠다.
fields TERMINATED BY ',' -- 필드는 , 기준으로 니누겠다. (가로)
LINE TERMINATED BY '\n'; -- 행은 줄바꿈 기준으로 나누겠다. (세로)
그리고 abc 테이블을 확인해보면,
SELECT * -- 모든 것을 선택하여 보겠다.
FROM abc -- abc 테이블에서
결과 (터미널이 아닌 DBeaver를 이용하였다.)
이 에러를 해결하면서...
사용하는 컴퓨터마다 에러 내용이 같아도 해결하는 방법은 같지 않을 수 있다는 것을 깨달았다. 같은 맥북을 사용하더라도 .my.cnf 파일이 어느 경로에 있는지 다를 수 있다. 만약 같은 경로에 없더라도 당황하지 말자. find 명령어를 사용해 찾으면 되고 없다면 만들면 된다.
일주일을 보내면서...
전에 회사에 다닐 때는 sql로 데이터 조회만 가능하였었는데, 이렇게 데이터베이스를 만들고 그 안에 테이블을 만들어 직접 데이터를 가공해보니 새로운 스킬을 배운 것 같아 뿌듯하다. 지금은 간단한 데이터 파일을 가지고 만들어보았는데 복잡한 데이터 파일로도 만들어보고싶다! 그리고 에러를 다루면서 에러에 대한 무서움이 조금씩 무뎌지는 것 같다. 열심히 구글링하거나 강사님께 여쭤보고 이런저런 지식을 얻어가니 오히려 에러가 생길 때 더 많이 배우는 것 같다.
앞으로 나의 방향
사실 나는 IT회사에서 마케터로 3년동안 근무한 경험이 있다. 당시 내 주업무는 데이터를 분석하여 전략을 짜고 기획을 하는 일이었다. 내가 회사에서 제공하는 대시보드를 보고 직접 데이터를 추출할 수 있었지만 Deep하고 Detail한 데이터를 보기 위해서는 데이터팀에 부탁해야했다.
외국계 회사였어서 데이터팀은 본사에 따로 있었는데, 정확히 내가 원하는 데이터는 A이고 이를 통해 인사이트를 얻고 싶은 것이 있었는데 항상 뭔가 원했던 데이터와는 조금 다른 파일들을 받았었다. 데이터팀이 데이터 전문가이지만 마케팅 분야를 이해하지 못하는 데이터팀이 내놓은 해답은 실무와 동떨어질 수도 있고 무의미한 데이터가 될 수 있다는 것을 깨달았다. 게다가 회사에서 제공하는 대시보드의 기준과 한국에서 봐야하는 데이터 기준과 달랐기 때문에 로컬 시스템을 통해 RAW파일을 다운로드받아 정리해야 했다. (이 과정이 시간을 엄청 잡아먹는다..)
그래서 나는 마케팅의 도메인 지식을 갖춘 데이터 엔지니어가 되는 것이 목표이다. 실무자분들이 원하는 데이터를 정확하게 파악하여 필요한 데이터를 설계하고 가공하는 엔지니어로 나아가고 싶다.
'데이터엔지니어 부트캠프' 카테고리의 다른 글
데이터엔지니어 부트캠프 - 아파치 스파크(Apache Spark) 이해하기, 에어플로우에 적용시키기 (5주차) (1) | 2024.08.11 |
---|---|
데이터엔지니어 부트캠프 - 첫번째 팀프로젝트 (8/2~8/6) 2-3일차 (0) | 2024.08.05 |
데이터엔지니어 부트캠프 - 첫번째 팀프로젝트 (8/2~8/6) 1일차 (1) | 2024.08.04 |
데이터엔지니어 부트캠프 - 에어플로우 dag, Operator 다뤄보기 (3주차) (1) | 2024.07.28 |
데이터엔지니어 부트캠프 - 에어플로우 dag, Operator 다뤄보기 (2주차) (1) | 2024.07.21 |