기본 콘텐츠로 건너뛰기

라벨이 mysql인 게시물 표시

롯뽕기... 그리고 쿼리 튜닝

영상버전 : https://youtu.be/S7CDcs0bLJM 고객사에서 환영회를 하자고 해서 관련 사람들 7명이 모인 작은 노미까이에 초대 받아서 롯뽕기에 왔습니다.  롯뽕기는 수도고속도로 아래의 자투리 공간에 바이크 주차장을 운영중이네요..  국가에서 관리하는 곳이라 저렴하니 바이크로 롯뽕기에 오시는 분들은 참고 바랍니다.  30분에 100엔이고 12시간 이내라면 최대 1000엔으로 고정이므로 주차비 걱정을 안해도 될 듯 합니다.  노미까이에서 저를 극찬을 아끼지 않아주셔서 몸둘바를 몰랐는데..  오히려 제가 이 환경에선 담당자분들이 정말 좋은 환경의 튜닝을 경험할 수 있어서 행운이라고 말씀을 드렸지요.  SQL Server라는 RDBMS의 대표격인 제품의 특장점에서, 무료 MySQL엔진의 Aurora에 IOPS가 떨어지는 클라우드 환경에서의 튜닝기법, 그리고 Key Value 베이스인 TiDB환경에서의 튜닝방법까지 제게서 배워간다면,  어떠한 교육기관에서도 배울 수 없는 경험을 할 수 있으니 제가 가진 경험을 받아가실 수 있는 최고의 환경이라고 했지요..  참고로 여기 DB운영 사람이 부족해서 추가로 더 모집한다고 합니다. N1자격이나 동등의 일본어 능력을 가지신 분들 중에 이 프로젝트에서 저와 같이 하고 싶으신 분들은 연락 주세요~ ^^ 회사의 밸류가 구치코미, 즉 유저 평가의 분석을 무기로 한 기업이다 보니 AI에 대한 활용 방법론 등도 관심을 많이 가지고 있어 미래가 기대되는 곳이었습니다… 이런 건전한 이야기를 하면서 두 시간 코스로 식사를 하고 헤어졌는데요.. 2차를 가자고 했는데, 2차는 회사 내부 사람들과 가라고 하고 전 빠졌지요..  그런데 여기 사람들과는 좀 더 오랫동안 좋은 관계를 가지고 싶네요..  담당자 분들도 순수하고 밝고 내부에서도 서로 배려하는 모습이 아주 좋았습니다.  일단, 정치질 하려는 사람이 저랑 엮인 분들 사이에선 ...

월99만엔 TiDB프로젝트 2주째. 기존 디비의 튜닝

영상버전 :  https://youtu.be/VO7eNgFAGDA 2주 째에 들어왔습니다.  업무시간 8시간 중에 거의 5~6시간은 화상회의를 켜놓고 하게 되네요.  너무 지치는군요..  지난 번 프로젝트가 너무 널럴해서 그랬나봐요..^^;;;  한국과 조금 다른 것은  모두들 발언을 신중히 하기 때문에 말은 많지 않으나,  그 사람들의 말이 정말 이런 이유인지 아니면 다른 원인으로 인한 것인지를 찾는데 신경을 쓰다보니  더 빨리 피곤해지는데요..  지금은 TiDB 잘한다는 사람이 앞단의 교통정리를 헤주고 있으니 잘 하겠죠.  정말 잘할지는 모르겠으나 월권은 귀찮으니.. 하다가 폭탄 만들면 프로젝트를 뜨는 걸로..  SES는 SI와는 달리 프로젝트가 맘에 안들면 언제든 뜰 수 있는게 부담 없어 좋습니다.  리더를 해도 내가 합당한 이유를 우리쪽 영업에게 이야기 하면 빼주거든요..  요즘처럼 사람이 부족한 시기는 고를게 많아서  아무리 비수기라 해도 사람이 부족해 뒤늦게 가격 올려서 구인 하는 경우도 있어요.    첫주엔 27분기 총회가 있어서 참여를…  잊어먹고, 나중에 녹화방송을 봤습니다.  사원은 지금 마구 뽑아서 200명이 되었는데.. 3년 전에 수십억엔 매출이 2년전에 850억, 작년에 1850억엔이었네요..  레드오션이라는 화장품 시장에서 스타트업이 이 정도 수직상승이 가능…하네요..  여기 정사원들은 나중에 스톡 받겠네요…좋겠다…^^;;;  그건 그렇고..  이번주에 기억나는게 두 가지 있었는데요..  하나는 sql server의 리플리케이션이 끊어져 다시 걸어달라는 내용이었습니다.  얘네들은 부하가 너무 커져서 8대의 리플리케이션용 디스트리뷰터 조차 따로 두어서 마스터의 부하를 최소한으로 운영한건 좋었는데.. 마스터의 HA구성으로 대기용 ...

