Mysql 기본사용법

MySQL 2005/07/04 10:20
1. MySQL 사용하기

1.1 MySQL 서버 시작하기

MySQL이 정상적으로 설치 되었다면 그리고 디폴트 옵션으로 설치
하였다면 /usr/local/bin/ 디렉토리에 관련 실행 파일이 설치 되었
을 것이다. 먼저 MySQL 서버를 실행하는 명령은 다음과 같다.
물론 root 아이디로 실행해야 한다.(다른방법이 있으면 알려주세요)

mysql.server start

위와 같이 입력하면 서버가 실행된다. 두개의 프로세서가 데몬상태로
실행되는데, safe_mysqld, mysqld 이렇게 두개이다.
이 두개의 프로세서가 실행되고 있다면 이제 MySQL을 사용할수 있다.
MySQL 두번째 강좌에서 보면 위의 두 프로그램에 대한 설명이 나와 있다.
이 상태에서 아래와 같이 MySQL을 사용할수 있는 가상 터미날을 실행시킨다.

mysql -u root mysql

MySQL이 처음 설치되면 DB admin user 는 root 이다. 몰론 이것은 변경
할수도 있다. 디폴트로 설치한 경우 암호가 처음에는 생성되어 있지 않으
므로 위와 같이 하면 실행이 된다. 위의 명령에 대한 설명은 다음과 같다.

mysql -u root mysql
실행파일 유저선택 root db 유저 사용할데이타베이스

그외 몇가지 간단한 옵션이 있으나 필요하면 mysql -h 하여 내용을 참고
하기 바란다. 그리고, root 유저에 암호를 설정한 후 부터는 -p 옵션을
하나더 추가하여 실행하기 바란다. 이 옵션은 패스워드를 입력받는 옵션이다.


1.2 mysql 프로그램의 사용

mysql을 실행하여 간단한 동작을 하여보자.
mysql은 일반 유저로 실행하여도 되는 프로그램이다.

$ mysql -u root mysql ---> DB 사용을 위한 실행
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.21.27-gamma-log

Type 'help' for help.

mysql>

위와 같이 연결된다. 여기서 몇가지 간단한 테스트용 명령을 적는다.

mysql> show databases --> 데이타베이스 종류보기
-> \g
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.00 sec)

mysql> show tables from mysql --> mysql상의 테이블 정보 보기
-> \g
+-----------------+
| Tables in mysql |
+-----------------+
| db |
| func |
| host |
| user |
+-----------------+
4 rows in set (0.00 sec)

mysql> show columns from db --> db table 칼럼정보 보기
-> \g
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| Host | char(60) | | PRI | | |
| Db | char(32) | | PRI | | |
| User | char(16) | | PRI | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
+-------------+---------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

mysql> show index from db --> db table의 인덱스정보기
-> \g
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
Collation | Cardinality | Sub_part |
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
| db | 0 | Host | 1 | Host |
A | 4 | NULL |
| db | 0 | Host | 2 | Db |
A | 4 | NULL |
| db | 0 | Host | 3 | User |
A | 4 | NULL |
| db | 1 | User | 1 | User |
A | NULL | NULL |
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
4 rows in set (0.00 sec)

mysql> show status --> MySQL의 상태정보 보기
-> \g
+--------+-----------------+-----------+---------------+---------
+-------------+
| Uptime | Running_threads | Questions | Opened_tables | Reloads
| Open_tables |
+--------+-----------------+-----------+---------------+---------
+-------------+
| 1493 | 1 | 26 | 4 | 1
| 4 |
+--------+-----------------+-----------+---------------+---------
+-------------+
1 row in set (0.00 sec)

