QNAP Container Station MySQL Server 構築

TS-h1283XU-RP」上のコンテナ(Container Station)で MySQL Server を構築します。

基本のセットアップ方法については、「QNAP QuTS hero 5 セットアップ」をご覧ください。

 

MySQL Server って何?

各種Webアプリ等ではデータベースサーバーを良く使用します。

QNAPのApp CenterにもMariaDBが用意されていますが、メンテされていないためかバージョンが古いです。

そのためDocker経由でデータベースサーバーを用意することにします。

 

よく使われる有名どころのデータベースサーバーでは、以下のようなソフトウェアが見つかります。

MySQLが一番有名かと思われます。

MariaDBはMySQLの買収によって非公開となる懸念からフォークされたプロジェクトです。

MySQLがベースとなっているため、またMySQLの買収後も公開が続いていることから、私は本家MySQLを使うのが良いと思っています。

気になる方はMariaDB等を使用してもいいかもしれません。

機能性ではPostgreSQLに軍配が上がると思われますが、メジャーアップデートの際にpg_upgradeツールを使用してアップデートの必要があります。

なお、MySQLは8.0.16以降でmysql_upgradeが自動化されたため、アップデートの際のコマンド手動実行の必要はありません。

しかしながら、どちらにしてもアップデートの際は問題発生に備えて、データベースの内容をダンプしてバックアップを取ることが重要となります。

 

MySQL Server を Container Station に設定

詳細はこちらにある通りで、このDockerイメージを動かす場合には、いくつか環境変数の設定が必要になります。

latest タグや lts タグがありますが、メジャーアップデート(Ver8系から9系等)が発生する可能性があるため、推奨はされないと思われます。

長期サポートのLTSバージョンは、2025年12月現在は8.4になっていて、次のLTSバージョンが9.7と予定されています。

そのため、パッチバージョンは自由に当たるように、現在は「8.4」のタグを使用するのが良いのではないかと思います。

「8.4.7」のタグもありますが、次のパッチバージョン「8.4.8」が公開されたときにイメージのプルで新しいバージョンを当てたいので。

(次のLTSバージョン9.7が公開されたら、バックアップの上、メジャーアップデートとして移行計画を整えるような形)

 

事前準備

データベースの保存先としてディレクトリを作成します。

以下のディレクトリを準備しておきます。

  • /share/Container/mysql/db/

コマンド例:

mkdir -p /share/Container/mysql/db/

 

また反映させたい設定があるので、以下の内容の設定ファイルを作成しておきます。

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
default-character-set = utf8mb4

以下に保存しておきます。

/share/Container/mysql/my.cnf

適当なエディタ等でファイルを作成してください。

コマンド例:

vi /share/Container/mysql/my.cnf

なお、文字コードはutf8mb4一択ですが、collationについては要件に応じて検討してください。

 

Dockerコンテナの設定

「Container Station」を開き、「コンテナ」タブから「探索」ボタンを押してDockerHubからmysqlを探します。

QNAP Docker MySQL Server 001 QNAP Docker MySQL Server 002

「コンテナまたはアプリケーションの作成」という画面が表示されるので、検索欄に「mysql」などと入力して「mysql」を探します。

「mysql」の右に表示される「デプロイ」ボタンを押します。

確認画面が表示されますが、公式イメージなので大丈夫でしょう。

 

QNAP Docker MySQL Server 003

イメージバージョンの選択画面になるので、先程の話の通り 8.4 に変更をします。

コンテナ作成の画面になるので、以下のように設定していきます。

 

QNAP Docker MySQL Server 004

  • 名前:任意(わかりやすいもの)
  • 設定・再起動ポリシー:「停止時以外」
  • ネットワーク設定・露出ポート:3306/tcp, 33060/tcp
  • ネットワーク設定・デフォルトの Web URL ポート:無効

「詳細設定」をクリックして、詳細設定に進む。

 

