MySQL/Startup Guide/ko

From Gentoo Wiki
< MySQL
Jump to: navigation, search
This page is a translated version of the page MySQL/Startup Guide and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎Türkçe • ‎français • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

이 문서는 MySQL 설치 및 사용을 돕는 문서입니다.

MySQL 시작하기

배경

MySQL은 다양한 프로그램에 사용하는 유명한 데이터베이스 서버입니다. SQL은 (S)tructured (Q)uery (L)anguage(구조 질의 언어)를 의미하며, MySQL이 다른 프로그램과 의사소통할 때 사용하는 언어입니다. 무엇보다도 MySQL은 자체 확장 SQL 함수가 있어 사용자에게 추가 기능을 제공합니다. 이 문서에서는 초기 MySQL 설치, 데이터베이스 및 테이블 설정, 새 사용자 추가 방법을 살펴보겠습니다. 설치 단계부터 시작해보겠습니다.

MySQL 설치

우선 MySQL을 시스템에 설치했는지부터 확인하십시오. MySQL의 개별 기능이 필요한 경우 설치 과정에서 세부 설정을 가능하도록 돕는데 필요한 USE 플래그를 활성화했는지 확인하십시오.

root #emerge --ask mysql

설치가 끄나면 다음 안내 메시지가 뜹니다:

코드 MySQL einfo 메시지
You might want to run:
"emerge --config =dev-db/mysql-[version]"
if this is a new install.

이 문서에서 새로 설치했으니 명령을 실행하겠습니다. MySQL 데이터베이스를 설정하는 동안 프롬프트가 뜨면 Enter 키를 누르시면 됩니다. 설정 단계에서는 관리하는데 필요한 데이터베이스, 테이블, 사용자 등의 정보가 들어있는 MySQL 주 데이터베이스를 설정합니다. 설정 단계에서는 가능한한 빨리 루트 암호를 바꾸는 것이 좋습니다. 이 부분을 분명하게 짚고 넘어가겠으며, 과정을 거치지 않으면 누군가가 기회를 잡고 들어와서 MySQL 서버의 기본 설정을 건드립니다.

root #emerge --config =dev-db/mysql-[version]
 * MySQL DATADIR is /var/lib/mysql
 * Press ENTER to create the mysql database and set proper
 * permissions on it, or Control-C to abort now...
 
   Preparing db table
   Preparing host table
   Preparing user table
   Preparing func table
   Preparing tables_priv table
   Preparing columns_priv table
   Installing all prepared tables
 
   To start mysqld at boot time you have to copy support-files/mysql.server
   to the right place for your system
 
   PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
   To do so, issue the following commands to start the server
   and change the applicable passwords:
 
   /etc/init.d/mysql start
   /usr/bin/mysqladmin -u root -h pegasos password 'new-password'
   /usr/bin/mysqladmin -u root password 'new-password'
   Depending on your configuration, a -p option may be needed
   in the last command. See the manual for more details.
참고
호스트 이름 설정을 localhost로 설정하여 이전 명령이 멈췄다면 gentoo 같은 다른 이름으로 호스트를 설정하십시오. /etc/conf.d/hostname 파일을 업데이트하시고 /etc/init.d/hostname를 재시작하십시오.

MySQL의 비 이빌드 관련 정보를 지워 이 문서의 내용과 최대한 일관성을 유지하십시오.

중요
mysql-4.0.24-r2의 설정 단계에서는 루트 암호 항목을 더 안전하게 입력합니다.

실행하여 암호를 설정할 스크립트 명령이 나타났으니 이 명령을 실행해보겠습니다.

OpenRC를 사용한다면 이 명령을 실행하십시오:

root #/etc/init.d/mysql start
 * Re-caching dependency info (mtimes differ)...
 * Starting mysqld (/etc/mysql/my.cnf) ...        [ ok ]

systemd를 사용한다면 다음 명령을 대신 실행하십시오:

root #systemctl restart mysqld.service

With >=dev-db/mariadb-10.1.18, use:

root #systemctl restart mariadb.service

다음 루트 암호를 설정하십시오:

root #/usr/bin/mysqladmin -u root -h localhost password 'new-password'

입력한 루트 암호를 제대로 설정했는지 MySQL 서버에 로그인하여 확인할 수 있습니다:

