Takahiro Octopress Blog

-1から始める情弱プログラミング

Dockerコンテナ内のUbuntuでMariaDBを使ってみよう!

はじめに

さて、Redisに引き続きMariaDBをDockerコンテナ内のUbuntuにインストールしてみたいと思います。
今回扱う環境は以下です。

  • Ubuntu: 16.04.2 LTS
  • MariaDB: Ver 15.1 Distrib 10.0.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

では早速インストール方法から見ていきましょう。

MariaDBのインストール

これまで通りで非常に簡単です。

1
2
3
4
5
6
7
8
9
10
11
// 念のためapt-getをupdate && upgrade
$ apt-get update
$ apt-get upgrade

// MariaDBのインストール
$ apt-get install mariadb-server

// MariaDBがインストールされたことの確認
// /etc配下にmysqlフォルダがある
$ cd /etc
$ cd ls

MariaDBの初期設定

インストール後の初期設定手順を書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$ mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, well need the current
password for the root user.  If youve just installed MariaDB, and
you havent set the root password yet, the password will be blank,
so you should just press enter here.

// rootユーザのパスワードを設定しましょう!
Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

// rootユーザのパスワードを変更しますか?(既に設定したので "n" を入力)
Change the root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

// 匿名ユーザを削除しますか?
Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

// リモートでrootによるログインを許可しますか?
Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

// test用のデータベースを削除しますか?
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

// テーブルへの特権情報をリロードしますか?(上記までの変更を即時反映させるため "y" を選択)
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If youve completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

MariaDBにユーザを追加

流石にrootユーザだけだと何なので、メインで利用するユーザを作成しましょう。

1
2
3
4
5
6
7
8
9
10
11
12
// MariaDBにログイン
$ mysql -u root -p
// ユーザを作成
MariaDB [(none)]> create user 'takahiro'@'localhost' identified by 'password';
// ユーザの一覧を確認
MariaDB [(none)]> select Host, User, Password from mysql.user;
+-----------+----------+-------------------------------------------+
| Host      | User     | Password                                  |
+-----------+----------+-------------------------------------------+
| localhost | root     |                                           |
| localhost | takahiro | ***************************************** |
+-----------+----------+-------------------------------------------+

MariaDBの設定ファイル

さてさて、続いてMariaDBのデフォルトの設定ファイルを見ていきます。

設定ファイルがたくさんあることで混乱しそうになりますが、1つ1つはあまり何も書いていません。
構造を見てみると…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql
├── conf.d
    ├── mysql.cnf
    └── mysqldump.cnf
├── debian-start
├── debian.cnf
├── mariadb.cnf
├── mariadb.conf.d
    ├── 50-client.cnf
    ├── 50-mysql-clients.cnf
    ├── 50-mysqld_safe.cnf
    └── 50-server.cnf
├── my.cnf
└── my.cnf.fallback

となっています。
それぞれの大まかな意図はmariadb.cnfに書かれています。

mariadb.cnf

このファイルには下記のように書かれています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

