본문 바로가기

Database/mariaDB administrator

mariadb mysql 특정 스키마 테이블 ddl 추출 프로그램 배포

mariadb mysql 특정 스키마 테이블 ddl 추출 프로그램 배포

mariadb mysql 특정 스키마 테이블 ddl 추출 프로그램 배포

안녕하세요.
sTricky 입니다. 저 sTricky가 오늘부터 작은 목표를 하나 만들었습니다.
ETL을 하는데 있어서 좀 더 편하고, 공짜로 하실수 있도록 간단한 툴을 파이썬으로 제작 해보는건데요.

처음부터 완벽하고 거창하게 시작 할 수는 없어서, step by step 으로 나가보도록 하겠습니다. 그래서, 오늘 처음으로 mariadb나 mysql에서 특정 스키마의 테이블 ddl을 추출 하는 프로그램을 작성했고, 공개 하도록 하겠습니다.

필요하신분들은 가져다가 쓰시고, 저보다 파이썬이나 DB에 더 능숙 하신분들은 프로그램 코드도 공개를 하니, 수정해서 쓰시면 되겠습니다. 주의 하실점은 본인보다 못했다고 욕하기는 없습니다.

그리고, 이걸 바탕으로 진화(?) 하신 코드를 작성하게 되시면 저한테도 함께 공유 해주시면 감사하겠습니다.


프로그램 코드


 

 

 

잘 아시겠지만, DB접속 계정, 비밀번호, IP등이 필요하기 때문에 프로그램 실행시 변수로 받도록 작성을 하였습니다. 그래서 입력 아규먼트가 5개나 됩니다.

입력 아큐먼트 정보는 아래와 같습니다.

* DB서버 IP
* DB서버 port
* DB계정
* DB계정 비밀번호
* DDL 백업 스키마 명

이렇게 총 5개의 정보를 입력하면서 프로그램을 실행 하시면 입력하신 스키마에 생성된 모든 table DDL이 윈도우 download 폴더에 table_ddl.sql 이란 파일로 저장이 될 것 입니다.

# import library
import pymysql
from pathlib import Path
import sys

# argvs
db_ip = sys.argv[1]
db_port = int(sys.argv[2])
db_acct = sys.argv[3]
db_pw = sys.argv[4]
db_schema = sys.argv[5]

# 개발 DB connect
conn_a = pymysql.connect(host=db_ip, port= db_port, user = db_acct, password=db_pw, db = 'mysql',charset = 'utf8') 
curs_a = conn_a.cursor(pymysql.cursors.DictCursor)

# download 경로
downloads_path = str(Path.home() / "Downloads")

######################################################################
# tables
######################################################################
sql = "select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = '" + db_schema + "'"
curs_a.execute(sql)

tables = curs_a.fetchall()

# 테이블 목록을 리스트로 저장
acc_tables = list(tables)

# 테이블 수 변수에 저장
tables_cnt = len(tables)

# ddl 파일 초기화

sql_file = open(downloads_path + "\\table_ddl.sql", "w")
sql_file.write("")
sql_file.close

sql_file = open(downloads_path + "\\table_ddl.sql", "a")
for i in range(1,tables_cnt):

    # db에서 ddl 추출
    ddl_sql = "show create table " + db_schema + "." + tables[i]['TABLE_NAME']
    curs_a.execute(ddl_sql)

    table_ddl = curs_a.fetchall()
    table_ddl = list(table_ddl)

    # 파일 열어서 저장
    sql_file.write(table_ddl[0]['Create Table'])
    sql_file.write("; \n")

sql_file.close

라인별 코드 설명은 따로 하지 않겠습니다. 궁금 하신 분들은 댓글로 문의 해주세요. 
유용하게 잘 쓰시기 바라겠습니다.

 

 

 


실행 방법


프로그램 실행방법은 아래 프로그램을 다운로드 받으시거나, 위 코드를 그대로 복사해서 쓰시면 됩니다.
파이썬 코드니 뭐니 그런거 잘 모르시면 아래 프로그램을 다운로드 받으세요.

table_ddl.exe
6.43MB

뭔가 웹에서 exe 파일 다운로드 받는게 겁나시는 분들은 위 코드를 이용하시구요.
뭐, 제 블로그 보시면 아시겠지만, 이상한 프로그램 심지도 않구요. 그럴 능력도 안됩니다 ㅎㅎ
아무튼, 다운로드 폴더로 다운 받았다고 가정을 한다면, 아래와 같이 윈도에서 cmd를 실행하시고 프로그램명과 입력 아규먼트를 써서 실행 하시면 됩니다.

실행예제

table_ddl.exe 1.2.3.4 3306 dba_acct passwod schema_name

이렇게 프로그램이 문제없이 실행이 되었으면 다운로드 폴더로 이동 해보세요.
그럼 거기 table_ddl.sql이 있을겁니다.

여기로~!

이걸 시작으로 앞으로 하나씩 발전시켜 나가도록 하겠습니다.
많은 호응 부탁드리겠습니다.
감사합니다!!!!

by.sTricky

  • Favicon of https://tzara.tistory.com tzara 2021.06.01 11:20 신고

    살짝 수정 필요하다 싶은 부분이 있어서 의견 드려요.
    1. 테이블 갯수가 성능에 크게 영향 줄리야 없겠지만 그래도 굳이 for 문 안에서 매번 파일 open/close 할 필요는 없을 듯 합니다. 그리고 매 실행 시 마다 내용 append 할 것 아니라면 굳이 파일 초기화도 불필요하지 않을까 싶구요.
    그렇다면 '# ddl 파일 초기화' 이 후 구문은 아래처럼 그냥 with 구문으로 정리해도 무난할 듯 합니다.
    2. ddl_sql 에서 'aac.'는 하드코딩될 게 아니라 db_schema 에 정의된 값을 이용하는게 맞을 듯 하여 그 부분도 살짝 수정 해봤습니다.
    3. range(1, tables_cnt) 으로 하면 첫 테이블 정보가 누락되네요. 그냥 range(tables_cnt) 이렇게 해야될 듯.
    4. table_ddl = list(table_ddl) 이게 필요한 부분인지 잘 모르겠어요. 빼도 상관없을 듯 싶은데 ...

    with open(downloads_path + "\\table_ddl.sql", "w") as sql_file:
    for i in range(tables_cnt):
    ddl_sql = "show create table " + db_schema + "." + tables[i]['TABLE_NAME']
    curs_a.execute(ddl_sql)
    table_ddl = curs_a.fetchall()

    sql_file.write(table_ddl[0]['Create Table'] + "; \n")

    • Favicon of https://stricky.tistory.com nice sTricky 2021.06.01 12:30 신고

      이런거 좋습니다~!
      제가 아직 파이썬을 접한지 얼마 안되서.. 서툰 부분이 많을겁니다.
      이렇게 시간내어서 잘못된점 짚어주셔서 정말 감사드립니다.

      acc 부분은 기존 사내 프로그램에서 떼오면서 수정이 덜 된것 같습니다.
      그쪽도 첨에 acc 스키마만 조회 했었는데, 지금은 여러군데꺼 다 조회하는 로직으로 변경하면서 변수처리 하여 동기화 작업 하고 있거든요.

      파일을 열고 닫는 부분도 수정을 하고, 지적해주신 부분 수정해서 본문 업데이트 지금 하겠습니다.
      다시한번 감사합니다.