SQL 쿼리 줄바꿈 단축키 

  • Ctrl + Shift + f 

 

명령어 실행

  • Ctrl  + enter : 해당 라인 또는 선택 영역 명령어 실행
  • Alt  + x : 전체 명령어 실행

주석 처리 / 해제  :  주석이 없으면 주석처리되고, 한번 더 수행하면 해제

  • Ctrl + / 

대소문자 변경

  • Ctrl  + Shift  + y : 선택 영역 소문자 변경
  • Ctrl  + Shift  + x : 선택 영역 대문자 변경

 

기타

  • F4 : 테이블 구조 보기
  • F3 : 신규 편집창 열기 

'Database(DB)' 카테고리의 다른 글

트랜잭션 격리성 수준  (0) 2018.08.04

오라클이나 MSSQL의 경우 EXCEPT 혹은 MINUS를 사용하여 차집합을 구할 수 있지만, 

MYSQL의 경우 버전에 따라 지원하는 경우도 있고 아닌 경우도 있다. 


TB1에 있는 데이터 중 TB2에 있는 데이터를 제외하고 가지고 싶다면,

JOIN하는 컬럼을 기준으로, 조인테이블의 값이 NULL인 경우를 WHERE절에 적어주면 차집합과 동일한 결과가 출력된다 


SELECT * 

FROM TB1 a LEFT OUTER JOIN TB2 b

ON (a.ID = b.ID)

WHERE b.ID IS NULL; 



개요

innodb_log_file_size 는 transaction 의 redo log 를 저장하는 로그 파일의 사이즈로 기본(ver 5.5)은 5,242,880  로 설정되어 있습니다.

이는 실제 운영 환경에서 사용하기에는 너무 작은 값이므로 256M 이상을 권장합니다.


설정

단순히 my.conf 에 위 값을 설정하고 MySQL 을 재구동하면 설정 값과 실제 로그 파일 사이즈가 달라서 다음과 같은 에러가 나고 구동되지 않습니다.

 

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 268435456 bytes!
160203 20:56:49 [ERROR] Plugin 'InnoDB' init function returned error.
160203 20:56:49 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160203 20:56:49 [ERROR] Unknown/unsupported storage engine: InnoDB
160203 20:56:49 [ERROR] Aborting

 

  1. 먼저 MySQL 을 종료합니다.

    service mysqld stop
  2. /etc/my.cnf 를 수정합니다.

    [mysqld]
    max_allowed_packet=512M
    innodb_log_file_size=512M
  3. 기존 redo log 파일을 삭제하거나 다른 폴더로 이동합니다. 로그 파일명은 ib_logfile 이며 뒤에 숫자가 붙어 있을수 있으며 /var/lib/mysql/ 위치합니다.

    mv /var/lib/mysql/ib_logfile* ~/
  4. MySQL을 재시작합니다.

    service mysqld start

 



출처 : https://www.lesstif.com/pages/viewpage.action?pageId=30703620

[COMMENT]

아직 프로시저에서 커서의 사용이 어떤 작업때 사용해야하는지 실무적으로 감이 없다.

대략적으로 이해한 것을 적어보면 select into 를 이용할 경우는 하나의 데이터만 변수값으로 가질 수 있으므로

select 한 결과를 한 로우씩 받아서 처리해야할 때 커서를 이용한다. 



프로시저 예제. 커서(CURSOR) 이용하기

1. 프로시저 생성 


DELIMITER //


DROP PROCEDURE IF EXISTS EVT_MONITORING;

CREATE PROCEDURE EVT_MONITORING()


BEGIN


DECLARE v_finished INTEGER DEFAULT 0;

DECLARE v_evtname varchar(20);                # select 한 컬럼을 담을 변수 선언

DECLARE v_evtlist varchar(255) DEFAULT "";  # 읽어온 로우를 하나로 연결하여 담을 변수 선언

DECLARE evtlist_cursor CURSOR FOR        # 커서 선언 (커서이름은 마음대로 생성 가능 ex. evtlist_cursor )

SELECT NAME FROM user;                     # 커서를 사용할 테으블 명시

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

OPEN evtlist_cursor;        # 커사를 사용하기 위한 오픈 명시

get_ename : LOOP

FETCH evtlist_cursor INTO v_evtname;    #  select에서 얻은 결과값을 v_evtname 변수에 넣는다 (여러개의 경우 , 로 구분)

IF v_finished = 1 THEN        # row 가 끝까지 갔을 경우 loop 빠져 나가기

LEAVE get_ename; 

END IF;

SET v_evtlist = CONCAT(v_evtname,",",v_evtlist);