「コマンド」ページ

QNAP Docker MySQL Server 005

先程用意したmy.cnfを反映させないのであれば、何もいじらなくて良いのです。

日本語環境下であれば設定したほうが良い内容なので、my.cnfをコンテナ内に反映させたいです。

本来であれば、ストレージ設定から、my.cnfをリードオンリーで読ませれば良いだけですが、この環境下ではリードオンリーでもパーミッションが777となる関係で、設定読み込みが弾かれてしまいます。

そのため設定を読み込ませるにはコマンドでコンテナ起動時にファイル操作をする必要があります。

  • コマンド:Override「-c "cp /tmp/my.cnf /etc/mysql/conf.d/my.cnf && chmod 644 /etc/mysql/conf.d/my.cnf && exec docker-entrypoint.sh mysqld"」
  • エントリポイント:Override「bash」

このように変更します。コマンドは長いですが1行で入れます。

デフォルト設定ではdocker-entrypoint.sh実行後にmysqldが上がってくるような内容ですが、その前に設定ファイルコピーとパーミッション設定をしています。

 

「環境」ページ

QNAP Docker MySQL Server 006

「新しい変数の追加」ボタンで以下の内容を増やす。

  • 変数「TZ」値「Asia/Tokyo」
  • 変数「MYSQL_ROOT_PASSWORD」値「(ルートパスワードを設定)」

画像ではパスワードは簡単な例ですが、データベースの全てを握るルートパスワードとなるので、強固なパスワードを設定してください。

同時にユーザーを作成したりデータベースを作成したり出来ますが、あとからいくらでも出来るので、ルートパスワードだけを設定します。

 

「ストレージ」ページ

QNAP Docker MySQL Server 007

ボリューム「/var/lib/mysql」設定があるため、それを一旦削除。

「ボリュームの追加」ボタン横の矢印から「マウントされたホストのパスをバインド」を選択して追加。

  • ホスト「/Container/mysql/db」に対してコンテナ「/var/lib/mysql」RWのままで

(なお、ボリュームの設定のままでも、ボリュームに /share/Container/mysql/db のパスで設定を入れると勝手にマウントになります)

この設定でコンテナ内のディレクトリをファイルシステムにマッピングさせます。

設定ファイルも以下のようにマウントします。

  • ホスト「/Container/mysql/my.cnf」に対してコンテナ「/tmp/my.cnf」ROで

 

QNAP Docker MySQL Server 008

以上で最低限起動する設定になっています。

「完了」でコンテナを作成しましょう。

 

コマンドラインでのデータベース操作確認

QNAPにSSH接続して、以下のコマンドから起動中のmysqlコンテナにrootユーザーで入れます。

docker exec -it [コンテナ名 or コンテナID] mysql -u root -p

Enter password: と表示されるので、mysqlのrootユーザーで設定したパスワードを入力するとコンソールに入れます。

設定が反映されているか以下のようにSQL文を入力して確認してみましょう。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.7 MySQL Community Server - GPL

Copyright (c) 2000, 2025, 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> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

mysql> show variables like 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.4/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database   | utf8mb4_bin        |
| collation_server     | utf8mb4_bin        |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> exit
Bye

反映されてそうですね。

 

データベースの確認と作成

まずはSQL文のクエリーを投げてデータベース一覧を確認してみます。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql>

CREATE DATABASE文にて新たに「test」という名のデータベースを作成しました。

その後のSHOW DATABASES文にてデータベース一覧を確認してみると、「test」という名のデータベースが増えていることがわかります。

データベースに触れたことが無い方は、「test」という名のExcelファイルを新規に作ったイメージとすると理解しやすいと思います。

 

データベースの削除

なお、以下の方法でデータベースの削除が行えます。

※確認されませんので以下のクエリーは慎重に。

mysql> drop database test;
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>

DROP DATABASE文にてデータベースの削除が行えます。

 

