MySQL : Project(MySQL 연동) 3 – 기초

1. MySQL 시작하기

MySQL 구동 하기.

$ /etc/init.d/mysql start

 

MySQL 접속하기

$ mysql -uroot -p1234567890

-u 다음에는 접속하고자 하는 ID, -p 다음에는 접속하고자 하는 계정의 패스워드를 입력한다.

 

MySQL에서 데이터 베이스 생성하기

mysql> create database test;

생성한 데이터 베이스 확인하기

mysql> show databases;

 

MySQL에서 데이터 베이스 선택하기

mysql> use test;

use 다음에 사용하고자 하는 데이터 베이스를 입력한다.

 

선택한 데이터베이스에서 테이블 만들기

mysql> CREATE TABLE student (
-> name varchar(10),
-> korean int,
-> math int,
-> english int
-> );

student 라는 이름의 테이블을 생성하는 쿼리이다.  테이블 생성 후, Data Directory 를 확인하면, 데이터 베이스 디렉토리 속에 student라는 이름을 가진 파일들이 생성된 것을 확인할 수 있다.

root@jonathan-laptop:/var/lib/mysql/test# pwd
/var/lib/mysql/test
root@jonathan-laptop:/var/lib/mysql/test# ls -slh|grep student
rw-rw—- 1 mysql mysql    0 2011-06-30 10:59 student.MYD
rw-rw—- 1 mysql mysql 1.0K 2011-06-30 10:59 student.MYI
rw-rw—- 1 mysql mysql 8.5K 2011-06-30 10:59 student.frm

 

생성한 테이블 확인하기

mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| address        |
| student        |
| test           |
+—————-+

 

테이블 정보 확인하기

mysql> explain student;
+———+————-+——+—–+———+——-+
| Field   | Type        | Null | Key | Default | Extra |
+———+————-+——+—–+———+——-+
| name    | varchar(10) | YES  |     | NULL    |       |
| korean  | int(11)     | YES  |     | NULL    |       |
| math    | int(11)     | YES  |     | NULL    |       |
| english | int(11)     | YES  |     | NULL    |       |
+———+————-+——+—–+———+——-+
4 rows in set (0.00 sec)

 

2. 사용자 설정

 

2-1. 사용자 암호 바꾸기

MySQL에서 사용자의 암호를 변경하는 방법은 세가지가 있다.

– UPDATE 문을 이용
– SET PASSWORD 이용
– mysqladmin 이용

2-1-1 UPDATE 문 이용하기

jonathan@jonathan-laptop:/var/lib$ mysql -uroot -p mysql