END LOOP get_ename;

CLOSE evtlist_cursor;

#select v_evtlist;

  select RIGHT(v_evtlist,(CHAR_LENGTH(v_evtlist)-1));  #마지막 , 제외하기 위해서..


END //


DELIMITER ;



2. 프로시저 호출 및 결과 


CALL EVT_MONITORING();





row를 다 불러오고 나서 ,값을 없앨 수 있는 방법을 고민해봐야겠다 ㅠ

-> RIGHT, CHAR_LENGTH 함수를 사용하여 처리하였는데, 이런 처리 없이 바로 가능한 방법이 없을지 좀 더 고민해봐야지 ㅠ


참고 및 출처

커서사용 간단 예제 : http://coolmsd.tistory.com/31

[Stored Procedure] 10. MySQL Cursor : http://blog.duveen.me/20?category=657591


[COMMENT]

매일 최소 한개 이상씩은 프로시저를 만들어 보기로 했는데, 다른 일로 빠뜨려 먹는 날들이 생기고 있다..

최대한 의식해서 빠짐없이 간단한 프로시저라도 짜는 연습을 해야지 



[예제 2] 입력받은 매개변수 값에 따라서 변화하는 값 테이블에 입력하기 



■만드려는 프로시저 결과 예시 


 LNO

LINE 

 1

 2

** 

 3

*** 

**** 



1. 프로시저 생성하기 


DELIMITER //


DROP PROCEDURE IF EXISTS sp_start;

CREATE PROCEDURE sp_start(IN endvar INT)


BEGIN


DECLARE i INT;

DECLARE lineval VARCHAR(20);


DROP TABLE IF exists star;

create table star(LNO INT, LINE varchar(20));

SET i = 1;

while i <= endvar DO            #입력받은 매개변수 값 만큼 반복

select REPEAT('*',i) into lineval;             # 입력되어야할 문자와 반복횟수를 select ~ into 절을 이용하여 변수로 지정

insert into star values(i, lineval) ;           

commit;

SET i = i + 1;

END WHILE;

   #SELECT * FROM star; # 결과 확인 하고 싶을 경우 추가하기 


END //


DELIMITER ;



2. 프로시저 구동 및 결과 확인


CALL sp_start(5);             # 프로시저 호출 : 입력 매개변수로 5를 전달


select * from star;






※ 출처


MySQL로 배우는 데이터베이스 개론 : https://opentutorials.org/course/1578/8986  


[COMMENT]

빠른 업무적응을 위해서 최소 하루에 한개 이상씩 프로시저를 생성하는 연습을 할 예정이다..

프로시저 생성을 못할 경우에는 퇴근후 공부한 내용에 대해 포스팅을 진행할 생각인데, 

공부시간보다 포스팅 시간이 더 길어져서.. 잘 될지 모르겠다.. 



MYSQL 프로시저 매개변수와 동적쿼리 예제_1


1. 조회용 테이블 생성


create table GET_DATA(getData varchar(20));



2. 동적쿼리 테스트용 프로시저 생성 


DELIMITER //


CREATE  PROCEDURE `SP_DYN`(

IN TBL_NAME varchar(255))


BEGIN

 

DECLARE _STATEMENT VARCHAR(2500);

  

    SET _STATEMENT = CONCAT('SELECT * ');

 

    SET _STATEMENT = CONCAT(_STATEMENT, ' FROM ',TBL_NAME,' WHERE 1=1 ');

 

 

    SET _STATEMENT = CONCAT(_STATEMENT);       

 

    SET @STATEMENT = _STATEMENT;

 

    PREPARE DYNQUERY FROM @STATEMENT;

 

    EXECUTE DYNQUERY;

 

    DEALLOCATE PREPARE DYNQUERY;

 

 

END //


DELIMITER ;




간단하지만 응용 가능성을 가진 코드이다 


보통 SET _SATATMENT 부분을 지우고 select * from table 같은 일반 쿼리를 실행해도 문제없이 돌아간다


하지만 문자열로 저장을 하게해서 매개변수로 테이블명을 넘겨주는 구조인것이다


매개변수에따라 동적인 쿼리를 구현할수있다는게 프로시저의 또다른 장점이다 



3. 프로시저 실행 결과 


CALL SP_DYN('GET_DATA');   # 테이블명(GET_DATA)를 매개변수로 입력하여 프로시저 호출


※ 출처


Mysql-Procedure프로시저-개념과-예제 : http://epthffh.tistory.com/entry/Mysql-Procedure프로시저-개념과-예제 [물고기 개발자의 블로그]




