MySQL 튜닝 query cache 설정

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

query cache 설정을 하지 않았을때와 했을때는 엄청난 차이가 난다.  

본인이 직접 13만건데이터를 테스트 해본결과 cpu부하율은 80% 에서 0.2% 떨어졌고 검색 속도시간은 2.12초에서 0.00초로 단축됐다..  

쿼리 내용은  
select count(*) from 테이블명  

이런퀄리를 계속 적으로 반복 됐지만 캐싱이 되지 않아 버벅 되는 모습을 보였다..  

더욱이 innodb를 사용한다면 다음셋팅을 반드시 해주어야 한다 isam 방식에서는 별다른 차이를 못느꼈지만 innodb방식의 경우는 이 튜닝을 해주지 않고서는 5만건 이상되는 테이블을 서비스하기가 부담이 된다.  

#####----- query cache setting -----#####  
set-variable = query_cache_limit=1M  
set-variable = query_cache_size=2M  
set-variable = query_cache_type=1  

#####----- innodb setting -----#####  
# 주석을 제거 한후 셋팅  
innodb_data_home_dir = /usr/local/mysql/data  
innodb_data_file_path = ibdata1:1000M:autoextend  
innodb_buffer_pool_size = 16M  


반응형

댓글()

mysql 다양한 기초 문법

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

● 함수 : 복잡한 명령을 간단히 처리하기 위해서 만들어준 기능.

1. 단일함수 - 숫자함수, 날짜함수,문자열함수,논리함수 등
-> 하나의 데이타를 입력받아 처리하는 함수

 

2. 그룹함수 - 여러개의 데이타를 입력받아 처리하는 함수
 : count(), max(), min(), sum(), avg()

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

 

※ 단일함수 이용예제

ex) 대문자를 소문자로 만들어 주는 함수 : lcase, lower
mysql> select lower(pname) from person;

 

ex) 소문자를 대문자로 만들어 주는 함수 : ucase, upper
mysql> select upper(pname) from person;

 

ex) 사원의 이름을 출력하되 2번째 문자부터 4번째 문자까지만 출력
mysql> select substring(pname,2,3) from person;

 

ex) 사원의 이름을 출력하되, 첫번째 문자 대문자로 출력
mysql> select upper(substring(pname,1,1)) from person ;

 

ex) 사원의 이름을 출력하되, 첫번째 문자를 대문자로, 나머지는 소문자로 출력
mysql> select concat(upper(substring(pname,1,1)),lower(substring(pname,2,10))) from person ;

 

ex)사원의 이름과 이름 철자의 갯수를 출력
mysql> select pname,length(pname) from person;

 

ex) 사원의 이름 중 앞의 3문자만 출력
mysql> select pname,left(pname,3) from person;

 

ex) 123.45를 소숫점 1번째 자리에서 반올림하여 출력
mysql> select round(123.45,1) ;

 

ex) 123.45를 소숫점을 버리고 출력
mysql> select floor(123.45);

 

ex) 현재 날짜를 출력
mysql> select curdate();

 

ex) 사원의 사번, 이름, 급여와 급여가 3500 이상이면 good으로 3500미만이면 poor로 출력되도록 검색
mysql> select pno,pname,pay if(pay>=3500,'good','poor') result from person;
php에서 if문을 이용해서 사용한다.

ex)123456를 암호화하여 출력
mysql> select password('123456');


※ 그룹함수 이용예제
- 그룹함수를 사용할 경우 그룹함수만을 출력테이타로 사용한다.
- 그룹함수는 null를 데이타로 취급하지 않는다.

ex) person에 저장된 데이타의 갯수를 출력
mysql> select pno, count(pno) from person; =>사용불가(그룹함수만을 출력데이타로 사용해야 하기 때문)
mysql> select count(pno) from person; => 10 출력
mysql> select count(manager) from person; => 9 (데이타 1개가 null이기 때문)
mysql> select count(*) from person; => 갯수 파악할 경우 사용

 