MySQL Replication

First Configuration Master Server -- create user for replication GRANT REPLICATION SLAVE ON * . * TO ' replusr ' @ ' XXX.XXX.XXX.XXX ' IDENTIFIED BY ' replpwd ' ; -- check user select user, host from mysql . user where user = ' replusr ' ; RESET MASTER; -- Locking for start sync FLUSH TABLES WITH READ LOCK; -- check all task was flushed SHOW STATUS LIKE ' Key_blocks_not_flushed ' ; /* Key_blocks_not_flushed | 0 */ -- get file name and position SHOW MASTER STATUS\G; /* File: mysql-bin.000001 Position: 999 */ Master check sync mysql -u root -p -e " SHOW ENGINE INNODB STATUS\G " | grep -e " Log sequence number " -e " Log flushed up to " Master backup mysqldump -u root -p --all-databases > all-databases.dmp Slave conf STOP SLAVE; RESET SLAVE ALL; -- using master file and position CHANGE MASTER TO MASTER_HOST = ' XXX.XXX.XXX.XXX ' , MASTER_USER = ' replusr ' , MASTER_P...

mongodb에서 mysql로 간단하게 데이터 임포트 및 익스포트

누군가 요청해서 재미삼아 만들었음.. mongodb를 mysql에서 불러들이는 방법은 몇 가지가 있는데요..  1. mongodb에 mysql 모듈을 설치해서 mysql에서 호출하는 방법..   -> 설정이 많이 필요해서 귀찮음 2. mongodb에 mysql 5.7이후라면 json import를 이용해서 json으로 집어넣는 방식   -> mongodump를 이용해서 json 파일로 넣고 json_import를 이용해서 테이블에 넣으면 되기 때문에 간단한 명령으로 쉽게 정리 됨.    단점은 KVS(Key Value Store)로 저장되기 때문에 쿼리가 살짝 귀찮아짐.. 기존 쿼리를 사용할 수 없다.  SELECT doc->>"$.name" AS name FROM test.my_restaurants WHERE doc->>"$.cuisine" = "Italian"    요런 느낌으로 쿼리를 짜야 함. 3. mongodump로 json으로 떨군 뒤에 jq로 읽어서 쉘로 필드를 뽑은 뒤에 mysql커맨드로 insert처리를 함.       #!/bin/bash      # Useful date text     TodayYYYYMMDDHH24MISS= `date '+%Y%m%d%H%M%S'`     TodayYYYYMMDD= `date '+%Y%m%d'`     TomorrowYYYYMMDD= `date +%Y%m%d --date '1 day'`     YesterdayYYYYMMDD= `date +%Y%m%d --date '1 d...

MySQL - insert or update - replace vs. insert on duplicate key

