이 문제로 많은 고민을 했었는데

MySQL은 SQL Server나 Oracle과 다르게 SP가 처음 한번만 컴파일 되고 재사용 되는것이 아니다.


http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/

위 링크를 참고하면 커넥션 별로 컴파일이 관리되는데 말인데

즉 어플단에서 쿼리로 실행하나 SP로 실행시키나 컴파일하고 실행하는 과정에서 성능상 이득을 취하긴 어렵다는것!


물론 SP를 사용함으로서 프로그램과 데이터 조작과의 관계를 분리 할 수 있고(추후 SQL 튜닝 및 스키마 수정에 유리)

SP실행 권한만 줌으로서 인젝션과 같은 공격에서 상대적으로 안전하며

짧은 요청 문장으로 인한 트래픽 감소

트리거를 사용하지 않고도 데이터의 참조 무결성 유지

http://ko.wikipedia.org/wiki/%EC%A0%80%EC%9E%A5_%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80


등의 장점은 여전히 남아 있다.



그러면 컴파일 된 프로시저를 그냥 아깝게 버리느냐... 하면

mysql-proxy나 sqlrelay 등을 사용해서 Connection Pool을 구축한다면 커넥션을 한번만 맺고 재사용하기에 극복 할 수 있으니

MySQL을 사용하면 SP는 사용하면 안된다 하지 말고 커넥션 풀을 구축해서 사용하면 커넥션 비용도 감소하고 SP 컴파일도 재사용 가능하니 일석이조의 효과가!!


http://sqlrelay.sourceforge.net/

http://dev.mysql.com/downloads/mysql-proxy/

Posted by Mr.Jo :

MySQL에서 복제시 binlog_format 에 따라 동기화가 되지 않을 수 도 있다.

5.1 버전대에 추가된 기능으로 기존에는 Statement로 동작한다.



binlog_format 는 설정 파일 혹은 글로벌 변수로 변경 가능하고 값은

Statement, Row, MIXED 세가지가 들어갈 수 있는데



Statement 는 마스터에 들어온 쿼리를 쿼리문으로 기록하기 때문에


- 쿼리는 짧고 데이터 변경은 많은 종류가 많이 실행될 때 유리할 수 있으며

- 일반적으로 로그 양이 작고(master - slave간 회선이 느릴때 유리)

- 나중에 열어봤을때 알아보기가 상대적으로 쉽다 (일부 쿼리만 사용 가능)

- 버젼이 서로 달라도 사용 가능


-*항상 일관된 값이 나오지 않는 함수의 실행을 보장 할 수 없다. ( NOW()는 정상 작동하지만 SYSDATE()는 동기화 되지않을 수 있다.)

- 상대적으로 느리다(보통 쿼리의 실행이 데이터 변경보다 크기 때문에)



ROW는 변경된 데이터를 기록하는 방식으로

Statement 와 장단점이 반대라 볼 수 있으며 SYSDATE() 의 경우도 일관되게 복제된다.



MIXED는 서로의 장점을 취하는 방법으로

기본적으로는 Statement 필요에 따라 ROW로 기록하는 방식



운영 중간에 설정을 바꿀 수 있으나

임시테이블 사용중, 트리거나 프로시저에서 변경 시도, NDB가 활성화 되어 있을때는

변경이 불가하다.



잘 모르겠으면 MIXED나 ROW로 설정하는 편이 동기화 오류로 고생하는 일이 없을것 같다.






master와 slave의 연결을 끊었다 이었다 하는 식으로 데이터 동기화를 지연 시키면서

now() 함수와 sysdate() 함수로 데이터를 넣을 때 결과다


왼쪽 master 오른쪽 slave

1 = MIXED,        now()

2 = MIXED,        sysdate()

3 = MIXED,        sysdate()

4 = Statement ,  sysdate()

5 = Statement ,  now()

6 = ROW,          now()

7 = ROW,          sysdate()




http://www.mysqlkorea.com/sub.html?mcode=develop&scode=51ha&m_no=22902&cat1=1106&cat2=1287&cat3=1377&lang=k


Posted by Mr.Jo :

sources.list 에 내용을 추가하고 apt-get update시

다음과 같이 GPG error 메시지를 내고 저장소 추가가 되지 않을 경우


W: GPG error: http://www.deb-multimedia.org jessie InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 07DC563D1F41B907


빨간 부분에 주목하여

gpg --keyserver pgpkeys.mit.edu --recv-key 07DC563D1F41B907

gpg -a --export 07DC563D1F41B907 | sudo apt-key add -


위와 같은 명령으로 해결 할 수 있다

Posted by Mr.Jo :