ex) 사원의 급여 중 가장 적은 급여 출력
mysql> select min(pay) from person;

 

ex) 입사일이 최근인 사원의 입사일 출력
mysql> select max(startdate) from person;

 

ex) 사원 급여 합계를 출력
mysql> select sum(pay) from person;

 

ex) 사원 급여 평균을 출력
mysql> select avg(pay) from person;

 

ex) 10번 부서에 근무하는 사원들의 평균 급여를 출력
mysql> select avg(pay) from person where dno=10;

 

ex) 사원의 급여 + 보너스의 평균을 출력
mysql> select avg(pay+bonus) from person; => bonus에 null값이 있으므로 잘못된 값이 출력됨.
mysql> select avg(pay+ifnull(bonus,0)) from person;

- group by  : 그룹함수를 사용한 경우 select에서 사용하는 문장
전체데이타를 하나의 그룹으로 보는 것이 아니라 그룹을 세분화한다.

형식)
select 그룹함수(필드명) from 테이블명 where 조건문 group by 필드명;
=> group by의 필드값이 값을 것을 하나의 그룹으로 인식한다.
=> group by의 필드는 select에서 출력이 가능하다.
=> 출력데이타를 여러개 둘 수 있다.

 

ex) 부서별 인원을 파악하여 출력
mysql> select count(*) from person group by dno;

 

ex) 부서별 인원을 파악하여 부서와 인원 출력
mysql> select dno,count(*) from person group by dno;

 

ex) 업무별 급여 평균을 구하여 업무 및 평균급여 출력
mysql> select job,avg(pay) from person group by job;

- having : 그룹함수에 의한 조건문을 제시하기 위해 사용

형식)
select 그룹함수(필드명) from 테이블명 where 조건문 group by 필드명 having 그룹함수조건문;

 

ex) 부서별 급여 평균을 구하여 부서 및 평균급여를 출력하되, 평균급여가 3000이상인 부서만 검색하여 출력.
mysql> select dno,avg(pay) from person group by dno having avg(pay)>=3000;

- order by : 데이타를 정렬(sort)하여 출력해주는 문장
형식)
select 출력데이타 from 테이블명 where 조건문 group by 필드명 having 그룹함수조건문 order by 필드명 asc(또는 desc), 필드명 asc (또는 desc),...;

※ 정렬순서
asc : 오름차순. 일반적으로 생략하여 사용
desc : 내림차순 정렬

 

ex) person에서 사번,이름,급여를 출력하되 급여순으로 오름차순으로 정렬하여 출력
mysql> select pno,pname,pay from person order by pay asc;
mysql> select pno,pname,pay from person order by pay; (asc 생략가능)

 

ex) person에서 사번,이름,급여를 출력하되 입사일순로 내림차순으로 정렬하여 출력
mysql> select pno,pname,pay from person order by startdate desc;

 

ex) person에서 사번,이름,급여,부서번호를 출력하되 부서순로 오름차순으로 정렬하고 부서가 같은 경우 급여순으로 내림차순 정렬하여 출력
mysql> select pno,pname,pay,dno from person order by dno,pay desc;
mysql> select pno,pname,pay,dno from person order by dno asc,pay desc;

 

ex) person에서 사번,이름,연봉을 출력하되 연봉순으로 내림차순정렬. 단 연봉은 급여*12 + 보너스로 하고 필드명은 yearpay로 한다.
mysql> select pno,pname,pay*12+ifnull(bonus,0) yearpay from person order by yearpay desc;

 

ex) person에서 사번,이름,연봉을 출력하되 업무가 salesman인 사원을 연봉순으로 내림차순정렬. 단 연봉은 급여*12 + 보너스로 하고 필드명은 yearpay로 한다.
mysql> select pno,pname,pay*12+ifnull(bonus,0) yearpay from person where job='salesman' order by yearpay desc;

