mysql 4.0 -> 5.1 이전 방법

리눅스/MySQL|2015. 1. 16. 11:26
반응형

MySQL 5.1 (euckr)로 이전하는것이라면 좀 쉽게 끝나는 경우가 있습니다.

 

우선 MySQL 4.0의 DB를 mysqldump 명령으로 덤프 받은후

그 파일을 vi 로 열어서 ' TYPE=MyISAM' 부분을 일괄 삭제하고 저장합니다.

그리고 MySQL 5.1 에 import 하면 끝납니다.

 

이 부분이 되지 않는 경우엔 아래 매뉴얼을 참고하여 진행하시면 됩니다.

 

실제 DB이전 경험을 토대로 작성하였지만 내용이 다소 어려울 수 있습니다.

추후 같은 작업시 제가 참고를 하고자 작성을 하는것이니

이전 작업중 일어나는 문제 해결에 대해서는 다른 매뉴얼을 참조하시기 바랍니다.

 

 

본 문서 습득 후 가능한 작업 두가지입니다.

1. MySQL 4.0 (euc_kr)    >    MySQL 5.1 (euckr)

2. MySQL 4.0 (euc_kr)    >    MySQL 5.1 (utf8)

 

euc_kr 에서 euckr 로 이전시 하단의 ++++++++ 표시 라인까지만 보시면 됩니다. ^^

> 이경우 문서에서는 구서버 데이타를 임시서버로 옮기게 되는데 임시서버를 신서버로 생각하시면 됩니다.

> utf8 로 이전시만 3대의 서버가 사용됩니다.

    (서버가 구서버와 신서버 이렇게 두 대라면, 신서버를 euckr 로 설치했다가 중간에 utf8로 다시 설치하시면 됩니다.)

 

 

구서버 (192.168.10.1)

MySQL 4.0.24 (euc_kr)

 

신서버 (192.168.10.2)

MySQL 5.1.52 (utf8)

 

임시서버 (192.168.10.3)

MySQL 5.1.52 (euckr)

  

작업했던 MySQL 버전은 위와 같습니다.

잘못알고 있는분도 계신데 4.0 이하 버전의 경우 정확히 말하면 euckr 이 아니고 euc_kr 입니다.

4.1 이상의 버전으로 업데이트 되면서 euckr 과 utf8 사용이 가능해졌습니다.

 

 

[진행순서]

아래 처럼 데이타를 dump 받아 임시서버로 이동합니다.

 

1. 구서버(115.68.10.1)에서
mysqldump --quote-names -p --all-databases > sysdocu.sql
rsync -avzPog sysdocu.sql root@192.168.10.3:/usr/local/src/

 

* --quote-names 옵션을 주는 이유는 테이블이나 컬럼이 MySQL 5.0 이상 버전에서

예약어로 사용되고 있을 경우 import 에러가 납니다. 이경우 ` 로 테이블이나 컬럼명을

감싸주게되면 MySQL 5.x 의 예약어일지라도 import 가능하게 됩니다.

이 옵션은 자동으로 ` 표시를 하여 dump 합니다.

 

 

2. 임시서버(192.168.10.3)에서
sysdocu.sql 을 vi 로 열고

CREATE DATABASE `mysql` 부분부터 376줄 삭제하고    // mysql DB를 삭제하는 부분입니다. 꼭 필요한 부분.
CREATE TABLE `keyword` 부분부터 5778줄 삭제    // keyword 테이블에서 계속 오류가 난다면 삭제 조치합니다.

                                                                                              추후에 rsync 명령으로 이 테이블만 이동 하도록 합니다.
 

위는 예입니다. CREATE DATABASE `mysql` 부분을 찾아서 해당 table 까지 없애줍니다.

그리고 아래 명령으로 import 를 하면 되는데, 혹시 오류가 나는 테이블이 있다면 위의 keyword 부분과 같이 삭제해줍니다.

MySQL 4.0 이하 버전과 MySQL 5.0.x 버전과 MySQL 5.1.x 이상 버전 컬럼 수가 모두 다르기 때문에

삭제를 하지 않을 경우 컬럼수가 맞지않아 import 가 되지 않습니다.

삭제 후 저장한 데이타를 아래명령으로 import 합니다.

 

mysql -p --default-character-set=euckr < sysdocu.sql

 

★그리고 계정 정보가 있는 구서버의 mysql DB와 임시서버의 mysql DB를 dump 받아

db 테이블, user 테이블의 컬럼 수를 조절하여 임시서버에 import 합니다.

(이 내용이 이해 안가시면 댓글 달아주세요. 자세히 작성해서 문서를 수정해 드리겠습니다. ^^)

 

★DB import 후 사이트에서 열었을때 웹소스 한글은 잘 보이나, DB내용만 깨지는 경우가 있습니다.

    euc_kr 에서 euckr 로 옮겼는데도요. IE에서 페이지 우클릭 > 인코딩을 utf-8 로 확인해보면 

    이번엔 웹소스 한글이 깨지고 DB에서 가져온 한글은 잘 출력이 됩니다.

    이럴때 해결책은 /etc/my.cnf 에 아래 두줄 추가 해주고 mysqld 재시작 해주세요. ^^


   default-character-set = euckr

   character-set-client-handshake = FALSE


 

3. 구서버(115.68.10.1)에서

위의 예와 같이 dump 파일을 수정하여도 import 가 잘 되지 않는 테이블이 있다면 수동으로 가져옵니다.

rsync -avzPog /usr/local/mysql/data/sysdocu/keyword.* root@192.168.10.3:/usr/local/mysql/data/sysdocu/

  

MySQL 4.0 (euc_kr) 에서 MySQL 5.1 (euckr) 로 데이타를 이전해 오는 것은 여기까지가 끝입니다. ^^

MySQL 5.1 (utf8) 로 이전하려고 한다면 계속해서 봐주세요.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

4. 임시서버(192.168.10.3)에서

데이타를 dump 받아 캐릭터셋 변경 작업을 진행합니다. 그리고 신서버로 데이타를 전송합니다.

 

mysqldump -p --default-character-set=euckr --all-databases > sysdocu_euckr.sql

iconv -c -f euckr -t utf8 sysdocu_euckr.sql > sysdocu_utf8.sql
vi sysdocu_utf8.sql    // 파일을 열어 euckr 이라는 부분을 utf8로 일괄 변경 합니다.

                                          일괄 처리 방법 (:%s/euckr/utf8/g)

rsync -avzPog sysdocu_utf8.sql root@192.168.10.2:/usr/local/src/

 

 

5. 신서버(192.168.10.2)에서

mysql -p --default-character-set=utf8 < sysdocu_utf8.sql

 

이렇게 작업은 끝이 납니다.

 

[중요]

사이트 테스트를 해보시고 혹시 웹소스(html 이나 php 등) 의 한글이 깨지게 된다면

1. 한글이 브라우저에서 잘 출력되기 위해 웹서버 설정파일(httpd.conf)에서  AddDefaultCharset utf-8 를 추가해줍니다.