user $mysql -u root -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.25
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

-u 스위치는 로그인할 사용자를 설정합니다. -h 스위치는 호스트를 설정합니다. 보통 원격 서버를 설정하기 전까지는 localhost가 됩니다. 마지막으로 -p는 mysql 클라이언트에게 데이터베이스를 접근할 암호를 입력하겠다고 알립니다. 명령을 실행하면mysql> 프롬프트를 봅니다. 여기가 바로 명령을 입력할 부분이빈다. 이제 루트 사용자 권한으로 mysql 프롬프트로 들어왔으니 데이터베이스 설정을 시작할 수 있습니다.

중요
기본 mysql 설치 요건은 개발 시스템을 의도했습니다. 더 안전한 기본 환경을 설정하려면 /usr/bin/mysql_secure_installation을 실행하십시오

데이터베이스 설정

데이터베이스 만들기

로그인하여 mysql 프롬프트를 띄웠습니다. 우선 우리가 설정한 데이터베이스를 살펴보겠습니다. 데이터베이스를 살펴보기 위해 SHOW DATABASES 명령을 사용하겠습니다.

mysql>SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.09 sec)
중요
MySQL 명령은 세미콜론 -- ; 으로 끝나야 함을 기억하십시오.

이미 시험용 데이터베이스를 만들었으에도 불구, 그래도 자체 데이터베이스를 만들겠습니다. CREATE DATABASE 명령을 사용하여 데이터베이스를 만듭니다. gentoo라는 데이터베이스를 만들겠습니다.

mysql>CREATE DATABASE gentoo;
Query OK, 1 row affected (0.08 sec)

응답을 통해 어떤 오류 없이 명령을 실행했음을 알 수 있습니다. 이 경우 1열을 수정했습니다. 이 결과는 전체 데이터베이스 목록을 보유하고 있는 mysql 주 데이터베이스의 참고 사항입니다. 뒤에서 무슨 일이 일어나고 있는지는 그다지 신경쓰지 않아도 됩니다. 마지막 숫자는 요청을 얼마나 빨리 처리했는지 보여줍니다. SHOW DATABASES 명령을 다시 사용하면 우리가 만든 데이터베이스를 확인해볼 수 있습니다.

mysql>SHOW DATABASES;
+----------+
| Database |
+----------+
| gentoo   |
| mysql    |
| test     |
+----------+
3 rows in set (0.00 sec)

데이터베이스를 분명하게 만들었습니다. 이 데이터베이스에 테이블을 만들려면 방금 만든 데이터베이스를 현재 데이터베이스로 선택해야합니다. 따라서 USE 명령을 사용하겠습니다. USE 명령은 해당 이름을 지닌 데이터베이스를 현재 데이터베이스로 사용하겠다는 의미입니다. 다른 선택지가 있다면 실제 명령줄에 -D스위치를 쓰는것입니다. 이제 gentoo 데이터베이스로 전환해보겠습니다.

mysql>USE gentoo;
Database changed

그리고 현재 데이터베이스는 앞서 만들었던 gentoo 데이터베이스가 되었습니다. 이제 이 데이터베이스를 활용하여 테이블을 만들고 정보를 넣어보겠습니다.

MySQL 테이블 작업하기

테이블 만들기

MySQL 구조상, 데이터베이스, 테이블, 레코드, 필드가 있습니다. 데이터베이스는 테이블을 관리하고, 테이블은 레코드를, 레코드는 필드를 관리하며, 필드에는 정보가 들어있습니다. 이 구조는 사용자로 하여금 정보에 접근하는 방식을 선택할 수 있게 해줍니다. 지금까지는 데이터베이스를 다루었으며, 이제는 테이블을 다루겠습니다. 우선, 테이블은 데이터베이스와 유사하게 SHOW TABLES 명령으로 확인할 수 있습니다. 지금은 명령을 실행하여 나타난 결과와 같이 gentoo 데이터베이스에 테이블이 없습니다:

mysql>SHOW TABLES;
Empty set (0.00 sec)

