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
라인별 코드 설명은 따로 하지 않겠습니다. 궁금 하신 분들은 댓글로 문의 해주세요.
유용하게 잘 쓰시기 바라겠습니다.
실행 방법
프로그램 실행방법은 아래 프로그램을 다운로드 받으시거나, 위 코드를 그대로 복사해서 쓰시면 됩니다.
파이썬 코드니 뭐니 그런거 잘 모르시면 아래 프로그램을 다운로드 받으세요.
뭔가 웹에서 exe 파일 다운로드 받는게 겁나시는 분들은 위 코드를 이용하시구요.
뭐, 제 블로그 보시면 아시겠지만, 이상한 프로그램 심지도 않구요. 그럴 능력도 안됩니다 ㅎㅎ
아무튼, 다운로드 폴더로 다운 받았다고 가정을 한다면, 아래와 같이 윈도에서 cmd를 실행하시고 프로그램명과 입력 아규먼트를 써서 실행 하시면 됩니다.
table_ddl.exe 1.2.3.4 3306 dba_acct passwod schema_name
이렇게 프로그램이 문제없이 실행이 되었으면 다운로드 폴더로 이동 해보세요.
그럼 거기 table_ddl.sql이 있을겁니다.
이걸 시작으로 앞으로 하나씩 발전시켜 나가도록 하겠습니다.
많은 호응 부탁드리겠습니다.
감사합니다!!!!
by.sTricky
'Database > mariaDB administrator' 카테고리의 다른 글
mariadb partition table의 종류와 선택 기준 주의할 점 (0) | 2021.07.02 |
---|---|
[mysql 독학] 독학으로 예제따라 익히는 mysql/mariadb SQL 입문서 출간 (47) | 2021.06.03 |
mariadb mysql 특정 스키마 테이블 ddl 추출 프로그램 배포 (2) | 2021.05.31 |
[mariadb] binary log 안전하게 삭제하는 방법 (0) | 2021.05.27 |
mysql binary log 복구 방법 & create update delete insert alter 명령어 추출 방법 (2) | 2021.04.22 |
replace into & insert into 차이점, 주의할점이 무엇인지 쉽고 간단하게 확인하기 (2) | 2021.03.18 |
살짝 수정 필요하다 싶은 부분이 있어서 의견 드려요.
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")
이런거 좋습니다~!
제가 아직 파이썬을 접한지 얼마 안되서.. 서툰 부분이 많을겁니다.
이렇게 시간내어서 잘못된점 짚어주셔서 정말 감사드립니다.
acc 부분은 기존 사내 프로그램에서 떼오면서 수정이 덜 된것 같습니다.
그쪽도 첨에 acc 스키마만 조회 했었는데, 지금은 여러군데꺼 다 조회하는 로직으로 변경하면서 변수처리 하여 동기화 작업 하고 있거든요.
파일을 열고 닫는 부분도 수정을 하고, 지적해주신 부분 수정해서 본문 업데이트 지금 하겠습니다.
다시한번 감사합니다.