와 이거 어디서부터 정리해야하지 진짜 막막하다
근데 우짜 해야지
끄응
때는 바야흐로 벌써 인턴 한 달 차 !
크롤링이 끝난 후 AWS에 인스턴스를 올려 코드 작업하고 있었는데
세상에 회사 내부 DB를 사용할 수 없는 것이었다 ㅠㅠ
그래서 나온 방법이 도커로 mySQL을 올려서 사용하는 법
그동안 효자 디비버🦦로만 하다가 눈에 보이지 않는 환경을 쓰려고 하니 머리가 좀 아팠다😥
하지만 열심히 해봐야지, 일은 해야지😎 !!
먼저 나는 WSL 환경에서 작업했다.
sudo apt update
-- 패키지 목록을 업데이트 (사용 가능 최신 버전 확인)
sudo apt install -y docker.io
-- docker.io 패키지 설치, -y 모든 질문에 자동으로 "예"로 답
sudo systemctl start docker
-- Docker 서비스 시작
sudo usermod -aG docker $USER
-- 현재 사용자를 Docker 그룹에 추가해 sudo 없이 Docker 명령어 실행
docker pull mysql/mysql-server:latest
-- 최신 버전 MySQL 이미지를 Docker Hub에서 다운로드
docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3306:3306 mysql/mysql-server:latest
name crawling
: 컨테이너 이름e MYSQL_ROOT_PASSWORD=1111
: root 비밀번호 1111 설정d
: 컨테이너 백그라운드 실행p 3306:3306
: 호스트 3306 포트-> 컨테이너 3306 포트에 연결
docker ps
입력해서 확인!
이렇게 뜨면 된건데, 이상하게 자꾸 연결이 안되는거다.
그래서 확인해보니 pc 포트가 막혀 있었음 ^^^ 이게 나라냐
결국 컨테이너 지우고 ^^ 다시해
docker stop crawling
docker rm crawling
-- 컨테이너 삭제
docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3334:3306 mysql/mysql-server:latest
-- 다시 빌드하기
다행히(?) 3334 포트는 열려 있어서 3306으로 포워딩 시켰다
⚡mysql 한글 검색이 안되던 문제를 해결한 방법 중 하나가
docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3334:3306 mysql/mysql-server:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker를 run할 때 utf-8을 직접 설정해 준 것이다. 참고 !
이건 그냥 참고용
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' crawling
-- 도커 ip 주소 확인
import pymysql
# 데이터베이스 연결
connection = pymysql.connect(
host='localhost', # 내부에서 사용중이어서
user='root',
password='1111',
database='crawling',
charset='utf8mb4',
port=3334
)
python에서 이런식으로 코드를 작성하면 연결된다
기존 DB의 데이터를 백업 파일(예: .sql 파일)로 준비해야 한다 !
docker cp /mnt/c/202410071345.sql crawling:/tmp/
-- .sql 파일을 Docker 컨테이너 crawling의 /tmp/ 디렉토리로 복사
docker cp
-- 호스트 - 컨테이너 간 파일 복사/mnt/c/202410071345.sql
-- 복사할 파일의 경로crawling:/tmp/
-- 파일이 복사될 컨테이너와 그 안의 경로나의 경우는 "C:\202410071345.sql"여기에 파일이 있었기 때문에 쉽게 할 수 있었다.
docker exec -it crawling bash
-- 컨테이너 내부 접속
✨docker exec -it -e LC_ALL=C.UTF-8 crawling bash
-- 컨테이너 내부 접속 시 한글 사용 가능하게 만드는 명령어 !!!!!!!!!!!!!✨
mysql -u root -p1111
-- sql 접속
✨ 지금까지 bash를 접속하면 한글이 입력 안되고 한글자만 보이는 현상이 있었는데 이 명령어를 입력해서 접속하니까 한글 입력이 잘 되더라 ㅠㅠ 와 만세
CREATE DATABASE crawling;
-- 데이터베이스 생성
USE crawling;
-- 데이터베이스 사용
CREATE TABLE
-- 테이블 생성
CREATE TABLE test (
column1 datatype,
column2 datatype,
...
);
이런식을 테이블을 생성해주면 된다
SOURCE /tmp/202410071345.sql;
-- sql 삽입
그리고 나서야 드디어 ! 데이터를 넣을 수 있었다
쌓여가는 쿼리들. vㅔ리 굿
DESCRIBE <테이블명>;
-- 테이블에 대한 정보 확인
여기에서 쿼리문을 날리면 데이터들을 확인할 수 있다
mysql이나 bash는 모두 exit
을 입력하면 빠져나올 수 있다.
외부에서 접속하기 위해 사용자 권한을 부여해준다.
나는 그냥 기본 값으로 부여해줬음
CREATE USER '사용자이름'@'%' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
-- 사용자에게 모든 DB, 테이블 접근 권한 허용
FLUSH PRIVILEGES;
-- 상태 바로 반영
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods??
요 이상한 에러는
ALTER USER 'shua'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
이걸로 해결할 수 있다
pymysql.err.OperationalError: (1049, "Unknown database 'crawling'")
요 에러는 내가 데이터베이스를 안 만들어서 그런다
(CREATE DATABASE crawling)
pymysql.err.OperationalError: (1044, "Access denied for user 'root'@'%' to database 'crawling'")
요 에러는 모든 db, 테이블 접근 권한을 안줘서 그렇다
(GRANT ALL PRIVILEGES ON . TO 'root'@'%';)
1) docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3334:3306 mysql/mysql-server:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
-- docker 빌드 시 MySQL 서버에 직접 utf-8 설정하기
2) docker exec -it -e LC_ALL=C.UTF-8 crawling bash
-- 한글 입력 가능한 상태로 bash 접속하기
진짜 엄청 고생했는데 ㅠㅠㅠㅠ
답을 찾아서 다행이다 진짜 한시름 놓았다 ㅠㅠㅠㅠㅠㅠ
왜 안되는건진 모르겠지만, 한글로 검색이 안된다...
한글 쿼리문 입력도 안되고 미치겠음!!!!!!
포트 포워딩도 안돼서 엄청 고생했는데............
dump 파일도 utf-8로 하고, character_set%도 utf8mb4 변경했으나 대실패.... 이유를 알 수 없다
이 문제는 차차 해결해야겠다 ㅠㅠ
오늘 하루 요약 :
모든 문제는 결국 해결 되게 되어 있다
정말 만만세다 만만세 ㅠㅠ!!!!