====== MySQL 설정 ======
===== my.cnf 위치 =====
* ''/etc/my.cnf''
* ''/etc/mysql/my.cnf''
* ''/mysql/MyHome/etc/my.cnf''
* ''~/.my.cnf''
* Replication을 사용하지 않을 경우 bin log는 무조건 꺼야 한다. 성능을 저하시키고, 디스크 공간을 차지한다. 아니면 최소한 bin 로그 크기/기간 제약을 걸어야 한다.
* [[http://faq.hostway.co.kr/Linux_DB/1306|Linux DB - mysql bin log 관리하기]]
# bin log 크기 제한.
log-bin=/home/mysql_log/bin_log/bin # 빈로그 저장 설정 및 저장할 디렉토리 지정
binlog_cache_size = 2M # binlog cache 사이즈
max_binlog_size = 50M # bin로그 최대 파일 사이즈
expire_logs_days = 10 # 보관기간
* [[http://mindspill.net/computing/linux-notes/disable-mysql-binary-logging/|Disable MySQL binary logging]]
# bin log 삭제
#log-bin
...
#expire_logs_days = 10
* 실제 bin log 파일은 ''*-bin.00000숫자'' 파일들과 ''.index'' 확장자의 파일을 백업하고 삭제하면 된다.
===== charset =====
* [[database:mysql:charset|MySQL charset encoding]]
===== Client Options =====
[client]
protocol=tcp # 로컬 접속시 소켓 대신 TCP 이용 강제
port=3306 # TCP 접속 기본 포트
MySQL Client는 ''protocol=tcp'' 옵션이 없으면 항상 ''/var/run/mysql/mysqld.sock'' 파일을 통해서만 접속한다. 이 경우에 ''%%--%%port=anotherport'' 옵션을 아무리 줘도 무시한다. 명령행에서 ''--protocol=tcp'' 옵션을 줘야한다.
===== Connection 갯수 정리 =====
* ''/etc/my.cnf''
[mysqld]
max_connections = 250
* 최대 커넥션 갯수 확인 mysql에 들어가서
show variables like 'max_connections';
===== table 이름 대소문자 처리 =====
* table name uppercase / lowercase
* **원칙은 0으로 두는 것이 좋다.**
* [[https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html|MySQL :: MySQL 8.0 Reference Manual :: 9.2.3 Identifier Case Sensitivity]]
* 아래 설정은 되도록 안하는게 좋긴 하지만, 내 코드가 아닌 남의코드(예: [[springframework:batch|Spring Framework Batch]])에서 대문자로 테이블명을 조회하는데, DB에는 소문자로 테이블이 생성돼 있는 경우등에 대비해 필요할 수도 있다.
[mysqld]
lower_case_table_names=1
* ''0'': ''ceate table''/''create database'' 에 지정된 대소문자를 그대로 따른다. 대소문자를 구분한다. linux 에서는 ''0''이 기본이다. 윈도우나 Mac 같은 대소문자를 구분하지 않는 시스템에서는 절대로 ''0''으로 두면 안된다.
* ''1'' : 모든 DB명, 테이블명, alias 등을 소문자로 저장한다. 그리고 query 에서 지정한 테이블명 대소문자를 무시하고 항상 소문자로 비교한다. 윈도우와 Mac 에서 이 값으로 한다.
* ''2'' : 생성시에는 ''create table''/''create database'' 에 지정된 것을 그대로 따르지만, 조회 query 등에서는 모두 소문자로 변경한다. 이름 비교시에 대소문자를 가리지 않는다. 윈도우/Mac 같은 대소문자를 안가리는 시스템에서만 지정가능하다. linux 에서는 지정하지 말 것.
* 이 설정값은 여러 운영체제에서 동일 DB를 사용한 애플리케이션을 돌릴때 문제가 발생할 경우 해당 운영체제 서버별로 설정을 다르게 해줘야할 수 있다.
* 모든 시스템에서 ''1'' 을 사용해도 된다.
* Unix/Linux 계열에서는 ''0'', 윈도우에서는 ''2'' 로 지정해서 사용할 수 있다.
===== Client Prompt =====
* http://www.thegeekstuff.com/2010/02/mysql_ps1-6-examples-to-make-your-mysql-prompt-like-angelina-jolie/
* 기본 설정
[mysql]
prompt=\u@\h:\d\_\R:\m:\\s>\_
===== Can't connect to MySQL server on 'hostname' (111) =====
* [[http://forums.mysql.com/read.php?11,6916,184947|Re: Error 2003 (HY000): Can't connect to MySQL server on...]]
* '' ERROR 2003 (HY000): Can't connect to MySQL server on 'hostname' (111)'' 와 같은 오류가 발생했다.
* 이 이유는 ''my.cnf'' 파일에 ''bind-address = 127.0.0.1'' 항목이 있기 때문이다. 이 항목이 있으면 ''127.0.0.1''에서 들어오는 요청만 허용한다.
* 해당 줄을 주석 처리하거나 ''bind-address = 0.0.0.0'' 으로 변경하고 다시 시작한다.
===== com.mysql.jdbc.PacketTooBigException: Packet for query is too large (x > y). You can change this value on the server by setting the max_allowed_packet' variable =====
MySQL 클라이언트가 MySQL 서버에 전송한 쿼리의 크기가 지나치게 클 때 발생하는 오류.
한 번에 많은 쿼리를 전송해야 할 경우 ''max_allowed_packet=16M'' 형태로 값을 지정해준다.
===== 모든 쿼리 로그 찍기 Query Log =====
[mysqld]
general_log_file = /var/log/mysql/mysql.log
general_log = 1
slow_query_log = 1
* ''log-output=FILE|TABLE|NONE'' : File은 파일명을 지정하고, TABLE일 경우에는 ''mysql.general_log'', ''mysql.slow_log''로 쿼리를 저장한다.
* ''general_log''에서 로그 확인
select * from general_log order by event_time desc limit 100;