[comment] 

업무 번외로 받은 첫번째 과제..! 

특정 구분자로 이어져서 들어오는 데이터를 분리하여 테이블에 입력하는 프로시저 작성하기.

만들고 나니 간단한 프로시저인데.. 업무 하루를 꼬박 날렸다..

책에서 접한 기본적인 프로시저 테스트만 해본 상태라서.. 직접 짜보려니 어려웠다 ㅠ_ㅠ



특정 구분자로 합쳐진 데이터 분리하기 (구분자로 이어진 데이터 분리)

1. 요청예시 및 구상

a,b,c,d,... 

a|b|cde||f,... 

c$f$gg$e$...


위와 같이 다양한 형태 구분자로 합쳐져 있는 데이터 분리하기.


- 작업 구상

1) 데이터의 총 개수 구하기 -> 구분자 +1 만큼 데이터의 총 개수

2) 전체 데이터의 개수만큼 while문 이용하여 데이터 추출  



2. 테이블 생성 : 얻게 되는 데이터를 입력할 테이블

create table GET_DATA(getData varchar(20));


3. 총 데이터 개수 구하기 (구분자가 1bytes일 때)

SELECT CAST((LENGTH('a|b|cde||f')-LENGTH(REPLACE('a|b|cde||f','|','')) +1 ) as unsigned);


# LENGTH('a|b|cde||f') -- 입력받은 데이터의 전체 bytes

# LENGTH(REPLACE('a|b|cde||f','|','')  -- 입력받은 구분자(IN_DELI)를 제외한 데이터의 bytes = 구분자 개수 


+ 함수설명



4. 프로시저 생성 

DELIMITER //        


CREATE PROCEDURE SP_GET_DATA(

IN IN_DATA VARCHAR(30),  # 구분자로 이어진 데이터

IN IN_DELI VARCHAR(2),

IN IN_TB_NAME VARCHAR(30)

)

BEGIN 

   DECLARE POS INT;    # 데이터 총 개수

   DECLARE i INT default 1;    # 데이터 순번 

   DECLARE OUT_DATA VARCHAR(20);    # 얻어진 각 데이터

# 총 데이터의 사이즈에서 구분자를 제외한 길이 

SELECT CAST((LENGTH(IN_DATA)-LENGTH(REPLACE(IN_DATA,IN_DELI,'')) +1 ) as unsigned) into POS;

while i <= POS DO

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(IN_DATA,IN_DELI,i),IN_DELI,-1) into OUT_DATA;

SET @_SQL = CONCAT("insert into ", IN_TB_NAME," values('", OUT_DATA,"');");

PREPARE myquery FROM @_SQL;

EXECUTE myquery;

commit;

set i = i + 1;

END while;

END //


5. 프로시저 실행

CALL SP_GET_DATA('a|b|cde||f','|','GET_DATA');  # 구분자로 이어진 데이터, 구분자, 테이블명을 입력하여 프로시저 호출 

SELECT * FROM GET_DATA;                         # 결과확인 


결과



가상머신에 올려둔 mysql DB를 시작했는데 FAIL이 떠서 로그를 확인해보니 아래와 같았다. 



[에러 확인] vi mysqld.err

2018-09-10 21:34:47 3235 [ERROR] /usr/local/mysql/bin/mysqld: Table './mysql/user' is marked as crashed and should be repaired

2018-09-10 21:34:47 3235 [ERROR] Fatal error: Can't open and lock privilege tables: Table './mysql/user' is marked as crashed and should be repaired


# 에러 확인은 mysqld.err파일을 열어서 확인한다.

   위치를 모를 경우 my.cnf에 지정된 위치(변수 log_error)를 확인.



[에러 해결] 

cd /home/date/mysql/    -- mysql/user 디렉토리로 이동 

myisamchk -r user         -- 해당 테이블 repair 진행 



## 아직 원인파악은 못한 상태. 추가로 테이블 에러나고 나면 이벤트, 프로시저 등도 정상적으로 사용되지 않고 에러가 발생.

참고 : http://jiniwar.tistory.com/entry/MySQL-%EA%B4%80%EB%A0%A8-error-event-scheduler-disabled


show global variables like 'event%' ;

이벤트 상태 확인 : OFF가 아니라 disable로 뜸

 

SET GLOBAL event_scheduler = ON ;




[해결] mysql DBMS 업그레이드를 의미하는 것이 아니라 mysql DB를 업그레이드 해서 문제가 되는 테이블 및 문제점을 고치는 것.

mysql_upgrade -usjyang -psoon0714 --verbose


+ Recent posts