Insert into ~ on duplicate key update INSERT   INTO  tableA (sn, cateid, catename)  VALUES     ( 101 ,  'A001' ,  'CateA1' ),     ( 102 ,  'B001' ,  'CateB1' ),     ( 103 ,  'C001' ,  'CateC1' ),     ( 104 ,  'C002' ,  'CateC2C' ), ON  DUPLICATE  KEY   UPDATE  catename = ( CASE   WHEN  catename =  'C002'   THEN  catename  ELSE   values (catename)  END ); replace REPLACE   INTO  tableA (sn, cateid, catename)  VALUES     ( 101 ,  'A001' ,  'CateA1' ),     ( 102 ,  'B001' ,  'CateB1' ),     ( 103 ,  'C001' ,  'CateC1' ),     ( 104 ,  'C002' ,  'CateC2C' ); on duplicate key update의 경우 기존 row에서 update를 하지만,  replace in...

DBMS 튜닝(tuning)시 유의 점

DBMS의 튜닝의 70% 이상은 SQL튜닝과 Index튜닝으로 해결 됩니다. 하지만 예외적인게 조금 있지요. 얼마 전에 옆에서 이상하게 속도가 느려진 쿼리가 있어서 봐달라고 쿼리를 보여주었습니다. 힌트를 주어 강제로 인덱스를 태우고 있었습니다. 이 힌트는 왜 주었냐고 물어보니 원래 그렇게 되어 있어서 사용중이었다고 합니다. 아마 초기에 만든 사람이 사라지고 그냥 그 동안 문제 없이 쓰고 있었던 것 같네요. 그냥 잘 모르면 힌트를 없애고 돌려보세요. 라고 가이드를 했더니 3초 이상 걸렸던 쿼리가 0.01초로 끝났습니다. 이유는 뭘까요? 대부분의 인덱스는 초기 개발자가 개발하면서 만든 인덱스 외에는 나중에 추가 되는 경우가 많지 않습니다. 대부분 한 번 만들면 그게 최적이라고 생각하는 경우가 대 부분이고, 지금 처럼 초기에 만든 사람들이 사라지고 물려받은 사람들은 이유를 모르고 사용하는 경우도 있습니다. 테이블 설계시의 예상 데이터 축적량을 보고 아무리 DB 전문가가 Index를 걸어준들 사용자의 성향이나 시대에 따라 데이터는 전혀 달리 쌓이게 되는게 보통입니다. 예를 들어, 한국형 게시판은 대 부분 글이 많고 댓글이 적은 편입니다. 이유는 튀기 좋아하는 한국인들은 자기가 돋보여야 하기 때문에 댓글에 달 글 조차도 글쓰기로 올라와서 많은 사람들이 보게 하길 원하는 경우가 많기 때문이지요. 하지만 이 게시판으로 일본에서 서비스를 해보면 글은 얼마 안올라오는데 댓글이 수천에서 수만개가 쌓입니다. 즉 유저의 성향에 따른 데이터의 편중이 달라지는데, 이 때 게시글 옆에 댓글을 카운트 하는 경우 subquery를 이용해서 카운트 하는 경우도 많고, group by 를 이용해서 한 번 카운트 한 댓글 통계를 join하는 경우도 있습니다. 전자의 경우는 댓글 수가 적은 한국에서는 좋은 쿼리이나, 댓글이 너무 많아진 일본에서는 group by에 비해 많은 양의 카운트를 nested loop로 처리하게 되므로 효율이 많이 떨어집니다. ...

한국어, 일본어 대응 가능한 DBMS Query Tool - ORACLE MySQL SQL Server ODBC 지원

