저자: 임영규 / Gnome Linux Institute / imlinux70@hanafos.com
1. 서론
현재 데이트베이스 이해와 학습 그리고 일반적인 웹 사이트 구성에 가장 많이 적용되고 있는 데이트베이스 엔진이 MySQL이다. 많은 데이터베이스 엔진이 있음에도 불구하고 일반인들이 접근 하기가 가장 쉬운 것이 MySQL이라고 하겠다. 이번 과제에서는 MySQL 엔진이 탑제 서버에 어떻게 접슨하여 데이터를 억세스 하는지 그 과정을 알아보고자 한다.
일반적으로 데이터베이스 접근을 위한 방법은 OS Shell에서 데이터베이스 클라이언트를 이용하여 접근한다. MySQL은 mysql이라는 클라이언트 프로그램을 제공한다. 그럼 본론에서 클라이언트와 서버 간의 구체적인 접근 방법에 대한 과정을 살펴 보기로 한다.
2. 본론
하나의 데이터베이스 서버를 구축하고, 편의상 본 과제에서는 MySQL을 다운받아 설치하기로 한다, 다른 PC에서 이 데이터베이스 서버에 접근해 보기로 하자. 우선 서버는 리눅스 시스템을 사용하기로 한다. 현재 본 연구소에서는 레드햇 리눅스 9.0을 사용한다. 리눅스 설치시 데이터베이스를 모두 설치하면 MySQL을 설치할 수 있다. 학습을 목적으로 근사모가 제공하는 APM_SETUP이라는 윈도우용 페키지를 이용할 수도 있겠다. 이번 과제의 클라이언트는 윈도우를 사용하기로 한다. MySQL 페키지는 크게 다음과 같이 3그룹의 프로그램으로 구성된다.
. MySQL 서버 엔진 (mysqld)
. 클라이언트 프로그램 (mysql)
. 그 외 utility 프로그램
이번 과제에서는 mysql 이라는 클라이언트 프로그램과 OS Shell을 이용하는 방법과 OS Shell이 제공하는 표준 출력을 재 가공하기 위한 PHP 스크립트를 이용하여 데이트베이스 엑세스 방법을 이해하고 한다.
2.1 서버와 클라이언트의 상호 데이트 송수신 관계
mysql 클라이언트 프로그램은 서버로 sql 명령어를 전달하고 서버엔진이 그 결과를 산출해 주면 이것을 받아 user에게 feekback하는 역할을 한다. [그림 1]은 이러한 관계를 그림으로 표시한 것이다.
2.2 SQL 명령어 전달 방법
클라이언트 측면, 즉 사용자 입장에, sql 명령을 전달하는 방법은 크게 3가지로 나눌 수 있는데 그 방법은 다음과 같다.
. mysql 서버의 shell을 얻어서 직접 명령을 입력하는 경우
. mysql 클라이언트에 sql 명령어군 직접 실어 보내는 경우
. mysql 클라이언트에 미리 작성해 둔 sql명령군의 파일을 전달하는 경우
. 웹 기반에서 OS shell을 통하여 명령을 전달하는 경우
2.2.1 서버 shell 직접 이용 방식
MySQL 서버의 shell을 얻어서 직접 명령을 전달하는 경우에 대해 살펴보자. 우선 사용자는 OS가 제공하는 shell 프롬프트에서 다음고 같은 명령어를 사용하여 데이터 베이스 서버 엔진에 접속 할 수 있다.
# mysql -h host_name -u user_id -p
-h는 데이터베이스 서버이며 -u는 데이터베이스를 사용할 수 있는 권한을 가진 사용자가 된다. 이 사용자는 데이터베이스 서버의 mysql.user (DB.Table)에 등록된 사용자인 경우이다. -p는 사용자의 개인 password이다. 이 과정에서 정상적인 접속이 이루어지면 MySQL 서버는 다은과 같은 프롬프트를 사용자에게 제공해 준다.
..... some message
>
2.2.2 mysql 클라이언트에 sql 명령어군 직접 실어 보내는 경우
# mysql -h host_name -u user_id -p -e "sql명령; sq명령; sql명령‘
이 경우는 -e 선택 사항을 사용하는 경우이다. 간단한 명령을 전달하여 그 결과를 보는데 편리하다고 하겠다. 간단히 예를 들면 다음과 같다.
# mysql -h host_name -u user_id -p -e "use mydb; show tables; select * from mystbl where myid=10"
앞서 설명한 것과 같이 OS shell에서 사용함으로써 제한된 sql 명령어만 제공할 수 있다. 많은 명령어는 기술하지 못하며, sql명령과 명령 사이에는 mysql 서버 엔진이 명령 구분기호로 사용하는 ;을 적어주면 되겠다.
2.2.3 mysql 클라이언트에 미리 작성해 둔 sql명령군의 파일을 전달하는 경우
이 방법은 OS가 제공하는 필터 기능을 활용하는 방법으로 리눅스 시스템에 설치된 mysql 서버엔진의 경우 명령 history, 방향키에 기존에 사용한 명령이 저장되어 있음, 를 유용하게 사용할 수 있지만, 윈도우즈 환경에서는 그렇지 못하다. 따라서 이 방법은 이러한 문제점을 쉽게 극복할 수 있으며, 초보자들에게 유영하리라 생각한다.
# mysql -h host_name -u user_id -p < path/file.sql
여기서 file.sql은 미리 sql 명령어를 만들어 준비한 것이라고 하겠다. 그럼 간단한 예제를 보다. 편의상 sql 명령어를 모아 두었으므로 파일 확장자를 sql로 했다. 사용자의 편의에 따라 변경하면 되겠다. path는 사용자가 만든 directory이다. 그럼 예제를 보자
$ mkdir -p ~/app/sql
$ vi test.sql
아래는 test.sql 파일의 내용이다. #은 mysql 서버가 remark로 인식한다. 따라서 remark를 붙이는 버릇이 습관화 되면 데이터베이스를 사용하는 모든 사용자에게 이해를 도울 수 있다고 하겠다.
# mysql test를 위한 명령어
# file : file.sql
# data :04.4.25
# auth : Lim.Y.K
use mydb;
show tables;
describe mytbl;
select * from mytbl where myid > 10;
# end of sql
이 파일의 저장위치는 앞서 만든 ~/app/sql이 되겠다. 그리고 다음과 같이 서버엔진에 접근가능하다.
# mysql -h host_name -u user_id -p < ~/app/sql/test.sql
2.2.4 웹 기반에서 OS shell을 통하여 명령을 전달하는 경우
오늘날 웹 기반 프로그래밍에 가장 많이 사용되는 PHP script 언어를 이용하여 mysql에 접근하는 방법에 대하여 알아보자. 이 방법은 PHP 자체 내장 함수를 이용하는 방법과 OS shell의 출력 결과를 backtick로 받아오는 방법으로 나누어 사용 가능하다. 함수를 이용하는 방법은 그 절차가 많이 복잡하다. 그러나 각 row,col 에 대한 유연한 처리가 가능하지만 backtick으로 처리하는 경우는 그렇지 못하다. 어떤 방법을 사용하는 것이 혀냊 적용하고자 하는 시스템에 적합한지는 사용자 몫이라고 하겠다.
본 과제에서는 backtick을 이용하여 mysql status를 모니터링 하고자 하는데 적용해 보았다. 우선 PHP의 backtick을 이용하기 위해서는 backtick 연산자 (·)에 대하여 알아야 할 것이다. "(작은 따옴표)의 반대모양으로 키보드 판에 존재한다. 1번키 좌측. 이것은 PHP가 제공해 주는 system 함수와 비슷한 역할을 한다고 생각하면 아주 쉬울 것이다. 우선 mysql 접속을 위한 폼을 하나 만들어 이것을 post하고 서버접속 후 질의 결과를 받아와 출력해 주는 PHP 스크립트를 작성하면 되겠다.
스크립트 내부를 보면 알 수 있듯이 2.2.3, 2.2.3의 방법을 모두 적용 할 수 있는 장점이 있다. 여기에 간단한 스크립트를 제공한다. 아래 스크립트를 보고 사용하는데 많은 도움이 되기를 바란다.
mmlt;?
// form : mysql 접속 정보 입력
// file : out.php
// auth : 임영규 @ Gnome Institute Head
// date : "04. 04.23
//
$m_host=$HTTP_POST_VARS["f_host"];
$sqlcmd=$HTTP_POST_VARS["sql"];
$m_db=$HTTP_POST_VARS["db"];
$m_name=$HTTP_POST_VARS["f_name"];
$m_pw=$HTTP_POST_VARS["f_pw"];
// host 확인
if (empty($m_host))
$m_host="localhost";
// DB 확인
if (!empty($m_db))
$cmd="mysql -h $m_host -e "use $m_db; $sqlcmd;" -u $m_name --password=$m_pw". " | cat -b";
else
$cmd="mysql -h $m_host -e "$sqlcmd;" -u $m_name --password=$m_pw". " | cat -b";
// 특수문자 제거
$cmd=stripslashes($cmd);
// 조합 명령 출력
echo $cmd."mmlt;brmmgt;";
// 질의 전송 및 결과 획득
$result=`$cmd`;
// form 정보 출력
echo "DataBase : ".$m_db."mmlt;brmmgt; SQL = ".$sqlcmd."mmlt;brmmgt;";
// mysql 질의 결과 출력
echo "mmlt;textarea name=res rows=30 cols=100mmgt;";
if (empty($result))
echo "access fail. Permition denied";
else
echo $result;
echo "mmlt;/textareammgt; ";
?mmgt;
3. 결론
여러 가지로 mysql 서버의 접근 방법을 알아보았다. 이번 과제를 하면서 상당히 많은 흥밋거리가 있음을 알게 되었다. 또한 함수 이용과 backtick 이용의 구분 방법 및 편리함에 대한 이해도 구할 수 있었다. 어떤 것이 효율적인지 잘 정리하고 여러분이 mysql 데이터베이스를 이용함에 있어 많은 편리를 보장 받았으면 한다. 또한 많은 좋은 결과가 있기를 바란다.
[참고]
. MySQL 사용자 manual (on the web : http://mysql.org)
. MySQL CookBook in use P2P .pdf file
. MySQL 시스템 관리와 프로그래밍 (O"reilly, 한빛미디어)