이는 테이블을 만들어야 함을 의미합니다. 테이블을 만들기 위해 CREATE TABLE 명령을 사용하겠습니다. 허나 이 명령은 단순한 CREATE DATABASE 명령과는 조금 다릅니다. 이 명령은 인자 목록을 취합니다. 형식은 다음과 같습니다:

코드 CREATE TABLE 문법
CREATE TABLE [table_name] ([field_name] [field_data_type]([size]));

table_name은 우리가 만들고자 하는 테이블 이름입니다. 이 경우 developers 테이블을 만들겠습니다. 이 테이블에는 개발자 이름, 전자메일 주소, 직급이 들어갑니다.

field_name은 필드 이름이 들어갑니다. 여기서 우리는 name, email, job을 넣겠습니다.

field_data_type은 어떤 형식의 정보를 넣을지를 말합니다. 각각의 다른 형식은 MySQL 컬럼 형식 페이지en에서 찾아보실 수 있습니다. 모든 필드에 대해 VARCHAR 데이터 형식을 사용하겠습니다. VARCHAR는 문자열을 다룰 때 사용하는 간단한 데이터 형식 중 하나입니다.

size는 데이터 단일 필드 갯수를 얼마나할 지 정합니다. 이 경우 128 값을 사용하겠습니다. 하나의 데이터 필드에서 사용하는 VARCHAR 데이터 형식의 크기가 128 바이트라는 의미입니다. 위 사이트에 여러분께 기술적으로 증명할 건덕지가 있지만, 시간이 아무리 흐르고 흘러도 128개의 문자 정도면 안전하다 생각하셔도 됩니다. 이제 테이블을 어떻게 만드는지 알아볼 시간입니다. 계속 진행해보습니다.

mysql>CREATE TABLE developers ( name VARCHAR(128), email VARCHAR(128), job VARCHAR(128));
Query OK, 0 rows affected (0.11 sec)

테이블을 잘 만든 것 같습니다. SHOW TABLES 명령으로 확인해보겠습니다:

mysql>SHOW TABLES;
+------------------+
| Tables_in_gentoo |
+------------------+
| developers       |
+------------------+
1 row in set (0.00 sec)

테이블이 있군요. 그런데 설정한 필드 형식에 맞춘 어떤 정보도 없는 것 같습니다. DESCRIBE 명령 (또는 줄여서 DESC) 명령을 사용하여 어떤 테이블 이름과 인자를 가지고 있는지 살펴보겠습니다. developers 테이블이 어떻게 생겼는지 살펴보도록 하겠습니다.

mysql>DESCRIBE developers;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(128) | YES  |     | NULL    |       |
| email | varchar(128) | YES  |     | NULL    |       |
| job   | varchar(128) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

화면에서는 각자 다른 필드와 형식을 보여줍니다. 또한 일부 추가 속성을 보여주는데, 이 내용은 설명서의 설명 범위를 벗어납니다. 그 밖의 내용은 알아서 MySQL 참조 설명서en를 보세요. :P 이제 건드려볼 테이블이 만들어졌습니다. 여기에 데이터를 넣어보겠습니다.

MySQL 데이터베이스 데이터 배치

INSERT 명령으로 테이블의 내용을 늘리(거나 데이터 추가)도록 해보겠습니다. CREATE TABLE 명령과 같이, 개별적인 형식이 있습니다:

코드 INSERT 문법
INSERT INTO table (col1, col2, ...) VALUES('value1', 'value2', ...);

이 명령은 테이블에 레코드를 넣을때 사용합니다. 테이블에는 우리가 정보를 넣고자 하는 레코드가 들어갑니다. 테이블 이름 다음에는 컬럼 이름 목록이 들어가며 VALUES() 에는 테이블에 넣고자 하는 값이 들어갑니다. 각 필드에 정의한 컬럼 순서를 맞춰 값을 넣는다면 컬럼 목록 이름을 생략해도 됩니다. 이 경우 developers 테이블에 데이터를 넣어 보겠습니다. 예제 레코드를 삽입하도록 하죠:

mysql>INSERT INTO developers VALUES('Joe Smith', 'joesmith@gentoo.org', 'toolchain');
Query OK, 1 row affected (0.06 sec)
## (If you don't know the order of the columns in the table or want to insert an incomplete record)
mysql> INSERT INTO developers (job, name) VALUES('outsourced', 'Jane Doe');
Query OK, 1 row affected (0.01 sec)

