[Python] 외부 DataBase connection (feat. 터널링)

Seongkeun·2023년 2월 26일
1

Python

목록 보기
6/8
post-thumbnail

개요

내가 사용하는 Local Desktop 에서 회사 서버(Local)의 DataBase 에 접속하고자 한다
로컬이란 내 desktop 으로부터 자유로이 connect(SSH) 가능한 192.168 로 시작하는 IP 주소를 의미한다.

Needs

당연히 접근하려는 서버에 database 가 깔려있어야 하고 Database 는 activate 상태여야 한다.

사용환경

  • Ubuntu 22.04LTS
  • Python 3.10.6
  • MySQL (Database)

사용 Library

  • pymysql
  • sshtunnel

서버 mysql 및 상태 체크

  • mysql bind-address, port 등 mysql 상태 체크
    • vim /etc/mysql/mysql.conf.d/mysqld.cnf
    • mysql 밑에 port 가 주석처리('#') 되어있는 상태라면 port 번호는 default(3306) 로 적용된다
  • mysql 이 activate(running) 상태인지 체크
    • sudo systemctl status mysql
    • Ctrl+c 로 나올 수 있다
  • 서버 방화벽 체크
    • sudo ufw status
  • 서버 ip 주소 체크
    • ifconfig 에서 inet 확인
  • 서버 127.0.0.1 의 DNS 주소 확인
    • vim /etc/hosts 에서 127.0.0.1localhost 로 되어있는지 확인

코드

import pymysql
from sshtunnel import SSHTunnelForwarder
import getpass

ssh_pw=getpass.getpass() # ssh 비밀번호
mysql_pw=getpass.getpass() # mysql 비밀번호


if __name__ == '__main__':
    with SSHTunnelForwarder(
            ('192.168.0.160', 22),
            ssh_username='flower',
            ssh_password=ssh_pw,
            remote_bind_address=('localhost', 3306),
            local_bind_address=('localhost', 3306),
        ) as tunnel:
        conn = pymysql.connect(
            user='root',
            password=mysql_pw,
            host='localhost',
            port=tunnel.local_bind_port,
            database='name of database',
        )
        
        cursor = conn.cursor()
        cursor.execute('select * from table limit 50')
        
        results = cursor.fetchall()
        for result in results:
            print(result)
            
        cursor.close()
        conn.close()

다른 버전 - 서버 터미널로 터널링

사용 library

  • mysql-connector-python

teminal

  • local terminal 에서 아래와 같이 접근하려는 서버에 ssh
    • ssh -L 3306:localhost:3306 flower@192.168.0.160
    • ssh 할 서버에 포트번호가 따로 설정되어있다면 아래와 같이 접근 가능하다
      ssh -p {portnum} -L 3306:localhost:3306 flower@192.168.0.160
    • ssh 터널링을 유지시키려면 위 커맨드로 서버 접속하고 끄면 안된다.

코드

import mysql.connector
import getpass

mysql_pw=getpass.getpass() # mysql 비밀번호

mysql_db = mysql.connector.connect(
  host="127.0.0.1",
  port=3306,
  user="root",
  password=mysql_pw,
  database="name of database"
)

mysql_db.is_connected() # 접속 되었는지 상태체크, True : db접속상태

cursor = mydb.cursor()
cursor.execute('select * from table limit 50')
result = cursor.fetchall()

for row in result:
  print(row)
  
cursor.close()
mysql_db.close()

TROUBLE SHOOTING

mysql_db = mysql.connector.connect(
  host="127.0.0.1",
  port=3306,
  user="root",
  password=mysql_pw,
  database="name of database"
)

host 에서 "127.0.0.1" 대신 "localhost" 라고 쓰면 간혹 오류가 날 수가 있다. 그건 아마 당신의 /var/run/mysqld/mysqld.sock 이 없어서 그럴가능성이 있다. localhost 는 unix socket 을 이용하는 것이고 127.0.0.1 은 network socket 을 이용하는 것이다.

profile
지혜는 지식에서 비롯된다

0개의 댓글