mysql> select pno,pname,pay*12+ifnull(bonus,0) yearpay from person where job='salesman' order by 3 desc;

 

3 : 출력되는 3번째 필드를 정렬의 기준으로 하라는 의미.

 

ex) person에서 업무별 평균급여를 구하여 업무,평균급여를 출력하되 평균급여가 4000이상인 업무만 출력. 단, 평균급여의 내림차순 정렬.
mysql> select job,avg(pay) avgpay from person group by job having avg(pay)>=4000 order by avg(pay) desc;
mysql> select job,avg(pay) avgpay from person group by job having avgpay>=4000 order by avgpay desc;

 

ex) person에서 업무가 president를 제외한 업무별 평균급여를 구하여 업무,평균급여를 출력하되 평균급여가 4000이상인 업무만 출력. 단, 평균급여의 내림차순 정렬.
mysql> select job,avg(pay) avgpay from person where job!='president' group by job having avgpay>=4000 order by avgpay desc;

- limit : 출력 갯수를 제어하여 출력
형식)
select 출력데이타 from 테이블명 where 조건문 
  group by 필드명 having 그룹함수조건문 
  order by 필드명 asc(또는 desc), 필드명 asc (또는 desc),...
  limit 시작위치,갯수;

※ 시작위치 생략시 처음으로 인식. 행의 번호는 0번 부터 시작한다는 것을 유의할 것.

 

ex) person에서  사번,이름,급여를 출력하되 처음부터 5명만 출력
mysql> select pno,pname,pay from person limit 5;

 

ex) person에서  사번,이름,급여를 출력하되 두번째부터 5명만 출력
mysql> select pno,pname,pay from person limit 1,5;

 

[출처] 인간승리 | 인간승리 (http://bigl2929.textcube.com/31)

반응형

댓글()

[Warning] /usr/local/mysql/libexec/mysqld: Forcing close of thread 15 user:

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

101224 11:40:07 [Warning] /usr/local/mysql/libexec/mysqld: Forcing close of thread 15 user:

 

mysql 이 스스로 멈추는 경우 mysql 에러로그를 보면 위와같은 메세지가 많이 출력되어있는

경우가 있습니다.

이럴 경우에는 간단히 my.cnf 파일을 수정하여 해결을 할 수 있습니다.

 

vi /etc/my.cnf

[mysqld]

skip-name-resolve    // 주석 제거를 하거나 항목이 없는경우 추가를 해줍니다.

 

저장 후 mysql 을 재시작 하면 mysql 이 스스로 다운되는 현해당 문제가 해결 됩니다.

 

※ 참고 

skip-name-resolve

> DB에 연결된 IP에 대해 resolve 하지않고 그냥 처리합니다.

반응형

댓글()

MYSQL 테이블 컬럼 수정 (추가, 수정 ,삭제)

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

sysdocu 라는 테이블에 member 라는 컬럼을 추가, 수정, 삭제하는 예제입니다.

 

1. 추가

alter table 테이블명 add 컬럼명 옵션;

예1) alter table sysdocu add member varchar(250) not null;

예2) alter table sysdocu add member 

varchar(250) not null after group;

    // group 컬럼 다음에 입력 (맨앞은 first)

 

2. 수정

alter table 테이블명 modify 컬럼명 옵션;

예) alter table sysdocu modify member varchar(200) not null;

예) alter table sysdocu change user member varchar(200) not null;    // user : 구 컬럼명, member : 신 컬럼명

예) alter table sysdocu change member member varchar(200) after name;    // 컬럼 위치 변경. 기존 컬럼명 member 이름 두번쓰는것 주의

 

3. 삭제

alter table 테이블명 drop 컬럼명;

예) alter table sysdocu drop member;

 

※ 참고

1. 쿼리 옵션

auto_increment    // 자동으로 증가되는 값이 생성됩니다.

