원본출저 : 허정수님의 홈페이지

	
			MySQL 소개와 특징, 설치

1. 들어 가는 말.
	1997년 겨울, 필자는 SQL을 배우기 위해 
	SQL 서버를 찾고 있었다. 여러 잡지와, 
	책을 찾아 보았는데, 그때만 해도  
	mSQL과 PostgreSQL에 대한 내용 밖에 없었다.
	평소 일반 사람들과 다른 삶을 살고 싶었던
	필자는 일반 사람들이 많이 쓰지 않는 SQL 서버를
	찾다가 우연히 MySQL을 알게 되었고, MySQL에 반해 
	버렸다. 1997년 만해도 MySQL은 mSQL이나, PostgreSQL
	보다는 사용자가 적었다(우리 나라에서만 그런지는 모르지만).
	몇 달전 리눅스 저널에서 각 분야별로 어떤 응용 프로그램이
	가장 많은 사용자를 확보했나 조사를 한 적이 있다. 
	DB 분야에서는 MySQL이 1등을 했다. 
	아이러니컬하게도 다른 사람이 많이 안 쓰는 SQL 서버를
	사용하기 위해 MySQL을 썼었는데, 지금은 가장 많은 사용자를
	확보하였다. ^^;

	이 글에서는 MySQL의 특징과 설치 방법, 설정 방법,
	C API를 이용하여 응용 프로그램과 연동하기,
	PHP3를 이용하여 연동하는 방법에 대해서 알아 본다.

	이번 기사에서는 MySQL의 특징과 설치 방법, 설정 방법에
	대해서 알아 본다.

2. MySQL 의 특징
	
	MySQL의 메뉴얼을 보면 MySQL의 특징이 약 30가지 정도 나와 있다.
	중요한 것을 요약해 보면 다음과 같다.

	* 커널 thread를 이용한 Multi thread를 지원하므로, 
	  CPU가 여러 개일 경우 이들 CPU를 잘 활용할 수 있다.
	
	* 다양한 플랫폼을 지원한다.( Windows NT도 지원한다 ) .

	* 아주 큰 데이타 베이스도 다룰 수 있다. 
	  MySQL을 만든 회사는 5천만개의 레코드를 가진 
	  데이타 베이스도 사용하고 있다.
	
	* 다양한 나랏말로 에러 메시지를 표시한다.

	이외에도 많은 특징이 있지만, 일반적인 SQL 서버의 특징이기
	때문에 생략한다.

	하지만, MySQL의 가장 큰 특징을 들라고 하면, 
	빠른 속도를 들 수 있다. 

	그림 1에 MySQL과 오라클의 속도를 비교해 놓은 벤치 마크 결과가 있다.

	

