Solaris

mysql 설치 확인 및 계정 생성

알 수 없는 사용자 2008. 2. 29.
728x90
1> 해당 시스템에서 mysql을 사용할수 있는지 확인하는 방법은 ?
2> mysql을 인스톨하고 데몬프로세스까지 확인했는데, 무엇부터 손을 대야 하는지?

시스템환경 및 MySQL 버전정보
-----------------------------------------------------------
SunOS superman 5.6 Generic sun4u sparc SUNW,Ultra-2
mysql Ver 9.32 Distrib 3.22.24, for sun-solaris2.6 (sparc)

Linux free.kobis.net 2.2.5-15 #1 Mon Apr 19 23:00:46 EDT 1999 i686
mysql Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
-----------------------------------------------------------

root 사용자의 권한으로 실행되 2개의 프로세스가 실행되고 있는지 확인하면 된다.
safe_mysqld 와 mysqld 이다. 물론 시스템의 상태에 따라 포크(fork)된 자식프로세스

의 개수는 여러개일수 있다.
-------------------------------------------------------------------------------

솔라리스경우:
% ps -ef | grep mysql

root 21768 21757 0 10월 15 ? 0:00 /usr/local/mysql/bin/mysqld --bas
edir=/usr/local/mysql --datadir=/usr/local/mys
root 21757 1 0 10월 15 ? 0:00 /bin/sh /usr/local/mysql/bin/saf
e
_mysqld

리눅스경우:
$ ps -auxw | grep mysql

root 546 0.0 0.1 1664 796 ? S Sep27 0:00 sh /usr/local/my
s
ql/bin/safe_mysqld
root 573 0.0 0.4 12680 2564 ? SN Sep27 0:12 /usr/local/mysql
/
libexec/mysqld --basedir=/usr/local/mysql --datadir=
root 576 0.0 0.4 12680 2564 ? SN Sep27 0:10 /usr/local/mysql
/
libexec/mysqld --basedir=/usr/local/mysql --datadir=
root 577 0.0 0.4 12680 2564 ? SN Sep27 0:00 /usr/local/mysql
/
libexec/mysqld --basedir=/usr/local/mysql --datadir=
-------------------------------------------------------------------------------
-



database 프로그램을 설치하고 사용하기로 마음을 먹었다고 하더라도 쉽게 새로운
환경에 접근하기란 말처럼 쉽지가 않다. 그렇기 때문에 이렇게 글을 쓰고
있는 이유이기도 하다. 개발자가 프로그램을 만드는 이유가 자신의 가려운 곳을
해결하기 위해서라는 말이 있다. 지금의 나 역시 그런 가려운 곳을 스스로 발견하려

노력하고 있고 굳이 시간을 투자해 이렇게 정리하는데는 나름대로의 발전을 기대하기

때문이다. SQL(Structured Query Language)이란 언어와 DBMS(Database Management Sy
stem)
라는 시스템은 여러분이 알고 있다고 전제하고 글을 써 나갈 생각이다.
사람에 따라서는 mysql을 시작하게 된 배경이 서로 다르겠지만, 나의 경우는 웹페이
지용
으로 사용하기 위해 mysql을 선택하게 되었다. 따라서 우선은 원하는 테이블을 생성
할 수 있는
권한을 얻는것으로 부터 mysql을 더듬어 보기로 한다.

두가지의 경우가 존재할 수 있다. root 일수 있고 일반user(이하 user)일수가 있다.

root된 자의 도리와 user된 자의 도리는 다를수 밖에 없다. 서로가 처지를 혼동하면
멀티유저 시스템은 흔들리게 된다.

먼저 root된 자의 도리는 user들을 위한 최적화된 환경을 조성해야 한다. 그중에서
도 가장
중요한 것은 user의 데이터를 손상되지 않게 보존하는 정규적인 백업작업이고 또한
권한없는 자로부터 민감한 데이터를 보호할수 있는 보안설정이 될 것이다.

구체적인 것은 각각의 도리를 알고나서 할일이지만, 여기서는 크게보아 행해야 하는
도리를
살펴보는 것으로 질문을 완성해 본다.

mysql 이 설치가 되고 나면, /usr/local/mysql/bin 이라는 디렉토리에 실제로 사용할
수 있는
유틸리티(명령어)를 볼수있다. 이중에서 당장 필요한 것은 mysql 이라는 명령어이다.