A5MK2라는 일본인이 만든 무료 툴이 있다. 그 동안은 Orange라는 국내 유료 소프트를 사용했는데, 너무 고가다 보니 회사에서는 대체 툴을 희망하였고, 이것저것 찾아보다보니 일본인 스탭에게서 추천을 받아 사용을 해보게 되었다. 공식 홈페이지 :  https://a5m2.mmatsubara.com/ 공식 홈페이지(개인 이지만..)에 들어가도 일본 특유의 이뿌지 않고 실용적이기만 한 페이지가 뜨고.. 다운로드 및 과거 버전 다운로드가 가능하다. 사용하면서 느낀 점으로 보아 Orange의 DBA툴(Orange의 메뉴명)은 보기가 좋은 장점이 있는데, 그 외의 기능들을 보면 A5MK2는 떨어지지 않는 훌륭한 툴이다. 그래도 Orange의 장점을 들어보자면 DBA에서 Tablespace기능이나 AWR추출 기능등은 보기도 편하고 클릭 한 번으로 쉽게 확인 및 처리가 가능하다. 하지만, 사이즈가 큰 경우 Processing... 이라고 표시되면서 몇 시간이고 사용을 못하게 되는 단점은 있다. 그 부분에서 본다면 그냥 필요한 부분을 모두 SQL로 보관하고 처리하면 A5MK2에서도 별로 문제 없이 사용할 수 있으므로 그 부분은 좋았다. A5MK2만의 장점을 들자면.. 접속가능한 DBMS가 많다! Oracle OCI 및 직접 접속 IBM DB2 Microsoft SQL Server Interbase/Firebird PostgreSQL MySQL Mariadb SQLite AccessDB ADO(OLE, ODBC) 지원이 안되는 것이 있다면 ODBC로 연결후에 접속을 해버리면 된다! 아쉽게도 최신 버전에는 강제 UTF Encoding이 걸려있어 과거 버전의 Encoding을 할 수 없는 커넥터로 연결하면 글자깨짐이 발생할 수가 있다. 처음부터 UTF8로 만들어진 경우는 전혀 문제 없으나 예전에는 ANSI로 해당 국가 전용으로 만든 케이스가 있다보니 이러한 소수의 케이스에는 과거 버전인...

BI의 궁극판! Apache Drill을 써보자!

사실 Apache Drill 은 BI(Business Intelligence)라고 부르는 것 보다는 단순 데이터 연결 엔진이다. https://drill.apache.org/ 하지만 내가 왜 극찬을 하느냐면.. DBA로서 항상 문제가 되어왔던게, 이기종 데이터의 변환이나 처리였다. 포맷을 맞추는데 엄청난 시간이 걸리고, 데이터 임포트 실패가 무수하게 나고.. 한 번 잘못 데이터를 추출하면 다시 조정, 변환, 추출하는데 시간이 많이 걸린다. 그런데! Apache Drill은 그냥 RDB를 CSV랑 연결해서 조인해서 통계를 낼 수 있다. 그것도 표준 SQL을 사용하여! 예를 들어, CSV의 세 번째 컬럼이 price 이고, 물건의 판매이력을 PG사에서 CSV로 출력 받았다. 우리 DB와의 검증을 위해서는 수동으로 Import를 한 뒤에 포맷이 안맞아 잘리는 데이터가 있다면 다시 맞춰주고, 재 임포트를 수십 번, 그리고 나서 겨우 들어간 데이터를 조인하여 빠진 데이터를 분간한다. 숫자가 적다면 개발자가 개발로 처리할 수도 있지만, 건수가 하루에 300만건 짜리라면.. 한 달 온 파일은 9천만 건이다. 프로그램으로 고작 처리하는 것이 초당 500건. 거의 20만초, 에러 없이 약 56시간.. 에러가 생기면 다시 56시간.. ㅠㅡㅠ 이런게 현실이기 때문에 쿼리 말고는 방법이 없다. apache drill 의 진면목을 보자! 이번에는 좀 범용 적인 MySQL DB와 붙여 보자. . 난 이번에는 Mac에서 작업을 했기 때문에 그냥 다운 받아서 풀었음.. https://drill.apache.org/download/ 여기서 자기 OS에 맞는 버전을 받아서 설치하시길.. 압축을 풀고 나면 MySQL 커넥터를 붙여야 한다. https://dev.mysql.com/downloads/connector/j/5.1.html 여기서 다운로드 이런 커넥터 들을 붙일 때마다 콘피그를 수정해 줘야 하지만, 몇 번만...