Database/Database__Mysql

mysql_config_editor

말하는감자 2019. 7. 24. 14:37

mysql_config_editor

id/pwd 없이 키파일로 접속이 가능하도록 하는 파일
계정의 .mylogin.cnf 라는 파일로 저장된다
.mylogin.cnf 파일은 소유자만 read write 할수있는 권한 600에서만 동작한다
암호에 # 스트링을 포함하지 않아야 한다

 

 

centos 에는 mariadb가 기본적으로 설치되어 있기 때문에 일단 삭제

1. 
패키지를 확인
yum list installed mariadb\*
yum list installed maria\*


2.
나오는 것들을 모두 삭제한다
yum remove -y mariadb-devel.x86_64

3.
mysql이 혹시 설치되었을지도 모르니 확인해본다
mysql -V

 

mysql client 설치(서버 X)

yum install mysql 로 설치했더니 이넘이 자꾸 mariadb깔자고 조름 ㅠ... 다운받아서 설치했다

여기서 중요한것은 mysql client 는 5.6.6 이상으로 설치해주어야 한다

내가 바로 5.6.1 설치했다가 버젼 안맞아서 못쓰고 있는 사람입니다 ^^... 바버가튼나..

구글링을 좀 해봤더니 자꾸 server 설치하는거랑 5.x 버젼 설치만 나온다

하지만 저는 8.0을 원합니다...

1.
mysql client를 다운받는다. 5.6 이상으로 받는다.
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

2.
yum list에 추가해준다
rpm -ivh mysql80-community-release-el7-3.noarch.rpm

3.
설치 가능한 목록에 있는지 확인해본다
yum list mysql\*

4.
설치한다
yum install mysql-community-client.x86_64

5.
잘 설치되었나 확인해본다
mysql -V

 

 

키파일 생성 및 사용하기

로그인 패스를 설정하지 않으면 로그인 패스는 자동으로 client로 잡힌다

만약 암호에 특수문자가 섞여있다면 "asdf!(!(!(!(!" 이런식으로 시작과 끝에 " 를 써주세요

키파일 생성
1. 
mysql_config_editor set --login-path=패스이름뇸뇸 --host=디비아이피뇸뇸뇸 --port=접속포트 -u디비아이디 --password
mysql_config_editor set --login-path=로그인패스이름 --host=아이피 --user=아이디 --port=포트 --password

2. 암호 설정에 디비 암호 입력

3. 접속 정보를 확인해본다
mysql_config_editor print --all

4. 접속 정보를 사용해본다
mysql --login-path=패스이름뇸뇸

5. 필요 없으면 지워버린다
mysql_config_editor remove --login-path=패스이름뇸뇸

 

 

키파일 저장 경로

find / -name .mylogin.cnf

/root/.mylogin.cnf
/home/계정이름/.mylogin.cnf

 

 

 


 

 

 

 

소스 단에 적용하기

 

기존의 소스

import pymysql
conn = pymysql.connect(host="호스트아이피", user="아이디", password="암호", db="디비이름", 
charset="utf8", cursorclass=pymysql.cursors.DictCursor, autocommit=True)

 

필요한 패키지 설치

pip3.6 install myloginpath

 

소스 수정 - pymysql

import myloginpath, pymysql
conf = myloginpath.parse('생성한키파일이름')

#conf 를 출력해서 확인해보면 dict 형태를 가지고 있는데 keyword argument로 인자값을 전달하는듯
conn = pymysql.connect(**conf, db='디비이름')

#결과값을 list로 받기
cur = conn.cursor()

#결과값을 dict로 받기
cur = conn.cursor(pymysql.cursors.DictCursor)

#여기까지만 적용해주면 DB접속에는 문제가 없을것이다


#test
cur.execute("쿼리문")
result = cur.fetchone()
print(result)

 

만약 위의 예제로 했는데

mysql --login-path=키파일이름으로는 로그인 되지만 소스단에서는 access denied 된다면..

당신은 혹시 암호에 특수문자를 섞었나요?......

Dict는 특수문자 앞뒤를 감싼 ""까지 password로 읽는 중입니다... 

아래와 같이 소스를 바꾸세요 ㅠ ㅠ 

password = conf['password'].replace('"', '')
conn = pymysql.connect(host=conf['host'], port=conf['port'], user=conf['user'], password=password, db='데이터베이스이름', charset='utf8', cursorclass=pymysql.cursors.DictCursor, autocommit=True)

 

소스수정 - sqlalchemy

import myloginpath

conf = myloginpath.parse('키이름')
engine_api = create_engine('mysql+mysqldb://%s:%s@%s:%s/%s?charset=utf8' %
                      (conf['user'], conf['password'], conf['host'], conf['port'], '디비이름'),
                      echo=False, pool_size=20, max_overflow=20, convert_unicode=True, pool_recycle=500)
                      
                      

 

키 파일에 디비 이름은 지정되지 않는다

계정 이름, 암호, 포트 정도만 지정되기 때문에 하나의 아이피에 여러개의 DB가 생성되어 있다면 하나의 키파일로 여러개의 DB에 접속이 가능하다

 

그리고 mysql.connector?  가이드를 보고 아무리 열심히 따라해도 절대로 접속은 불가능하다... 이유는 모르겠다 ㅠㅡㅠ

sqlalchemy는 다른 스타일로 접속 시키고 싶었지만 인터넷에서 검색해서 찾은 parse등등을 아무리 사용해도 접속이 안돼서 그냥 내가 생각한 방법으로 해버림.....

'Database > Database__Mysql' 카테고리의 다른 글

멀티 컬럼 인덱스  (0) 2020.07.06
ERROR 1418  (0) 2020.02.20
데이터 관리  (0) 2020.02.20
사용자 관리  (0) 2020.02.20
centos7 mysql clean install  (0) 2020.02.20