not null                // 빈 데이타가 들어갈 수 없습니다.

default 내용        // 들어갈 데이타가 없을경우 기본값을 입력합니다.

 

2. 테이블 구조 보기

mysql> desc 테이블명

반응형

댓글()

mysql euckr과 utf8 같이 사용하기

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

현재 제 서버에는 euckr로 운영중인 사이트만 있어 mysql 설정에서 디폴트 캐릭터셋을 euckr로 해둔 상태입니다. 기존 운영중인 사이트를 굳이 utf8로 변경할 필요가 없기 때문에.... 근데 이번에 신규로 개발하는 사이트부터는 utf8로 개발할 예정이라 부득이 하게 euckr과 utf8 을 동시에 사용하게 되었습니다. 여기서부터 삽질이 시작되었는데....

핵심적인 부분이 기존 운영중인 사이트에는 아무런 영향을 주지 않고 신규 사이트를 utf8로 운영할 수 있도록 할려고 합니다.
일단 적용에 성공했고 아래 자료는 참고자료를 바탕으로 100% 테스트해 본 결과입니다.

 

일단 디폴트 캐릭터셋을 utf8로 변경합니다.

my.cnf 변경

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

[client]
default-character-set=utf8

 

[mysqld]
default-character-set=utf8

 

[mysql]
default-character-set=utf8

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

 

이렇게 변경합니다. (euckr -> utf8로) 
mysql restart 합니다.

변경후 제대로 되었는지 확인합니다.

mysql> show variables like 'c%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci                        |
| collation_database       | utf8_general_ci                        |
| collation_server         | utf8_general_ci                        |
| completion_type          | 0                                      |
| concurrent_insert        | 1                                      |
| connect_timeout          | 5                                      |
+--------------------------+----------------------------------------+
14 rows in set (0.00 sec)

 

위와 같이 변경되었으면 정상적으로 변경된겁니다.

 

위와 같이 디폴트 캐릭터셋을 변경하더라도 기존 euckr사이트에는 아무런 영향이 없습니다.
(프로그램 변경이나 DB수정 작업은 필요치 않습니다)

 

여기에 utf8 사이트를 추가해 봅니다.
디폴터 캐릭터셋을 utf8로 했기 때문에 DB를 생성하시면 utf8로 생성이 됩니다.

 

그런후 일단 테스트로 그누보드 utf8 버전을 설치해 봅니다.
그냥 설치하시면 DB 한글이 깨집니다. 따라서 설치전 파일 2개를 수정하셔야 됩니다.

 

[ 그누보드 ]
DB를 euckr 과 uft8 을 같이 사용하는 경우 utf8 프로그램에 아래 부분을 추가해주어야 됨

common.php
$connect_db = sql_connect($mysql_host, $mysql_user, $mysql_password);
$select_db = sql_select_db($mysql_db, $connect_db);
mysql_query("set names utf8");    //utf8 설정 추가

 

install_db.php
$select_db = @mysql_select_db($mysql_db, $dblink);
mysql_query("set names utf8");    // utf8 설정 추가

 

이렇게 수정후 설치하시면 100% 모든 데이타가 utf8로 처리되고 phpmyamin 등에서도 euckr 과 utf8 모두 정상적으로 한글이 보입니다.

 

참고로 위에 부분이 그누보드 utf8 버전에는 기본적으로 포함되었으면 좋겠습니다^^ (영자님 참고해 주세요)

 

위에 방법말고 utf8 전용 서버에서는 프로그램 수정없이 my.cnf 를 아래와 같이 설정하시면 됩니다.