mysql 은 mysql 데이터베이스에 로그온할수 있는 프로그램이다.
사용법은 다음과 같다.

# mysql mysql // root의 경우

% mysql -u사용자명 -p패스워드 DB명 // user의 경우

무릇 root와 user된 자의 도리를 말한 이유는 단지 단어의 차이가 아니다.
위에서 보듯이 그 차이는 실제로 보인다.
접근할 수 있는 데이터베이스에 차등이 있다. 그래서 root에게는 또다른 이름이
부여가 된다. 다름아닌 DBA(database administrator)가 그것이다.
mysql이라는 DB는 관리자용 데이터베이스로 설치시에 기본적으로 인스톨되는 것이며,

-물론 mysql 인스톨시 초기설정 스크립트파일(mysql_install_db)를 실행해야 함은 당
연하다-
일반유저는 접근을 할 수 없다.
mysql를 처음으로 살펴보게 되면 2개의 DB가 존재함을 알수 있다.
mysql,test 라는 이름의 DB가 그것이다.
mysql은 DB전체에 대한 관리자격 DB이며, 이곳에는 mysql에 존재하는 DB의 이름과
해당DB의 소유자, 사용권한 등이 설정되는 곳이다. 말하자면 mysql을 총괄하는 최상

존재라고 보면 이해하기 쉽다. 그래서 user는 접근해서도 안되며,넘보아서도 안된다.

root가 mysql DB에 로그온하는 것이다. 그리고 나서 user들을 위한 공간을 분할해 주
어야
한다. 그것이 최초의 작업이 될 것이다.
mysql DB에 진입하게 되면 먼저 그 안에 뭐가 들어있는지 살펴야 한다.
DB안에 테이블이 들어있다. 여기서 오라클을 공부한 사람이 테이블스페이스 이야기를
하면
난 자신이 없다. MSSQL과 ORACLE이 아주 상이한 아키텍쳐를 가진 것처럼 MySQL도 아

상이한 것 같다. 나의 생각이지만, 기왕이면 ORACLE을 최초로 공부해두는 것이 다른
DBMS
에 접근하기 용이할 것 같다. 나의 경우엔 ACESS와 MSSQL을 먼저하고 ORACLE을 공부
하게
되었는데, Database라는 용어도 처음에는 혼동이 되었다. 물론 지금도 잘 모르겠지만
...
show tables;라는 명령이 있다. 오라클의 경우는 select * from tab; 을 사용했던 기
억이
나지만, mssql은 이런류의 SQL문을 써 본 기억이 없는 것 같다.
그냥 gui환경에서 마우스를 클릭해서 본 내용 외에는 ...

다음은 root 사용자로 mysql DB에 진입한 다음에 사용한 명령어이다.

mysql> show tables;
+-----------------+
| Tables in mysql |
+-----------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+-----------------+
6 rows in set (0.00 sec)

다음의 명령어는 반드시 사용해 보야야 한다. desc(describe)는 테이블의 구조를 보
여준다.
테이블의 구조와 내용은 다르다. 구조는 뭔가를 채우는 형식이고 내용은 채워지는 속
알맹이다.

mysql> desc db; desc user; desc host; desc tables_priv; desc func; desc colums_
priv
mysql> desc db;
+-----------------+---------------+------+-----+---------+-------+
| 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 | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+-----------------+---------------+------+-----+---------+-------+
13 rows in set (0.00 sec)
mysql> desc user;
+-----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| Host | char(60) | | PRI | | |
| User | char(16) | | PRI | | |
| password | char(16) | | | | |
| 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 | |
| Reload_priv | enum('N','Y') | | | N | |
| Shutdown_priv | enum('N','Y') | | | N | |
| Process_priv | enum('N','Y') | | | N | |
| File_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+-----------------+---------------+------+-----+---------+-------+
17 rows in set (0.00 sec)


그리고 다음의 명령어로 해당테이블이 보유하고 있는 데이터를 들여다본다.
mysql> select * from 테이블명;

mysql> select * from func;
Empty set (0.00 sec)

mysql> select * from tables_priv;
Empty set (0.01 sec)

mysql> select * from host;
Empty set (0.00 sec)

