Posted
Filed under Mysql
mysql> set global max_connections=300;
(mysql 을 재시작 안해도 max_connections 값이 바로 적용된다.)
또 다른 방법으로
mysql 설정파일(my.ini 또는 my.cnf )을 다음과 같이 설정해주면 된다.
[mysqld]
  max_connections = 300
설정파일 변경 후에는 mysql 재시작이 필요하다.

■ max_connections에 대한 설명
MySQL은 [ 최대 접속수 + 1 ]의 접속을 허용한다. "1"은 관리자 권한 접속을 나타낸다.
문제가 발생했을 경우 관리자가 접속할 수 있게 하기 위해서이다.

시스템에 접속수가 폭주해서 접속이 안되는 경우가 발생한다. (ERROR 1040 (08004): Too many connections)
이런 상황에서 일시적으로 접속수를 증가시킴으로써 에러를 해결하자~.

■ MySQL 접속수 관련 상태를 확인하는 방법
mysql> show variables like '%max_connect%';    
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 10000 |
| max_connections    | 100   |
+--------------------+-------+

mysql> show status like '%CONNECT%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Aborted_connects         | 200   |
| Connections              | 300   |
| Max_used_connections     | 101   |   ==> 현재 연결된 접속수
| Ssl_client_connects      | 0     |
| Ssl_connect_renegotiates | 0     |
| Ssl_finished_connects    | 0     |
| Threads_connected        | 101   |   ==> 연결되었던 최대 접속수
+--------------------------+-------+
7 rows in set (0.00 sec)

mysqladmin 실행해서 확인하는 방법
./mysqladmin -u root -p processlist
./mysqladmin -u  root -p variables | grep max_connections
2015/05/09 17:07 2015/05/09 17:07
Posted
Filed under Mysql

1. MySQL Replication 환경에서 지우기

  - MySQL Replication MASTER 서버
    shell> mysql -u root -p
    mysql> RESET MASTER;

  - MySQL Replication SLAVE 서버
    shell> mysql -u root -p
    mysql> RESET MASTER;

2. MySQL Binary Log sequence number 또는 특정 일자로 지우기

  shell> mysql -u root -p
  mysql> PURGE BINARY LOGS TO 'mysql-bin.000015';
  shell> mysql -u root -p
  mysql> PURGE BINARY LOGS BEFORE '2009-05-01 00:00:00';

3. mysqladmin flush-logs 명령어를 통해서 MySQL Binary Log 지우기

   shell> mysqladmin -u root -p flush-logs

4. MySQL Binary Log 생성을 방지하는 방법

  /etc/my.cnf 파일에서 아래 라인을 주석 처리
  log-bin

5. MySQL Binary Log 를 특정 1주일까지만 생성 및 보관하기
  /etc/my.cnf 파일에서 아래 라인을 추가
  expire_logs_days = 7

[원문] http://faq.hostway.co.kr/Linux_DB/1307

 

2015/03/12 09:05 2015/03/12 09:05
Posted
Filed under Mysql
  트리거는 테이블에 INSERT, UPDATE, DELETE 가 발생 할 때 그 과정의 전후로 무언가를 하도록 지정 할 수 있다.

 

DELIMITER $$

CREATE TRIGGER 트리거이름
BEFORE UPDATE ON 테이블이름
FOR EACH ROW 
BEGIN 
 IF (NEW.AA <> OLD.AA) THEN
    SET new.BB = new.AA;
 END IF ;
END$$
;
 

 

위의 쿼리는 트리거의 한 예제이다.

 

이 쿼리는 특정 테이블에 UPDATE가 발생 할 때 AA 의 값이 이전값과 이후값이 다를 경우에 

 

BB 컬럼에 값을 새로운 AA의 값으로 치환하라는 트리거이다.

 

녹색 : AFTER, BEFORE 

붉은색 : INSERT, UPDATE, DELETE

푸른색 : 쿼리(INSERT, UPDATE, DELETE 등)

 

NEW : 새로운 값

OLD : 이전 값