반환 결과에 따르면 레코드를 올바르게 넣었음을 나타냈습니다. 단지 하나의 레코드가 아니라 더 많은 정보를 넣고 싶다면요? LOAD DATA 명령이 이런 경우 역할을 대신합니다. 이 명령은 탭으로 구분한 텍스트 파일을 줄 하나당 레코드 단위로 불러옵니다. 홈 디렉터리에 파일 하나를 편집하여 몇가지 레코드를 넣어보겠습니다. 이 파일 이름은 records.txt라고 하겠습니다. 예제는 다음과 같습니다:

코드 ~/records.txt
John Doe	johndoe@gentoo.org	portage
Chris White	chriswhite@gentoo.org	documentation
Sam Smith	samsmith@gentoo.org	amd64
중요
넣고자 하는 데이터를 확인하십시오. 파일에 어떤 데이터가 있는지 모를 경우 LOAD DATA 명령을 사용하는 방법은 매우 안전하지 않습니다!

LOAD DATA 명령에 긴~ 정의가 있습니다만 여기서는 간단한 방식을 활용하겠습니다.

코드 LOAD DATA 문법
LOAD DATA LOCAL INFILE '/path/to/filename' INTO TABLE table;

/path/to/filename은 디렉터리이며 filename은 불러오고자 하는 파일의 이름입니다. 테이블은 테이블의 이름입니다. 이 경우, 우리가 사용하고자 하는 파일은 ~/records.txt 이며 테이블 이름은 developers 입니다.

mysql>LOAD DATA LOCAL INFILE '~/records.txt' INTO TABLE developers;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
중요
이상한 동작을 봤다면 필드를 탭으로 구분했는지 확인하십시오. 입력 파일의 내용을 다른 파일로부터 복사해서 붙여넣었을 경우 탭 대신 공백 문자가 들어있을 수도 있습니다.

잘 동작합니다. 그러나 단순히 레코드를 넣을 뿐이고 MySQL에 어떤 관리도 진행하지 않았습니다. 대부분의 웹 프로그램에서는 MySQL을 빠르고 간편하게 설정하기 위해 SQL 스크립트를 활용합니다. SQL 스크립트를 활용한다면 mysql을 배치모드로 활용하거나 파일을 원본으로 지정해야합니다. mysql을 배치모드에서 실행하는 예시를 보여드리겠습니다:

user $mysql -u root -h localhost -p < sqlfile

LOAD DATA와 같이 sqlfile 파일에 대해 할 일을 지시할 수 있습니다. Failure to do so may cause your database to be compromised! 메시지가 나타났다면 source 명령을 사용하여 처리할 수 있습니다. 이 명령은 mysql 대화식 모드에서 sql 파일의 mysql 명령을 실행합니다. sql 파일을 실행 원본으로 지정하는 방법은 다음과 같습니다:

mysql>source sqlfile;

웹 프로그램에서 sql 파일 실행을 기다리는 장면을 본다면 위의 두가지 명령으로 작업을 처리할 수 있습니다. 이제 테이블 설정이 끝났는데 필드는 어떻게 확인해볼까요? 요청문을 통해 테이블을 검색하여 필드를 확인해보겠습니다.

쿼리로 MySQL 테이블 탐색하기

요청 처리는 SQL 데이터베이스의 주 기능 중 하나입니다. 요청문을 통해 테이블 안에 있는 데이터를 어떤 용도로 되돌려줍니다. 대부분 사용하는 요청문은 SELECT 명령입니다. SELECT 명령은 조금 복잡하며, 이 문서에서는 명령의 기본 형식만 보여줍니다.

코드 SELECT 양식
## (Select all entries in a table)
SELECT * FROM table;
## (Select specific entries in a table)
SELECT * FROM table WHERE field=value;
## (Select specific fields)
SELECT field1,field2,field3 FROM table [WHERE field=value];

첫번째 양식을 살펴보겠습니다. 상당히 쉬우면서도 테이블 전체를 쓱 살펴볼 수 있습니다. 바로 실행해서 테이블에 어떤 데이터가 있는지 살펴보겠습니다.