비어있거나 내용이 나와야 한다.
user,db테이블은 보안상 공개하지 아니하기로 한다.
직접명령어를 입력해 보면 알게 될 것이다.

mysql> select * from db; 명령의 경우는 mysql에 설치된 사용자 DB에 대한 정보를
프린트해 낼 것이다.
mysql> select * from user; 명령은 시스템의 명칭(localhost,호스트명)과
사용자(root)를 정의하고 있다.

mysql DB 내의 db,user테이블을 볼수 있는 유일한 존재는 root임을 의심하지 말자.
db,user 테이블의 내용을 알고 있다면 적어도 같은 호스트상의 어떤 유저라도
불법적으로 남의 데이터를 넘볼수 있다. 보는 차원에서 끝나면 다행이지만,
심히 훼손을 시키거나 아예 삭제할 수 도 있기 때문이다.
그래서 root는 전지전능해야 한다.
다음은 free라는 일반유저가 mysql DB를 범하려고 시도해본 결과이다.

% mysql -ufree -p패스워드 free

mysql> show databases;
+------------+
| Database |
+------------+
| artbe |
| bookdown |
| boxing |
| codicom |
| cybervoice |
| ehf |
| free |
| mornsun |
| mysql |
| reload |
| sharezone |
| superman |
| techstar |
| test |
| uahome |
+------------+
15 rows in set (0.00 sec)

mysql> desc mysql;
ERROR 1146: Table 'free.mysql' doesn't exist
물론 root라고 할지라도 desc명령을 데이터베이스에 내린다면,
똑같은 에러를 만난다. 단지 허용되지 않는 권한을 행사한 예를 보인셈이다.

방금전에 언급했듯이 아파트를 새로 지었다고 하자.
아파트이름이 mysql이고 관리자는 root이다. 그리고 이 아파트는 localhost내지
고유이름(host name)이라는 주소를 갖게 된다.
그래서 외부에서 이 아파트(mysql)에 오려면 root@localhost 이런식으로 접근하게 된
다.
free라는 일반사용자가 허가없이 접근하는 경우는
반드시 다음과 같은 경험을 당하게 된다.

% mysql mysql
ERROR 1045: Access denied for user: 'free@localhost' (Using password: NO)

위의 경우는 free라는 일반 사용자가 겁도 없이 mysql 관리자DB를 범하려고 했을때,
만나는 에러이다.
mysql -uroot -p마음대로 mysql
이런 식의 명령을 하면, mysql은 순수히 받아들이지 않을 것이다.
그러나 한가지 방법은 있다. 해킹(?) ...
그것은 관리자의 소홀로 mysql DB에 패스워드를 걸지 않았을 경우이다.
그러면 일반 유저도 다음과 같이 mysql에 접근할 수 있다.
% mysql -uroot mysql
정말 무서븐 일이다.
그러니 root된 자는 처음에 반드시 mysql DB에 패스워드를 걸어야 한다.

mysql> update user
-> set password = password('testpass')
-> where user = 'root';
Query OK, 2 row affected (0.00 sec)
위를 실행하면 일반적으로 user 테이블상에 root사용자가
localhost와 host명으로 2개 등록 되어 있으므로
2 row 의 비밀번호가 변경이 된다.
자 이제부터는 admin 유저인 root로 mysql에 접속할 경우 꼭 password를
입력해야 한다. 즉 아래와 같이 실행하여야 한다.
$ mysql -uroot mysql
Enter password:
암호를 물을때 암호를 입력하면 mysql을 사용할수 있다.

여기서 하나 짚고 넘어가자. 유닉스시스템에 로그인하는 것하고,
데이터베이스에 로그인하고 하는 것은 서로 분리된 영역이라는 것이다.
루트로 유닉스시스템에 로그인했다고 해서, mysql DB에 접근하는 패스워드를
잊어버렸다면 mysql에 로그인할수없다. 단지 mysql자체를 시스템에서 제거하든지
새로 인스톨하는 선택밖에는 없다.

이제까지 잘은 정리되진 않지만, root된 자의 도리를 대강 살펴보았다.
이젠 user된 자를 mysql이라는 공간으로 통과시켜줄 절차가 필요하다.
이 역시 root된 자만의 도리이다.
사실 이 자체가 DBA에 관한 내용이기에 user된 자의 도리는 자신의 처지를
잘 아는 일외에는 할일이 없다고 본다. 말하자면, 자기집안에서 살림만
잘 하면 된다는 이야기이다.