[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

 

이렇게 설정하시면 프로그램에 mysql_query("set names utf8"); 를 추가하지 않아도 기본적으로 utf8로 모든 데이타가 처리됩니다.


단 euckr과 utf8 같이 사용하는 서버에서는 위와 같이 설정하시면 euckr 사이트가 정상적으로 동작되지 않습니다. 참고하시길...

 

한글문제로 고민하는 분들께 조금이나마 도움이 되었으면 좋겠습니다.

 

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

 

[댓글]

참고로 다양한 웹호스팅 환경을 고려한다면 프로그램쪽에

mysql_query("set names utf8"); 이 부분을 추가하는게 더 좋을 것 같다는 생각입니다.

euckr 의 경우는 mysql_query("set names euckr"); 추가하면 더 확실하겠죠^^ 

 

[출처] SIR | 하이하바 (http://sir.co.kr/bbs/board.php?bo_table=pg_mysql&wr_id=215)

 

 

★ 요약

DB 는 utf8 로 설정하고

my.cnf 의 [client] [mysqld] [mysql] 항목에 각각 아래 한줄 추가

default-character-set=utf8

 

확실히 하기 위해 웹소스에서 각각의 DB 캐릿터셋에 맞게

mysql_query("set names utf8"); 또는

mysql_query("set names euckr"); 를 추가하면 됩니다.

반응형

댓글()

phpMyAdmin 캐릭터셋 변경

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

config.inc.php 파일에 아래 내용을 추가합니다.

 

$cfg['Lang'] = 'ko-euc-kr';
$cfg['Export']['charset'] = 'euc-kr';
$cfg['AvailableCharsets'] = 'euc-kr';
$cfg['DefaultConnectionCollation'] = 'euckr_korean_ci';

 

또는 utf8 의 경우

 

$cfg['Lang'] = 'ko-utf-8';
$cfg['Export']['charset'] = 'utf8';
$cfg['AvailableCharsets'] = 'utf8';
$cfg['DefaultConnectionCollation'] = 'utf8_general_ci';
 

또한 phpmyadmin 로그인시 풀다운메뉴에서 캐릭터셋이 예전 그대로 셋팅되어있다면 수동으로 바꾸어줍니다.

다음 로그인부터는 정상 출력됩니다.

반응형

댓글()

Starting MySQLCouldn't find MySQL manager or server

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

Solution 
Step 1.)

Rem out the line in /etc/my.conf that was setting basedir to /var/lib. As seen below:

user=mysql
#basedir=/var/lib

Step 2.)

Create the directory "/var/run/mysqld" if it does not exist. Then chown that directory to mysql.mysql as below...

mkdir /var/run/mysqld
chown mysql.mysql /var/run/mysqld

Step 3.)

Start the service..

service mysql start

 

[출처] http://javasolution.blogspot.com/2007/04/mysql-couldnt-find-mysql-server-or.html

 

※ basedir 이 /etc/init.d/mysqld 구동파일과 /etc/my.cnf 에 있을 수 있으니 둘 다 확인해보아야 합니다.

반응형

댓글()

libmysqlclient.so.16: cannot open shared object file: No such file or directory

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

yum 으로  mysql 설치 했을때  
관련 라이브러리를 사용하려 하면 아래와 같은 에러가 날수도 있다.
libmysqlclient.so.16: cannot open shared object file: No such file or directory
알아본바로는 mysql 버그라는데  해결법이 있다.

yum 으로 설치시  라이브러리가  libmysqlclient.so.15 설치가 되서 에러가 나는것인데
so.16 을 다운 받아  링크를 걸어주어야 한다.


centos  5  를 깔았으므르로   mysql 사이트가서 다운로드 탭을 누른다 
커뮤니티 서버를 클릭후 레드햇 엔터프라이즈 5  rpm  x86 누르고 

shared libraries  를 다운 받는다   
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-shared-community-5.1.41-0.rhel5.i386.rpm/from/http://mysql.byungsoo.net/
그러면  rpm  파일이 생성되는데    rpm 을 풀면  /usr/lib/ 폴더에  풀리게 되는것을 볼수 있을것이다 
rpm -ivh MySQL-shared-community-5.1.41-0.rhel5.i386.rpm