AFTER 를 사용할 때 같은 테이블에 INSERT, UPDATE, DELETE를 하게된다면 문제가 발생할 수 있다.

[원문] http://wofmaker.blog.me/220116117593

2015/01/28 23:33 2015/01/28 23:33
Posted
Filed under Mysql

[원문]  : http://urikr.tistory.com/85

order by 절을 사용 하다보면 varcahr타입 등의 integer 탑입이 아닌 타입으로
정렬을 해야 될 경우가 생긴다 .
이런 경우 다음과 같이 처리 한다.
order by cast(id as unsigned) desc

order by 절 뿐만 아니라 텍스트를 숫자로 변환 할 때 사용 하면 될거 같다.

2012/12/28 16:39 2012/12/28 16:39
Posted
Filed under Mysql
( if(mb_hp='',concat(hp1,hp2,hp3) , mb_hp  ) ) as 'mb_hp'
위와 같이 사용함
if(조건, true, false)

위와같이 사용 합니다.
2012/08/31 15:24 2012/08/31 15:24
Posted
Filed under Mysql
[MySQL] IF문 사용예제

※ 경고
높이뜬새의 모르는 사람이 없는 팁시리즈 입니다.
이 팁시리즈는 지면낭비라는 항의시에 즉각 중단됩니다.

MySQL에서는 IF문 자체를 프로시져 도움없이도 SQL문에 바로 삽입하는 것이 가능해서 무척 편리합니다. 물론 제어부분이 계속 중첩된다면 CASE문을 사용하셔야 합니다.

형식) if (조건,
참일때 결과,거짓일때 결과)


예1) 쉬운 예

mysql> SELECT if( 2 > 1, '참', '거짓' );

결과 : 2가 1보다 크므로 당연히 참을 출력합니다.

예2) WHERE절에서 사용

SELECT * FROM join_table WHERE if( CHAR_LENGTH(name) = 2, 'Y', 'N' ) = 'Y';

결과 : join_table의 name컬럼에서 이름이 두글자인 분만 가져옵니다.


예3) SELECT문에서 사용

SELECT if( substr( name, 1, 1 ) = '강', '강씨', name ) FROM join_table;

결과 : join table의 name컬럼에서 이름의 첫자가 '강' 이면 '강씨'를 출력하고, 아니라면 name 컬럼의 이름을 걍 출력합니다.

From : 높이뜬새(www.webmadang.net)

2012/05/14 16:28 2012/05/14 16:28
Posted
Filed under Mysql
[원문] : http://webtech.tistory.com/31

1. MySQL INSERT의 사용법


MySQL 공식 Document에서는 아래와 같이 사용법을 정의 하고 있다.(참고, http://dev.mysql.com/doc/refman/5.5/en/insert.html)
각각의 의미는 천천히 살펴보면 누구나 알 수 있을 것이다.
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ]

OR:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
OR: 
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)] SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]

Document상에 있는 내용을 번역은 아니고, 나름 이해해서 설명 하자면...

INSERT는 이미 존재하는 Table에 새로운 rows를 추가한다.
[INSERT ... VALUES]와 [INSERT ... SET]과 같은 문장 형식은 특정한 값을 명확하고 추가하며, [INSERT ... SELECT] 형식은 다른 Table 혹은 Table들로 부터 선택된 값들을 추가 한다.(여기서 주의 해서 봐야 할 부분은 [다른 Table혹은 Table들]이다. 즉 subquery내에 동일한 Table명이 있으면 안 된다. 달리 말해 동일한 테이블의 일부를 다시 넣는 방식으로는 이와 같은 문법으로 작동 하지 않는다는 뜻이다.)
이전 row의 값을 덮어 쓰고자 한다면 INSERT대신 REPLACE를 사용할 수 있다. REPLACE는 Primary key나 Unique index와 같은 새로운 row를 추가 하고자 한다면, 이전 row를 먼저 지우고 새로운 row를 추가 하는 방식으로 동작한다. 중복되지 않는 것은 그냥 INSERT와 동일하게 동작한다.

