MySQLにおけるDB作成メモ
データベースを作る
MySQL上にデータベースを作ります。
CREATE DATABASEコマンドを作成します。
今回は、NVD から取得した脆弱性情報を格納するデータベースを作りたいため、「NVD_DB」とします。
-- データベースを作成する
CREATE DATABASE IF NOT EXISTS NVD_DB
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
CHARACTER SET utf8mb4:4byteのUTF-8
COLLATE utf8mb4_general_ci:UTF-8を使用し、大文字小文字を区別しない
CREATE USERコマンドを作成します。
-- ユーザーを作成する
CREATE USER 'ユーザー名'@'%' IDENTIFIED BY 'パスワード';
便宜上1行しか書いていませんが、管理者と作業者の2ユーザー作ります。
CREATE TABLEコマンドを作ります。
-- テーブルを作成する
-- CVE情報
-- CVE基本情報
CREATE TABLE IF NOT EXISTS NVD_DB.NVD_CVE_INFO
(
cveid VARCHAR(16) PRIMARY KEY,
sourceidentifier VARCHAR(128),
published TIMESTAMP NOT NULL,
lastModified TIMESTAMP,
vulnStatus VARCHAR(32),
KEY idx_sourceidentifier(sourceidentifier)
)
ENGINE=InnoDB
COMMENT='CVE情報の基本情報を管理する';
GRANT SELECT, INSERT, UPDATE, DELETE ON NVD_DB.NVD_CVE_INFO TO '管理者ユーザー'@'%';
GRANT SELECT ON NVD_DB.NVD_CVE_INFO TO '作業者ユーザー'@'%';
こちらもサンプルで1テーブルだけ掲載。
コンテナにsqlファイルを配置します。
mac上でsqlファイルを作成したため、まずscpコマンドでRasberryPi上へ転送します。
$ scp ./*.sql ユーザー名@ホスト名.local:/home/ユーザー名/Documents/MySQL
create_database.sql 100% 124 25.8KB/s 00:00
create_table.sql 100% 5897 449.9KB/s 00:00
create_user.sql 100% 135 24.2KB/s 00:00
コンテナからはRasberryPi上のディレクトリを参照することはできないため、コンテナの/tmpディレクトリにsqlファイルをコピーします。
docker cp /home/ユーザー名/Documents/MySQL/create_database.sql mysql-rpi:/tmp/create_database.sql
docker cp /home/ユーザー名/Documents/MySQL/create_user.sql mysql-rpi:/tmp/create_user.sql
docker cp /home/ユーザー名/Documents/MySQL/create_table.sql mysql-rpi:/tmp/create_table.sql
MySQLにログインします。
$ docker exec -it mysql-rpi bash
bash mysql -u ユーザー名 -p
ログイン時点で使用するデータベースを確定させたい場合は、mysqlコマンドにてデータベース名を指定します。
$ docker exec -it mysql-rpi bash
bash mysql -u ユーザー名 -p データベース名
MySQL上でsqlファイルを実行。
source /tmp/create_table.sql
source /tmp/create_user.sql
source /tmp/create_database.sql
数回エラーが出ましたが、全部シンタックスエラーだったため割愛。
データベースとテーブルをそれぞれ確認します。
mysql> SHOW DATABASES ;
+--------------------+
| Database |
+--------------------+
| NVD_DB |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
「NVD_DB」が作成されていることが確認できました。
mysql> SHOW TABLES FROM NVD_DB;
+------------------+
| Tables_in_NVD_DB |
+------------------+
| CONFIGURATION |
| CVECHANGE |
| CVECHANGE_DETAIL |
| DESCRIPTION |
| METRICS |
| NVD_CVE_INFO |
| NVD_CVE_TAG |
| REFERENCE |
| VENDERCOMMENT |
| WEAKNESSE |
+------------------+
10 rows in set (0.00 sec)
PRIMRY KEY と UNIQUE KEY
テーブルを作成する時に必ず意識をするのがプライマリーキー(主キー)です。
プライマリーキーは、テーブルに必ず存在するキーで一意なキーです。MySQLではテーブル作成時に省略した場合は自動的に連番が割り振られます。
私はテーブル設計時には気づいていなかったのですが、複数の項目を組み合わせてプライマリーキーとすることもできるようです。
対して、ユニークキーも、一意でないといけないという点においては変わりありません。大きな違いは、ユニークキーの場合「NULLが許される」点だと思います。また、一つのテーブルに対して複数のユニークキーを持たせることもできます。
私の設計しているテーブルの場合、プライマリーキーだけで用が足せそうなので、あとで修正します。
# プライマリーキーまたはユニークキーが単一項目である場合
# 変数名定義時に PRIMARY KEY や UNIQUE と書けばOK
-- 導入済み製品
DROP TABLE NVD_DB.INSTALLED_PRODUCT;
CREATE TABLE IF NOT EXISTS NVD_DB.INSTALLED_PRODUCT
(
applicationname VARCHAR(256) PRIMARY KEY,
productname VARCHAR(256),
vendername VARCHAR(128),
a_version VARCHAR(64),
platform VARCHAR(256),
software_type VARCHAR(256),
a_edition VARCHAR(128),
KEY inx_vendername(vendername),
KEY inx_productname(productname),
KEY inx_a_version(a_version)
)
ENGINE=InnoDB
COMMENT='導入済み製品';
# プライマリーキーまたはユニークキーを複数項目組み合わせる場合
# 変数定義後に PRIMARY KEY (変数名、変数名、、、)または UNIQUE KEY (変数名、変数名、、、)とかきます。
DROP TABLE NVD_DB.NVD_CVE_INFO;
CREATE TABLE IF NOT EXISTS NVD_DB.NVD_CVE_INFO
(
cveid VARCHAR(16),
sourceidentifier VARCHAR(128),
published TIMESTAMP NOT NULL,
lastModified TIMESTAMP,
vulnStatus VARCHAR(32),
PRIMARY KEY(cveid),
UNIQUE KEY(cveid, sourceidentifier),
KEY idx_sourceidentifier(sourceidentifier)
)
ENGINE=InnoDB
COMMENT='CVE情報の基本情報を管理する';
コメント
コメントを投稿