MySQL 을 사용하면서, 생겼던 문제들을 정리하였다.
설치에서 사용까지
MySQL을 받아야 하기 때문에 인터넷의 여러 곳을 돌아다녀보자. 워낙 인터넷이 무궁무진하기 때문에 금방 찾을 수 있을 것이다. 참고로 나는 mysql-3.22.32.tar.gz 을 받았다. 압축을 풀면 mysql-3.22.32 라는 디렉토리가 생길 것이다.
모든 프로그램이 그렇듯 설치할 때가 가장 까다롭다. 하지만 이 mysql 핵심가이드와 함께 한다면 원하는 결과를 얻을 수 있을 것이다. mysql-3.22.32 라는 디렉토리에 들어가서 바로
#./configure --prefix=/usr/local/mysql --with-charset=euc_kr <-- 이부분을 반드시 해주세요..
를 입력한다. 여기서 '–prefix=/usr/local/mysql'은 이 경로로 설정을 풀라는 뜻이고,
'–with-charset=euc_kr'는 언어를 한국어로 한다는 뜻이다.(미루어 짐작하기에….)
그리고 'make'를 입력하여 컴파일하고, 'make install'을 입력하여 시스템에 깐다.
'scripts/mysql_install_db'를 입력한다. 'make install'을 입력했기 때문에 '/usr/local/mysql/'이란 디렉토리가 생긴다.
'/usr/local/mysql/bin/safe_mysqld&'를 입력한다. 그러면 아무런 일없이 커서가 한칸 아래 내려가서 깜박인다.
여기서 긴장하지말고 엔터를 친다. 그리고 'ps -ax|grep mysql'를 입력한다. 그러면 결과가 나오는데 'mysql………'라고 3~4줄 정도가 나올 것이다.
그리고 './mysql‘를 실행하면 'mysql>'하고 커서가 깜박일 것이다. 이 화면이 나온다면 설치는 무사히 마친 것이다.
'mysql>use mysql'라고 입력하고 엔터를 치면 마지막 줄에 '데이터베이스 체인지'라고 나온다.
그리고 'show table;'을 치면 테이블이 나온다. 이를 확인했다면 'quit'를 치고 빠져 나온다.
지금의 mysql은 아무나 들어갈 수가 있다. 이것은 보안에는 무방비 상태를 의미하므로 패스워드를 정해주어야 한다. 정해주는 방법은 다음과 같다.
'/usr/local/mysql/bin/'에서 'mysql -u root passwd 암호' 또는 'mysqladmin -u root password 암호' 입력한다. 이제 암호가 제대로 입력되었는지 확인해보자. '/usr/local/mysql/bin/'에서 './mysql -p'라고 치면 암호를 입력하라고 요구한다. 방금전 입력했던 암호를 입력해보자. 'mysql>' 가 나온다면 제대로 입력된 것이다.
MySQL FAQ
Mysql DB 를 백업하려면?
shell 상에서 아래와 같이 명령을 주시면 됩니다.
mysqldump -p사용자패스워드 db_name > 저장할 파일명( 일반적으로 db_name.dump)
위의 명령을 주시면, db를 백업하실수 있고, 다시&nbs p;쓰실 경우에는
mysql -p패스워드 new_db_name < 저장하신 파일명
여기서 new_db_name은 미리 만들어져 있어야 합니다.
Mysql DB Table를 현재 컴퓨터에서 다른 컴퓨터로 옮길려고 하거든요.
방법이 없을까요…
아직 초보라서…….
이미 만들어져 있는 테이블에 새로운 열의 이름과 자료형을 추가시키려면 어떻게 하나요??
alter table 테이블이름 add 칼럼, alter table 테이블이름 drop 칼럼을 사용하세요.
이미 만들어져 있는 테이블에 새로운 열의 이름과 열의 자료형을 추가시키려면 어떻게해야 하나요??
또 이렇게 추가시킨 테이블에서 특정 열의 이름과 자료형을 삭제시키려면 어떻게 해야 하는지도 궁금합니다. 아시는 분들 답변 좀 부탁드립니다.
추가하는 예
d 라는 새로운 TIMESTAMP 컬럼을 추가한다.
mysql>alter table t2 add d TIMESTAMP; //여기서 t2는 컬럼을 추가하려는 테이블명이다.
제거하는 예
컬럼 c를 제거한다.
mysql>alter table t2 drop COLUMN c; // t2는 위와 같다.
Mysql을 살리려면 '/usr/local/mysql/bin/safe_mysqld &' 해야한다는 것은 누구나 알고 있을 것이다. 하지만 데몬이 띠워진 상태에서 다시 safe_mysqld & 해보자!! 데몬이 ended 될 것이다. 이는 왜그럴까?
우선 아래와 같이 해보자!!
#ps acx | grep mysqld
그럼 지금 작동하고 있는 mysql 데몬을 볼수 있을 것이다. 이것을 모두 kill 하자!! 그리고 다시 safe_mysqld & 실행시켜보자..
테이블을 검사하여 복구하려면 'isamchk' 라는 유틸을 이용하는 데 사용법은 다음과 같다.
#/usr/local/mysql/bin/isamchk proftp <----proftp는 테이블명이다..
위의 실행은 '/usr/local/mysql/var/' 의 Database의 디렉토리에 들어가서 한다.
mysql에서 사용자정의 함수(UDF)를 사용하기
우선 C로 짠 프로그램(함수)를 컴파일한다. 리눅스에서는 gcc로 컴파일하는데, 이것이 쉽지가 않다. 예를 들어 'getgrade.c'라는 함수가 있다고 하자!! 그럼 이 함수가 있는 디렉토리에 가서 다음과 같이 한다.
#gcc -shared -o getgrade.so getgrade.c -lmysqlclient -I /usr/local/mysql/include/mysql/
여기서 중요한 것은 ‘-I'다음 부분인데, ’mysql.h'파일이 있는 경로명을 적어주어야 한다는 것이다. 이는 시스템마다 다를수 있는데, find 명령을 이용해서 어디에 있는지 경로를 알아두자!!
정상적으로 설치했는데 데몬이 안 뜰 때 make; make install 까지 하고 mysql_install_db까지 실행했음에도 불구하고
#cd /usr/local/mysql/bin #./safe_mysqld Starting mysqld daemon with databases from /usr/local/mysql/var 011007 21:39:39 mysqld ended
위와 같은 메시지가 뜨면서 에러가 뜨는 경우!! 필자도 애먹었다~~
#vi /usr/local/mysql/var/fat81.com.err
에러 파일을 보면 왜 데몬이 안뜨는지 이유가 영어로 자세히 나와있다. 대충 이유를 해석하자면 ‘mysql'이란 계정으로 바꾸어 주라는 내용이다. 파일의 내용은 아래와 같다.
----------------------fat81.com.err------------------------------------------ 011007 21:18:07 mysqld started Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists! 011007 21:18:08 Aborting 011007 21:18:08 /usr/local/mysql/libexec/mysqld: Shutdown Complete 011007 21:18:08 mysqld ended --------------------------------------------------------------------------
해결책은 다음과 같다.
#chmod 755 /usr/local/mysql/var
그리고는 다시 데몬을 띄워보자!!
root 패스워드 보호하기
많은 사람들이 mysql을 시스템에 설치하고 루트(root)의 패스워드를 준다. 그러나 여기서 한가지 중요한 사실이 있다. 우선 mysql에 접속해서 'mysql' 데이터베이스의 user 의 테이블을 보자. 그 상태에서 아래의 명령을 내려보자!!
mysql>select host, user, password from user where user = 'root';
그럼 결과는 'localhost' 와 'myfeel.hoseo.ac.kr'가 있을 것이다. 그런데 그 옆을 보면 'localhost'는 패스워드가 설정되어 있지만 'myfeel.hoseo.ac.kr' 은 패스워드가 지정되어 있지 않다. 그 상태에서 mysql을 빠져나가 프롬프트에서 다음과 같이 명령을 내려보자..
#./mysql -u root -h myfeel.hoseo.ac.kr -p
그리고 패스워드를 입력하지 않고 엔터를 누르면 그냥 접속이 가능하다.(이럴 수가!!)
이런 일을 방지하기 위해 반드시 귀찬더라도 아래와 같이 해준다.
#./mysqladmin -u root password 1234 <---------ex #./mysqladmin -u root -h myfeel.hoseo.ac.kr password 1234 <----------ex
텍스트 파일의 데이터를 자동으로 추가시키기
텍스트 파일 형태로 어떤 데이터들이 들어있다고 하자.
이런 경우는 대개 대용량의 데이터들을 입력할 때이다. 일일이 손수 추가시킬 수도 있겠지만, 그렇게 하기에는 너무 많다. 이럴 때 사용할 수 있는 것이 바로 LOAD DATA 명령어이다.
여기서는 이해하기 쉽게 예를 들어 설명해 보겠다.
다음과 같은 스키마를 가진 vocabulary 라는 테이블이 있다.
create table vocabulary( num int(10) not null default '0' auto_increment, name varchar(20), mean varchar(50), primary key(num) );
바로 이 테이블에 데이터를 추가할 것이다. 이번에는 텍스트 파일을 보자!! 파일명은 eng.txt 이다.
1 school 학교 2 speak 스피커
위의 텍스트 파일을 생성 시에 주의할 것이 있다. 각 항목은 탭(TAB)간으로 띄어준다. 그리고 각 행은 엔터(ENTER)로 구분한다.
이제 모든 준비가 완료 되었다. 실제로 자동으로 입력해보자!!
텍스트 파일의 복사는 데이터베이스 파일이 있는 경로로 복사한다. mysql 의 경우 각 데이터베이스는 디렉토리 이름으로 생성되어서 구분한다. 나의 현재 경우는 /var/lib/mysql/ 아래 데이테이스 이름의 디렉토리 아래에 복사했다. 여기서는 test 라는 데이터베이스 이름으로 했다.
#mysql test -p mysql>load data infile "eng.txt" into table vocabulary fields terminated by '\t' lines terminated by '\n'; Query OK, 2 rows affected (0.01 sec) Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 mysql>select * from vocabulary;
어떤가? 제대로 입력되었는가??
여기서 주의할 점은 num 항목은 auto_increment 와 primary key 로 지정해주었지만, 텍스트 파일에서 반드시 num 항목에 대한 입력값을 주어야 한다는 것이다.
그대신 primary key 이기 때문에 유일한 값을 넣어야 한다. 그렇지 않으면 에러가 발생한다.
보너스!!
바로 앞에서 했던 것은 테이블의 필드가 3 개라면, txt 파일에도 똑같이 3 개의 데이터를 넣어주어야 했다. 이번에는 특정 필드만 데이터를 넣는 방법을 알아보자!! name 와 mean 필드만 데이터를 입력하고 싶다면, 아래와 같이 실행한다.
load data infile "a.txt" into table md_basic fields terminated by '\t' lines terminated by '\n' (name, mean);
여기서 당연히 txt 파일에서는 2 개의 필드의 데이터만 있어야 한다.