위에서 사용된 tbl_name은 추가 되어야 할 row들이 들어갈 Table명을 의미 한다.
column name은 Table명 뒤에 콤마(,)로 분리된 리스트로 작성 할 수 있으며, 이 경우 각 column name에 해당하는 값을 VALUES리스트나 SELECT문으로 제공해야 한다. 만약 column name을 작성하지 않는다면, 해당 테이블의 모든 column의 값들을 VALUES리스트나 SELECT문으로 제공해야 한다. 테이블의 column을 모른다면 DESCRIBE tbl_name으로 찾을 수 있다.

SET절은 column이 명확하게 지정되는 것을 나타낸다.

column의 값은 여러가지 방법들로 주어질 수 있으며, 많이 사용하거나 중요한 내용만 몇가지 다루고자 한다.

먼저 가장 일반적인 방법이다.

INSERT INTO tbl_name (col1,col2) VALUES(15, 30)

해당 필드명과 값들의 리스트를 순서대로 나열하는 방식이다. 이때 반드시 컬럼의 수와 값의 수가 같아야 하며, NOT NULL이 아닌 필드는 포함되지 않아도 된다.



다음은 필드 리스트의 생략이다.

INSERT INTO tbl_name VALUES(15, 30); ==> tbl_name테이블의 필드가 2개라면...

이때는 반드시 컬럼의 수만큼 값의 리스트를 제공해야 한다.



SET 키워드를 이용한 방법.

INSERT INTO tbl_name SET col1 = 15, col2 = 30;

SET키워드 뒤에 컴럼과 값의 쌍으로 나열해 주면 된다.



INSERT ... SELECT를 이용한 방법.

INSERT INTO tbl_name (col1,col2) SELECT 15, 30;

다른 column명을 참조를 통한 방법.

INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

이 경우 참조되는 column은 꼭 먼저 값이 설정되어야 한다. 아래와 같이 하면 안된다.
INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
col2가 15로 설정되기 전에 col1에 col2*2를 넣으라고 하면 안된다는 것이다.


VALUES를 이용한 multiple rows.

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

참고로 AUTO_INCREMENT로 증가된 값을 알고 싶다면 mysql_insert_id()함수를 사용하면 된다. 이에대한 자세한 정보는 아래 링크를 참조하기 바란다.
http://dev.mysql.com/doc/refman/5.5/en/mysql-insert-id.html

마지막으로 당연한 것이지만, INSERT는 해당 Table에 대한 INSERT권한이 있어야만 한다.

2012/03/04 14:51 2012/03/04 14:51
Posted
Filed under Mysql

[원문]:  http://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/
[원문] : http://blog.naver.com/PostView.nhn?blogId=justis1&logNo=40091860278

Oracle에서는 Connect by로 쉽게 해결되는데 Mysql에서는 고생하시는 분 많으 실것 같아서 올립니다

 

Mysql 계층 구조 (Tree 구조)에서

테이블 구조가 아래와 같은 경우

 

 ID  PARENT_ID ETC
 1 0 ROOT
 2 1

CHILD

 3 2 CHILD OF 2
 4 2 CHILD OF 2
 5 2

CHILD OF 2

Depth가 깊어 질수록 부모노드를 찾기가 힘들어 진다 . 이럴 경우 특정 자식 노드에서 Root까지의 부모노드를 가져오고 싶은 경우 아래의 쿼리를 사용하면 쉽게 해결된다.

 SELECT @r as _ID,
      (
        SELECT @r := PARENT_ID FROM TABLE WHERE ID = _ID
      ) AS _PARENT_ID, @l := @l + 1 AS level
      FROM (
        SELECT @r := 5
      ) vars, TABLE h
      WHERE @r <> 0
   
     )A, TABLE B

 

결과

 _ID

PARENT_ID LEVEL
 1  0  1
 2  1  2
 5  2  3
2012/02/20 14:46 2012/02/20 14:46
Posted
Filed under Mysql