mysql> show variables --> MySQL 환경변수보기
-> \g
+--------------------+---------------------------------+
| Variable_name | Value |
+--------------------+---------------------------------+
| back_log | 5 |
| basedir | /usr/local/ |
| datadir | . |
| join_buffer | 131072 |
| key_buffer | 1048568 |
| language | /usr/local/share/mysql/english/ |
| max_allowed_packet | 65536 |
| max_connections | 90 |
| max_join_size | 4294967295 |
| max_sort_length | 1024 |
| net_buffer_length | 8192 |
| port | 3306 |
| record_buffer | 131072 |
| skip_locking | 1 |
| socket | /tmp/mysql.sock |
| sort_buffer | 2097144 |
| table_cache | 64 |
| thread_stack | 65536 |
| tmp_table_size | 1048576 |
+--------------------+---------------------------------+
19 rows in set (0.00 sec)

mysql> select * from db --> db 테이블의 데이타 가져오기
-> \g
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
| Host | Db | User | Select_priv | Insert_priv |
Update_priv |Delete_priv | Create_priv | Drop_priv |
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
| % | test | | Y | Y |
Y |Y | Y | Y |
| % | test\_% | | Y | Y |
Y |Y | Y | Y |
| localhost | binggo | binggo | Y | Y |
Y |Y | Y | Y |
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
3 rows in set (0.00 sec)

mysql>


위의 명령은 기본적인 명령으로서 실제 mysql 을 사용할때
자주 사용될 명령이라고 생각된다. 기타 sql문은 강좌 3에서
정리하였으므로 생략하기로 한다.


2. MySQL DB admin user 암호걸기

MySQL 을 설치후 가장 먼저 해야 할 일은 MySQL의 admin 인
root (DB user 임)의 암호를 설정하는 일이다. 이것은 서버가
인터넷상에 접속되어 있을경우 보안을 위하여 가장 먼저해야
하는 일이라고 생각된다. 암호를 설정하는 방법은 다음과 같다.
먼저 admin 유저인 root 아이디의 암호를 설정하기로 한다.

mysql> update user
-> set password = password('testpass')
-> where user = 'root'
-> \g
Query OK, 2 row affected (0.00 sec)

mysql>

위를 실행하면 일반적으로 user 테이블상에 root 아이디가 두개가 root
아이디가 등록 되어 있으므로 2 row 의 비밀번호가 변경이 된다.
여기시 확인을 위하여 아래의 명령을 실행해 본다.

mysql> select * from user
-> \g
. . . .
. . . .

테이블상에 저장된 내용이 출력될 것이다.

자 이제부터는 admin 유저인 root로 mysql에 접속할 경우 꼭 password를
입력해야 한다. 즉 아래와 같이 실행하여야 한다.

$ mysql -u root -p mysql
Enter password:

암호를 물을때 암호를 입력하면 mysql을 사용할수 있다.


3. 새로운 데이타 베이스 생성과 사용자 연결

3.1 데이타 베이스의 생성

데이타베이스 생성의 방법은 두가지가 있다. mysqladmin 프로그램을
이용하여 root 아이디로 shell 상에서 생성하는 방법과 또하나 mysql
프로그램 상에서 생성하는 방법이다.

먼저 mysqladmin 프로그램을 이용하는 방법이다.

mysqladmin create soonhg --> 이경우 soonhg 라는 데이타베이스 생성

admin 인 root 에 암호를 설정한 경우 다음과 같이 실행한다.

mysqladmin -u root -p create soonhg

이 경우 디폴트로 설치한 경우 /usr/local/var/soonhg 라는 디렉토리가 생성
된다. 이 디렉토리가 데이타 베이스 공간으로 이용될 곳이다. 즉 soonhg 라는
데이타 베이스 공간에 테이블을 생성할 경우 soonhg 라는 디렉토리로 관련된
파일이 생성되며 데이타가 저장된다.

*******************************************************************
중요한 tip......
*******************************************************************
MySQL과 주고 받는 각종 내용은 /usr/local/var 상의 full도메인명.log
파일상에 모두 저장된다. 만일 동작 상태를 알고 싶다면 터미날을 하나 더
열어서 tail -f full도메인명.log 하여 MySQL과의 주고받는 내용을
모니터링 할 수 있다.
*******************************************************************