mysql> update user set password=password(‘1234’) where user = ‘root’;
Query OK, 3 rows affected (0.09 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

-p 다음에 mysql은 mysql이란 데이터 베이스를 사용하라는 것을 의미한다. mysql 프롬프트에서 use db_name을 이용하여 사용하고자 하는 데이터베이스를 변경할 수도 있다. UPDATE 문을 이용하여 암호를 변경할 경우에는 꼭 flush privileges; 를 실행해야 한다.

이유는 MySQL은 속도를 조금이나마 빠르게 하기 위해 mysql 데이터베이스에 있는 사용자 권한에 관련딘 내용을 처음 MySQL 시작시에 메모리로 읽어 들이는데(메모리가 하드 디스크에 비해서 속도가 빠르므로 이렇게 해서 사용자 인증 부분에 속도를 향상시킬 수 있는 것이다), UPDATE문을 사용하여 암호가 바뀌었을 때는 flush privileges; 를 이용하여 사용자 관련 테이블에 변경된 내용이 있으니 다시 읽으라고 서버에 알려야 한다.

2-1-2 SET PASSWORD 이용하기

mysql> SET PASSWORD for root=password(‘1234’);

이 방법은 flush privileges; 를 할 필요가 없음. 그러나 MySQL 5.1 버전에서는 제대로 되지 않는것을 확인했음.

2-1-3 mysqladmin 이용하기

$ mysqladmin -u root password  new-password

 

2-2 새로운 사용자 등록하기

MySQL에서 새로운 사용자를 추가하는 방법은 GRANT를 이용하는 방법과 직접 mysql의 user 테이블에 INSERT 하는 방법 두가지가 있다.

2-2-1 GRANT문 이용

mysql> grant all privileges on *.* to pchero@localhost identified by ‘1234’ with grant option;
Query OK, 0 rows affected (0.04 sec)

localhost의 pchero에게 (to pchero@localhost) 1234라는 암호로(identified by ‘1234’) MySQL의 모든 데이터베이스에 있는 모든 테이블에(on *.*) 모든 권한 (all privileges)을 부여하는 것을 의미한다.

위의 쿼리문은 모든 데이터베이스를 사용할 수 있도록 하는 쿼리인데, 이를 특정 데이터베이스에 한정하기 위해서는 다음의 쿼리문을 사용하도록 한다.

mysql> grant all privileges on test.* to pchero@localhost identified by ‘1234’;

위의 쿼리문은 localhost의 pchero에게 test 데이터베이스의 모든 테이블에 모든 권한을 부여하는 것을 나타낸다. 특정 데이터베이스에 특정 권한만을 부여하기 위해서는 다음의 쿼리문을 수행한다.

mysql> grant select, insert on test.* to pchero@localhost identified by ‘1234’;

이 외에도 특정 테이블이나 특정 컬럼에만 권한을 주는 방법도 있다.

2-2-2 INSERT문 이용하기

insert into user values(‘localhost’, ‘pchero’, password(‘1234’), ‘N’, ‘N’, ‘N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’,’N’);

 

 

 

MySQL : Project(MySQL 연동) 2 – 환경 구성

 

1.  MySQL 설치

작업의 대부분은 Ubuntu – 10.04 버전에서 진행하였다.

Ubuntu Linux의 경우 MySQL 은 기본적으로 설치가 되어있으나, 다른 Linux 배포판의 경우, 설치가 안되어 있거나 따로 설치를 해야할 경우가 있다.

이럴 경우, 대부분의 최신의 배포판들은 다음의 명령어를 사용하여 간단하게 설치를 진행할 수 있다.

apt-get 을 이용할 경우

# apt-get install mysql

yum 을 이용할 경우

# yum install mysql

이번 프로젝트에서 사용한 MySQL의 버전은 5.1.41 버전이다.

MySQL 버전 확인하기

# mysql –version

 

2. MySQL Options

ubuntu 환경에서 apt-get 으로 MySQL을 설치 했을 경우, 기본적으로 설정되는 database directory는 다음과 같다.

/var/lib/mysql

만약 위의 디렉토리에 존재하지 않는다면, /etc/mysql/my.cnf 파일을 통해서 database directory 의 위치를 확인할 수 있다.

아래는 필자의 my.cnf 파일의 내용이다.

#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# – “/etc/mysql/my.cnf” to set global options,
# – “~/.my.cnf” to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain “#” chars…
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port        = 3306
socket        = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket        = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
#
# * Basic Settings
#

#
# * IMPORTANT
#   If you make changes to these settings and your system uses apparmor, you may
#   also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#

user        = mysql
socket        = /var/run/mysqld/mysqld.sock
port        = 3306
basedir        = /usr
datadir        = /var/lib/mysql
tmpdir        = /tmp
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 127.0.0.1
#
# * Fine Tuning
#
key_buffer        = 16M
max_allowed_packet    = 16M
thread_stack        = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit    = 1M
query_cache_size        = 16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1

log_error                = /var/log/mysql/error.log

# Here you can see queries with especially long duration
#log_slow_queries    = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id        = 1
#log_bin            = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size         = 100M
#binlog_do_db        = include_database_name
#binlog_ignore_db    = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI “tinyca”.
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

[mysql]
#no-auto-rehash    # faster start of mysql but no tab completition

[isamchk]
key_buffer        = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with ‘.cnf’, otherwise they’ll be ignored.
#
!includedir /etc/mysql/conf.d/

각각의 옵션들의 정확한 의미와 사용법을 알고 싶다면 아래의 링크를 참조한다.

http://dev.mysql.com/doc/refman/5.1/en/program-options.html

OS 커널의 구조와 원리 : 3. Protected Mode로 변환

멀티태스킹 기능으로 여러 프로세스를 동시에 동작시키는 것, 메모리 페이징 시스템을 구현하여 적은 양의 메모리를 효율적으로 관리하는 것 등은 모두 Protected Mode에서 이루어진다. PC에 전원이 들어간 후 CPU의 초기 모드인 Real Mode와는 달리 Protected Mode로는 작성된 프로그램을 통해서 몇몇의 설정을 행한 뒤에 들어가야 한다.

16비트 Real Mode

Real Mode는 PC가 부팅할 때 맨 처음 동작하는 CPU 모드이다. 이 모드는 16비트로 동작하기 때문에 모든 레지스터를 16비트의 형태로 사용한다.

AX, BX, CX, DX 등과 같은 레지스터들은 모두 16비트의 한 개의 WORD로 되어 있고, 최대 저장할 수 있는 수는 64K(10진수 65535, 16진수 0xFFFF)뿐이다.

그리고, 인텔 X86 계열의 CPU에서는 프로그래머가 RAM 상의 어떤 주소에 접근하고 싶을 때 레지스터에 그 수를 바로 넣어 사용할 수 없고, 반드시 세그먼트:오프셋 방식으로 두 개의 레지스터를 사용하여 주소에 접근한다.

16비트 Real Mode에서도 당연히 세그먼트 레지스터, 오프셋 레지스터 모두 16비트 값밖에는 취할 수 없다.

 

Protected Mode

Protected Mode에서 주소 지정을 하기  위해서는 Real Mode ~ Protected Mode 전환 전에 미리 하나의 테이블(GDT : Global Descriptor Table)을 준비해야 한다. 이 테이블은 어떤 형식이 있는 데이터의 나열이고, RAM 영역 중 어디든지 기입해 놓을 수 있다.

이 테이블에는 각 세그먼트 영역에 대해 이것들을 어떻게 사용할 것이지에 대해 설명해 놓는다. 이것은 “커널이 이제부터 메모리를 어떻게 사용하겠다”라고 하는 설계서와 흡사한 것이다.

테이블을 구성하는 각각의 요소들에는 하나의 세그먼트를 표현하기 위해서 Base Address, Limit, 속성의 정보를 넣어둔다. 하나의 요소를 지칭하여 디스크립터(Descriptor)라고  부르고, 여러 개의 디스크립터를 모아두었다고 하여 GDT-디스크립터 테이블이라고 하는 것이다.

Base Address란 Real Mode에서 CS 레지스터에 세그먼트가 시작 주소를 넣어두는 것과 같은 것이며, 이 세그먼트의 시작을 나타낸다. CPU는 프로그래머의 명령에 따라서 테이블에서 Base Address를 찾아내서 CS, DS 등의 레지스터에 넣어둔다.

 

Protected Mode 의 장점

1. Limit 값을 최대 0xFFFFFFFF까지 지정할 수 있으므로 Base Address를 0으로 지정한다면 최대 4GB의 영역을 오프셋을 가지고 마음대로 지정할 수 있다.
Real Mode에서는 오프셋을 16비트로 0x0000 ~ 0xFFFF까지밖에 지정할 수 없었다는 것을 생각하면 오프셋으로 매우 자유롭게 프로그램을 이동시키거나 데이터를 읽어올 수 있다는 편리함이 있다는 것을 알 수 있다.

2. 위에서 오프셋을 마음대로 지정할 수 있다는 설명을 했으나, 때에 따라서는 DPL 값을 조작하여 커널 시스템 영역으로 유저 영역의 어플리케이션 프로그램이 접근하지 못하도록 하거나, 코드/데이터 세그먼트를 분리시켜 코드를 데이터로서 읽거나 쓰지 못하도록 막아놓을 수도 있다.

3. Protected Mode의 GDT의 각 디스크립터에는 각 세그먼트의 시작 주소를 물리 주소롤 지정할 수 있다. GDT에는 상당히 많은 세그먼트를 지정할 수 있고, 시작 주소를 루리 주소 값으로 직접 넣기 때문에 1Byte 단위로 지정할 수 있다.

 

GDT

디스크립터의 모습

 

 

 

OS 커널의 구조와 원리 : 2. 커널을 로드한다.

PC에 전원이 들어오고 POST 과정이 끝난 후에는 OS 커널을 로드하는 과정이 실행된다. 커널의 로드는 모든 OS에서 비슷한 과정을 수행한다. 디스크의 MBR 이라는 좁은 곳에 커널 전체를 넣을 수는 없다. 따라서 모든 OS에서는 MBR에 있는 프로그램으로 하여금 디스크의 뒷부분을 RAM으로 더 읽어들이게 한 후 그 읽어들인 곳을 부터 프로그램을 점프시키는 방법을 사용한다.