mysql>SELECT * FROM developers;
+-------------+-----------------------+----------------+
| name        | email                 | job            |
+-------------+-----------------------+----------------+
| Joe Smith   | joesmith@gentoo.org   | toolchain      |
| John Doe    | johndoe@gentoo.org    | portage        |
| Chris White | chriswhite@gentoo.org | documentation  |
| Sam Smith   | samsmith@gentoo.org   | amd64          |
| Jane Doe    | NULL                  | Outsourced job |
+-------------+-----------------------+----------------+
5 rows in set (0.00 sec)

INSERT 명령 및 LOAD DATA 명령을 통헤 넣은 데이터를 살펴보았습니다. 이제 Chris White의 레코드만 보도록 해보겠습니다. 아래와 같이 select 두번째 양식으로 살펴볼 수 있습니다.

mysql>SELECT * FROM developers WHERE name = 'Chris White';
+-------------+-----------------------+---------------+
| name        | email                 | job           |
+-------------+-----------------------+---------------+
| Chris White | chriswhite@gentoo.org | documentation |
+-------------+-----------------------+---------------+
1 row in set (0.08 sec)

기대한 바와 같이 우리가 찾으려는 각각의 항목을 선택했습니다. 이제 구성원의 이름을 제외한 직급과 전자메일 주소만 원한다고 해보겠습니다. SELECT 명령 세번째 양식으로 아래와 같이 나타내보겠습니다.

mysql>SELECT email,job FROM developers WHERE name = 'Chris White';
+-----------------------+---------------+
| email                 | job           |
+-----------------------+---------------+
| chriswhite@gentoo.org | documentation |
+-----------------------+---------------+
1 row in set (0.04 sec)

이 선택 방식은 앞으로 마주하게 될 일과 마찬가지로 상당히 많은 양의 정보를 쉽게 관리할 수 있게 해줍니다. 이제 루트 mysql 사용자로서 MySQL 데이터베이스에서 우리가 하고 싶은대로 제한 없는 권한을 누려보겠습니다. 서버 환경에서 각 권한을 쥐고 있는 사용자는 각자 문제를 안고 있을 수 있습니다. 이들 사용자가 데이터베이스에서 할 일을 관리하기 위해 권한을 설정하겠습니다.

MySQL 권한

권한이란 사용자가 데이터베이스, 테이블, 등에 접근하는 방식을 말합니다. 이제 gentoo 데이터베이스에서 MySQL 루트 계정은 단지 접근하고 권한을 부여할 수 있는 계정일 뿐입니다. 이제 gentoo 데이터베이스에 접근하고 정보를 다룰 일반 사용자인 guest, admin 계정을 만들겠습니다. guest 계정은 상당 부분을 제한하겠습니다. 할 수 있는 유일한 동작은 데이터베이스로부터 정보를 가져오는 일이 전부입니다. admin은 root 계정과 동일한 제어권을 받지만, (mysql 주 데이터베이스가 아닌) gentoo 데이터베이스에 한합니다. 계정을 만들기 전에 GRANT 명령을 단순화한 형식을 면밀히 살펴보겠습니다.

Creating Users

The CREATE USER SQL statement will define users and set the authentication method, commonly by password but other plugins may be available.

An example CREATE USER command is:

코드 CREATE USER Syntax
CREATE USER '[user]'@'[host]' IDENTIFIED BY '[password]';

user is the name of the user and host is the hostname the user will be accessing from. In most cases, this will be localhost. To create our users for this example:

(admin)

mysql>CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';

(guest)

mysql>CREATE USER 'guest'@'localhost' IDENTIFIED BY 'password';
중요
A host of 'localhost' does not mean DNS localhost (127.0.0.1) to MySQL. Instead, it refers to the UNIX socket connection and not TCP/IP.

GRANT 구문으로 권한 부여하기

Let's have a closer look at this somewhat simplified format of the GRANT command.

코드 GRANT 문법
GRANT [privileges] ON database.* TO '[user]'@'[host]' IDENTIFIED BY '[password]';