아파트를 분양해 보자... 아파트는 각각의 동과 호로 나누어 진다.
하나의 동이 있어서 여러사람을 수용해야 한다고 가정하자.
아파트에 입주하게 될(계정사용자) 사람들의 명단을 확보하고 그것에 대한 패스워드를 지정해야 한다. 여기서 패스워드는 시스템로그인 패스워드와는 달라야 할 것이다.(물론 같아서 안될법은 없지만, 보안은 그렇지 않다)

mysql> create database user1;
mysql> create database user2;
mysql> create database user3;


mysql> create database user1;
Query OK, 1 row affected (0.01 sec)
mysql> create database user2;
Query OK, 1 row affected (0.01 sec)
mysql> create database user3;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+-----------+
| Database |
+-----------+
| mysql |
| test |
| user1 |
| user2 |
| user3 |
+-----------+
5 rows in set (0.00 sec)


리눅스의 경우 디폴트로 설치한 경우 /usr/local/mysql/var/user1 이런 식으로 디렉토리가 생성되는것 같다. 이 디렉토리가 데이타 베이스 공간으로 이용될 곳이다.

즉 user1 라는 데이타 베이스 공간에 테이블을 생성할 경우 user1 라는 디렉토리로 관련된 파일이 생성되며 데이타가 저장된다. 퍼미션이 정해져 있어 안을 살펴보지는 못했다.
그러나 솔라리스의 경우는 좀 달랐다. data디렉토리가 var디렉토리 대신 쓰였다.

[superman:/usr/local/mysql]% cd data
[superman:/usr/local/mysql/data]% ls
./ mysql/ superman.err user1/ user3/
../ test/ superman.pid user2/
*******************************************************************
중요한 tip......
*******************************************************************
MySQL과 주고 받는 각종 내용은 /usr/local/mysql/var 상의 호스트명.log파일상에 모두 저장된다. 만일 동작 상태를 알고 싶다면 터미날을 하나 더 열어서 tail -f 호스트명.log 하여 MySQL과의 주고받는 내용을 모니터링 할 수 있다. ---- 박순행(soonhg)님의 강의록중에서
*******************************************************************

이러면 다 되는가? 아니다. 이제 각각의 호에 이름을 지었을 뿐 입주권은 주어지지 않았다.
권한있는 사용자가 이 집을 사용하도록 각각의 호에 열쇠와 사용규칙을 정해주어야 한다.
그렇지 않으면, 이 집은 아무도 접근할 수 없는 버려진 공간이 되고 만다.

user용 DB와 mysql 관리테이블과의 Link, 사용자등록 및 각각의 권한설정이 이루어져야 한다. 이것이 바로 실제적인 분양이 되는 셈이다.
자 이제 생성된 데이타베이스와 데이타베이스 관리및 엑세스 권한등을 정의하고 있는 mysql 상의 db, user 테이블에 방금 생성된 user1,user2,user3 Database 내용을 정의 하자.