두번째 방법으로 mysql을 이용하는 법이다. mysql 실행상태에서 아래와 같이
한다. (admin 인 root 아이디로 mysql 에 접속)

mysql> create database soonhg
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

위의 두가지 방법중 어느 방법을 사용하여도 무관하다. 개인적으로는 mysql
상에서 데이타베이스를 생성하는것을 권장한다. 왜냐하면 계속하여 작업을
해야할것들이 있기 때문이다.


3.2 데이타베이스와 mysql 관리 테이블과의 연결 및 사용자등록 및 특권정의

자 이제 생성된 데이타베이스와 데이타베이스 관리및 엑세스 권한등을 정의
하고 있는 mysql 상의 db, user 테이블에 방금 생성된 soonhg 테이블의 내
용을 정의 하자.

먼저 이 soonhg 데이타베이스는 모든 호스트 상에서 접근이 가능하도록 만들
기로 한다. 그리고 사용자는 id 로 park 라는 DB user 를 생성한다고 하자.
sql 문은 다음과 같다.

mysql> insert into db
-> (host,db,user,select_priv,insert_priv,update_priv,delete_priv,
-> create_priv,drop_priv)
-> values ('%','soonhg','park','Y','Y','Y','Y','Y','Y')
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

위의 sql문에서 보면 park 이라는 사용자는 soonhg 데이타베이스에 대하여
select,insert,update,delete,create,drop 권한이 모두 주어졌다. 이것은
하나의 soonhg 데이타 베이스에 대하여 각 sql 명령에 대한 권한을 개별적
으로 줄수 있다는 것을 의미한다.
select * from db 라는 sql 문을 이용하여 정상적으로 insert 되었는지
확인해 보기 바란다.

자 이제 park 라는 db 사용자에 대한 등록을 할 차례이다.
다음과 같은 sql 문을 만들어 실행한다.


mysql> insert into user
-> (host,user,password,select_priv,insert_priv,
-> update_priv,delete_priv,create_priv,drop_priv,
-> reload_priv,shutdown_priv,process_priv,file_priv)
-> values ('localhost','park',password('park'),'N',
-> 'N','N','N','N','N','N','N','N','N')
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

위와 같이 하여도 되고 간단히 아래와 같이 하여도 무방하다.

mysql> insert into user
-> (host,user,password)
-> values ('localhost','park',password('park'))
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

host,user,password 이외의 칼럼들은 모두 디폴트로 'N' 으로 설정
되어 있으므로 위와 같이 하면된다. 여기서 db 테이블과 user 테이블은
특권상에서 약간의 차이점이 있다. db 테이블 상에서 설정되지 않고
user 테이블 상에만 설정되어진 DB 사용자는 user 테이블 상에서 설정
된 권한을 존재하는 모든 데이타베이스에 대하여 인정받는다.
이러한 이유로 일반 사용자인 경우는 user 테이블 상에는 모든 권한을
'N' 로 설정하여야 하고 각 DB user 가 사용할 데이타베이스에 대한
권한을 DB 테이블에 다시 정해주는 것이다.
즉, 데이타베이스가 여러개 존재한다고 가정하자. aaa, bbb, ccc 라는
세개의 데이타베이스가 존재할때, park 이라는 DB 사용자는 aaa 라는
데이타베이스만 이용하게 하려고 설정하려고 한다고 하자.

이경우는 user 테이블에는 모든 권한을 'N' 상태로 설정하고 db 테이블
에는 aaa 라는 테이블에 대하여 모든 권한을 'Y' 라고 설정하면 이 park
라는 db 사용자는 aaa 라는 데이타베이스에 대하여 사용권한이 주어질
것이다. 잘 이해가 가지 않는다면 몇번 더 자세히 읽어보고 test 해본다면
쉽게 이해할 수 있을것이다.

