- docker ์ปจํ ์ด๋๋ก MySQL์ ์ค์นํ๊ณ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ์๋ฃํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์นํด์ ์ง์ ์ฐ๊ฒฐํ๊ณ SQL ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ DB, Table, Record๋ฅผ ์์ฑ, ์
๋ฐ์ดํธ, ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ๋ค.
- DB ์๊ตฌ์ฌํญ์ ์ฐธ๊ณ ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ค.
- (option) ๋ฐ์ดํฐ ์์ฑ์ ํ ๋ ๋ช %๊ฐ ์์ฑ๋์๋์ง ํ์ํด์ฃผ๋ ํ๋ก๊ทธ๋ ์ค ๋ฐ(Progress Bar)๋ฅผ ๊ตฌํํ๋ค.
#๋ฐ์ดํฐ๋ฒ ์ด์ค
#MySQL
#SQL
#๋์ปค
#DDL
#ํ
์ด๋ธ
#DDL(Data Definition Language)
#DQL(Data Query Language)
#MySQL
-
docker
์ค์น - docker ๊ธฐ๋ฐ์ผ๋ก
MySQL
์ค์น - docker ๋ช
๋ น์ผ๋ก
MySQL ์ปจํ ์ด๋
์คํ - docker ๋ช
๋ น์ผ๋ก MySQL ์ปจํ
์ด๋์
bash
๋ก ์ ์ - ์ ํ๊ฒฝ๋ณ์ ๋ฐ Locale ์ค์
- MySQL config๋ฅผ latin1์์
utf8
๋ก ๋ณ๊ฒฝ
- DB ์ด๋ฆ์ ์ ํ๊ณ ์์ฑ
- DB์ ์ฐ๊ฒฐํ User๋ฅผ ์์ฑํ๊ณ ์ ์ ๊ถํ์ ์ค์
- ๋ค์ ์ ๋ณด๋ฅผ ํฌํจํ๋ user_log ํ ์ด๋ธ ์์ฑ
nickname varchar(64),
money dec(10, 2),
last_visit datetime
- 100๋ง ๊ฑด์ ๋ฐ์ดํฐ ์์ฑ ํ ํ ์ด๋ธ์ ์ ๋ ฅ
- ๋ฐ์ดํฐ๋ ๋ค์ ๊ท์น์ผ๋ก ์์ฑ
- ์ฌ์ฉ์ nickname ์ ์์ด ๋จ์ด 100๊ฐ + ๋๋ค ๋ฌธ์์ด 3์๋ฆฌ + ๋๋ค ์ซ์ 4์๋ฆฌ๋ก ์์ฑ
- money ๋ 1๋ถํฐ 100,000 ์ฌ์ด ๊ฐ์ผ๋ก ๋๋ค ์์ฑ
- last_visit ์ ์ต๊ทผ ํ ๋ฌ ์ฌ์ด๋ก ๋๋ค ์๊ฐ์ผ๋ก ์์ฑ
- DB์ Locale ์ค์ ์ด ์ ๋๋ก ์๋ ๋ฏ ํ๋ค.
- Docker ํํ์ด์ง์์ ๋ค์ด๋ก๋ํ์ฌ ์ค์นํ๋ค.
์ค์น ํ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฒ์ ์ด ์ถ๋ ฅ๋๋ฉด ์ ์์ ์ผ๋ก ์ค์น๋ ๊ฒ์ด๋ค.
$ docker -v
Docker version 20.10.22, build 3a2c30b
Homebrew๋ฅผ ํตํด์๋ ์ค์น ๊ฐ๋ฅํ๋ ์ถ๊ฐ๋ก ์ค์ ํด์ผ ํ ๊ฒ๋ค์ด ์๋ค๊ณ ํ๋ค.
- ๋ค์ ๋ช ๋ น์ด๋ก MySQL Docker ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๋ค.
- ๋ฒ์ ์ ์ง์ ํ์ง ์์ผ๋ฉด ์ต์ ๋ฒ์ ์ ๋ค์ด๋ก๋ํ๋ค.
MySQL ๋ฒ์ ์ docker hub ํํ์ด์ง์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
$ docker pull mysql:5.7
M1์ผ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ ์ ์๋๋ฐ
์๋ฒ๊ฐ ์ฌ๋ฌ๊ฐ์ง ๋ฒ์ ์ค ์ด๋ค ํ๋ซํผ์ ๋ฒ์ ์ ๊ฐ์ ธ์ฌ์ง ๋ชฐ๋ผ์ ๋จ๋ ์๋ฌ๋ก ์ถ์ธก๋๋ค.
5.7: Pulling from library/mysql
no matching manifest for linux/arm64/v8 in the manifest list entries
์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ธฐ์กด ๋ช
๋ น์ด์ platform
์ธ์ ์ต์
์ ์ถ๊ฐํ๋ค.
$ docker pull --platform linux/amd64 mysql:5.7
5.7: Pulling from library/mysql
e048d0a38742: Pull complete
c7847c8a41cb: Pull complete
351a550f260d: Pull complete
8ce196d9d34f: Pull complete
17febb6f2030: Pull complete
d4e426841fb4: Pull complete
fda41038b9f8: Pull complete
f47aac56b41b: Pull complete
a4a90c369737: Pull complete
97091252395b: Pull complete
84fac29d61e9: Pull complete
Digest: sha256:8cf035b14977b26f4a47d98e85949a7dd35e641f88fc24aa4b466b36beecf9d6
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
- ๋ค์ ๋ช ๋ น์ด๋ก ๋ค์ด๋ก๋ํ Docker ์ด๋ฏธ์ง๋ฅผ ํ์ธํ๋ค.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 be16cf2d832a 2 weeks ago 455MB
- ๋ค์ ๋ช ๋ น์ด๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค.
- ์ปจํ
์ด๋ ์ด๋ฆ:
--name
๋ค์ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ ๋ ฅํ๋ค. - ๋น๋ฐ๋ฒํธ:
<๋น๋ฐ๋ฒํธ ์ ๋ ฅ>
์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋๋ฐ<
์>
๋ ์ ๋ ฅํ์ง ์๋๋ค. - MySQL์ ํน์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ฒ์ ์ ์ ๋ ฅํด์ค๋ค.
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<๋น๋ฐ๋ฒํธ ์
๋ ฅ> -d -p 3306:3306 mysql:latest
๐ก ๋ช ๋ น์ด ์ฐธ๊ณ :
--name
: ์์ฑํ ์ปจํ ์ด๋ ์ด๋ฆ-e
: ํ๊ฒฝ๋ณ์ (PASSWORD) ์ค์ -d
: Dispatch mode (๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ)-p
: ํฌํธ (์ธ๋ถํฌํธ : Docker ๋ด๋ถํฌํธ)mysql
: sql ๋ฒ์
- MySQL ์ต์ ๋ฒ์ ์ด ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ์ธ์ด๊ฐ
latin1
๋ก ์ค์ ๋์ด ์์ ์๋ ์๋ค. - ํ์ ์, ๋ค์ ์ต์ ์ ์ ๋ช ๋ น์ด ๋ค์ ๋ถ์ฌ์ ์ ๋ ฅํ๋ค.
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
๐ก ์ฐธ๊ณ : ํ๊ฒฝ์ ๋ฐ๋ผ ์ปจํ ์ด๋ ์ข ๋ฃ ํ ์ฌ์ ์ ์, ์ค์ ์ด ๋งค๋ฒ ์ด๊ธฐํ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f95ad85c7e02 mysql:5.7 "docker-entrypoint.sโฆ" 27 seconds ago Up 26 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-container
๐ก ๋ช ๋ น์ด ์ฐธ๊ณ :
ps
: ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ฆฌ์คํธ ๋ณด๊ธฐps -a
: ๋ชจ๋ ์ปจํ ์ด๋ ๋ฆฌ์คํธ ๋ณด๊ธฐ
-
๋ช ๋ น์ด ๋ค์ ์ปจํ ์ด๋ ์ด๋ฆ์ด๋ ID๋ฅผ ์ ๋ ฅํ๋ค.
-
์ปจํ ์ด๋ ์์
$ docker start mysql-container // "mysql-container" ๋์ ID์ธ "f95ad85c7e02"๋ก๋ ์คํ ๊ฐ๋ฅ
- ์ปจํ ์ด๋ ์ข ๋ฃ
$ docker stop mysql-container
- ์ปจํ ์ด๋ ์ฌ์์
$ docker restart mysql-container
- ๋ค์ ๋ช ๋ น์ด์์ ์ ์ํ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ ๋ ฅ ํ MySQL์ ๋ก๊ทธ์ธํ๋ค.
- ์ดํ
root@{containerName}#
์ผ๋ก ์ง์ ํ๊ฒ ๋๋ค. - docker๋ก ๋์๊ฐ๊ณ ์ถ์ผ๋ฉด
exit
๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
docker exec -it mysql-container bash
๐ก ๋ช ๋ น์ด ์ฐธ๊ณ :
-it
: Interactive Terminal Mode
- ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ฌ ํ๊ฒฝ์ locale ์ค์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค.
locale -a
- ๋ํดํธ ํ๊ฒฝ์๋ ํ๊ตญ์ด ์ค์ ์ด ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ ํ๊ตญ์ด ์ฌ์ฉ ์์ ์ด๋ผ๋ฉด 7๋ฒ ๊ณผ์ ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.
๐ก ์ฐธ๊ณ : bash์ ์ง์ ํ ์ํ๋ผ๋ฉด
exit
๋ฅผ ์ ๋ ฅํ์ฌ ๋์ฌ ์ ์๋ค.
- ์ดํ
locale
๋ช ๋ น์ด๋ก ๋ค์ ํ์ธํด๋ณด๋ฉด UTF-8์ด ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
$ docker exec -it -e LC_ALL=C.UTF-8 mysql-container bash
- ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ์๋ก ์๋ฒ์ ์ ์ํ๋ค.
- ์ ์ํ๋ฉด
mysql>
๋ก ์ง์ ํ๊ฒ ๋๋ค.
๐ก ์ฐธ๊ณ : ์ฐ๋ถํฌ์์ ์คํํ๋ค๋ฉด
root@{containerName}#
ํํ๋ก ๋จ๊ณ , docker์์ ์ง์ ํ๋ฉดbash-์ซ์#
ํํ๋ก ๋จ๋ ๊ฒ์ผ๋ก ์ถ์ธก๋๋ค.
bash-4.2# mysql -u root -p // # ๋ค๋ถํฐ ์
๋ ฅํด์ผ ํ๋ค.
Enter password: // ๋น๋ฐ๋ฒํธ ์
๋ ฅ
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.41 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> // mysql๋ก ์ง์
- ์์: jinny๋ผ๋ ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ , ๋ชจ๋ ๊ถํ์ ๋ถ์ฌํ๋ค.
โผ๏ธ ์ฃผ์: SQL ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๋งจ ๋ง์ง๋ง์;
๋ฅผ ๊ผญ ์ ๋ ฅํด์ผํ๋ค.
- ์ฌ์ฉ์ ์์ฑ
๐ก : ์ปจํ ์ด๋ ์ธ๋ถ์์ MySQL์ ๋ก๊ทธ์ธ์ด ํ์ํ ์,
localhost
๋์%
๋ฅผ ์ ๋ ฅํ๋ค.
mysql> create user 'jinny'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.04 sec)
- ์์ฑํ ์ ์ ์๊ฒ ๋ชจ๋ DB ๋ฐ ํ ์ด๋ธ ์ ๊ทผ ๊ถํ ๋ถ์ฌ
mysql> grant all privileges on *.* to 'jinny'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)
- ์ค์ ํ ๊ถํ ์ ์ฉ
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> quit
Bye
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; // UTF ์ค์ ํด์ค์ผ ํ๊ธ ์๊นจ์ง
- ๋ค์ ๋ช ๋ น์ด๋ก ๋น๋ฐ๋ฒํธ ์ ๋ ฅ ํ MySQL์ ์ ์ํ๋ค.
mysql -u root -p
- ๋ค์๊ณผ ๊ฐ์ ๊ธด ๋ฌธ์์ด ๋์ค๋ฉด ์ ์์ ์ผ๋ก ์ ์๋ ๊ฒ์ด๋ค.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.7.41 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input state
- ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์คํธ๋ฅผ ํ์ธํ๋ค.
- 4๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ ์์ฑ๋ ๊ฒ์ด๋ค.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
- ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ๋ค.
- ์์: "UserLog" ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
mysql> CREATE DATABASE UserLog;
Query OK, 1 row affected (0.02 sec)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ์ธํด ๋ณด๋ฉด ์๋ก ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| UserLog | // ์๋ก ์์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
| mysql |
| performance_schema |
| sys |
+--------------------+
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ DB๋ฅผ ์ ํํ ํ table์ ํ์ธํ ์ ์๋ค.
-
DB ์ ํ
mysql> use UserLog;
Database changed
- ํ ์ด๋ธ ํ์ธ
mysql> SHOW tables;
Empty set (0.00 sec) // ํ
์ด๋ธ์ ๋ฐฉ๊ธ ๋ง๋ค์ด์ ๋น์ฐํ ๋น์ด์๋ค.
- ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ํ ์ด๋ธ ์์ฑ
mysql> CREATE table user_log(
-> ID INT NOT NULL AUTO_INCREMENT,
-> nickname VARCHAR(64),
-> money DEC(10, 2),
-> last_visit DATETIME,
-> PRIMARY KEY(ID)
-> );
Query OK, 0 rows affected (0.07 sec)
- ์์ฑ๋ ํ ์ด๋ธ ํ์ธ
mysql> SHOW tables;
+-------------------+
| Tables_in_UserLog |
+-------------------+
| user_log |
+-------------------+
1 row in set (0.00 sec)
- ํ ์ด๋ธ ๊ตฌ์กฐ ํ์ธ
mysql> desc user_log;
+------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| nickname | varchar(64) | YES | | NULL | |
| money | decimal(10,2) | YES | | NULL | |
| last_visit | datetime | YES | | NULL | |
+------------+---------------+------+-----+---------+----------------+
4 rows in set (0.05 sec)
์ฐ๋์ ์๊ฐํ๊ฒ ๋ ๊ณ๊ธฐ??
ํฐ๋ฏธ๋๋ก 100๋ง๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฆฌ๋๊ฒ ๋ง๋? ํ๋ ์๊ฐ์ ๊ณ ๋ฏผํ๊ฒ ๋จ
์ฐพ์๋ณด๋๊น ๋ช๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์์
- MySQL GUI ์ฌ์ฉํ๋ ๊ฒ
- ์ธํ ๋ฆฌ์ ์ด๋ ์ฐ๋ํ๋ ๊ฒ
- ๋ ๋จธ ์์๋๋ฐ ๊ธฐ์ต์ด ์๋จ
DBA๊ฐ ์๋๋ผ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ฉด 2๋ฒ์ ๋ ์์ฃผ ๋ณด๊ฒ๋ ๊ฒ ๊ฐ์์ 2๋ฒ์ ์ ํํด์ ์งํํ๊ธฐ๋ก ํจ.
์ฐ๋ ์ด์ฐ์ ์ฐ ์ฝ์งํด์ ์ฑ๊ณตํจ... (์ง๊ธ ๊ณผ์ ์ค๋ช
ํ๋ผ๊ณ ํ๋ฉด 5๋ถ ์ปท)
์ด ์ฝ์ง๋ ๊ณง ์ ๋ฆฌํด๋ ์์ .
๊ทผ๋ฐ ์ฌ์ค ์ด ๋ฌธ์ ๋ณด๋ค 100๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋ ์ง๊ฐ ๋ฌธ์ ์์.
DB ์ฐ๋์ ํ๋๋ฐ 100๋ง๊ฐ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ๊ฒ์ธ์ง,, ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค ๋ณด๋ ๋ ๋ฐฉ๋ฒ์ด 2๊ฐ์ง ์ ๋ ์๋ ๊ฒ ๊ฐ์์.
- ํ๋ก์์ ๋ ํจ์๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์์ฑ -> ์ง๊ธ ๋ด ์์ค์์ ๋ถ๊ฐ๋ฅ
- ์๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ฌ CSV ํ์ผ๋ก ์ฟผ๋ฆฌ -> ๊ตฌ๊ธ๋ง ํ๋๋ฐ ์๋ฐ๋ก CSV ํ์ผ ์ฝ๊ธฐ ์ด๋ฐ ๊ฒ ๋ฐ์ ์๋์์,, ๊ตฌ๊ธ๋ง ์ค๋ ฅ์ด ๋ถ์กฑํ๋น
์ํผ 2๋ฒ ๋ฐฉ๋ฒ์ ์ด์ฐ์ ์ฐ ๊ตฌ๊ธ๋ง ํ์. (์ง๊ธ ์๋ ์ค์)
๊ทผ๋ฐ ์ง๊ธ๊น์ง ์๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ค 100๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ฟผ๋ฆฌ๋ก ๋ ๋ฆฌ๋ ๊ฒ์ด์๋๋ฐ,
์ค๋ ๋ง์คํฐ ์์
์ ๋ค์ด๋ณด๋๊น ํ๊บผ๋ฒ์ ๋ ๋ฆฌ๋ฉด ์๋ ๊ฒ ๊ฐ๊ณ ,
์นผ๋ผ ๋ณ๋ก ํ๋์ฉ insert ํ๋๊ฒ ์ข์ ๋ฐฉ๋ฒ์ธ ๋ฏ?
์ด์ ๋ ์์ง ๋ชฐ?๋ฃจ
๊ณต๋ถํด์ผ ๋จ
ํผ๊ฐ์~โฅ๏ธ