vim /etc/ld.so.conf  파일을 열어서 
/usr/lib   를 넣어주고  저장한다

ldconfig  실행후   mysql 서비스를 시작해 준다 

고생 꾀나 했다.
의외로 해결법은 간단하지만  이런오류나면 무조건 당황하기 마련이다.

 

 

[출처] 블로그이름작성하라는데거귀찮거나생각이안나서이러는거절대아님 (http://ilovejam84.tistory.com/53)

반응형

댓글()

my.cnf에 wait_timeout설정하는 문제

리눅스/MySQL|2015. 1. 16. 11:12
반응형
  • 구글링을 해보면 이 문제로 많은 사람들이 삽질을 이미 했다. 그리고 대다수가 버그라고 생각하고 있었다.
  • 버그가 아니다. 당연한 삽질이었다.
    • my.cnf [mysqld] section에 wait_timeout=300 으로 설정 추가하고 다시 띄운다.(기본값은 28800)
    • mysql로 접속하여 show variables like 'wait_timeout' 을 해본다.
    • 어라? 28800이다. 왜 적용이 안되는 걸까..
  • show variables like '%timeout%'을 해보면, interactive_timeout이라는게 있는데, 이게 바로 커맨드라인 클라이언트인 mysql (보통/usr/local/mysql/bin/mysql 또는 /usr/local/bin/mysql 등등)을 말하는 거다. 당연히 mysql 기본 클라이언트로 interactive mode접속하면wait_timeout interactive_timeout값으로 바꿔주는거다.
  • 왜냐구?  interactive mode로 접속했으니까 그렇지 ㅡ_ㅡ
  • show global variables like '%timeout%'을 해본다.
  • wait_timeout=300으로 설정이 잘 되어있다. 즉, interactive mode가 아닌 접속 쓰레드에 대해서 wait_timeout이 새로 설정한 값이 된다는거다. 당연히mysql로 접속해서는 확인을 못한다.
  • 본인이 작성하는 프로그램의 라이브러리를 이용하여 테스트 커넥션을 만들고 300초간 아무것도 하지 않은 후에 쿼리를 하나 날려보자 "SELECT 1" 같은..
  • 에러가 난다. 2006, Mysql server has gone away. 설정한 wait_timeout이 먹었다.
  • 뭐.. 그런거다.. 설정 잘 돼있는거 가지구 착각하고, 삽질하지 말자.
  •  

    [출처] 루미넌스 - TechNote (http://lumitech.tistory.com/11)

    반응형

    댓글()

    오라클 클라이언트(Oracle Client) 설치

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

    오라클 서버 접속도구로 사용되는 Oracle Client 는 어느버전이든 상관이 없습니다.

    그러므로 최신버전 설치하는것을 설명드리겠습니다.

     

    Apache 는 미리 설치가 되어있다는 가정하에 설명드립니다.

    설치 순서는 아래 둘중 아무거나 상관없으나

    PHP보다 Oracle Client 를 먼저 설치해야 된다는것을 기억하시기 바랍니다.

     

    Apache > Oracle Client > PHP

    Oracle Client > Apache > PHP

     

    1. Oracle Client 설치

     

    1) 다운로드

        http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html

        위 링크주소에 접속하면 페이지 중간쯤에

        Platform Downloads

        See Instant Client downloads for all platforms

        라고 되어있습니다. 이부분을 클릭하여 링크를 따라 갑니다.

     

        여기에서 저는 Instant Client for Linux x86 버전을 선택했습니다.

     

        설치하고자 하는 시스템이 리눅스이며, 32bit이기 때문입니다.

        > 자신의 시스템이 몇bit인지 모를 경우 쉘에서 uname -a 라고 해보시면 커널 버전이 나오는데,

            x64 라는 문자가 보이지 않으면 32bit입니다.

     

        Accept License Agreement를 클릭하여 설치파일 링크를 활성화 시키고 아래 두가지를 다운로드 받습니다.

     

        Instant Client Package - Basic
        oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm

        oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm    // 64bit 시스템일 경우


        Instant Client Package - SDK
        oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm

        oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm    // 64bit 시스템일 경우


        다운받은 파일 두개를 서버에 올려놓고 설치를 진행합니다.

     

    2) 설치

        업로드한 폴더로 가서 파일을 설치합니다.

        64bit 는 아래 형식대로 파일명을 바꿔서 설치합니다. 


        root@sysdocu:~# rpm -Uvh oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm

        root@sysdocu:~# rpm -Uvh oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm


     

    2. PHP 설치

        사전에 PHP가 설치되어있다해도 재컴파일 해야합니다. 소스폴더의 config.status 를 참고하여 설치된 옵션에

        오라클 관련 옵션을 추가하여 재설치 합니다.

        ./configure 를 할때 PHP버전에 맞는 옵션을 추가해서 설치를 합니다.

     

        PHP 5.1.1 이전 설치 옵션
        --with-oci8-instant-client

        PHP 5.1.2 이후 설치 옵션
        --with-oci8=instantclient,/usr/lib/oracle/11.2/client/lib       // 설치 디렉토리 포함. 버전을 미리 확인해봅니다.

        --with-oci8=instantclient,/usr/lib/oracle/11.2/client64/lib    // 64bit 시스템일 경우


        PHP를 make 할때 아래와 같은 오류가 나타난다면 위에 버전에따른 옵션이 잘못된것입니다.

        make: *** [ext/oci8/oci8.lo] 오류 1

     

     

    3. profile 수정

        profile 을 수정하여 Oracle 에서 필요한 내용을 넣어줍니다.

        (맨하단에 추가하셔도 됩니다.)

        (64bit 는 디렉토리를 /usr/lib/oracle/11.2/client64/lib 로 사용해야 함)


        root@sysdocu:~# vi /etc/profile

        LD_LIBRARY_PATH=/$LD_LIBRARY_PATH:/usr/lib/oracle/11.2/client/lib:${LD_LIBRARY_PATH}
        PATH=$PATH:/usr/lib/oracle/11.2/client
        NLS_LANG=Korean_Korea.KO16KSC5601
        TNS_ADMIN=/home
        export LD_LIBRARY_PATH TNS_ADMIN

     

        수정된 환경을 적용시킵니다.

        root@sysdocu:~# source /etc/profile

     

     

    4. 확인

        아파치를 재구동 후, PHP정보 함수를 넣은 파일을 Document Root 디렉토리안에 넣어 놓습니다.

     

        phpinfo.php 파일 내용

        <?php    phpinfo();    ?>

     

        웹페이지로 접근하여 OCI8 섹션이 활성화 되었는지 확인합니다.

        http://sysdocu.tistory.com/phpinfo.php

        > OCI8 섹션
        OCI8 Support  enabled

     

     

    [참고] tnsnames.ora 파일 작성

        vi 에디터를 이용하여 /home/tnsnames.ora 파일을 생성하시고 아래 내용을 입력합니다.

     

    DBNAME =                                                                                                    // 접속할 DB명을 입력
     (DESCRIPTION =
       (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT = 1521))          // 
    호스트, 포트 번호 
        )
       (CONNECT_DATA =
        (SID = ORCL)                                                                                              // SID명 입력
        (SERVICE_NAME = DBNAME)                                                               // 접속할 DB명을 다시 입력
       )
     )

    vi 에디터를 이용하여 /etc/ld.so.conf 에 하단 내용을 입력 후 ldconfig 명령으로 적용 합니다.

     

    /usr/lib/oracle    // ld.so.conf 파일에 내용 추가

     

    root@sysdocu:~# ldconfig    // 적용

     

    반응형

    댓글()

    최대 동시접속자수 테스트 프로그램

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

    최대 동시접속자 수 테스트용 프로그램입니다.


    컴파일 방법:
    g++ -o mysql-con-stress -I/usr/local/mysql/include/mysql/ -L/usr/local/mysql/lib/mysql/ -lmysqlclient mysql-con-stress.cc


    사용방법:
    ./mysql-con-stress host user pass max_tries

    host : 예를 들면 localhost
    user : root
    pass : 암호
    max_tries : 최대동시접속자 수


    성공시:
    Successefully established 1500 connections
    Never failed 
    Cleaning up 1500 connections ...
    Clean up complete


    실패시:
    Successefully established 1501 connections
    Failed because Too many connections
    Cleaning up 1501 connections ...
    Clean up complete


    MySQL Client 상에서 최대 동시접속 확인법: 
    show status like max_used_connections;

    이 결과값이 max_tries와 일치하여야 함.

     

    주의사항: mysql_connect 함수가 deprecate 되었으므로 mysql_real_connect 함수로 수정하였습니다. 자신의 MySQL버젼에서 오류가 발상할 경우 mysql_init() 부분을 삭제하고 mysql_real_connect 함수를 mysql_connect()함수로 수정바랍니다.

     

    /*

    * mysql-con-stress.cc by Sasha Pachev

    * Stresses a running mysqld to see the maximum number of additional concurrent

    * connections it can handle

    * to compile: g++ -o mysql-con-stress -I<where_mysql.h_is_found> r

    -L<where-libmysqlclient-is-found> mysql-con-stress.cc -lmysqlclient

    * to use: mysql-con-stress host user pass max_tries

    * If the first three parameters are not obvious, you should not be using this program

    * max_tries is the maximum number of concurrent connection mysql-con-stress will try to

    * estabilsh

    */

    #include <mysql.h>

    #include <iostream.h>

    #include <stdlib.h>

    #include <sys/types.h>

    #include <signal.h>

     

    int num_cons = 0;

    MYSQL* glob_cons = NULL;

     

    void clean_up(int )

    {

    int i;

    cerr << Cleaning up << num_cons << connections ... << endl;

     

     

    for(i = 0; i < num_cons; i++)

    {

    mysql_close(glob_cons + i);

    }

     

    cerr << Clean up complete << endl;

    exit(0);

    }

     

    void usage()

    {

    cerr << Usage: mysql-con-stress host user pass max_tries << endl;

    exit(1);

    }

     

    int main(int argc, char** argv)

    {

    if(argc != 5) usage();

    char* user, *host, *pass;

    int max_tries;

     

    user = argv[2];

    host = argv[1];

    pass = argv[3];

    max_tries = atoi(argv[4]);

     

    MYSQL cons[max_tries];

    glob_cons = cons;

     

    int i;

    int never_failed = 1;

    int port = 0;

     

    // if we get a signal, clean up first

     

    signal(SIGTERM, clean_up);

    signal(SIGINT, clean_up);

     

    // establish as many connections as we can

     

    for(i = 0; i < max_tries; i++)

    {

    mysql_init(&cons);

    mysql_real_connect(cons + i, host, user, pass, test, 0, NULL, 0);

    num_cons = i ;

     

    if((mysql_error(cons + i))[0])

    {

    never_failed = 0;

    cout << Successefully established << num_cons << connections << r

    endl; cout << Failed because << mysql_error(cons + i) << endl;

    break;

    }

    }

     

     

    if(never_failed)

    {

    num_cons = i ;

    cout << Successefully established << num_cons << connections << endl;

    cout << Never failed << endl;

    }

     

    // this is really not necessary, because exiting will close all the connection,

    // but it is good practice to clean up

     

    clean_up(0);

     

    return 0;

    }

     

     

    [출처] rootman | rootman (http://www.rootman.co.kr/bbs/zboard.php?id=linux&no=1900)

    반응형

    댓글()