*******************************************************************
중요한 tip......
*******************************************************************
user 테이블에 사용자를 insert, update 한 경우 MySQL을 꼭 재기동
시켜 주어야만 한다. 명령은 다음과 같다.
mysqladmin -u root -p reload
이 명령은 user 테이블에서 사용자 정보를 다시 읽어서 MySQL 을 다시
실행시켜준다.
*******************************************************************


4. 테이블의 생성

테이블의 생성은 일반적인 sql 문장이므로 간단히 테이블 하나 생성하는
예제를 적는것으로 대신하겠다.
위에서 생성한 사용자와 사용자를 위한 테이블을 이용하여 작업을 하여보자

먼저 mysql을 실행한다. 실행은 그냥 일반 계정 사용자로 한다.

$ mysql -u park -p soonhg
Enter password: **** <-- 여기서 password 인 park을 입력한다.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 3.21.27-gamma-log

Type 'help' for help.

mysql>


자 MySQL에 접속되었다. 이제 table을 생성하여 보자. 아래는 individual
테이블 생성을 위한 SQL 문장이다.

create table individual(
empno char(16) primary key,
name char(20) not null,
sex char(2),
addr char(80),
tel char(15)
)

위의 테이블은 개인정보 테이블로 간단히 만든것이다. empno 가 키가 되어
저장된다. 물론 index 테이블이 하나 생성되며 empno 가 인덱싱 되어진 테
이블이 생성될것이다. not null 은 말그대로 name 칼럼은 null 값은 받지
않겠다는 것이고.....

자 그럼 insert 문장을 하나 작성해 보자

insert into individual
values ('1','박순행','1','서울시 중랑구 상봉동 LG apt.','02-777-7777')

위의 sql문을 실행하면 한 row의 데이타가 insert 된다. 그럼 이제
select 문을 이용하여 읽어보자.

mysql> select *
-> from individual
-> \g
+-------+--------+------+------------------------------+-------------+
| empno | name | sex | addr | tel |
+-------+--------+------+------------------------------+-------------+
| 1 | 박순행 | 1 | 서울시 중랑구 상봉동 LG apt. | 02-777-7777 |
+-------+--------+------+------------------------------+-------------+
1 row in set (0.00 sec)


위와 같이 출력 될 것이다. 여러가지 sql문장을 테스트 해보면 될것이다.
2005/07/04 10:20 2005/07/04 10:20
인터넷 사용자들이 많아지면서 인기있는 웹 사이트에서는
Max connections 에러가 발생되는 것을 볼 수 있을겁니다.

우선, MySQL은 동시에 연결될 수 있는 클라이언트의 수가
100입니다.

이런 에러가 발생한다면 먼저 접속되어있는 클라이언트의 수를
확인하셔야 합니다.. 확인방법은 아래와 같습니다.
$ mysqladmin -u root -p variables | grep max_connection

| max_connections | 100

이제는, 클라이언트의 동시 접속자를 늘리는 명령입니다.
먼저 mysqld - 이 데몬을 kill 합니다..
$ safe_mysqld --set-variable max-connections=200 &
참고로, 리눅스나 솔라리스 계열에서는 클라이언트의 동시
접속자수가 500 ~ 1,000 까지 가능하다고 합니다.

이렇게 하신 후 다시 확인합니다.
$ mysqladmin -u root -p variables | grep max_connection

그럼 제한되어 있지만 원하시는 만큼의 동시접속자 수를
늘리시게 된겁니다.
2005/07/04 10:18 2005/07/04 10:18
#/usr/local/mysql/bin/perror 1(에러번호)
Not owner

# /usr/local/mysql/bin/perror 2
No such file or directory

# /usr/local/mysql/bin/perror 3
No such process

# /usr/local/mysql/bin/perror 23
File table overflow

# /usr/local/mysql/bin/perror 24
Too many open files
2005/07/01 15:24 2005/07/01 15:24