使用するデータベースの選択

必須ではありませんが、使用するデータベースを選択しておくと、毎度指定する必要がなくなります。

mysql> select database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

mysql> use test;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

mysql>

USE文にて使用するデータベースを選択します。

database関数は現在選択されているデータベースを返します。

(最初の時点では何もデータベースを選択していないので何も無いことを表す「NULL」が返ってきています)

 

テーブルの確認と作成

データベース内には複数のテーブルが作成できます。

Excelに複数のシートがあるようなイメージです。

テーブル一覧を確認してみます。

mysql> show tables;
Empty set (0.00 sec)

mysql> create table tbl_test(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(100), price INT);
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tbl_test       |
+----------------+
1 row in set (0.00 sec)

mysql> desc tbl_test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
| price | int          | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> show full columns from tbl_test;
+-------+--------------+-------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type         | Collation   | Null | Key | Default | Extra          | Privileges                      | Comment |
+-------+--------------+-------------+------+-----+---------+----------------+---------------------------------+---------+
| id    | int          | NULL        | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| name  | varchar(100) | utf8mb4_bin | YES  |     | NULL    |                | select,insert,update,references |         |
| price | int          | NULL        | YES  |     | NULL    |                | select,insert,update,references |         |
+-------+--------------+-------------+------+-----+---------+----------------+---------------------------------+---------+
3 rows in set (0.01 sec)

mysql>

(USE文にて使用するデータベースを指定していない場合は、test.tbl_testのようにテーブル名の前にデータベース名を指定する必要があります)

データベースでは重複した内容でも個別に扱えるように、ユニークなIDをプライマリーキーとしてつけるのが基本になります。

今回は、「id」という名で数値が入れられる整数型(INT)を指定しています。

末尾についているAUTO_INCREMENTでユニークな数値となるように自動でインクリメントする設定。

NOT NULLはNULL(未入力)を許容せず、ユニーク性の担保と検索の高速化でPRIMARY KEYでプライマリーキー(主キー)設定にしています。

「name」はVARCHAR(100)で100文字入力可能な文字列、「price」は数値を入れられる整数型です。

 

テーブルの削除

なお、以下の方法でテーブルの削除が行えます。

※確認されませんので以下のクエリーは慎重に。

mysql> drop table tbl_test;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)

mysql>

DROP TABLE文にてテーブルの削除が行えます。

 

データの挿入と確認

先程作成したテーブルにデータを挿入してみます。

mysql> select * from tbl_test;
Empty set (0.00 sec)

mysql> insert into tbl_test (name, price) values ("IGBT", 1000), ("MOSFET", 500);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tbl_test;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  1 | IGBT   |  1000 |
|  2 | MOSFET |   500 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> insert into tbl_test (name, price) values ("MOSFET", 600), ("SCR", 2000);

Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tbl_test;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  1 | IGBT   |  1000 |
|  2 | MOSFET |   500 |
|  3 | MOSFET |   600 |
|  4 | SCR    |  2000 |
+----+--------+-------+
4 rows in set (0.00 sec)

mysql>

idにはAUTO_INCREMENTが指定されているため値を指定しなくても自動的に数値をインクリメントして入れてもらえます。

そのため、nameとpriceだけ指定してデータを入れることができました。

mysql> select * from tbl_test order by price asc;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  2 | MOSFET |   500 |
|  3 | MOSFET |   600 |
|  1 | IGBT   |  1000 |
|  4 | SCR    |  2000 |
+----+--------+-------+
4 rows in set (0.00 sec)

mysql> select * from tbl_test order by price desc;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  4 | SCR    |  2000 |
|  1 | IGBT   |  1000 |
|  3 | MOSFET |   600 |
|  2 | MOSFET |   500 |
+----+--------+-------+
4 rows in set (0.00 sec)

mysql> select * from tbl_test order by price asc limit 2;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  2 | MOSFET |   500 |
|  3 | MOSFET |   600 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql>

