MariaDb 10/ MySQL 8 - data 디렉토리 변경 (Ubuntu)

data 폴더 위치를 변경해 이동한다.

  • 여기서는 MariaDB 를 사용하고 있다.
  • rsync 를 사용해서 복사한다.

위치 이동

my.cnf 에 있는 기본 디렉토리를 /data 폴더로 변경하고 적용한다.

  1. 기본 data 디레토리 확인

my.cnf 에서 datadir 로 지정된 항목을 찾아 보자.

1
2
~$ grep datadir /etc/mysql/mariadb.conf.d/*
/etc/mysql/mariadb.conf.d/50-server.cnf:#datadir = /var/lib/mysql

기본으로 Ubuntu 종류에서는 /var/lib/mysql 를 기본 데이터 디렉토리로 지정하고 있다.

  1. data 디렉토리를 /data 로 변경한다.

my.cnf 를 수정해서 /data로 변경하자

1
~$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
  1. data 폴더 권한

mysqld / mariadbd 데몬은 mysql 사용자, mysql 그룹으로 사용권이 실행되고 있다. 데이터베이스에서 접근하는 모든 자원(폴더, 파일, 로그 등등)은 mysql 사용자로 접근이 가는해야 한다. 그래서 /data 디렉토리 권한을 변경한다.

mysql 사용자와 그룹 확인한다.

1
2
3
4
5
$ grep mysql /etc/passwd
mysql:x:111:117:MySQL Server,,,:/nonexistent:/bin/false

$ grep mysql /etc/group
mysql:x:117:

소유권을 mysql 사용자로 변경한다.

1
2
3
4
5
$ sudo chown -R mysql:mysql /data
[sudo] 암호:
$ ls -al /data
drwxr-xr-x 3 mysql mysql 4096 5월 6 22:35 .
drwxr-xr-x 20 root root 4096 5월 6 17:15 ..
  1. data 이동

rsync 를 사용해서 /var/lib/mysql 데이터를 /data 아래로 복사한다.

1
$ sudo rsync -avzph /var/lib/mysql/ /data/
  1. mysqld 데몬을 재시작하고 확인한다.
1
2
3
4
$ sudo systemctl restart mysql
$ sudo systemctl status mysql

● mariadb.service - MariaDB 10.11.2 database server

데이터베이스에 접속해 데이터를 확인해 보자. @@datadir 환경변수를 출력해서 /data 가 출력되면 my.cnf 의 설정이 잘 구성된 상태를 확인할 수 있다.

1
2
3
4
5
6
7
8
$ sudo mysql -u root -p

> select @@datadir;
+-----------+
| @@datadir |
+-----------+
| /data/ |
+-----------+

rsync 로 복사한 실제 데이터들은 각 스키마에서 확인해 보자.

Docker 기반 mongodb

Docker 기반 mongodb

Official : https://hub.docker.com/_/mongo/
참조: https://github.com/dockerfile/mongodb

로컬에 “mongo_data” 라는 데이터 저장소가 있고 29817 포트로 실행하기를 한다면 다음 같다:

1
$ docker run -d -p 29817:27017 -v /home/its/mongo_data:/data/db --name mongodb mongo

그리고 docker로 시작한 mongodb 컨테이너에 있는 mongo 를 사용해서 데이터베이스에 접속할 수 있다.

1
$ docker exec -it mongodb mongo

인증 이용

1
$ docker run -d -p 29817:27017 -v /home/its/mongo_data:/data/db --name mongodb mongo --auth

admin 데이터에이스에서 사용자 관리 계정 등록

1
2
$ docker exec -it mongodb mongo admin
> db.createUser({ user: 'jsmith', pwd: 'some-initial-password', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });

MongoDB 구성 설정과 사용자 인증 사용

MongoDB에 관련 글

MongoDB Community Edition Installations 시리즈:ㅇ

  1. MongoDB Community Edition 4.2 설치 - ARM64 Ubuntu/Debian Armbian
  2. MongoDB 구성 설정 과 사용자 인증 사용

MongoDB Tutorials 시리즈:

  1. MongoDB Tutorials: collections
  2. MongoDB Tutorial

MongoDB와 Middleware Platform:

  1. NodeJS Mongoose
  2. Mongodb mongoose-middleware

이전 버전과 기타 자료:

  1. MongoDB User Authentication
  2. MongoDB Community Edition 3.6 on Ubuntu(ARM64)
  3. Mongodb 3.4 install on Armv8
  4. Raspberry Pi 3 64bit OS openSUSE: Build MongoDB 3.4


Mongo Database 설정과 사용자 인증 사용

이 문서는 MongoDB Community Edition 를 리눅스 플랫폼에서 시작과 운영에 필요한 구성 파일 mongod.conf 의 설정을 다루고 있다. 이를 통해 데이터베이스 서비스를 동작시키고, 인증한 사용자로서 클라이언트 프로그램으로 접속하기 위한 기본 인증방식을 구성하는 것을 정리하고 있다.

  1. Mongo Database 설정
  2. 기본인증 구성

이 글의 내용은 MongoDB Community Edition 3.6 이후 4.2 까지 사용이 가능하다.

자세히 보기

MongoDB Community Edition 4.2 설치 - ARM64 Ubuntu/Debian Armbian

MongoDB에 관련 글

MongoDB Community Edition Installations 시리즈:ㅇ

  1. MongoDB Community Edition 4.2 설치 - ARM64 Ubuntu/Debian Armbian
  2. MongoDB 구성 설정 과 사용자 인증 사용

MongoDB Tutorials 시리즈:

  1. MongoDB Tutorials: collections
  2. MongoDB Tutorial

MongoDB와 Middleware Platform:

  1. NodeJS Mongoose
  2. Mongodb mongoose-middleware

이전 버전과 기타 자료:

  1. MongoDB User Authentication
  2. MongoDB Community Edition 3.6 on Ubuntu(ARM64)
  3. Mongodb 3.4 install on Armv8
  4. Raspberry Pi 3 64bit OS openSUSE: Build MongoDB 3.4


Install MongoDB 4.2 Community edition 설치

이 문서는 Arm64 기반 CPU를 사용하는 Raspberry Pi, Odroid, PINE64, OrangePi 등 SBC 지원 보드 계열 위에서 Ubuntu/Debian 에서 설치 및 사용 가능한 MongoDB Community Edition 4.2 버전을 설치하고 구성하는 과정을 정리하고 있다.

MongoDB Community Edition 버전 Amd64, Arm64 의 설치는 Install MongoDB Community Edition on Debian 에서 제공하고 있다.

하지만 Arm64를 지원하는 Odroid C2, PINE64, OragePi 등 SBC 브드의 Armbian, Ubuntu 오에스에서 MongoDB Community Edition 을 저장소에서 apt 명령으로 직접 설치가 안되서 작은 트릭 이 필요하다.

  • MongoDB Community Edition 4.2 설치
  • systemd 사용이 가능한 mongod Unit 파일 구성
자세히 보기

Armbian 기반 MongoDB 4.2 설치

Armbian 을 사용하는 보드에서 mongodb 4.2 를 설치한다. 여기에 대한 자세한 내용은 아래 링크를 참조하고 있다.

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition

GPG error

1
W: GPG error: https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4B7C549A058F8B6B
1
2
3
4
5
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 3B4FE6ACC0B21F32
7C549A058F8B6B
gpg: key 4B7C549A058F8B6B: public key "MongoDB 4.2 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
1
$ sudo apt install -y mongodb-org

설정

mongod.conf 를 간단하게 다음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
storage:
#dbPath: /var/lib/mongodb
dbPath: /home/qkboo/Db-data/mongodb4
journal:
enabled: true

systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

net:
port: 27017
bindIp: 127.0.0.1

https://docs.mongodb.com/manual/core/security-mongodb-configuration/

인증

명령으로 mongod 로 실행이 가능한 MongoDB Server는 기본적으로 보안 모델이 없이 실행된다. 따라서 별도의 인증 절차를 가지고 있지 않습니다. 이 때문에 2017년 1월에는 이런 약점을 노린 랜섬웨어가 발생하기도 했습니다. MongoDB는 되도록이면 외부로부터의 신뢰되지 않은 접속을 허용하지 않는, 보안에 문제가 되지 않는 환경에서 보안 모델 없이 실행하는 것을 지향하고 있으나, 어쨌든 MongoDB도 ID와 비밀번호로 접근하는 기본적인 보안 모델을 가지고 있으니 이를 통해 MongoDB Server에 인증 과정을 추가해 보도록 합시다.

  1. 비인증 모드에서 관리자 계정 생성
  2. 인증 접속

1. 비인증 관리자 계정 생성하기

mongod로 별도의 보안 모델이 없는 MongoDB Server를 실행하고, MongoDB Shell에 접속합니다.

1
2
3
4
> mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3

MongoDB에는 admin이라는 데이터베이스가 존재하며, 해당 데이터베이스에 사용자를 추가합니다.

1
2
3
4
5
6
> use admin
> db.createUser({
user: 'username',
pwd: 'password',
roles: ['userAdminAnyDatabase']
})

db.createUser()는 현재 사용하고 있는 데이터베이스(여기서는 admin)에 사용자를 추가합니다. 여기에는 사용자 이름, 비밀번호와 함께 권한(roles)을 array로 정의합니다. MongoDB에서 빌트인으로 제공하고 있는 권한은 MongoDB Built-In Roles에서 확인할 수 있습니다.

위에서 정의한 userAdminAnyDatabase는 어느 데이터베이스든 사용자를 생성하고 제거할 수 있다는 것을 의미합니다. 모든 권한을 가지게 하려면 root를 사용하면 되고, MongoDB 2.4 이하의 경우 db.addUser()를 통해 사용자를 추가합니다.

mongod 인증하기

만약 mongod 명령으로 실행하면 MongoDB Server를 실행하도록 한다.

1
> mongod --auth

MongoDB Server 재시작하기

Ubuntu와 같은 리눅스 시스템에서 service mongod start처럼 service를 이용할 경우, config 파일을 통해 실행됩니다. 이 경우 /etc/mongod.conf를 다음처럼 수정하고 재시작(service mongod restart)하면 됩니다.

mongodb 4.x

인증을 활성화 하려면

1
2
security:
authorization: enabled
mongodb 3.x

mongod.conf 를 사용하면 다음 옵션을 true 로 구성한다.

1
auth = true

그리고 서비스를 재시작한다.

1
2

$ sudo systemctl restart mongod.service

2. 인증 접속

mongo 쉘에 접속하여 db.auth()를 사용하는 것입니다.

1
2
3
4
5
$ mongo
MongoDB shell version v4.2.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("177716fe-5b3c-41f6-bdae-d2584819abff") }
MongoDB server version: 4.2.1

쉘에서 db.auth() 를 사용해 인증에 성공하면 1이 나오면 성공이다.

1
2
3
4
5
> use admin
switched to db admin
> db.auth('admin', '!23456789');
1
>

인증 접속이 되면 로그에 아래 같은 로그를 확인할 수 있다.

1
2019-12-02T09:49:24.392+0000 I  ACCESS   [conn3] Successfully authenticated as principal admin on admin from client 127.0.0.1:52370
명령행에서 접근

인증과 함께 admin 데이터베이스로 접근하려면 아래 같이 명령어에 아이디와 비밀번호를 명시만 해 주면 된다.

1
> mongo admin -u username -p password --authenticationDatabase admin

아래 같이 mongo 명령행에서 인증을 통해 접속하면 test 라는 데이터베이스로 접속합니다.

1
2
3
4
5
6
$ mongo -u admin -p
MongoDB shell version v4.2.1
Enter password:
...
>
> use admin

사용자 계정 만들기

관리자 계정을 만들고 인증까지 수행 했으면, 일반 사용자를 만들어 데이터베이스를 사용하도록 해보자. 관리자 계정을 만들었던 것처럼 계정을 만들고자 하는 데이터베이스를 use 한 다음 db.createUser()를 실행하면 된다.

1
2
3
4
5
6
7
8
9
> use bookdiary
switched to db bookdiary
> db.createUser({
... user:'student',
... pwd:'0123456789',
... roles:['dbOwner']
... });
Successfully added user: { "user" : "student", "roles" : [ "dbOwner" ] }
>

dbOwner라는 권한은 해당 데이터베이스에 대한 모든 수정/삭제 권한을 가진다는 것을 의미합니다.

사용자 인증

db.auth()를 통해 인증을 진행해 봅시다.

1
2
3
> db.auth('username', 'password')
1
>

참고

MongoDB Community Edition 3.6 on Ubuntu

2018-06-22 내용 정리, User auth 링크
{:.right-history}

이 문서는 Ubuntu/Debian 계열 정규 배포본에 3.x 버전을 지원하지 않는 플랫폼에 MongoDB Community Edition 3.6 버전을 설치하는 과정을 정리하고 있다. 내용의 기초는 MongoDB Community Edition 3.6 버전을 Amd64, Arm64 지원하는 64bit OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행하고 경험상 필요한 부분을 추가로 정리했다.

  • MongoDB Community Edition 3.6 설치
  • Mongo Database 구성
자세히 보기

mongodb - Collection

Collection

mongoDB는
mongoDB는 Collection 이 데이터베이스 테이블과 같은 개념이다. 아래 테이블은 관계형 데이터베이스 MySQL과 MongoDB의 개념을 비교해 주고 있다. [^1]

MySQL MongoDB
Table Collection
Row Document
Column Field
Joins Embedded documents, linking
자세히 보기

MongoDB - Database와 User Authentication

2018-06-21 설치 링크로 대체
{:.right-history}

MongoDB 설치후 데이터베이스 위치, 로그, 인증 등에 관련한 서버 구성과 설정을 정리한다.

MongoDB 2.6 과 MongoDB Community Edition 3.x 버전을 사용했다.

mongoDB 접근제어

mongoDB 는 설치과정 중에 인증과 관련해 설정하는 부분이 없어서 설치 후 누구나 DB에 접속 할 수 있다. 인증을 추가해 데이터베이스 관리자와 데이터베이스 사용자로 구분해서 이용하고, 각 데이터베이스의 사용자는 허가된 역할(Role)을 가지고 데이터베이스에 접근 가능하도록 구성한다.

자세히 보기

mongodb 3.4 on Armbian

2018-06-22 내용 정리, User auth 링크
{:.right-history}

이 문서는 MongoDB Community Edition 3.4 버전을 64bit OSAmd64, Arm64 지원 OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행했다.

여기서는 Arm을 사용하는 SBC[^2] 컴퓨터에 mongodb 3.4 버전을, Hardkernel Odroid C2를 사용해서 설치를 진행했다.

자세히 보기

MySQL 5.x 시작 (3)

MySQL

사용자 관리

mysql-server 를 설치하며 만든 root 사용자 패스워드를 사용해서 데이터베이스에 접속한다.

1
$ mysql -u root -p

사용자 데이터베이스

사용자가 사용할 데이터베이스를 만든다.

1
2
mysql>create database mydb;
Query OK, 1 row affected (0.00 sec)

그리고 CREATE USER, INSERT 로 새 사용자를 추가할 수 있다.

create user userid@HOST identified by ‘PASSWORD’;

사용자 foo 를 localhost 와 모든 것을 의미하는 패턴 %로 추가하면:

1
2
mysql > create user foo@localhost identified by 'password';
mysql > create user 'foo'@'%' identified by 'password';

혹은

1
insert into user (host, user, password) values ('localhost', 'hiru', 'password('hirururu'));

사용자 제거
mysql > drop user ‘hiru’;
mysql > delete from user where user =’hiru’

사용자 생성시 다음같이 1396 에러는 CREATE USER/GRANT 명령으로 사용자와 권한을 추가/관리해야 하는데 mysql.db, mysql.user 테이블을 직접 조작하다가 일관성이 깨졌기 때문

1
2
mysql> create user 'shopuser'@'localhost' identified by ')12345';
ERROR 1396 (HY000): Operation CREATE USER failed for 'shopuser'@'localhost'

제대로 사용자를 삭제하고

drop user shopuser@localhost

flush privileges; 로 갱신해 준다.

권한 주기

권한을 추가하고 삭제하기 위해서, GRANT와 REVOKE의 명령을 사용한다. GRANT 명령 등으로 데이터베이스 사용자가 데이터베이스 자원에 접근하는 권한을 만들 수 있다.

GRANT ALL privileges ON DB_NAME.TABLE TO USER_ID@[HOST] IDENTIFIED BY ‘PASSWORD’
GRANT [SELECT,DELETE,INSERT,UPDATE,] ON DB_NAME.TABLE TO USER_ID@[HOST] IDENTIFIED BY ‘PASSWORD’

  • DB_NAME,TABLE 등에 * 패턴을 사용할 수 있다.
  • HOST: 접근하는 소스 호스트
  • PASSWORD: 패스워드

http://www.w3big.com/ko/mysql/mysql-administration.html

현재 머신에서만 접속할 수 있는 사용자 계정, 외부, 원격에서 접속할 수 있는 사용자 계정을 추가해 준다.

1
2
3
mysql> use mysql; # mysql system db
mysql> GRANT ALL privileges ON mydb.* TO foo@localhost IDENTIFIED BY '*****';
mysql> GRANT ALL privileges ON mydb.* TO foo@'%' IDENTIFIED BY '*****';

혹은

1
2
grant select, insert, update, delete on mydb.* to foo@host identified by 'password';
mysql > grant select, insert, update, delete on dbname.table to userid@'192.168.%' identified by 'password';

권한을 확인하는 방법

1
2
mysql > show grants for foo@localhost
mysql > show grants for 'foo'@'%';

변경된 권한을 적용하기

1
mysql > flush privileges;

권한을 삭제하는 방법

1
mysql > revoke all on dbname.table from username@host

추가한 사용자는 SELECT로 확인할 수 있다.

1
mysql> select host,authentication_string from user where user='foo';

사용자 데이터베이스 사용

새로 생성한 사용자 ID로 로그인을 해서 데이터베이스 정보를 확인해 보자.

1
2
3
4
5
6
7
8
9
10
$ mysql -u foo -p
Enter password:

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
+--------------------+

그리고 데이터베이스를 사용하려면 use [DATABASE] 로 변경한다.

1
mysql> use mydb;

Character Set

mysql에서 한글이 ?로 표시되는 경우.

1
2
3
4
5
6
7
8
mysql> SELECT * FROM department;
+----+------+
| id | name |
+----+------+
| 1 | ??? |
| 2 | ??? |
+----+------+
2 rows in set (0.00 sec)

my.cnf의 문자셋과 터미널 문자셋이 일치하지 않아서 그렇다. MySQL은 설치시 지정하지 않았다면 기본적으로 문자셋이 ‘latin1’으로 설정되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> show variables like 'c%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | OFF |
+--------------------------+----------------------------+
15 rows in set (0.00 sec)

MySQL 설정 파일에서 문자셋을 변경할 수 있다. 다믕 같이 자신의 my.cnf 파일을 작성한다. client, mysqld, mysql 에 대해서 utf8 사용을 선언해 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[client]
..
default-character-set=utf8

[mysqld]
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

mysql> show variables like ‘char%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)

사용자 관리

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO ‘zara‘@’localhost’
-> IDENTIFIED BY ‘zara123’;

SQL

Structural Query Language로 튜플 간의 관계를 계산해서 결과를 도촐한다.

  • SEQUEL: Structured English QUEry Language; part of SYSTEM R, 1974
  • SQL/86: ANSI & ISO standard
  • SQL/89: ANSI & ISO standard
  • SQL/92 or SQL2: ANSI & ISO standard
  • SQL3: in the works…
  • SQL2 supported by ORACLE, SYBASE, INFORMIX, IBM DB2, SQL SERVER, OPENINGRES,…

SQL의 구성

  • SQL consists of the following parts:
  • Data Definition Language (DDL)
  • Interactive Data Manipulation Language (Interactive DML)
  • Embedded Data Manipulation Language (Embedded DML)
  • Views
  • Integrity
  • Transaction Control
  • Authorization
  • Catalog and Dictionary Facilities

교수 학습 연습

데이터 유형

http://www.w3big.com/ko/mysql/mysql-data-types.html

table professor

파일 Python-Database-class-student.sql

컬럼명 테이터 타입 비고
scode varchar(4) 학번, 기본키
sname varchar(20) 이름
sdept varchar(20) 학과
sphone varchar(15) 전화번호
1
2
3
4
5
6
CREATE TABLE professor (
pcode varchar(4) NOT NULL PRIMARY KEY,
pname varchar(10),
pdept varchar(12),
pphone varchar(8)
);
table student

파일 Python-Database-class-student.sql

컬럼명 테이터 타입 비고
scode varchar(4) 학번, 기본키
sname varchar(20) 이름
sdept varchar(20) 학과
sphone varchar(15) 전화번호

create student table

1
2
3
4
5
6
CREATE TABLE student (
scode char(4) NOT NULL PRIMARY KEY,
sname char(10),
sdept char(12),
sphone char(8)
);
table course

파일 Python-Database-class-student.sql

컬럼명 테이터 타입 비고
ccode varchar(4) 과목코드, 기본키
cname varchar(20) 과목명
ctime int 강의 시수
croom varchar(15) 강의실

create course table

1
2
3
4
5
6
CREATE TABLE course (
ccode varchar(4) NOT NULL PRIMARY KEY,
cname varchar(10),
ctime integer,
croom varchar(8)
);
table lecture

파일 Python-Database-class-student.sql

컬럼명 테이터 타입 비고
lpcode varchar(4) 교수코드, 기본키
lccode varchar(4) 과목코드, 기본키

create lecture table

1
2
3
4
5
CREATE TABLE lecture (
lpcode char(4) NOT NULL,
lccode char(4) NOT NULL,
PRIMARY KEY (lpcode, lccode)
);
table advice

파일 Python-Database-class-student.sql

컬럼명 테이터 타입 비고
apcode varchar(4) 교수코드, 기본키
asccode varchar(4) 학번, 기본키

create advice table

1
2
3
4
5
CREATE TABLE advise (
apcode char(4) NOT NULL,
ascode char(4) NOT NULL,
PRIMARY KEY (apcode, ascode)
);
table register

파일 Python-Database-class-student.sql

컬럼명 테이터 타입 비고
rscode varchar(4) 학번, 기본키
rcccode varchar(4) 과목코드, 기본키

create register table

1
2
3
4
5
CREATE TABLE register (
rscode char(4) NOT NULL,
rccode char(4) NOT NULL,
PRIMARY KEY (rscode, rccode)
);

데이터 입력

1
2
3
4
5
6
7
8
9
10
11
12
INSERT INTO professor (pcode, pname, pdept, pphone)\
VALUES ('P001','김 구','컴퓨터공학과','0001');
INSERT INTO professor (pcode, pname, pdept, pphone)\
VALUES ('P002','안창호','컴퓨터공학과','0002');
INSERT INTO professor (pcode, pname, pdept, pphone)\
VALUES ('P003','이육사','국문학과','0003');
INSERT INTO professor (pcode, pname, pdept, pphone)\
VALUES ('P004','박종화','국문학과','0004');
INSERT INTO professor (pcode, pname, pdept, pphone)\
VALUES ('P005','심 훈','사학과','0005');
INSERT INTO professor (pcode, pname, pdept, pphone)\
VALUES ('P006','한용운','사학과','0006');

외부 데이터 파일 이용

파일에 필드 간의 ‘,’로 구분한 데이터 파일이 있다. 물론 필드 구별 문자는 데이터의 내용에 따라 사용자가 임의로 정 할 수 있다.
파일: studens.txt

1
2
3
4
5
6
S001, 박소명, 컴퓨터공학과, 123-4567
S002, 최민국, 컴퓨터공학과, 234-5678
S003, 이승호, 국문학과, 345-6789
S004, 정수봉, 국문학과, 456-7890
S005, 김상진, 사학과, 567-8901
S006, 황정숙, 사학과, 678-9012

studnets.txt 파일을 읽어들이는 것은 스크립트 파일을 작성하거나 mysql에서 직접 실행할 수 있다.
먼저 스크립트 파일 students.sql은 다음과 같다.

1
2
3
use mydb;
load data local infile "student.txt" into table student
fields terminated by ',' ;

이제 mysql 클라이언트에서 데이터를 읽어 들인다.

1
2
mysql>source students.sql;

데이터 조회

SELECT [DISTINCT] select _expr essi on
FROM table_list
WHERE where_definition
ORDER BY col_name [ASC|DESC]
GROUP BY col _name_list
LIMIT [offset ], rows

예제-1) 전체 교수 리스트를 출력하는 SQL 검색 문을 작성하라.
mysql > sel ect * fromprof;

예제-2) 전체 교수 리스트를 이름순서로 출력하는 검색 문을 작성하라.
mysql > sel ect * fromprof order by pname;

예제-5) 전체 교수 리스트를 이름 역순으로 출력하는 검색 문을 작성하라.
mysql > sel ect * fromprof order by pname desc;

전체 교수 리스트를 학과별로 출력하는 검색 문을 작성하라.
mysql > sel ect * fromprof order by pdept, pname;

예제-4) 국문학과 교수 리스트를 이름순서로 출력하는 검색 문을 작성하라.
mysql> select * from professor where pdept =’국문학과’;

JOIN

“FROM 테이블명 AS 별명” 구문은 SQL 문장에서 별명으로 테이블을 참조하 는 역할은 한다.

예제-6) MySQL 과목을 강의하는 교수님의 이름, 전화번호와 강의실을 검색 하는 문장을 작성하라.
mysql> select p.pname, p.pphone, c.croom from professor p, course c, lecture l
where c.cname=’MySQL’ and c.ccode=l.lccode
and l.lpcode=p.pcode;

예제-7) ‘김구’ 교수님이 강의하는 과목명, 강의 시수와 강의실을 검색하는 문장을 작성하라.

1
2
3
4
select c.cname, c.ctime, c.croom
from professor as p, course as c, lecture as l
where p.pname = '김 구' and p.pcode = l.lpcode
and l.lccode = c.ccode;

예제-8) 각 학생이 수강 신청한 과목에 대해서 학생이름, 전화번호, 과목명, 강의실, 강의 시수를 검색하는 문장을 작성하라.

1
2
3
4
select s.sname, s.sphone, c.cname, c.ctime, c.croom
from student as s , course as c, register as r
where s.scode = r.rscode and r.rccode = c.ccode
order by s.sname, c.cname;

sub-query

예제-9) 각 학생이 신청한 총 학점을 구하는 검색식을 작성하라.

1
2
3
4
select s.sname, s.sdept, s.sphone, sum(c.ctime)
from student as s , course as c, register as r
where s.scode = r.rscode and r.rccode = c.ccode
group by s.sname;
  • WHERE 조건절에 해당하는 결과를 GROUP BY 구절에 명시된 s.sname 필드에 따라 그룹으로 결과를 분류하고 난 후, SELECT 필드에 SUM(c.cti me) 함수를 사용해서 c.cti me 필드에 대한 합을 구함으로써 각 학 생이 신청한 총 학점를 구할 수 있다.

예제-10) 각 학과별 교수님은 몇 분인지 구하는 검색식을 작성하라.

1
2
3
select pdept, count(*)
from professor
group by pdept;

LIMIT 구절

예제-11) 페이지 크기가 2 일 때, (예제-8)의 결과에서 두 번째 페이지를 검색하는 SQL문장은 작성하라.
select s.sname, s.sphone, c.cname, c.ctime, c.croom fromstudent as s , course as c, regi ster as r
where s.scode = r.rscode and r.rccode = c.ccode order by s.sname, c.cname
limit 2, 2;

  • 마지막 행의 limit 2, 2구절에서, 첫 번째 인자는 오프셋(offset)으로 검 색 결과 레코드들의 순번을 의미한다. 오프셋 값은 0 부터 지정하기 때문에 오프셋값2는전체레코드중에서세번째레코드를가리킨다. 두번째는 인자는 출력하는 레코드 수(rows)를 의미한다. 따라서, 레코드 수 2 는 2 개 의 레코드를 출력하라는 의미가 된다.

Update

UPDATE tbl_name
SET col_name1 = expr1, col_name2 = expr2, …
[WHERE where_definition] [LIMIT rows];

예제-12) 교수테이블에서 ‘김 구’ 선생님의 이름을 ‘하은용’ 교수님으로 변 경하는 문장을 작성하라.
update prof set pname =’하은용’ where pname =’김구’;

예제-13) 지도 테이블의 교수코드가 ‘P007’ 인 레코드들을 모두 ‘P005’ 로 변경하라.
update advise set apcode =’P005’ where apcode =’P007’;

예제-14) 강의 시수가 2인 과목들의 강의 시수를 하나 증가 시키고, 강의실 을 Lab1로 변경하라.
update course set ctime=ctime + 1, croom=’Lab1’ where ctime=2;

Delete

DELETE FROM tbl_name
[WHERE where_definition] [LIMIT rows]

예제-15 ) 국문학과 학생 레코드를 삭제하는 문장을 작성하라.
delete fromstudent where sdept =’국문학과’;

PyMySQL 튜토리얼

PyMySQL 설치

1
$ pip install PyMySQL

만약 pip 로 설치가 안되면 다음 같이 setup.py를 이용해 직접 설치 할 수 있다.
$ # X.X is the desired PyMySQL version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python setup.py install
$ # The folder PyMySQL* can be safely removed now.

1
2
3
4
5
6
CREATE TABLE users (
'id' int(11) NOT NULL AUTO_INCREMENT,
'email' varchar(255) COLLATE utf8_bin NOT NULL,
'password' varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

데이터베이스 삭제

1
mysql> drop database mydb;

사용자 비밀번호 변경

1
mysql> set password for ''myid''@''localhost'' = password(''password'');

테이블 생성

show 명령으로 데이터베이스 자원 현환을 볼 수 있다.

mysql> help show

다음은 데이터베이스 목록을 보고, ‘mydb’를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

mysql>use mydb
...

테이블 현황

1
2
3
4
5
6
7
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| test |
+----------------+
1 row in set (0.00 sec)

테이블 만들기

1
2
3
4
5
6
7
8
mysql>CREATE TABLE users (\
id int(11) NOT NULL AUTO_INCREMENT,\
email varchar(255) COLLATE utf8_bin NOT NULL,\
password varchar(255) COLLATE utf8_bin NOT NULL,\
PRIMARY KEY (id)\
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin\
AUTO_INCREMENT=1 ;

  • mysql> 터미널에서 여러 줄의 명령을 입력하기 위해서 줄의 끝에 ‘'를 사용해서 여러줄을 입력했다.

이럴게 만들어진 테이블은 show 명령으로 작성 스크립트를 확인할 수 있다.

1
2
3
4
5
6
7
8
9
mysql> show create table users;
| Table | Create Table | users | CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_bin NOT NULL,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

1 row in set (0.00 sec)

테이블의 구성 요소는 desc 명령을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
mysql> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

데이터 입력

1
2
3
4
mysql> insert into users values (0, 'aaa@example.com', 'sldfjslfj');
mysql> insert into users values (0, 'bbb@example.com', 'sldfjslfj');
mysql> insert into users values (0, 'ccc@example.com', 'sldfjslfj');
mysql> insert into users values (0, 'ddd@example.com', 'sldfjslfj');

Alter

1
2
3
4
5
6
7
8
mysql> #컬럼 추가
mysql> alter table users add first_name varchar(10);
mysql> alter table users add last_name char(10);
mysql> alter table users add point int(5);
mysql> alter table users add gener int(5);

mysql> #컬럼 삭제
mysql> alter table users drop gener;

참조