mysql> insert into db
-> (host,db,user,select_priv,insert_priv,update_priv
-> ,delete_priv,create_priv,drop_priv,grant_priv,
-> references_priv,index_priv,alter_priv)
-> values ('%','user1','daepal',
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
-> ;
Query OK, 1 row affected (0.01 sec)

위의 내용은 눈감도 착착 만들어낸 것은 아니다.
mysql> desc db; 라는 명령어를 사용하게 되면, db테이블의 구조가 있으니 그것을 참조해야 한다. insert 시에 철자가 틀려서도 안되며, 필드숫자에 맞도록 값을 정확히 기재해야 한다.
위의 sql문에서 보면 daepal 이라는 사용자는 user1 데이타베이스에 대하여 select,insert,update,delete,create,drop,grant,references,index,alter
권한이 모두 주어졌다.
이것은 하나의 user1 데이타 베이스에 대하여 각 sql 명령에 대한 권한을 개별적으로 줄수 있다는 것을 의미한다.

자 이제 user1 이라는 db 사용자에 대한 등록을 할 차례이다.
다음과 같은 sql 문을 만들어 실행한다.
다음은 user테이블에 사용자에 대한 정보를 기술해 주어야 한다.
다음처럼 user테이블의 구조를 무시하고 제멋대로 passwd라고 기술하면 에러에 봉착한다.
에러를 만나기 원하지 않으면, 반드시 desc user; 명령으로 테이블의 구조를 보면서 하나하나 값을 메워가면 될 것이다.

mysql> insert into user
-> (host,user,passwd)
-> values ('localhost','user1',passwd('daepal'))
-> ;
ERROR 1064: You have an error in your SQL syntax near '('daepal'))
;' at line 3

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


mysql> desc user;
+-----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+-------+
| Host | char(60) | | PRI | | |
| User | char(16) | | PRI | | |
| password | char(16) | | | | |
| 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 | |
| Reload_priv | enum('N','Y') | | | N | |
| Shutdown_priv | enum('N','Y') | | | N | |
| Process_priv | enum('N','Y') | | | N | |
| File_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+-----------------+---------------+------+-----+---------+-------+
17 rows in set (0.00 sec)

생략한 항목(필드)와 값은 위에서 보듯이 기본값이 'N'임을 상기해야 한다.

host,user,password외의 칼럼들은 모두 디폴트로 'N' 으로 설정
되어 있으므로 위와 같이 하면된다. 여기서 db 테이블과 user 테이블은 특권상에서 약간의 차이점이 있다. db 테이블 상에서 설정되지 않고 user 테이블 상에만 설정되어진 DB 사용자는 user 테이블 상에서 설정된 권한을 존재하는 모든 데이타베이스에 대하여 인정받는다.

이러한 이유로 일반사용자인 경우는 user 테이블 상에는 모든 권한을 'N' 로 설정하여야 하고 각 DB user 가 사용할 데이타베이스에 대한 권한을 DB 테이블에 다시 정해주는 것이다.
즉, 데이타베이스가 여러개 존재한다고 가정하자. aaa,bbb, ccc 라는 세개의 데이타베이스가 존재할때, daepal이라는 사용자는 aaa 라는 데이타베이스만 이용하게 하려고 설정하려고 한다고 하자.

이경우는 user 테이블에는 모든 권한을 'N' 상태로 설정하고 db 테이블에는 aaa 라는 데이터베이스에 대하여 모든 권한을 'Y' 라고 설정하면 daepal이라는 사용자는 aaa 라는 데이타베이스에 대하여 사용권한을 확보하게 될 것이다.

*******************************************************************
중요한 tip......
*******************************************************************
user 테이블에 사용자를 insert, update 한 경우 MySQL을 꼭 재기동시켜 주어야만 한다. 명령은 다음과 같다.
myaqladmin -u root -p reload
이 명령은 user 테이블에서 사용자 정보를 다시 읽어서 MySQL 을 다시 실행시켜준다. ---- 박순행(soonhg)님의 강의록중에서
*******************************************************************
[superman:/usr/local/mysql/data]% mysql -udaepal -pdaepal user1
ERROR 1045: Access denied for user: 'daepal@localhost' (Using password: YES)

[superman:/usr/local/mysql/data]% mysqladmin -uroot reload
[superman:/usr/local/mysql/data]% mysql -udaepal -pdaepal user1
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 58 to server version: 3.22.24

Type 'help' for help.

mysql> show tables;
Empty set (0.01 sec)

mysql>


;
;
;
;
;
;
;
자 이로써 root된 자의 도리는 어느정도 마무리가 되었다.
아파트도 분양이 되었고, 열쇠도 주어서 언제든지 입주할 수 있도록 모든 준비를 끝냈다.
이제 사용자에게 데이터베이스의 이름과 로그인명 그리고 비밀번호를 전해주면, root된 자의 훌륭한 임무를 완수하게 되는 것이다. root만세...

자 이제는 user된 자의 도리를 다해, root님께서 분양주신 집을 잘 관리해 보자..
DB를 얻게 되면 그안에 테이블이라 불리우는 녀석을 만들수가 있다.
실제로 우리가 DB에 쿼리(질의)를 날리다고 말을 하는데, 바로 이녀석(테이블)이 바로 그 대상인 셈이다. 그러니까, DB의 무결성과 완벽성은 바로 얼마나 테이블을 잘 만들고 관리하느냐에 따라 사정이 확연히 달라진다. 테이블이 혼자 놀수도 있지만, 아주 비싼 컴포넌트 오디오처럼 여러가지 연결선을 통해 하나로 동작하는 경우도 있다.
테이블간의 관계(조인)로 이루어진 DB는 매우 복잡한 일에 쓰이게 된다.
관계형데이터베이스라 불리우는 이유는 바로 여기에 있다. 자료구조들이 서로 관계를 맺고 있으면서 상호작용을 하기 때문이다. 데이터베이스 디자인이 중요한 문제로 떠오르는 것은 이러한 관계가 처음에 잘못 설정이 되면, 애플리케이션 전체를 처음부터 다시 프로그래밍을 해야하는 어처구니 없는 사태에 다다르게 되기 때문이다. 이것은 나도 두어번 경험을 해서 매우 중요시하고 조심스러워 하는 부분이다.
하지만 여기선는 user된자의 기본도리인 테이블하나만 만들어 보는 것으로 만족한다.

그 이상은 자신도 없거니와 독립적인 범주로 다루어야 할 주제라 생각되기 때문이다.


% mysql -udaepal -pdaepal user1

Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 58 to server version: 3.22.24

Type 'help' for help.

mysql> show tables;
Empty set (0.01 sec)

mysql>


아무것도 없는 껍데기에 이제 user된 자의 도리를 다해
실내장식에 게으름을 피워선 안된다. 이제 이사를 와서 보았더니 벽에 벽지도 붙어있지 않는 집을 상상해 보자... Empty set ... 바로 이런 격이다.
이제 테이블을 하나둘 들여놓아야 한다. 그래야 잠도 자고 살림도 하고 그럴테니까..
..

mysql> create table individual
-> (
-> pno char(13) primary key,
-> name char(20) not null,
-> addr char(80),
-> tel char(15)
-> )
-> ;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+-----------------+
| Tables in user1 |
+-----------------+
| individual |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from individual;
Empty set (0.01 sec)

테이블만 만들면 되는가?
당연히 테이블의 내용물을 채워야 한다.
참고로 primary key(주키)라는 것은 하나의 테이블이 자신의 주체성을 확보하기 위해 -데이터의 무결성이라고 한다- 반드시 있어야 한다..
이것의 존재이유는 여러가지가 있지만, 다른 테이블과 자신을 구별하기 위해 쓰인다고 보면 된다. 나를 세계의 유일한 존재로 알리는 것은 이름인가? Never!!! 라고들 이야기 한다.
그대신 우린 740551-1666418 이라는 주민번호를 쓴다. 물론 이것도 세계의 유일한 존재보다는 대한민국의 유일한 존재라고 보는게 낫겠다. 주민번호를 독일에 가서 쓸 생각이 아니라면.....^^;
그리고 색인기능(index)을 가지고 있는 필드(항목)쯤으로 기억해두면 편할 것이다.
데이터검색 효율을 높이기 위해 인덱싱을 한다고 한다.
도서관에 가서 책을 가장 빨리 찾는 방법은 ?
유일하지는 않지만, 대강 방법이 있다. 바로 그것이 인덱싱이다.

mysql> insert into individual
-> values ('740551-1666418','정유리','전남 완도군 소안면','123-1234')
-> ;
Query OK, 1 row affected (0.00 sec)

mysql> select * from individual;
+---------------+--------+--------------------+----------+
| pno | name | addr | tel |
+---------------+--------+--------------------+----------+
| 740551-166641 | 정유리 | 전남 완도군 소안면 | 123-1234 |
+---------------+--------+--------------------+----------+
1 row in set (0.00 sec)
;
;
;
여기까지 4시간에 걸쳐 조금은 지루한 감이 있었지만, 아주 보람되게 실습을 해 보았습니다.
물론 이 실습은 나를 위한 것의 성격이 강했으며, 다른 사람도 읽어준다면 기쁨이 두배로 증가될 것 같습니다. 이글은 전반적으로 보아 하이텔리눅스 동회회의 박순행(soonhg) 님의 글을 제가 약간의 살을 붙여 작성한 것으로 자작물이 아님을 밝혀둡니다.
오늘 이글은 하이텔리눅스동호회 회원들에게 바치고 싶습니다. 
728x90

댓글