2. 모든 웹소스의 인코딩을 일괄변경 처리합니다.

 

혹시 이 문서를 정독하신 분중에 MySQL 4.0 덤프파일을 가지고 iconv 를 이용해 utf8 변환을 하면 되지 않을까 생각하시는 분이

계실지 모르겠습니다.

제가 그렇게 해봤는데 잘 되지 않았습니다. ^^;

MySQL 4.0 (euc_kr) 에서 dump 받은 파일을 열어보면 캐릭터셋 지정하는 부분이 없었습니다.

MySQL 4.1 부터 dump 파일에 CHARSET=euckr 이런 부분이 생기기 때문입니다.

저부분을 CHARSET=utf8 로 수정을 해야 MySQL 5.1 (utf8) import 시에 테이블을 utf8형식으로 만들 수 있기 때문입니다.




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

(질문)

★그리고 계정 정보가 있는 구서버의 mysql DB와 임시서버의 mysql DB를 dump 받아

db 테이블, user 테이블의 컬럼 수를 조절하여 임시서버에 import 합니다.

- 이 부분은 euc_kr에서 euckr 로 바꾸는 사람은 할 필요가 없는 부분인가요?? 이해가 안가서요...


(답변)

4.0 하고 5.1 의 db테이블, user테이블 컬럼수가 다릅니다.

실제로 두대의 서버에 각각 들어가 mysql 로그인을하고 use DB명 하신뒤,

desc db; 또는

desc user; 해보세요.

출력되는 라인이 틀립니다. (5.1버전이 더 많아요)


이럴경우 4.0에서 덤프받은 몇개 안되는 컬럼을 5.1에 넣게되면 컬럼수가 안맞는다고 오류메세지 나면서 insert가 되지 않기때문에

vi 에디터등을 이용해 수동으로 4.0 덤프파일의 컬럼수를 늘려주어야 합니다.


4.0의 DB 컬럼 갯수

INSERT INTO db VALUES ('%','sysdocu','sysdocu','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');


5.1의 DB 컬럼 갯수

INSERT INTO db VALUES ('%','sysdocu','sysdocu','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');


한눈에 보기에도 차이가 나요? 4.0에서 ,'Y','Y','Y','Y' 식으로 개수 맞춰서 더 추가해주어야 해요.

반응형

댓글()

MySQL 예약어

리눅스/MySQL|2015. 1. 16. 11:24
반응형
ADDALLALTER
ANALYZEANDAS
ASCASENSITIVEBEFORE
BETWEENBIGINTBINARY
BLOBBOTHBY
CALLCASCADECASE
CHANGECHARCHARACTER
CHECKCOLLATECOLUMN
CONDITIONCONNECTIONCONSTRAINT
CONTINUECONVERTCREATE
CROSSCURRENT_DATECURRENT_TIME
CURRENT_TIMESTAMPCURRENT_USERCURSOR
DATABASEDATABASESDAY_HOUR
DAY_MICROSECONDDAY_MINUTEDAY_SECOND
DECDECIMALDECLARE
DEFAULTDELAYEDDELETE
DESCDESCRIBEDETERMINISTIC
DISTINCTDISTINCTROWDIV
DOUBLEDROPDUAL
EACHELSEELSEIF
ENCLOSEDESCAPEDEXISTS
EXITEXPLAINFALSE
FETCHFLOATFLOAT4
FLOAT8FORFORCE
FOREIGNFROMFULLTEXT
GRANTGROUPHAVING
HIGH_PRIORITYHOUR_MICROSECONDHOUR_MINUTE
HOUR_SECONDIFIGNORE
ININDEXINFILE
INNERINOUTINSENSITIVE
INSERTINTINT1
INT2INT3INT4
INT8INTEGERINTERVAL
INTOISITERATE
JOINKEYKEYS
KILLLEADINGLEAVE
LEFTLIKELIMIT
LINESLOADLOCALTIME
LOCALTIMESTAMPLOCKLONG
LONGBLOBLONGTEXTLOOP
LOW_PRIORITYMATCHMEDIUMBLOB
MEDIUMINTMEDIUMTEXTMIDDLEINT
MINUTE_MICROSECONDMINUTE_SECONDMOD
MODIFIESNATURALNOT
NO_WRITE_TO_BINLOGNULLNUMERIC
ONOPTIMIZEOPTION
OPTIONALLYORORDER
OUTOUTEROUTFILE
PRECISIONPRIMARYPROCEDURE
PURGERAID0READ
READSREALREFERENCES
REGEXPRELEASERENAME
REPEATREPLACEREQUIRE
RESTRICTRETURNREVOKE
RIGHTRLIKESCHEMA
SCHEMASSECOND_MICROSECONDSELECT
SENSITIVESEPARATORSET
SHOWSMALLINTSONAME
SPATIALSPECIFICSQL
SQLEXCEPTIONSQLSTATESQLWARNING
SQL_BIG_RESULTSQL_CALC_FOUND_ROWSSQL_SMALL_RESULT
SSLSTARTINGSTRAIGHT_JOIN
TABLETERMINATEDTHEN
TINYBLOBTINYINTTINYTEXT
TOTRAILINGTRIGGER
TRUEUNDOUNION
UNIQUEUNLOCKUNSIGNED
UPDATEUSAGEUSE
USINGUTC_DATEUTC_TIME
UTC_TIMESTAMPVALUESVARBINARY
VARCHARVARCHARACTERVARYING
WHENWHEREWHILE
WITHWRITEX509
XORYEAR_MONTHZEROFILL

 