ORDER文、WHERE文、LIMIT文を組み合わせて任意のデータを取り出すことが出来ます。

 

ユーザーの確認

ユーザーを確認してみます。

mysql> select user(), current_user();
+----------------+----------------+
| user()         | current_user() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

mysql> show grants for root@localhost;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| GRANT ALLOW_NONEXISTENT_DEFINER,APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_PRIVILEGES,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,OPTIMIZE_LOCAL_TABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_ANY_DEFINER,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,TRANSACTION_GTID_TAG,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION |
| GRANT PROXY ON ``@`` TO `root`@`localhost` WITH GRANT OPTION                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

mysql>

user関数、current_user関数では接続に使用するユーザー情報や、現在のセッションのユーザー情報の確認ができます。

SHOW GRANTS文では権限の確認。

SELECT文を使用して、ユーザー情報が入っているmysql.userよりuserとhostを抜き出しています。

 

ユーザーの追加と権限

rootユーザーで日常的に操作すると誤操作等があったときに危険です。

そのため、基本的には用途ごとにデータベースとユーザーを作成するのが基本になります。

新たにユーザーを作成し、テスト用のデータベース「test」を操作することだけ可能な権限を与えます。

なお、こちらも強固なパスワードを設定することを忘れずに。

mysql> create user 'test_user'@'localhost' identified by 'Passw0rd12345';
Query OK, 0 rows affected (0.03 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| test_user        | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

mysql> show grants for test_user@localhost;
+-----------------------------------------------+
| Grants for test_user@localhost                |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`localhost` |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> grant all privileges on test.* to test_user@localhost;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show grants for test_user@localhost;
+-------------------------------------------------------------+
| Grants for test_user@localhost                              |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`localhost`               |
| GRANT ALL PRIVILEGES ON `test`.* TO `test_user`@`localhost` |
+-------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql>

以上で、データベース「test」の操作が可能なユーザー「test_user」が作成できました。

mysql> select user(), current_user();
+---------------------+---------------------+
| user()              | current_user()      |
+---------------------+---------------------+
| test_user@localhost | test_user@localhost |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> create database test2;
ERROR 1044 (42000): Access denied for user 'test_user'@'localhost' to database 'test2'
mysql> use test;
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 tbl_test2(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(100), price INT);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into tbl_test (name, price) values ("test", 100), ("test", 200);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into tbl_test2 (name, price) values ("test", 100), ("test", 200);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>

test_userにて接続してみると、データベース「test」は自由に操作できますが、他のデータベースの作成等は不可能なことがわかります。

 

ユーザーの削除

ユーザーの削除は、DROP USER文にて行います。

mysql> drop user 'test_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql>

こちらも事前に確認はされないので、注意して実行してください。

 

DBeaverを使ったデータベース操作確認

DBeaverを起動して、上部メニュー「データベース」から「新しい接続」を選択します。

QNAP Docker MySQL Server DBeaver 001 QNAP Docker MySQL Server DBeaver 002

MySQLを選択して、接続先情報を入力します。

最低限接続先となる「Server Host」「ユーザー名」「パスワード」を入力すれば良いです。

QNAP Docker MySQL Server DBeaver 003

ドライバファイルのダウンロードが必要な場合は、ダウンロードウィンドウが出ます。

QNAP Docker MySQL Server DBeaver 004

「テスト接続」ボタンをクリックし接続テストを行って、正常に接続できるか確認しましょう。

「Public Key Retrieval is not allowed」というエラーが出る場合には、ドライバのプロパティタブにて以下の変更をします。

  • 「allowPublicKeyRetrieval」を「true」に変更

これはMySQL 8.0以降にて認証方法が変わったためです。

 

なお、DBeaverは冬の間、メイン画面中に雪が降るエフェクトが表示されます。

無効にしたい場合は、上部メニューの「ウィンドウ」→「設定」を開き、設定画面内の「ユーザーインターフェース」→「Miscellaneous」内で「Show holiday decoration」のチェックを外します。

接続を行うと、左ペインに表示されている「データベースナビゲータ」にサーバーが表示されるようになります。

対象を右クリックすると編集他、様々な操作が可能です。

上部メニュー「データベース」→「接続する」をクリックするか、「データベースナビゲータ」中のツリーを開くとデータベースとの接続が切断されていても、接続状態になります。

 

データベースの確認と作成

最初にデータベースを確認してみます。

QNAP Docker MySQL Server DBeaver 005

データベースナビゲータ中で対象のデータベースサーバーを開き、「データベース」のセクションを確認します。

切断状態であるとツリーを開いた時点で接続が行われます。

DBeaverの場合、「sys」データベースだけデータベースセクションで見える状態になるようです。

その他、デフォルトで存在している「information_schema」「mysql」「performance_schema」はデータベースセクション内には非表示のようです。

 

先程と同様に「test」データベースを作成してみます。

QNAP Docker MySQL Server DBeaver 006

「データベース」のセクションを右クリックして「新しく作る データベース」をクリックします。

 

QNAP Docker MySQL Server DBeaver 007

「Create database」画面が表示されるので、「Database name」にデータベース名を入力して「OK」をクリックします。

 

QNAP Docker MySQL Server DBeaver 008

データベースが作成されました。

 

データベースの削除

データベースの削除の方法です。

QNAP Docker MySQL Server DBeaver 009

データベースナビゲータ中で対象のデータベースを選択します。

右クリックして、「削除」メニューをクリックすると削除が行えます。

 

QNAP Docker MySQL Server DBeaver 010

確認画面で「スクリプトの表示」をクリックすると実際に実行されるSQL文が表示されます。

DROP SCHEMA文でデータベースを削除するようです。

 

使用するデータベースの選択

QNAP Docker MySQL Server DBeaver 011

対象のデータベースを右クリックし、「デフォルトとして設定」をクリックするとデータベースが太字となりデフォルトに設定されます。

 

テーブルの確認と作成

対象データベース(今回は「test」)を開き、「テーブル」セクションを確認します。

テーブルは存在しないので現状ではツリーは展開できません。ダブルクリックで詳細を表示しても「No items」となります。

 

QNAP Docker MySQL Server DBeaver 012 QNAP Docker MySQL Server DBeaver 013

「テーブル」セクションを右クリックして「新しく作る テーブル」をクリックするとテーブル作成画面となります。

テーブル名はデフォルトで「NewTable」となっているので任意に変更します。(今回は「tbl_test」)

 

QNAP Docker MySQL Server DBeaver 014

カラムを作成するには、画面下部のアイコン「新しく作る カラム」からか、画面を右クリックして「新しく作る カラム」をクリックすることで作成できます。

カラムの編集画面が表示されるため、例として、以下の内容で作ってみましょう。

id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(100), price INT

以下のようにカラム数分繰り返します。

 

QNAP Docker MySQL Server DBeaver 015

カラム「id」、オートインクリメントとNOT NULLを指定。なおかつプライマリーキーとしても設定するため「Unique」にチェック。

 

QNAP Docker MySQL Server DBeaver 016 QNAP Docker MySQL Server DBeaver 017

カラム「name」と「price」はそれぞれ「VARCHAR(100)」と「INT」にして設定。

 

QNAP Docker MySQL Server DBeaver 018

内容を確認して良ければ、データベースサーバーに反映させるために保存(クエリーの実行)をします。

画面下部のアイコン「Save ...」または、「ファイル」→「保存」をクリックします。

 

QNAP Docker MySQL Server DBeaver 019

SQL文をプレビュー可能な画面が表示され、「実行」をクリックすることでクエリーが実行され、実際にテーブル・カラムが作成されます。

 

QNAP Docker MySQL Server DBeaver 020

テーブルの作成が完了しました。

 

テーブルの削除

なお、テーブルを削除するには、対象のテーブルを右クリックして「削除」から削除が出来ます。

QNAP Docker MySQL Server DBeaver 021

確認画面が表示されます。

QNAP Docker MySQL Server DBeaver 022

「スクリプトの表示」をクリックすると実際のSQL文が確認できます。

 

データの挿入と確認

対象のテーブルをダブルクリックで開いた状態で、「データ」タブを選択していると、データの操作が可能になります。

画面下部のアイコン「行を追加する」またはメニュー「編集」→「行を追加する」で値が入力可能になります。

 

QNAP Docker MySQL Server DBeaver 023

値を入力していきます。

idには「AUTO_INCREMENT」が設定されているため、自動的に数値が入ります。よってNULLのままにしておきます。

 

QNAP Docker MySQL Server DBeaver 024

画面下部のアイコン「Save」またはメニュー「ファイル」→「保存」でクエリーが実行されデータが挿入されます。

「AUTO_INCREMENT」の通り、idカラムには自動で数値が連番で入りました。

 

QNAP Docker MySQL Server DBeaver 025

データの並び替え表示も可能で、並び替えたいカラムで詳細メニューが表示出来ますので、詳細な並び替えやフィルター操作が可能です。

 

ユーザーの確認

ユーザーの一覧を確認してみます。

QNAP Docker MySQL Server DBeaver 026

データベースナビゲータよりユーザーを表示すると一覧表示になります。

 

ユーザーの追加と権限

ユーザーの追加を行います。

QNAP Docker MySQL Server DBeaver 027 QNAP Docker MySQL Server DBeaver 028

「ユーザー」セクションを右クリックし、「新しく作る ユーザー」からユーザー情報のタブを表示します。

プロパティタブ内の「Login」について入力を行います。

画面下部の「Save」またはファイルメニューから「Save」で反映させましょう。

 

QNAP Docker MySQL Server DBeaver 029

SQL文のプレビューが表示されるので「実行」をクリックしてクエリーを実行します。

 

次に権限設定をしましょう。

QNAP Docker MySQL Server DBeaver 030

ユーザー情報内の「スキーマ特権」タブを開きます。

ここが権限設定の画面になっています。

今回は「test」データベースに対して全て許可したいです。

  • Catalogs欄で「test」データベースを選択
  • Tables欄で「% (All)」を選択・全てのテーブルを対象に
  • Table Privileges欄で「Check All」を選択・全て許可
  • Other Privileges欄で「Check All」を選択・全て許可

先程と同様に「Save」を行います。

QNAP Docker MySQL Server DBeaver 031

SQL文のプレビューが表示されるので「実行」をクリックしてクエリーを実行します。

GUIからはGRANT ALL PRIVILEGES ONは指定できないようです?

 

ユーザーの削除

ユーザーの削除方法です。

QNAP Docker MySQL Server DBeaver 032

ユーザーセクションより対象のユーザーを右クリックして「削除」をクリックします。

 

QNAP Docker MySQL Server DBeaver 033

確認画面が表示され、ユーザーの削除ができます。

 

データベースのバックアップ・復元

こちらで紹介されている通り、Dockerコマンド経由で行う方法です。

以下のコマンドはNAS上でしか動きません。別マシンから行う場合はmysqldumpで接続先をQNAPにして行えば良いと思います。

docker exec mysql-server sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /share/Container/mysql/all-databases.sql

上記コマンドでバックアップが取れます。

コマンドラインでパスワードを使用することの警告が表示されますが、バックアップは取れます。

Dockerの変数から渡されるので、$MYSQL_ROOT_PASSWORDのまま書き換えなくて大丈夫です。

docker exec -i mysql-server sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /share/Container/mysql/all-databases.sql

復旧はこのように書き込みます。

 

実際の使用例