MYSQL  TIMESTAMP 사용 방법
TIMESTAMP DEFAULT Now()

2012/02/17 10:32 2012/02/17 10:32
Posted
Filed under Mysql

MySQL에서 사용하는 log-bin이라는 옵션은 사용된 쿼리들이 로깅되는 파일이며 Innodb 혹은 Replication등에서 사용되곤 합니다.

하지만 이 파일의 문제는 무한정 늘어난다는 것입니다. relay-log-space-limit 같은 옵션이 있지만 이 옵션은 Replication에서 사용되는 relay-log-bin의 용량을 제한 하는 옵션이지 해결책이 되지 못합니다.

하지만 이 파일을 정리하는 방법이 있습니다. 우선 다음의 Query를 사용하는 것입니다.

PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)

INTERVAL에서는 원하시는 로깅 시점을 기록하시면 됩니다. 위의 경우에는 30일 이전의 로깅 정보를 삭제하게 됩니다.

차례차례 해보도록 하겠습니다.


1. 현재의 하드디스크 용량 상태를 확인합니다.

[root@Theeye db]# df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              18G  1.9G   15G  12% /
/dev/sda3              15G  803M   13G   6% /home
/dev/sda2              97G   78G   15G  85% /usr/local/mysql/db

데이터베이스 공간이 85%나 사용되어 곧 꽉찰지도 모른다는 불안감에 휩싸이게 되었습니다.


2. log-bin 파일을 확인해 봅시다.

[root@Theeye db]# ls mysql-bin.*

mysql-bin.000001  mysql-bin.000002  mysql-bin.000003 ......  mysql-bin.000073

파일이 엄청나게 많이 있습니다.


3. 다음 명령어를 수행합니다.

mysql -u root -p -e "PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)"

Enter password:

물론 mysql에 접속하셔서 위의 명령어를 입력하셔도 됩니다. Super권한을 가진 root계정으로 실행해 주세요.


4. log-bin 파일이 줄었나 확인해 봅시다.

[root@Theeye db]# ls mysql-bin.*

mysql-bin.000041  mysql-bin.000042  mysql-bin.000043 ......  mysql-bin.000073



41번 이전의 파일들이 모두 삭제 되었습니다. 41번 부터가 최근 30일 이내의 로그정보가 남아있는 모양이군요.

5. 하드디스크 용량 상태를 확인해 봅시다.

[root@Theeye db]# df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              18G  1.9G   15G  12% /
/dev/sda3              15G  803M   13G   6% /home
/dev/sda2              97G   40G   53G  43% /usr/local/mysql/db

확실히 용량이 많이 확보가 되었군요^^

주기적인 실행이 필요하실 경우에는 위의 명령어를 crontab에 등록하시면 됩니다. 일주일에 한번정도의 실행이 적당하겠네요.


[출처] http://theeye.pe.kr/363


---------------------------------------------------------------------------------------------


파일이 커서 저장하지 안을려면 my.cnf 에서  log-bin 된부분을 주석 처리 해야 되고

파일 위치를 바꾸고 싶다면 log-bin = /usr/~~/file  처럼 주소를 적어주면 된다.



생성된 파일은 복구에도 사용이 가능하다.


기본적으로는

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/var/localhost-bin.000001 > bakcup.sql

식으로 파일을 일반 쿼리로 컨버팅 가능하다...


사용할 만한 옵션으로는

 -d 데이타베이스명      이건 특정 데이타베이스만 가져온다.


/usr/local/mysql/bin/mysqlbinlog --start-datetime="2008-12-30 01:00:00" --stop-datetime='2009-01-10 01:00:00' /usr/local/mysql/var/localhost-bin.000001 > bakcup.sql


이건 시간을 지정해서 그부분만을 가져온다...



가져온걸  다시 디비로 넣을때는 . 

/usr/local/mysql/bin/mysql -u 사용자 -p  < backup.sql


[원문] - http://blog.naver.com/forioso/10040245402

2011/05/27 18:01 2011/05/27 18:01