그림 - MySQL의 벤치 마킹
그림 1에서 알 수 있듯이, MySQL은 매우 빠르다. http://www.tcx.se/benchmark.html에 가면 다른 제품과도 비교해 놓은 자료가 많이 있으니, 관심있는 독자는 직접 확인 하기 바란다. 혹시,'빠르기만 하고 안정적이지 못한 것은 아닌가' 하는 독자도 있을지 모르겠는데, MySQL은 매우 안정적이다. 이는 이미 MySQL을 사용본 사람들에 의해서 검증되었다. 현재 MySQL을 개발한 TCX에서는 100기가 이상의 자료를 MySQL을 이용하여 관리하고 있다. MySQL의 다른 특징은 '사용하기 편리하다'이다. 필자가 SQL에 대해 문외한일 때 MySQL을 처음으로 써 봤었는데, 문서 몇개만 읽어 보고, 사용할 수 있을 정도로 사용하기 편리했다. 잠시 MS-SQL을 써 본 적이 있는데, MySQL을 사용하다가 MS-SQL을 사용할 때의 그 당혹감을 아직도 잊을 수 없다. 필자는 GUI보다 CUI를 좋아하는데, 비슷한 프로그램을 CUI와 GUI로 사용할 때마다 '배우기 쉽다'와 '사용하기 쉽다'는 전혀 다르다는 것을 느낀다. 리눅스는 배우기는 약간 어렵지만, 써볼 때마다 사용하기 정말 편하다는 것을 느끼고, 점점 애착이 간다. 그렇다면, 왜 MySQL이 다른 제품에 비해서 빠른지 궁금하지 않는가? MySQL은 속도 향상을 위해서 일부러 몇 가지 ANSI SQL을 구현하지 않다. 바로, Transaction과 Trigger이다. Transaction과 Trigger는 시스템의 자원을 많이 소모함으로 속도를 떨어지게 한다. MySQL은 Transaction과 Trigger를 일부러 구현하지 않았다. 2.1 MySQL에서 지원하지 않는 SQL 기능. 필자가 MySQL을 이용하면서 SQL을 공부하면서, MySQL이 ANSI SQL을 모두 지원하지 않는 다는 것을 알았다. '뭐, 이런게 다 있어'하면서 MySQL을 버리려고 했으나, 아직, MySQL이 개발 중이고, 또 속도를 위한 것이었음을 알고, 이해가 갔다. 다음은 아직 MySQL이 지원하지 않거나, 아예 지원 계획이 없는 것들이다. * Sub-select SELECT * FROM table1 WHERE id IN( SELECT id FROM table2) ; 와 같은 것은 아직 MySQL에서 지원하지 않는다. 다만, INSERT .. SELECT .. 와 REPLACE .. SELECT 만이 지원된다. sub-select는 3.23.0 버전에서 사용가능할 것이라고 한다. * SELECT INTO TABLE MySQL은 SELECT .. INTO TABLE을 지원하지 않는다. SELECT .. INTO OUTFILE 만을 지원한다. * Transaction 앞에서도 말했다시피 MySQL은 Transaction을 지원하지 않는다. Transaction은 일련의 작업 단위로, 이 작업 단위에 있는 하나의 작업이 취소되거나, 실패하였을 경우 원래의 상태로 돌아 오는 것을 말한다. (은행의 예금 인출을 생각하면 쉽다) 편리한 기능일지는 모르지만, Transaction은 시스템의 자원을 많이 소모함으로 전체적인 속도를 느리게 한다. 따라서 , MySQL은 Transaction을 구현하지 않고, 대신에 LOCK TABLES/UNLOCK TABLES를 이용하여 Transaction과 같은 일을 할 수 있도록 하였다. * Stored Procedure와 Trigger Stored Procedure는 C 언어의 함수와 비슷한데, 하나의 명령으로 여러 개의 명령을 수행하게 한다. Trigger는 UPDATE나 DELETE 등의 일이 발생되면, 지정된 동작을 실행시키게 한다. Stored Procedure는 앞으로 지원할 계획이지만, Trigger는 속도를 떨어트리고, 별로 필요없는 쿼리라서 앞으로도 지원할 계획이 없다. * Foreign Key * View 3. MySQL의 설치 아쉽게도 MySQL의 라이센스 방식 때문에 레드햇 같은 리눅스 배포판에는 MySQL이 포함되어 있지 않다. MySQL의 라이센스 방식은 비상업용으로 MySQL이 쓰일 경우 무료이고, 상업적으로 쓰일 경우, 라이센스를 구입해야 한다. Win 95, Win 98, Win NT용 MySQL은 상업적이든 비상업적이드 라이센스를 구입해야 한다. 리눅스 배포판에 MySQL이 없으므로 통신 동호회나 인터넷에서 구해야 한다. MySQL의 홈페이지는 http://www.tcx.se이다. http://www.tcx.se/download.html에서 MySQL을 구할 수 있다. 배포되는 형식은 소스 코드, 바이너리, RPM이다. 이 글이 쓰여 지고 있는 지금의 최신 버전은 3.22.20a이다. 3.1 소스 코드로 설치하기. 초보자들은 컴파일을 두려워 하는 경향이 있다. 하지만 대부분의 프로그램은 autoconf와 automake를 이용하여 배포되므로 컴파일하기가 쉽다. 메뉴얼에 나온대로 잘 따라간다면 실패없이 단 한번에 설치를 마칠 수 있다. 가장 기본적인 과정은 다음과 같다. % gzip -d mysql-Version.tar.gz % tar xvf mysql-Version.tar % cd mysql-Version 이제 실제 설치 단계이다. % configure % make % make check % make install % cd scripts % mysql_install_db 몇 줄만 치면 설치가 다 끝난다. 각 단계는 다음과 같은 일을 한다. configure : 각자의 환경에 맞게 Makefile을 생성한다. make : 컴파일을 한다. make check : 컴파일이 제대로 되었는지 검사하는 단계이다. 꼭 할 필요는 없다. make install : 만들어진 실행 파일을 원하는 디렉터리에 설치한다. mysql_install_db : MySQL의 권한에 대한 테이블을 생성한다. MySQL을 처음 설치했을 때만 필요한 과정이고, 이전 버전의 MySQL에서 업그레이드를 하고 싶다면 mysql_fix_privilege_tables를 실행시키면 된다. 따로 MySQL이 설치될 디렉터리를 지정하지 않았다면, 기본적인 디렉터리는 /usr/local/이 된다. MySQL을 설치할 시스템이 자신이 슈퍼 유저인 시스템이라면 상관없겠으나, 학교 서버에 설치한다든지의 경우는 대부분 /usr/local/에 설치할 권한이 없을 것이다. 이때, MySQL을 설치할 디렉터리를 지정해 줄 수 있다. % configure --prefix=원하는 디렉터리 이렇게 하면 MySQL이 자신이 지정한 디렉터리에 설치된다. MySQL이 설치된 디렉터리의 bin 디렉터리에 실행 파일이 설치 되고, include/mysql에 헤더 파일이 설치된다. lib/mysql에 라이브러리들이 설치되고, libexec에 MySQL의 데몬인 mysqld가 설치된다. var에는 실제 데이타들이 설치된다. 3.2 바이너리 배포판으로 설치하기. 일단 바이너리 배포판을 위의 홈페이지에서 받은 후에 % gzip -d mysql-Version-OS.tar.gz % tar xvf mysql-Version-OS % ln -s mysql-Version-OS mysql % cd mysql % scripts/mysql_install_db 이렇게 하면 설치가 끝난다. 3.3 rpm으로 설치하기. rpm은 소스 코드 rpm과 바이너리 rpm이 있다. rpm이 소스 코드를 담고 있다면, % rpm -i MySQL-Version.src.rpm % cd /usr/src/redhat/SOURCES 이후에는 소스 코드로 설치 하기 과정을 하면 된다. 바이너리의 경우 MySQL-Version.i386.rpm, MySQL-client-Version.i386.rpm MySQL-bench-Version.i386.rpm, MySQL-devel-Version.i386.rpm 의 4 개의 파일이 필요하다. rpm을 이용하여 위의 4 개 파일을 설치하면 된다. 이때 /var/lib/mysql에 실제 데이타들이 저장된다. 부팅시에 자동으로 데몬을 실행시키는 파일을 자동으로 만들어 준다. 3.4 MySQL 사용하기. 설치가 완료됐으니, 이제 MySQL을 사용해 보자. 먼저 어떤 실행 파일이 만들어 졌는지 살펴 보자. 많은 실행 파일이 있지만, 많이 쓰이는 실행 파일만 정리하면 다음과 같다. 1) mysql SQL 쉘로서, client 프로그램이다. MySQL에 접속하여, 쿼리를 수행하는 프로그램이다. 앞으로 많이 사용하게 될 것이다. 2) mysqladmin MySQL을 관리하는 프로그램이다. 데이타 베이스를 만들고, 삭제하고, 권한에 대한 테이블을 다시 읽어 들이는 일을 한다. 3) mysqld MySQL 데몬이다. MySQL을 사용하기 위해서 항상 실행 중이어야 한다. 4) mysqlshow MySQL안에 어떤 데이타 베이스들이 있는지, 그 데이타 베이스들에는 어떤 테이블이 있는지, 테이블에는 어떤 컬럼이 있는지를 보여 준다. 5) safe_mysqld mysqld를 좀더 안전하게 실행시키는 스크립트 파일이다. 6) isamchk 테이블에 문제가 있을 때 문제점을 고치기도 하고, 테이블을 최적화 한다. MySQL의 사용하기 위해서 데몬이 실행 중이어야 한다고, 설명을 했다. 데몬을 실행시키는 방법은 % safe_mysqld 혹은 % mysqld 이다. MySQL은 3306번 포트를 사용한다. 혹시 다른 프로그램에서 먼저 3306번을 쓰고 있으면 데몬이 에러를 내면서 실행이 안 된다. 이때는 % mysqld -P 3333 등 처럼 사용할 포트 번호를 지정해 줄 수 있다. 매번 부팅시마다 데몬을 손수 실행시키기 귀찮다면, safe_mysqld를 /etc/rc.d/rc.local 에 한줄 추가해주면 부팅시마다 자동으로 실행 된다. (rpm으로 설치한 사람은 자동으로 되어 있다.) 3.5 권한 설정과 새로운 사용자 추가하기. MySQL 설치 단계에서 mysql_install_db 단계가 권한에 대한 테이블을 설치하는 단계라고 하였다. MySQL을 처음 설치하면 root만이 MySQL을 사용하도록 권한이 주어여 있다. root 유저가 아니라도 걱정할 필요는 없다. 옵션만 붙여 주면 된다. 일단 어떤 데이타 베이스들이 있는지 보자. % mysqlshow -u root +-----------+ | Databases | +-----------+ | mysql | | test | +-----------+ '-u root'가 바로 root로 사용을 한다는 옵션이다. MySQL을 처음 설치하면 mysql, test라는 두 개의 데이타 베이스가 설치된다. mysql에 어떤 테이블이 있는지 보자. % mysqlshow -u root mysql Database: mysql +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ 6 개의 테이블이 있다. 이 중 user 테이블이 사용자에 관한 테이블이다. 이제 mysql이라는 클라이언트 프로그램을 이용해서 MySQL을 사용해 보자. % mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 13 to server version: 3.22.20a Type 'help' for help. mysql> mysql 데이타 베이스를 사용하기 위해서 다음과 같이 한다. mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> 그럼 다음과 같이 하여, mysql 데이타 베이스의 user 테이블에 어떤 레코드가 있는지 보자. mysql> select * from user ; +-------------+-------+------------------+-------------+- .. | Host | User | password | Select_priv | .. +-------------+-------+------------------+-------------+- .. | localhost | root | | Y | .. | inos.ml.org | root | | Y | .. | localhost | | | N | .. | inos.ml.org | | | N | .. +-------------+-------+------------------+-------------+- .. 7 rows in set (0.00 sec) 위와 비슷하게 나왔을 것이다. SQL 언어를 잘 모르는 독자를 위해 설명하자면 'select ... ' 는 테이블로 부터 컬럼을 리턴하라는 쿼리이다. 모든 쿼리의 끝은 ';' 혹은 '\g'로 끝난다. XXX_priv는 XXX에 대한 권한을 나타낸다. 즉 Select_priv 가 'Y'이면 그 사용자는 select 쿼리를 수행할 수 있음을 나타낸다. | Host | User | password | Select_priv | .. +-------------+-------+------------------+-------------+- .. | localhost | root | | Y | .. 위는 localhost의 root가 패스워드는 없고, 모든 권한이 주어져 있다는 것을 나타낸다. 하지만 어떠한 유저라도 % mysql -u root 만 하면 MySQL에 대한 모든 권한을 가질 수 있으므로 매우 위험하다. 암호를 지정하는 방법은 다음과 같다. mysql> UPDATE user SET password = password('새로운암호') > WHERE user='root' ; 쿼리가 길다면 두 줄에 나눠서 써도 된다. 쿼리의 끝을 나타내는 ';' 만 있으면 된다. UPDATE는 컬럼의 값을 변경시키는 쿼리이다.(다음 기사에 SQL 언어에 대한 설명이 이어 진다.) MySQL은 password를 암호화 한다. 따라서 암호를 지정할 때는 password('암호') 처럼 password() 함수를 이용해야 한다. 이제 mysql을 잠시 종료하고, 암호가 제대로 되었는지 확인해 보자. mysql> quit 혹은 mysql> exit 혹은 mysql> Ctrl-D 권한에 대한 테이블을 변경하였을 경우에는 mysqladmin을 이용하여 꼭 변경된 권한을 다시 읽어 들여야 한다. 다음과 같이 한다. % mysqladmin -u reload 위는 권한을 다시 읽어 들이란 명령이다. 위를 안하면, 변경되지 않은 내용을 가지고 있게 된다. 다시 mysql을 실행시켜 보자. 이제 암호가 있으므로 -p 옵션을 붙여야 한다. % mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 to server version: 3.22.20a Type 'help' for help. 4.6 새로운 사용자 추가 하기 이제 새로운 사용자를 추가해 보자. 사용자가 root만 있는 경우는 없고, 모든 사용자가 모든 권한을 갖는 경우도 없다. 사용자에 따라서는 SELECT만 할 수 있는 권한을 줄 때도 있다. 사용자를 추가하려면, INSERT .. INTO를 이용해서 mysql의 user 테이블에 추가를 하면 된다. % mysql -u root -p mysql Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 to server version: 3.22.20a Type 'help' for help. mysql> INSERT INTO user VALUES('localhost', 'new-user', password('newpasswd'), 'Y','Y','Y','Y', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') ; Query OK, 1 row affected (0.00 sec) localhost의 new-user라는 사용자가 newpasswd라는 암호와 모든 권한으로 추가되었다. 모든 권한을 주고 싶지 않다면, 주고 싶지 않은 권한 부분을 'Y'으로 하면 된다. 만약 SELECT, INSERT, DELETE에 대한 권한 만을 주고 싶다면 mysql> INSERT INTO user (host, user,password, Select_priv, Insert_priv, Delete_priv) -> VALUES ('localhost', 'new-user',password('newpasswd'),'Y','Y','Y') ; 처럼 하면 다른 권한은 모두 자동으로 'N'이 된다. 사용자 추가는 INSERT외에 GRANT를 이용할 수도 있다. mysql> GRANT ALL PRIVILEGES ON *.* TO new-user@localhost IDENTIFIED BY 'newpasswd' WITH GRANT OPTION ; 위는 localhost의 new-user 가 newpasswd라는 암호로 모든 권한을 갖는다는 것을 나타낸다. mysql> GRANT RELOAD, PROCESS ON *.* TO new-user@localhost ; 는 localhost의 new-user가 RELOAD와 PROCESS의 권한을 갖는다는 나타낸다. INSERT와 GRANT 중 어느 것을 써도 상관없다. 위에서 권한이 바뀌면 mysqladmin reload를 이용해서 바뀐 권한을 적용해야 한다고 했다. 하지만, mysql에서도 할 수 있다. mysql> FLUSH PRIVILEGES ; 5. 마치는 글 지금까지 MySQL의 특징과 설치법, 설정 방법에 대해 알아 보았다. 다음 시간에는 SQL 언어에 대해서 공부를 한다. 글을 읽으면서 모르는 점이 있다면 서슴치 말고 필자에게 메일을 보내주기 바란다. 마지막으로 암호를 잊어 버렸을 경우, 어떻게 해결할지에 대해서 설명을 하겠다. 암호를 잊어버리고서, 난감해 하는 사람들을 많이 봤다. 게중에는 아예 MySQL을 지우고 새로 설치하는 사람도 있다. 시간이 남는 사람이라면 새로 설치해도 되겠지만, 시간이 남아도 중요한 데이타가 있을 경우는 새로 깔지 못할 것이다. 이런 경우 다음과 같이 하면 된다. 먼저 MySQL 데몬이 실행 중이라면, 데몬의 실행을 중지한다. 그후, 데몬을 다시 실행시키는데, 권한에 대한 검사를 하지 않고, 실행을 시킨다. % safe_mysqld -Sg & -Sg가 바로 권한 검사를 하지 않는다는 옵션이다. 이제 mysql을 이용해서 암호를 제거해 주면 된다. 그후 mysqladmin reload를 이용해서 바뀐 권한을 적용해주고 다시 데몬을 실행시키면 된다. [ 참고 사이트 ] MySQl을 설치하거나, 관리하는데 도움을 줄만한 사이트를 모았다. 1. http://www.tcx.se/info.html 2. MySQL강좌. (영어예여)