우선 우리가 할당하려는 권한을 취하겠습니다. 지금까지 우리가 알아본대로 여러분이 설정할 수 있는 몇가지 권한이 있습니다:

  • ALL - 데이터베이스에 대한 모든 제어권을 줌
  • CREATE - 사용자가 테이블을 만들 수 있음
  • SELECT - 사용자가 테이블에 요청할 수 있음
  • INSERT - 사용자가 테이블에 데이터를 넣을 수 있음
  • SHOW DATABASES - 사용자가 데이터베이스 목록을 볼 수 있음
  • USAGE - 사용자에게 권한을 주지 않음
  • GRANT OPTION - 사용자가 권한을 부여할 수 있음
참고
{{{1}}}

admin 사용자에게는 모든 권한을 부여했습니다. guest 사용자에게는 읽기 전용 동작에 SELECT 정도면 충분하다고 봅니다 database는 사용자에게 접근 권한을 부여할 데이터베이스입니다. 여기서는 gentoo가 되겠습니다. .*은 모든 테이블을 의미합니다. 원하는 경우 테이블 단위로 접근 권한을 줄 수 있습니다. user는 사용자 이름이며, host는 사용자가 접근하고자 이용하는 호스트의 이름입니다. 대부분 localhost 입니다. 마지막으로 password는 사용자 암호입니다. 주어진 정보를 가지고 사용자를 만들어보겠습니다.

mysql>GRANT ALL ON gentoo.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
mysql>GRANT SELECT ON gentoo.* TO 'guest'@'localhost' IDENTIFIED BY 'password';

이제 사용자 설정을 끝냈으니 시험해보겠습니다. 우선 quit 명령을 명령 프롬프트에 입력하여 mysql을 빠져나가겠습니다:

mysql>quit

이제 콘솔로 돌아왔습니다. 사용자 설정을 처리했으니 사용자가 무얼 할 수 있는지 보도록 하겠습니다.

사용자 권한 시험

이제 guest 사용자로 로그인해보겠습니다. 현재 guest 사용자는 SELECT 명령에 대해서만 권한을 쥐고 있습니다. 기본적으로는 검색 이외의 것은 할 수 없습니다. guest 계정으로 로그인하러 가보겠습니다.

user $mysql -u guest -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 4.0.25
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

이제 사용자에게 제한을 제대로 가했는지 시험하겠습니다. gentoo 데이터베이스로 전환하겠습니다:

mysql>USE gentoo;
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>CREATE TABLE test (test VARCHAR(20), foobar VARCHAR(2));
ERROR 1044: Access denied for user: 'guest@localhost' to database 'gentoo'

보시는 바와 같이, 사용자가 적절한 접근 권한을 보유하고 있지 않으므로 동작이 실패했습니다. 그러나, 앞에서 허용한 접근 권한은 SELECT 문법입니다. 이 문법을 실행해보겠습니다.

mysql>SELECT * FROM developers;
+-------------+-----------------------+----------------+
| name        | email                 | job            |
+-------------+-----------------------+----------------+
| Joe Smith   | joesmith@gentoo.org   | toolchain      |
| John Doe    | johndoe@gentoo.org    | portage        |
| Chris White | chriswhite@gentoo.org | documentation  |
| Sam Smith   | samsmith@gentoo.org   | amd64          |
| Jane Doe    | NULL                  | Outsourced job |
+-------------+-----------------------+----------------+
5 rows in set (0.00 sec)

이 명령 실행에 성공했으며, 사용자에게 부여한 권한이 어떤 동작을 가능하게 하는지 잠깐 살펴보았습니다. 어쨌거나 마찬가지로 admin 계정도 만들었습니다. 이 계정에는 제한이 있긴 하지만 모든 권한을 다 줬다는걸 보여주려고 만들었습니다. MySQL을 빠져나간다음에 admin 으로 로그인해보겠습니다.

mysql>quit
Bye
user $mysql -u admin -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.0.25
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

admin 사용자로 새 데이터베이스를 만드는 시도로 시작해보겠습니다. 이 admin 사용자는 MySQL 루트 계정과 유사하며 gentoo 데이터베이스를 선택했을 때 gentoo 데이터베이스에 대한 어떤 수정 동작도 할 수 있습니다. MySQL 주 데이터베이스의 사용자 접근을 시험해보겠습니다. 개별 데이터베이스에 대한 권한만 부여했음을 기억하십시오.