ここに書かれている通り、

  1. /etc/mysql/mariadb.cnf: グローバル設定を書く
  2. /etc/mysql/conf.d/*.cnf: グローバルオプション設定を書く
  3. /etc/mysql/mariadb.conf.d/*.cnf: MariaDBにのみ有効なオプション設定を書く
  4. ~/.my.cnf: ユーザ固有のオプション設定を書く

というフォルダ構成になっているようです。

また、[client-server]を設定することでMariaDBクライアントとMariaDBサーバの両方から読み込まれる設定ファイルとして定義しています。
筆者が少し引っかかったのは!includedir構文です。
これは指定したファイルのインクルードを実行する構文です。
(!がついているのでインクルードしないのかと思いきや、これでインクルートなんですね…)

conf.d/mysql.cnf

下記しか書かれていません…
MySQLクライアントに有効な設定を書くことを想定している書き方に見えますね。

1
[mysql]
conf.d/mysqldump.cnf

名前からしてmysqldumpに関する設定ですね。

1
2
3
4
[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
  • quick: テーブルを1行ずつDumpする設定
  • quote-names: 識別子を逆引用符文字で囲む
  • max_allowed_packet: サーバーとの間で送受信するパケットの最大長
mariadb.conf.d/50-client.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# This group is read by the client library
# Use it for options that affect all clients, but not the server
#

[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8mb4

# This group is *never* read by mysql client library, though this
# /etc/mysql/mariadb.cnf.d/client.cnf file is not read by Oracle MySQL
# client anyway.
# If you use the same .cnf file for MySQL and MariaDB,
# use it for MariaDB-only client options
[client-mariadb]

MySQL / MariaDBクライアント側のデフォルトの文字コードがutf8mb4と設定されています。
また、MariaDBクライアントのみ設定を追加したい場合は[client-mariadb]より下の行にオプション設定を書きましょう。

mariadb.conf.d/50-mysql-clients.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#
# These groups are read by MariaDB command-line tools
# Use it for options that affect only one utility
#

[mysql]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8mb4

[mysql_upgrade]

[mysqladmin]

[mysqlbinlog]

[mysqlcheck]

[mysqldump]

[mysqlimport]

[mysqlshow]

[mysqlslap]

MySQLクライアント側のデフォルト文字コードはutf8mb4で設定されています。
他にもMySQL関連の設定を追加できるようですが、デフォルトでは何も書かれていませんでした。
一応、それぞれについて簡単に説明しておきます。

  • mysqladmin
    • MySQLサーバの管理を行うクライアント
    • サーバーの構成や現在のステータスの確認、データベースの作成および削除、およびその他の用途に使用
  • mysqlbinlog
    • MySQLのバイナリログの内容を確認
  • mysqlcheck
    • テーブルの保守 (テーブルの検査、修復、最適化、分析) を実行
  • mysqldump
    • MySQLデータのバックアップを実行
  • mysqlimport
    • LOAD DATA INFILE SQL ステートメントにコマンド行インタフェースを提供
    • ファイルをテーブルにインポート
  • mysqlshow
    • データベース / テーブル / テーブルのカラム / インデックスの存在迅速に確認するために使用
  • mysqlslap
    • MySQL サーバーのクライアント負荷をエミュレートし、各段階のタイミングをレポートする
mariadb.conf.d/50-mysqld_safe.cnf

エラー発生時の再起動やランタイム情報のエラーログファイルへのロギングなど、いくつかの安全機能を追加するために設定します。

1
2
3
4
5
6
7
8
9
[mysqld_safe]
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
socket          = /var/run/mysqld/mysqld.sock
nice            = 0
skip_log_error
syslog
  • socket: Unixドメインソケット接続を待機するソケットファイル
  • nice: サーバのスケジュール設定の優先順位を設定するために利用します
  • skip_log_error: エラーログの出力をスキップする設定
  • syslog: エラーメッセージをsyslogに書き込むための設定
mariadb.conf.d/50-server.cnf

文章の長さからしてMariaDB設定のベースとなります。
分割して見ていきます。
まずは基本設定です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
  • user: MariaDBに関連する操作を実行するためのユーザを設定します
  • pid-file: PIDファイルの指定先です
  • socket: Unixドメインソケット接続を待機するソケットファイル
  • port: 接続するためのポート番号です
  • basedir: MariaDBのインストールディレクトリ
  • datadir: MariaDBのデータベースに関するファイルが格納されるディレクトリ
  • tmpdir: ファイルシステムのディレクトリ
  • lc-messages-dir: エラーメッセージの配置ディレクトリ
  • skip-external-locking: 外部ロックを無効にする設定
  • bind-address: MariaDBへの接続を許可するIPアドレスの設定

続いて、チューニング周りです。

1
2
3
4
5
6
7
8
9
10
11
12
13
#
# * Fine Tuning
#
key_buffer_size         = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10
  • key_buffer_size: インデックスをメモリ上で確保するために使う物理メモリの許容量
  • max_allowed_packet: クライアントからMySQLサーバに転送可能な最大パケット数
  • thread_stack: スレッドに割り当てるスタック領域のサイズ
  • thread_cache_size: キャッシュに保持するスレッドの最大数
  • myisam-recover:MyISAMテーブルがクラッシュしたときに自動でリカバリーする設定
  • max_connections: 許容同時接続数
  • table_cache: メモリ上にキャッシュとして保持しておくテーブルの最大数
  • thread_concurrency: 同時実行スレッド数

クエリキャッシュの設定です。

1
2
3
4
5
#
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 16M
  • query_cache_limit: キャッシュするクエリ結果の最大値
  • query_cache_size: クエリキャッシュのサイズ設定

ロギングとレプリケーションに関する設定です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time = 10
#log_slow_rate_limit    = 1000
#log_slow_verbosity     = query_plan
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                        = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size   = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name
  • general_log_file: 一般クエリーログの保存ファイルを指定
  • general_log: 1を指定で一般クエリーログの取得が有効になる
  • log_error: エラーログの保存ファイルを指定
  • slow_query_log_file: スロークエリーログの保存ファイルを指定
  • long_query_time: スロークエリーと判断するための時間(秒)
  • log_slow_rate_limit: スロークエリーを判断するタイミングを設定 (1なら毎クエリごとに調査)
  • log_slow_verbosity: どの程度の詳細レベルでログを出すか決める
  • log-queries-not-using-indexes: Indexを使わない, 使っても全件スキャンになっているクエリはスロークエリとして出力する
  • server-id: 一意なサーバを識別するために設定(レプリケーション組む時に使える)
  • log_bin: バイナリログファイルを保存するファイルの指定
  • expire_logs_day: バイナリログの保存期限日
  • max_binlog_size: バイナリログろログローテーションし始める基準の値
  • binlog_do_db: バイナリログに書き込むデータベースを指定
  • binlog_ignore_db: バイナリログに書き込まないデータベースを指定

以下はInnoDB特有の設定のようです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!

#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
  • ssl-ca: SSL接続のためのCA証明書の指定
  • ssl-cert: SSL接続のためのサーバ証明書の指定
  • ssl-key: SSL接続のための秘密鍵の指定

エンコードの設定です。

1
2
3
4
5
6
7
8
#
# * Character sets
#
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
#
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci
  • character-set-server: MySQLサーバの文字コード設定
  • collation-server: MySQLサーバのソート順設定

その他にオプションを設定する場合は下記に続けて書くように用意されています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#
# * Unix socket authentication plugin is built-in since 10.0.22-6
#
# Needed so the root database user can authenticate without a password but
# only when running as the unix root user.
#
# Also available for other users if required.
# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.0 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers dont understand
[mariadb-10.0]

まとめ

今回はインストールと初期設定、デフォルトで生成される設定ファイルの意味について見ていきました。
今後は理解を深めるためにMariaDBならではのアーキテクチャを組んで試していければと思います。
と言ったところで本日はここまで。

参考

Comments