기본 콘텐츠로 건너뛰기

라벨이 DBMS인 게시물 표시

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 day ago'`     NextMonthYYYYMMDD= `date +%Y%m%d --date '1 month'`     PrevMonthYYYYMMDD= `date +%Y%m%d --date '1 month ago'`     delete sqldump.sql     j

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 into 는 delete + insert이기 때문에 default 필드 또는 auto_increment 필드는 신규 로우를 추가한 것과 같은 영향을 받음. giip :: Free mixed RPA orchestration tool!  https://giipasp.azurewebsites.net/

오라클에서 테이블 생성 쿼리 작성 - ORACLE Management by SQL

Oracle의 관리 툴은 대부분 비용이 비싸서 가급적 무료툴로 관리를 한다. 그러다보면 기능들이 부족해서 SQL로 해결해야 하는 것들이 생기는데, 그 중에서 많이는 사용하지 않으나 있으면 관리하기 편한 하나가 바로 테이블이나 Procedure의 생성쿼리 이다. Oracle에서는 기본으로 제공해주는 쿼리이므로 주기적으로 select * from all_tables where owner = '<owner>' 로 테이블 명을 가져와서 아래 쿼리로 테이블 생성 쿼리를 업데이트 해주면 변경이력 관리가 필요없게 된다. select dbms_metadata . get_ddl ( ' TABLE ' , ' TableName ' , ' Owner ' ) from dual; select dbms_metadata . get_ddl ( ' Procedure ' , ' ProcedureName ' , ' Owner ' ) from dual; 추가로 Procedure작성쿼리도 추가함.. select * from all_objects 로 검색해서 Procedure나 Function도 가져오면 편할 듯.. Do not login your server any more! giip :: Free server management tool! https://giipasp.azurewebsites.net/

한국어, 일본어 대응 가능한 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로 해당 국가 전용으로 만든 케이스가 있다보니 이러한 소수의 케이스에는 과거 버전인 2.9

[DBMS튜닝] 사람들이 쉽게하는 PK및 인덱스 실수

대부분의 사람들의 실수중에 row가 몇백개 없어서 PK자체를 안잡는 사람이 있다. 이런 경우 어떠한 현상이 일어날까? 잘 보이는지는 모르겠지만, 단순 select에 where에 자기 테이블내 특정 필드에 Y값을, 그리고 Z필드로 정렬하고 있다. 하지만 프로파일러에서 보면 20초가 넘었다. 가끔 한 번하는데는 전혀 문제가 없다 500ms미만으로 처리된다. 하지만 왜 이따금 발생하는 것일까? 정확한 DBMS의 엔진 알고리즘을 알고 있지는 않다. 하지만 경험적으로 말할 수 있다. 동일 쿼리를 여러번 시도하는 경우 PK가 없으면 정렬이 되지 않기 때문에 우선 Table Scan을 처음부터 해서 계속 메모리에 올리게 된다. 즉 Disk I/O와 Memory I/O가 지속적으로 일어나는 것이다. 때문에 동시 100번 정도 처리되도 전부 Disk I/O를 사용하게 된다. 단지 800행도 되지 않는데 20초를 먹을 수 있는 것이다. 하지만 PK를 Clustered index로 걸게 되면 처음 Insert할때마다 PK에 의존해서 Sorting을 계속하게 된다. 나중에 Select할때는 언제나 같은 것을 가져오기 때문에 Cache에서 처리할 수 있는 것이다. 그럼 누군가가 다시 질문한다. "50행도 안되는건 괜찮나요?" 그냥 맘대로 해라.. 선을 그어서 어디까지는 되고, 어디부터는 안된다는 흑백논리는 60년대나 하는 것이지, 모든 것을 정해놓고 이렇게 하세요 하는 것은 아직도 현실을 모르는 사람들이나 하는 것이다. 1Row가 1MB가 되도록 짜는 사람들도 있는 것이고, 1000Row가 100KB가 되도록 짜는 사람들도 있을 것이다. DB의 구조설계부터 스스로 판단하고 튜닝도 결정해라. 누누히 얘기하지만, 튜닝이란 것은 만들때 하고 땡이 아니다. 우리가 1년에 한번씩 건강검진을 받듯이, DBMS도 자신에게 축적된 노폐물이 어딨는지 찾고 부정맥이 어딨는지 찾기 위해 건강검진을 받아야 한다. 이

syscacheobjects (SQL Server)

해킹 또는 데이터의 변조등 이상한 문제가 발생했을 때 가장 먼저 훑어보는 System View이다. 이외에도 퍼포먼스 튜닝을 하려는데 개발쪽에서 모든 쿼리를 주지 않은 경우 훑어볼 경우도 사용하곤 한다. 최근에 일어났던 SQL의 내용을 모두 볼 수 있다는 것이 장점이고, SQL을 실행시킨 사람이나 시간을 볼 수 없다는 것이 단점이다. 우선 여기서 의심스러운 쿼리들을 훑어낸 뒤에 이것을 이용하여 Profile을 한다거나 여러가지 액션을 취할 수 있다. 아래는 syscacheobjects뷰의 생성쿼리이다. 기본적으로 생성되어있지만, 참조되는 테이블을 확인할 때 쓰기위해 적어놓는다.