mysql>CREATE DATABASE gentoo2;
ERROR 1044: Access denied for user: 'admin@localhost' to database 'gentoo2'

분명히 admin 사용자는 MySQL 주 데이터베이스에 데이터베이스를 만들 수 없습니다. 반면에 gentoo 데이터베이스에 대해서는 모든 권한을 가지고 있습니다. 허나, 우리는 여전히 다음과 같이 데이터 삽입 예제를 보여드리기 위해 gentoo 데이터베이스를 건드리는 admin 계정을 활용할 수 있습니다.

mysql>USE gentoo;
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> INSERT INTO developers VALUES('Bob Simmons', 'bobsimmons@gentoo.org', 'python');
Query OK, 1 row affected (0.08 sec)

admin 사용자는 원하는대로 데이터베이스에 접근할 수 있습니다. 이제 간혹 사용자 권한을 없애야 하기도 합니다. 문제가 있는 사용자를 은퇴 고용자로 만들 수 있습니다. REVOKE 명령을 사용하여 사용자 권한을 비활성화하는 장면을 살펴보겠습니다.

REVOKE 명령으로 사용자 접근 권한 제거

REVOKE 명령은 사용자의 접근을 철회합니다. 심지어 전체 접근 권한을 없애거나, 특정 권한을 없앨 수 있습니다. 사실 명령 형식은 GRANT와 유사합니다.

코드 REVOKE 문법
REVOKE [privileges] ON database.* FROM '[user]'@'[host]';

여기 있는 옵션은 GRANT 명령 형식에 설명했습니다. 그러나 여기서는 사용자에 대한 모든 권한을 철회하겠습니다. guest 계정이 보안 문제를 야기하고 있다고 치겠습니다. 모든 권한을 없애기로 작정했습니다. 루트로 로그인해서 필요한 조치를 취하겠습니다.

mysql>REVOKE ALL ON gentoo.* FROM 'guest'@'localhost';
Query OK, 0 rows affected (0.00 sec)
참고
이 경우 사용자 접근은 간단하여 데이터베이스 단위 철회는 문제가 되지 않습니다. 허나 광범위한 경우에 한해 gentoo.* 대신 *.* 처럼 사용하여 모든 데이터베이스에 대한 사용자 권한을 제거할 수도 있습니다.

이제 빠져나가서 guest 사용자로 로그인하겠습니다.

user $mysql -u guest -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9 to server version: 4.0.25
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

로그인할 수 있지만 gentoo 로의 접속권한이 날라갔습니다.

mysql>USE gentoo;
ERROR 1044: Access denied for user: 'guest@localhost' to database 'gentoo'

문제덩어리 사용자는 이제 더이상 gentoo 데이터베이스에 접근할 수 없습니다. 사용자는 여전히 로그인할 수 있습니다. 왜냐면 MySQL 주 데이터베이스에 남아있기 때문입니다. MySQL 사용자 테이블에서 DELETE 명령으로 어떻게 완전히 계정을 제거하는지 살펴보겠습니다.

DELETE 명령으로 계정 제거하기

MySQL 사용자 테이블은 모든 사용자 및 정보가 들어있습니다. 루트로 로그인했는지 확인하십시오 MySQL 주 데이터베이스를 활용하겠습니다.

DROP USER will delete the record in the user table and all privilege tables. Let's go ahead and do that:

mysql>DELETE FROM user WHERE User='guest';
Query OK, 1 row affected (0.07 sec)

잘 동작한 것 같습니다. 로그아웃 한 후 guest 사용자로 로그인을 시도해보겠습니다.

mysql>quit
Bye
user $mysql -u guest -h localhost -p
Enter password:
ERROR 1045: Access denied for user: 'guest@localhost' (Using password: YES)

사용자를 제대로 삭제했습니다

마무리

이 안내서는 MySQL을 명령행에서 설정하는 방법에 주안점을 두었으며, 이 외에도 GUI 양식으로 과정을 처리하는 수단이 있습니다:

이 문서는 MySQL을 간단히 소개하는 따라하기 내용으로 마무리합니다. MySQL에 대해 전반적인 기본사항을 좀 더 잘 이해하고 데이터베이스를 설정하는데 도움이 되길 바랍니다.


This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Chris White, Shyam Mani, Xavier Neys
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.