[출처] 듀시즌 (http://deuxism.tistory.com/2694564)

반응형

'리눅스 > MySQL' 카테고리의 다른 글

mysql 로그인 후 시스템 명령 사용하기  (0) 2015.01.16
mysql 4.0 -> 5.1 이전 방법  (0) 2015.01.16
MYSQL 4.0 -> 5.1 이전시 예약어 오류 해결  (0) 2015.01.16
MySQL 5.5.14 설치  (0) 2015.01.16
mysql-dml문 select문  (0) 2015.01.16

댓글()

MYSQL 4.0 -> 5.1 이전시 예약어 오류 해결

리눅스/MySQL|2015. 1. 16. 11:23
반응형
만약 예약어로 인해 MySQL 5.x 에서 복구가 되지 않을 경우
mysql 4.0 에서 dump 받아올때 --quote-names 옵션을 주어서 가지고 옵니다.
이는 예약어를 테이블 또는 필드로 사용하겠다는 뜻인데 ` 표시를 넣어주는 옵션입니다.
5.x 이상에서는 예약어를 사용할 수 없습니다.
 
[해결]
아래 옵션을 포함하여 DB를 다시 가져옵니다.
# mysqldump -p --quote-names --all-databases > all.sql
 


반응형

'리눅스 > MySQL' 카테고리의 다른 글

mysql 4.0 -> 5.1 이전 방법  (0) 2015.01.16
MySQL 예약어  (0) 2015.01.16
MySQL 5.5.14 설치  (0) 2015.01.16
mysql-dml문 select문  (0) 2015.01.16
[INS-20802] Oracle Net Configuration Assistant failed.  (0) 2015.01.16

댓글()

MySQL 5.5.14 설치

리눅스/MySQL|2015. 1. 16. 11:22
반응형

MySQL 5.5.x 버전은 기존 5.1 이하 버전의 설치 방법과 다릅니다.

MySQL 설치시 필요한 cmake 를 먼저 설치해야 합니다.

 

 

 1. cmake 설치

# cd /usr/local/src

# wget http://www.cmake.org/files/v2.8/cmake-2.8.5.tar.gz

# tar xvzf cmake-2.8.5.tar.gz

# cd cmake-2.8.5

# ./bootstrap

# make

# make install

  

 

2. 계정 생성

# groupadd -g 400 mysql
# useradd -u400 -g400 -d /usr/local/mysql -s /bin/false mysql

 

 

3. MySQL 설치

# cd ..

# wget ftp://ftp.sayclub.com/pub/mysql/Downloads/MySQL-5.5/mysql-5.5.14.tar.gz

# tar xvzf mysql-5.5.14.tar.gz

# cd mysql-5.5.14

# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DMYSQL_TCP_PORT=3306

# make

# make install

 

 

4. DB생성 및 기본 보안 설정

# cp -arp scripts/mysql_install_db /usr/local/mysql
# cd /usr/local/mysql

# rm -rf data

// data폴더를 지우는 이유는 기본폴더가 있긴한데 기본테이블이 없습니다.

    그대로 진행하시면 테이블이 없다며 mysql 이 구동되지 않습니다.

    때문에 data폴더를 삭제하고 아래 명령어로 재설치를 해줍니다.
# sh ./mysql_install_db

// 위 명령어로 data 폴더가 생성되지 않을 경우 아래 명령어로 생성해보세요.

    sh ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# chown -R mysql:mysql /usr/local/mysql
# chown -R mysql.mysql /usr/local/mysql/data
# cp support-files/my-huge.cnf /etc/my.cnf
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chmod 700 /etc/init.d/mysqld
# chown root.root /etc/init.d/mysqld
# chkconfig --add mysqld
# chmod 711 /usr/local/mysql
# chmod 700 /usr/local/mysql/data
# chmod 751 /usr/local/mysql/bin
# chmod 750 /usr/local/mysql/bin/*
# chmod 755 /usr/local/mysql/bin/mysql
# chmod 755 /usr/local/mysql/bin/mysqldump

 

[참고]

euckr 로 설치를 원할 경우 옵션을 변경해줍니다.

-DDEFAULT_CHARSET=euckr -DDEFAULT_COLLATION=euckr_korean_ci

 

반응형

'리눅스 > MySQL' 카테고리의 다른 글

MySQL 예약어  (0) 2015.01.16
MYSQL 4.0 -> 5.1 이전시 예약어 오류 해결  (0) 2015.01.16
mysql-dml문 select문  (0) 2015.01.16
[INS-20802] Oracle Net Configuration Assistant failed.  (0) 2015.01.16
오라클 10g 설치하기  (0) 2015.01.16

댓글()

mysql-dml문 select문

리눅스/MySQL|2015. 1. 16. 11:20
반응형

SELECT 문

 

1-1. 모든 컬럼 선택
SELECT 키워드에 “*”를 사용하여 모든 열을 조회 할 수 있다.
1-2. 특정 컬럼 선택
테이블의 특정 컬럼을 검색하고자 할 경우 Column이름을 “,”로 구분하여 명시함으로써 특정컬럼을 출력 할 수 있다.
출력 순서는 SELECT문 뒤에 기술한 Column 의 순서대로 출력 됨.
1-3. 열에 별칭 부여
질의의 결과를 출력할 때 사용자가 이해하기 쉽게 열에 이름을 부여 할 수 있다. 
-열 이름 AS 별칭
-열 이름  별칭
1-4. 중복행의 제거
특별히 명시 되지 않았다면 중복되는 행을 제거하지 않고 Query결과를 출력한다.
결과에서 중복되는 행을 제거하기 위해서는 SELECT 키워드 바로 뒤에 distinct를 기술한다.

 

 

1-4. 중복행(레코드)의 제거
DISTINCT라는 키워드는 항상 SELECT 바로 다음에 기술한다.
DISTINCT뒤에 나타나는 컬럼들은 모두 DISTINCT의 영향을 받는다
DISTINCT뒤에 여러 개의 컬럼을 기술하엿을 때 나타나는 행은 컬럼의 조합들이
중복되지 않게 나타난다.

 

 


1-5. 특정 레코드의 검색
일반적인 경우 테이블에 있는 모든 자료를 조회할 필요 없이 사용자가 원하는 자료를 조회하는 경우 WHERE절을 사용하여 조회한다
-조건은 아래의 것으로 구성된다.
비교연산자,SQL연산자,논리 연산자등 비교연산자에는

= ,> ,>=, < , <=, <>(!=) 등이 있고

SQL 연산자에는 BETWEEN a AND b,  IN ,LIKE,IS NULL 등이 잇고
논리 연산자에는 AND , OR,  NOT 이 있다.
mysql>SELECT empno 사번, ename 성명  

      FROM   emp      

  WHERE  deptno = 10; 


BETWEEN연산자
  두 값의 범위에 해당하는 행을 출력하기 위해 사용한다.
  BETWEEN연산자는  컬럼 >= 값 AND 컬럼 <= 값과 같은 의미이다.
mysql>  SELECT empno, ename    

       FROM  emp        

   WHERE  sal BETWEEN  3000 AND 5000 ; -->

급여가 3000에서 5000사이인 사원만 보여줍니다.  

    EMPNO ENAME  

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

 7788 SCOTT       7839 KING       7902 FORD   3 개의 행이 선택되었습니다. 


IN(NOT IN)연산자
  목록에 있는 값에 대해서 출력하기 위해  IN연산자를 사용한다.
  IN 연산자는 OR로 연결된 논리연산자의 결합과 같다. 
mysql> SELECT empno, ename     

     FROM  emp      

    WHERE  empno IN (7900, 7934) ; -->

 사번이 7900, 7934번인 사원의 사번과 성명 출력   

  EMPNO    ENAME 

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

7934      MILLER      7900      JAMES 2 개의 행이 선택되었습니다. 

 

 


LIKE연산자
LIKE 'A%‘:컬럼이 'A'로 시작하는 데이터들만 검색됩니다.
LIKE '%A‘:컬럼이 'A'로 끝나는 테이터들만 검색됩니다.
LIKE '%KIM%‘:컬럼에 'KIM' 문자가 있는 데이터 들만 검색됩니다.
LIKE '%K%I%‘:컬럼에 'K' 문자와 'I'문자가 있는 데이터 들만 검색됩니다.
LIKE '_A%‘:컬럼에 'A'문자가 두 번째 위치한 데이터 들만 검색됩니다
mysql>SELECT empno, ename   
     
   FROM  emp       

       WHERE  UPPER(ename) like '%K%';

EMPNO ENAME

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

  7698 BLAKE    7782 CLARK    7839 KING 


IS NULL(IS NOT NULL)연산자
NULL값은 값이 없거나 ,알 수 없거나,적용할 수 없다는 의미이므로 NULL값을
조회하고자 할 경우에 사용한다.
NULL은 이용할 수없고 할당되지 않고 알려져 잇지 않고 적용 불가능한 값을 의미한다.
NULL이란 0이나 공백(SPACE)와 다르다.
NULL값을 포함한 산술 표현식 결과는 NULL이다.
컬럼에 데이터 값이 없으면 그 값 자체가 NULL이다.

 

 


1-6. ORDER BY절
질의 결과에 반환되는 행의 순서는 정의되지 않는다.
ORDER BY절은 행을 정렬하는 데 사용한다. ORDER BY절을 사용하는 경우
SELECT문의 맨 뒤에 기술 되어야 한다. 
Order BY 컬럼 내지 표현식 [ASC|DESC] 
  -디폴트 정렬은 오름차순이다.
   숫자는 가장 적은 값이 먼저 출력 됨,날짜는 가장 빠른 값이 먼저 출력 됨
   문자는 알파벳 순서로 출력 됨
  -내림 차순으로 정렬하려면 ORDER BY절에서 열 이름 뒤에 DESC 키워드를 명시
   해야한다.
다중에 의한 정렬
  -하나 이상의 열로 질의 결과를 정렬할 수 있다.
  -주어진 테이블에 있는 컬럼 개수까지만 가능하다
  -ORDER BY절에서 열을 명시하고, 열 이름은 콤마(,)로 구분한다,
  -SELECT절에 포함되지 않는 열로 정렬 할 수도 잇다.



1-7. LIMIT 절
질의 결과에서 특정행 부터 특정 개수를 가져오기 위한 구문
반드시 질의문 맨 끝에 기술한다.
행은 0부터 인덱스가 시작된다
표기 방법은 LIMIT 시작행,행의 개수
시작행 생략시 첫번째 행부터 결과를 가져온다.
mysql>SELECT empno, ename         FROM  emp         WHERE  UPPER(ename) like '%K%’ LIMIT 2,3; 
3번째 행부터 시작해서 3개의 레코드를 가져오는 질의문
1-8. GROUP BY
 GROUP BY절에 의해 행을 그룹화 할 수 있다.
 SELECT절에 GROUP 함수와 Column이 같이 기술되면 반드시 group by절이 기술
 되어야 한다.
그러나  select절에 group함수만 기술되고 column은 기술되지 않으면 반드시
Group 절을 기술할 필요는 없다



1-8. GROUP BY
#GROUP 함수
COUNT(*): 테이블의 전체  레코드 갯수를 가져온다
예) SELECT COUNT(*) FROM 테이블명
AVG(컬럼명): 해당 컬럼의  전체 평균값을  구한다.
예) SELECT AVG(컬럼명) FROM 테이블명
MAX(컬럼명): 해당 컬럼의 가장 큰 값을 구한다.
예) SELECT MAX(컬럼명) FROM 테이블명
MIN(컬럼명): 해당 컬럼의 가장 작은 값을 구한다
예) SELECT MIN(컬럼명) FROM 테이블명

 

1-8. GROUP BY
GROUP BY는 ORDER BY전에 기술해야 한다.
그룹에 대한 조건은 HAVING절에서 기술해야 한다.
Group by 구문:
GROUP BY 행을 그룹화 하기위한 기준이 될 Column을 기술
[HAVING 그룹에 대한 조건]

2. SELECT문-조인문
하나 이상의 테이블로부터 자료를 검색하기 위해서 join을 사용한다.
일반적으로 primary key와 foreign key을 사용하여 join 하는 경우가 대부분이지만  때로는 논리적인 값들의 연관으로 join하는 경우도 있다.
2-1. INNER JOIN
   가장 자주 사용되는 조인문으로 테이블 간에 연결 조건을 모두 만족하는 행을 
   검색하는데 사용한다.
   검색시 검색되는 컬럼이 조인하는 테이블 모두에 존재한다면 반드시 컬럼명에
   테이블 이름을 “테이블명.컬러명” 의 형태로 기술해야 한다.

 

SELECT문-조인문
2-1. INNER JOIN
사용구문:   
     SELECT 컬럼명…..
     From 테이블명1 [INNER] JOIN 테이블명2 
     ON 조인 조건
#테이블에 별칭 부여
-테이블에 별칭을 부여하여 긴 테이블 명을 간단하게 사용한다.
-테이블 이름대신에 별칭을 사용한다.
-SQL코드를 적게 사용하여 코딩 시간이 절약되고 메모리를 보다 적게 사용한다.
-테이블 별칭은 30자까지 사용 가능하지만 짧을수록 좋다.

#여러 개의 테이블의 INNER JOIN
3개 이상의 테이블을 가지고 JOIN하는 경우 기본 개념은 2개의 테이블에서 출발한다.
즉 2개의 조인결과를 하나의 테이블로 보고 INNER JOIN문을 사용하면 된다.

 

SELECT문-조인문
2-2. OUTER JOIN
OUTER JOIN은 INNER JOIN과는 달리 두 테이블에 조인 조건이 정확히 일치 하지 않더라도 어느 한쪽 테이블에서 결과값을 모두 가져오는 JOIN문이다.
OUTER JOIN문을 사용할때는 반드시 OUTER 전에 데이터를 어느 쪽 테이블에서 
가져올지 즉 왼쪽인지(LEFT) 오른쪽인지(RIGHT) 아니면 양쪽 테이블(FULL)인지 
반드시 기술해야 한다.
LEFT OUTER JOIN
-JOIN문 왼쪽을 중심으로 왼쪽에 있는 테이블에서 데이터를 모두 가져온다.
RIGHT OUTER JOIN
-JOIN문 오른쪽을 중심으로 오른쪽에 있는 테이블에서 데이터를 모두 가져온다
FULL OUTER JOIN
-JOIN문 양쪽에 있는 모든 테이블에서 데이터를 모두 가져온다

 

 

[출처] 보는것은 다좋아 | 코자 (http://blog.naver.com/sjyoonmslee?Redirect=Log&logNo=70088087588)


반응형

댓글()

[INS-20802] Oracle Net Configuration Assistant failed.

리눅스/MySQL|2015. 1. 16. 11:20
반응형

오라클 설치시 아래와 같은 에러가 나타났다면

 

[INS-20802] Oracle Net Configuration Assistant failed.

 

/etc/hosts 파일에 현재 호스트 네임을 IP 로 등록해주면 됩니다.

 

[root@TEST oracle]#    // host 명을 기억 합니다. (TEST 로 되어있음)

 

/etc/hosts 내용

127.0.0.1       localhost.localdomain localhost
192.168.10.2    neulwon.com TEST    // host 를 서버IP에 추가하였습니다.

 

위 작업만 해도 되지만 혹시나!! 안될 경우에는 아래 방법으로도 한번 시도해보세요.

- /etc/sysconfig/network 에 gateway 를 등록

- /etc/resolv.conf 에 nameserver 168.126.63.1 및 서버 IP를 등록

반응형

'리눅스 > MySQL' 카테고리의 다른 글

MySQL 5.5.14 설치  (0) 2015.01.16
mysql-dml문 select문  (0) 2015.01.16
오라클 10g 설치하기  (0) 2015.01.16
MySQL과 SQLite 날짜 함수 비교  (0) 2015.01.16
Mysql 효과적으로 사용하기 [2]  (0) 2015.01.16

댓글()

오라클 10g 설치하기

리눅스/MySQL|2015. 1. 16. 11:19
반응형

< OS 환경 >
 - Asianux 
 - Oracle 10g 
 - VM ware 사용 

1. 오라클 설치를 위해 오라클 홈페이지에서 프로그램을 다운 받습니다. 
 : http://www.oracle.com/technology/software/products/database/oracle10g/
   Oracle Database 10g Release 1 (10.1.0.3) for Linux x86 

2. 압축을 해제 합니다. 
 : # zcat file_name  or # unzip file_name.zip or # tar xvfz file_name.tar.gz 

3. AsiaNux에서는 "오라 나비" 이라는 오라클을 특별한 변수 설정 없이 설정할 수 있게 하는 프로그램이 있다.
    만약, "오라나비"를 사용한다면, 앞으로를 잘 따라하게 되면.. 설치 될 것이다. 
    (여기서는 "오라나비" 사용이 아닌, 환경 설정, 유저 추가 등.. 오라나비를 이용하지 않을 경우를 설명한다.)

4. 오라클 설치 시에 사용될 사용자 및 그룹을 생성합니다. 
   # groupadd dba
   # groupadd oinstall
   # useradd -g oinstall -G dba oracle //초기화 그룹과 그룹을 지정하여 oracle 사용자를 추가한다. 
   # passwd oracle
   # mkdir -p /u01/app/oracle 
   # chown -R oracle.oinstall /u01
   # chmod -R 755 /u01/app/oracle
   ※ 오라클을 다른 경로에 설치하고자 하는 경우 위의 'u01'을 알맞은 경로로 바꾸고, 
        "오라클 사용자 환경 변수 설정" 부분에서 'ORACLE_BASE' 항목을 적절한 값을 변경하여 입력 하면 된다. 

 5. 커널 파라미터 수정 
  # vi /etc/sysctl.conf
### Oracle 10g Kernel Parameters 
 kernel.shmmax = 2147483648
 kernel.sem = 250 32000 100 128 
 fs.file-max = 65536 
(/etc/sysctl.conf 파일에 kernel.shmmax 값이 있다면 수정 또는 기존 행 주석 처리 후 입력함)

# /sbin/sysctl -p //수정한 파라미터 값을 커널에 적용

6. 오라클 사용자 환경 변수 설정 
 - $HOME/.bash_profile를 열어 하단에 오라클 설치 및 사용을 위한 설정을 입력한다. 

export ORACLE_BASE=/u01/app/oracle
export ORACLE_SID=ORCL
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin 

7. 본격적인 오라클 설치를 위해 콘솔창에서 OUI를 띄운다. 
    만약 init 3환경에서 작업을 했다면, startx 후에.. 콘솔 창을 띄운 후 작업을 한다. 

 # sh runInstaller 

    만약, OUI의 글자가 깨어져서 보인다면 $unset LANG 을 실행 후 다시 띄운다. 

환영 메시지가 나타나면, 읽어보고.. 열심히... ^^:;

 

 

[출처] SSISO COMMUNITY (http://www.ssiso.net/cafe/club/club1/board1/content.php?board_code=oracle%7Corainstall&idx=7115&club=oracle&cp=1&cb=1&search=&search_word=)

반응형

댓글()

MySQL과 SQLite 날짜 함수 비교

리눅스/MySQL|2015. 1. 16. 11:19
반응형

(mysql) 시간값 더하고 빼기

 

DATE_ADD(NOW(), INTERVAL-90 DAY); 

DATE_ADD(NOW(), INTERVAL+90 DAY); 

DATE_ADD(NOW(), INTERVAL+2 MONTH); 

...

 

(sqlite) 시간값 더하고 빼기

sqlite> select datetime('2000-01-01 00:00:00', 'weekday 1');
2000-01-03 00:00:00
sqlite> select datetime('2000-01-01 00:00:00', '-1 year');
1999-01-01 00:00:00
sqlite> select datetime('2000-01-01 00:00:00', '+09:00:00');
2000-01-01 09:00:00
sqlite> select datetime(946684800,'unixepoch');
2000-01-01 00:00:00
...

 

 

DATETIME, TIMESTAMP 비교

DATETIME    : '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
TIMESTAMP : '1970-01-01 00:00:00' ~ '2037-12-31 23:59:59'
 
 
(mysql) timestamp <-> Date
timestamp -> YYYY-MM-DD
   select from_unixtime(timestamp);

YYYY-MM-DD -> timestamp
   select unix_timestamp('YYYY-MM-DD');
 
(sqlite) timestamp <-> Date
timestamp -> YYYY-MM-DD
   select datetime(timestamp, 'unixepoch');
YYYY-MM-DD -> timestamp
   select strftime('%s', '2008-07-01 02:15:00');

 

sqlite> select julianday('2000-01-01 00:00:00');
  2451544.5
sqlite> select strftime('%Y-%m-%d %H:%M:%S','2000-01-01 12:34:56');
  2000-01-01 12:34:56

 

(sqlite) datetime 함수에서 로컬타임 얻기

기본은 GMT값을 얻어오므로 다음과 해주어야 한다.

sqlite> select datetime(timestamp, 'unixepoch', 'localtime');

sqlite> select datetime('now', 'localtime');


 

 
 
 


반응형

댓글()

Mysql 효과적으로 사용하기 [2]

리눅스/MySQL|2015. 1. 16. 11:18
반응형
어떤 데이타베이스를 사용하던 가장 중요한 것은 쿼리를 얼마나 효율적으로 날리냐는 것이다.
쿼리에 따라서 속도의 차이기 많이 날 수도 있으니까.
 
mysql의 경우 상용 데이타베이스에 비해서 락이 잘 걸리는 편이다.
대부분 이것 때문에 많은 속도저하가 나오는 것을 확인했다.
 
 
3> 인덱스의 활용
 
대량의 DB를 돌려보시면 알겠지만 index는 검색과 삭제, 수정에 있어서 상당히 중요하다
 
서버에서 100만개의 데이타의 정렬을 테스트 해본 결과 index로 정력했을 경우 144.33초가 나왔고 그렇지 않은 경우는 211.54초가 나왔다..
물론 정렬한 데이타나 필스는 같았고 말이다.
 
이는 큰 차이는 아니지만 데이타의 량이 많을 수록 더 차이가 날 것이다.
 
또 index는 전체 데이타의 50%를 넘지 말라고 규정하고 있는데 이보다는 30%미만으로 정하는 것이 좋다는 것이 개인적인 생각이다.
또 varchar, text는 인덱스로 지정해봐야 큰 속도차를 느끼지 못하므로 인덱스로는 부적합하다는 생각이다.
 
인덱스는 int, char로 정하는 것이 좋다. varchar과 char이 똑같은 문자가 크기만 다를 뿐인데 먼 차이냐고 물을 수도 있지만 두가지는 작지만 큰차이를 가지고 있다.
두개가 같은 크기라도 다른 점은 똑같은 땅에 방을 만들어 놓았냐 아니냐의 차이 일 것이다.
 
varchar, char 둘다 크기가 5라고 하여도 varchar은 데이타가 들어오면 그때서야 들어온 데이타에 크기에 따라서 새로 방을 만들지만 char은 방은 이미 만들어져 있고 그안에 데이타만 들어가는 형식이니 말이다.
따라서 이미 방이 만들어져 데이타만 들어가는 쪽이 속도 처리에 있어 빠르기 때문에 인덱스로서의 활용이 높음을 알아야 한다.
 
 
4> 테이블의 설계
 
데이타베이스를 약간이라도 공부해 보신 분이라면 1, 2, 3 정규형이라고 들어 보았을 것이다.
물론 이런 것들은 실무에서 그다지 중요하지는 않지만 알아두어서 나쁠 것은 없다.
 
이부분은 다른 많은 서적에서 워낙 많이 설명이 되어 있다.
 
테이블을 어떻게 쪼개냐에 따른 구분이지만 속도에 따른 중요한 부분이기도 하다.
 
특히 대용량의 DB의 경우 속도를 높이기 위해서 조개는 경우가 상당히 많다.
 
특정키를 공통으로 하여 데이타를 쪼개고 볼때는 이러한 것들을 다시 붙이는 것인데..
검색할때 많이 유용하게 처리가 가능하다.
 
예를 들어 쇼핑몰의 경우 회원이 구매한 물건, 회원데이타, 주문정보, 상품 등으로 나누어져 있다..
 
만약 A란 회원이 2004년 1월 1일에 어떠한 물건을 구매했으며 회원의 정보도 알고 싶을 경우 어떻게 해야 할까?
 
처음 회원데이타를 통해 회원 여부와 아이디를 알아내고 아이디로 주문정보를 조회한 후 구매한 물건에서 어더한 물건을 구매했으며 그 구매한 물건은 어던 것인지 상품 테이블에서 확인을 해야 할 것이다.
 
만약 이러한 데이타가 하나의 테이블로 묶여있다면 데이타 량이 너무 많아 검색하는데 어려움이 있을 것이고 회원을 삭제하면서 주문정보나 상품등도 함께 삭제될 수 있는 문제가 생긴다.
 
물론 이런 테이블을 하나로 묶는 경우는 없겠지만 단적인 예를 들면 그렇다는 것이다.
 
이렇게 여러개의 테이블로 쪼개어 검색의 속도를 높이는 것이 아주 중요하다.
 
그렇다고 무식하게 너무 많이 나누는 것도 좋지 않으니 잘 판단하여 설계해야 하겠다.
 
 
5> 락을 줄이자.
 
인덱스나 테이블의 설계는 많은 분들이 신경을 쓰는 부분이다.
 
하지만 락에 대해서는 많은 분들이 중요성을 인식하지 못하는 경우가 많다.
 
mysql의 경우 오라클 처럼 필드단위의 락이 아닌 테이블 락이 걸리므로 속도에 아주 치명적이다.
 
특히 insert와 select가 빈번하게 일어나면서 량이 크다면 큰 문제이다.
 
본인의 경우에도 락의 중요성을 인식하지 못하다가 1000만개의 데이타 쯤에서 동시에 50명 이상이 데이타를 select하고 insert하는 과정에서 속도의 저하가 워낙 심해서 원인을 찾던 중에 알게 되었다.
 
insert의 경우에는 동시에 많이 해도 큰 문제가 없었으나 한 번 select 하면 데이타가 크다보니 시간이 걸리면서 락이 심해졌는데 이는 insert가 너무 많아 select를 시도하는 경우에도 반대의 경우보다는 아니지만 그런 현상이 발생했다.
 
이를 위해서 테이블을 많이 쪼개서 해결을 하였고 insert나 select 구문도 상당 수 개선 작업을 하였다.
 
insert의 경우 insert into Table(a,b,c) values(1,2,3)(2,3,4)(4,5,6) 의 형태로 바꾸었는데 이는 insert를 세번 하는 것이 아니라 한번에 처리하므로 속도의 새선에 많은 영향을 준것으로 생각된다.
 
물론 이경우도 동시에 100명 이상이 들어올 경우 문제가 가끔 발생하였지만 이러한 작업들로 조금 느리다는 생각만 들뿐 크게 문제가 없이 개선이 되었다.
 
우선 테이블을 쪼갤때 많이 신경을 썼던 것이 어떤 부분은 select를 많이 하냐는 것이었다.
또한 이미 처리가 완료되어 잘 사용하지 않는 데이타 들도 따로 보관하고 이러한 작업들을 많이 하였다.
 
이러한 부분들은 게시판에서 아주 효과적으로 사용할 수 있을 것으로 생각이 되는데..
오래된 게시물을 테이블을 분리하여 관리하고 자주 select되는 부분과 그렇지 않은 부분을 테이블을 분리하여 관리하는 것이다.
 
사실 일반 사용자들은 이런 한 것을 잘 모르므로 우선 보여주는 화면이 아닌 효율적인 관리가 되어야 한다는 것이다.
 
게시판의 경우 리스트시에 나오는 제목, 작성자, 조회수, 작성일은 자주 select 가 될 수 있다. 하지만 여기서 조회수는 update가 많이 되므로 따로 분리할 필요가 있다.
또한 내용도 다로 관리하여 테이블의 양을 적게 만든다.
 
이렇게 구성한다면 천만개의 게시물도 효과적으로 처리 할 수 있을 것이다.
 
그러나 게시판의 경우 특별한 경우가 아니라면 이러한 작업은 오히려 번거러울 수 있다는 것을 명심해야 한다.
대형사이트의 게시판이나 이렇게 관리할 필요성이 있겠지만 그렇지 않은 경우는 꼭 이런 작업을 할 필요성이 없음을 미리 밝혀둔다.
 
게시판을 예로 들었지만 게시판 보다는 다른 데에 더 큰 활용이 있을 것으로 생각된다.
 
본인은 리서치 데이타에 이러한 부분을 처리하였고 현재 속더에 거의 영향이 없이 사용하고 있다.
무슨 설문에 이런 처리를 하느냐 싶겠지만 문항이 30개 이상이고 복잡한 처리를 하는 경우라면 상당히 많은 데이타를 insert, select 하므로 꼭 필요한 작업으로 생각된다.
 
지금가지 설명한 내용은 스스로가 어떻게 응용하냐에 따라서 효과적이 될수도 아닐 수도 있음을 다시 한번 밝히며 이쯤에서 마무리 하겠다.
 
PS. 사실 일주일 단위로 강좌  혹은 팀을 올리려하는데 그다지 쉽지가 않다. 너무 게으른듯...
 
 
[출처] 아낌없이 주는 나무 | 마게님 (http://comager.blog.me/60040577018)


반응형

'리눅스 > MySQL' 카테고리의 다른 글

오라클 10g 설치하기  (0) 2015.01.16
MySQL과 SQLite 날짜 함수 비교  (0) 2015.01.16
Mysql 효과적으로 사용하기 [1]  (0) 2015.01.16
MD5, SHA-1, MySQL Pass 서로간의 변경  (0) 2015.01.16
MySQL 튜닝 query cache 설정  (0) 2015.01.16

댓글()

Mysql 효과적으로 사용하기 [1]

리눅스/MySQL|2015. 1. 16. 11:18
반응형

회사에서 mysql로 과도한 DB를 돌리면서 데이타베이스의 튜닝에 대해 관심을 가지게 되었다.
오라클 같은 경우는 대용량 데이타베이스로서의 활용능력이 좋아 대용량의 데이타를 돌려도 mysql에 비해서 좋은 성능을 낸다.


물론 mysql이 뛰어난 데이타베이스라는 것은 인정하나 아직은 대용량의 DB를 돌리기에는 무리가 있다.

오랜만에 강좌를 쓰면서 mysql을 어떻게 하면 효과적으로 대용량 DB로 활용할 수 있는 지를 이야기 해보겠다.

mysql의 튜닝에 관해서는 데이타베이스 사랑넷에서 많은 도움을 받았음을 미리 밝힌다.
사실 여기서 이야기하는 것은 단순한 설정을 통한 튜닝이며 보다 난이도 높은 튜닝은 컴파일 전 소스를 직접 만져야지만 가능한 부분이 있다.
그 부분에 대해서도 다루어 볼 생각은 있으나 아직은 그정도의 실력이 안되므로 그냥 넘어가고 후일을 기약해보겠다.

튜닝에 관현한 부분은 mysql의 공식 메뉴얼에도 자세하게 설명은 되어 있다.

10GB가 넘는 데이타를 돌리면서 쌓은 노하우를 공개해 보겠다...

그럼 서론은 이쯤에서 하고 본격적인 mysql을 이용하여 대용량의 데이타 베이스를 다루어 보겠다.

1> MYSQL 튜닝(?)

a. 설치 과정에서의 튜닝

mysql 메뉴얼에서는 컴파일 및 링크시에 정적(Static)로 하는 것이 속도를 더 빠르게 할 수 있으며 gcc보다 pgcc를 이용하여 컴파일 하는 것이 더 빠르며 TCP/IP보다 소켓을 이용하는 경우가 더 빠르다고 설명하고 있다.

메뉴얼에 적혀 있는 Full Configure Option은 다음과 같다.

CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro 
-felide-constructors -fno-exceptions -fno-rtti" ./configure 
--prefix=/usr/local/mysql --enable-assembler 
--with-mysqld-ldflags=-all-static


그래로 사용해도 무방하며 제가 사용하는 방법은 다음과 같습니다.

CC="/usr/local/pgcc/bin/pgcc" CFLAGS="-O6 -mpentiumpro 
-mstack-align-double -fomit-frame-pointer -march=pentiumpro" 
CXX="/usr/local/pgcc/bin/pgcc" CXXFLAGS="-O6 -mpentiumpro -march=pentiumpro 
-mstack-align-double -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" LDFLAGS="-static" 
./configure --prefix=/usr/local/mysql --enable-assembler 
--localstatedir=/val/mysql 
--with-charset=euc_kr 
--with-extra-charsets=none 
--with-mysqld-user=mysql 
--sysconfdir=/etc 
--with-innodb 
--enable-thread-safe-client 
--with-mysqld-ldflags=-all-static 
--with-client-ldflags=-all-static


! pgcc란 Pentium용으로 최적화된 gcc다. 
http://goof.com/pcg/binaries-linux.html 에서 바이너리를 받을 수 있다.


pgcc는 레드햇의 경우 기본으로 포함된 패키지가 아니므로 설치해야만 한다.

처음 해보는 사람이라면 좀 헤멜 수도 있지만 그다지 어렵지는 않으니 필요한 부분을 잘 선택해서 사용하면 된다.

컴파일이 힘들다면 mysql에서 배포하는 바이너리를 이용하는 것도 좋은 방법이다.
mysql에서 배포하는 바이너리는 모두 pgcc로 컴파일되었으며 최적화된 configure를 사용했다고 한다.

물론 컴파일하는 것이 속도는 더 빠르다.

! pgcc를 이용한 컴파일은 mysql에만 한정된 것이 아니다. php, apache 등에도 pgcc를 이용하여 컴파일 하면 속도 향상의 효과를 볼 수 있다.

위의 방법의 컴파일만으로는 눈에띄는 속도의 향상을 느낄 수는 없었다..
물론 수치상으로는 빨라진 것은 분명하였다. 


b. my.cnf 의 설정 변경을 통한 튜닝

my.cnf 파일의 설정을 변경하므로서의 튜닝은 상황에 따라서는 매우 좋은 방법이라는 생각이 든다.
그런데 새로운 시스템에서는 어떻게 설정해야 할까 고민되는 부분이기도 하다.

개인적으로는 처음에는 mysql에서 기본으로 제공하는 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 을 사용하는 것을 추천한다.

물론 사용상황에 따른 변경은 해줘야 겠지만 말이다.

현재 mysql이 돌아가고 있다는 것을 가정하에 설명을 해보겠다.

#mysqladmin variables

my.cnf에서 설정된 내용을 볼 수 있다.
사실 그다지 볼 필요성은 없다..

여기서 중요하게 설정을 해야하는 부분만 설명해보겠다.

+ key_buffer_size : 성능에 많은 영향을 주는 설정이다. 키버퍼는 인덱스블락에서 사용하는 버퍼의 크기이며 인덱스가 많은 테이블에서 insert, delete릐 작업이 많다면 증가해 주는 것이 좋다.
+ max_connections : 동시 접속자수이다. 적당량으로 사용하는 것이 좋다. 너무 과하면 좋지 않다.
+ table_cache : 모든 쓰레드에서 열 수 있는 테이블 숫자이다.
+ join_buffer_size : full-join에서 사용하는 버퍼의 크기아다. full-join을 많이 사용하는 경우 늘려주는 것이 좋다. (왠만하면 인덱스를 사용한 조인을 하는 것이 속도가 빠르다)
+ max_join_size : 최대 조인의 크기이다. 크기 값보다 큰 조인인 경우는 에러가 난다.
+ record_buffer : 순차적인 검색을 하는 쓰레드에 할당하는 버퍼 크기로 순차적인 검색을 많이 하는 경우 증가시키는 것이 좋다
+ sort_buffer : 정렬시 각 쓰레드에 할당하는 버퍼크기. order by, group by를 빠르게 하려면 증가시키는 것이 좋다.
+ thread_cache_size : 이미 사용한 쿼리를 기억해 놓는 캐시의 할당 크기. 많이 할당 할 수록 좋으나 다른 설정을 위해 적당량으로 설정하는 것이 좋다. 같은 쿼리를 반복적으로 많이 하는 경우 크게 하는 것이 좋다.
+ tmp_table_size : 메모리 기반의 임시테이블을 디스크 기반의 임시테이블로 변환할 때의 크기. 복작한 쿼리를 실행할 경우 변환되는 경우가 많으며 여유있게 설정하는 것이 좋다. 단 디스크 용량을 생각해서..
+ wait_timeout : 연결을 끊기전 대기하는 시간


물론 이러한 부분들은 언제든지 유동성이 있게 설정하는 것이 중요하다.
처음 예측했던 것과는 다르게 mysql을 사용할 수 있으므로 지속적으로 모니터링하여 설정값을 변경해주어야 한다.

#mysqladmin extended-status

이 명령어로 mysql의 사용량을 알수가 있다.

이렇게 알아낸 사용량으로 my.cnf를 변경하여야 하며 주기적으로 확인하여 설정 값에 문제가 있는지 확인하는 것이 좋다.

역시 중요한 부분들만 살펴 보겠다.

+ Aborted_clients : 클라이언트에서 연결이 적절하게 닫지 못해서 죽어서 취소된 연결 횟수이다. 이 값이 많다면 네트워크 연결에 문제가 있을 가능성이 있다. 네트웍을 확인해 보는 것이 좋으나 경우에 따라서 프로그래밍시 연결을 적절하게 끊어주지 않아 많이 발생하는 경우도 있으므로 크게 신경 쓸 필요는 없다.
+ Aborted_connects : 연결을 시도해서 실패한 횟수로 최대 동시접속자 수나 네트웍을 확인해보아야 한다.
+ Connections : 연결을 시도한 횟수로 사용령을 알 수 있다.
+ Key_reads : 디스크에서 물리적으로 키 블락을 읽어들인 횟수로 이 값이 크면 key_buffer_size이 너무 작게 설정되어 있는 경우가 대부분이며 이 값이 크면 성능에 큰 문제가 될 수 있으므로 key_buffer_size를 크게 설정해야 하며 시스템의 성능이 늘릴 수 없을 경우에는 시스템을 업그레이드 하는 것이 좋다. key_buffer_size이 시스템의 성능에 비해 너무 크게 잡을 경우 계속적인 페이징을 하게되어 더 느려질 수 있으므로 잘 고려해야 한다.
+ Key_reads, Key_read_request : Key_reads/Key_read_request로 계산하면 캐시 히트률을 알 수 있다. 0.01보다는 작아야 하며 무조건 작을 수록 좋다. 0.01보다 클 경우 key_buffer_size를 조정한다.
+ Max_used_connections : 최대 동시 접속자수이며 이 값을 보고 max_connections의 값을 조정한다.
+ Opened_tables : 열었던 테이블 수로 이 값이 너무 클 경우 table_cache의 값이 작은 경우일 수 있으므로 table_cache의 값을 늘려 주어야 한다.
+ Select_full_join : 인덱스를 사용하지 않은 조인으로 최대한 0에 가깝게 해주는 것이 좋으며 값이 너무 클 경우 테이블의 인덱스를 재설정해주거나 쿼리문은 수정해야 한다.
+ Questions : 서버로 보낸 질의 횟수로 이 값으로 앞으로의 사용량을 예측해보아 앞으로의 업그레으드의 계획을 세우는 것이 좋다. Questions와 Uptime을 이용하여 초당 질의 수를 알아볼 수 있다.
+ Table_locks_waited : 테이블 락을 위해 대기한 시간으로 최대한 작아야 한다. 설정 값만으로 줄일 수는 없으며 너무 클 경우 데이타베이스의 설계나 쿼리문에 문제가 있을 수 있으며 속도저하의 원인이 대부분 여기서 찾을 수 있다. 이부분은 뒤에 따로 다루어 보겠다.


my.cnf의 설정은 메모리와의 연관이 많다. 충분한 메모리가 있을 경우 다양한 설정을 할 수 있다.
변수는 key_buffer, table_cache, sort_buffer, record_buffer 의 값이 성능에 가장 큰 영향을 주나 무조건 크다고 성능이 좋아지는 것은 아니다.
시스템에 맞게 설정하는 것이 중요하다.

[출처] 아낌없이 주는 사랑 | 마게님 (http://comager.blog.me/60040577018)

반응형

'리눅스 > MySQL' 카테고리의 다른 글

MySQL과 SQLite 날짜 함수 비교  (0) 2015.01.16
Mysql 효과적으로 사용하기 [2]  (0) 2015.01.16
MD5, SHA-1, MySQL Pass 서로간의 변경  (0) 2015.01.16
MySQL 튜닝 query cache 설정  (0) 2015.01.16
mysql 다양한 기초 문법  (0) 2015.01.16

댓글()

MD5, SHA-1, MySQL Pass 서로간의 변경

리눅스/MySQL|2015. 1. 16. 11:18
반응형

MySQL 의 패스워드로 잠시 고민... 

대부분의 설치형 보드에서 MySQL 의 PASSWORD() 함수를 써서 사용자의 패스워드를 저장한다. 
문제는 접속 어플리케이션에서 날 패스워드를 날려 서버에서 비교하는 것은 말도 안된다는 것. 
쌍방간에 인코딩을 적절히 하려면 먼저 MySQL이 패스워드를 저장하는지 알아야 할 것 아닌가... 

일단 mysql 에서 패스워드가 어케 동작하는지 보자구. 

mysql -u root -p 

mysql> select password('mypass'); 
+-------------------------------------------+ 
| password('mypass') | 
+-------------------------------------------+ 
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 


40글자. 160비트다. 


대충 인터넷을 뒤져보자. 

MySQL 사이트. 
http://dev.mysql.co...assword-hashing.html
 

여기에 달린 리플이 재미난다. 

function mysql_41_password($in) 

$p=sha1($in,true); 
$p=sha1($p); 
return "*".strtoupper($p); 


오호~~ 단순히 SHA1을 두번 거친 놈이네. 


진짜 그런지 테스트. (PHP) 


<?php 
$string = 'mypass'; 
printf("Original string: %sn", $string); 
printf("MD5 hash: %sn", md5($string)); 
printf("SHA-1 hash: %sn", sha1($string)); 
printf("MySQL Pass: %sn", sha1(sha1($string, true))); 
?> 

결과는 

Original string: mypass 
MD5 hash: a029d0df84eb5549c641e04a9ef389e5 
SHA-1 hash: e727d1464ae12436e899a726da5b2f11d8381b26 
MySQL Pass: 6c8989366eaf75bb670ad8ea7a7fc1176a95cef4 

대문자로 바꾸고 앞에 *만 붙이면 MySQL 의 패스워드 인코딩과 동일하다. 

[출처] http://www.gpgstudy.com/forum/viewtopic.php?p=125137&sid=cf619e282c948f016dbbbdf24d54ee32

반응형

댓글()