1. コンフィグレーションファイルの設定
コンフィグレーションファイルは
/usr/local/etc/mysql/my.cnf
です。
my.cnf という MySQL 用のコンフィグレーションファイルがありますが。
mysql56 の時点では、起動スクリプトが参照している場所でなかったりして、いささか面倒でした。
mysql57 では FreeBSD での所定の位置に変わっており、起動スクリプトもそこを参照の候補としているので楽になりました。
デフォルトは以下のように書かれています。
# $FreeBSD: head/databases/mysql57-server/files/my.cnf.sample.in 414707 2016-05-06 14:39:59Z riggs $
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt = \u@\h [\d]>\_
no_auto_rehash
[mysqld]
user = mysql
port = 3306
socket = /tmp/mysql.sock
bind-address = 127.0.0.1
basedir = /usr/local
datadir = /var/db/mysql
tmpdir = /var/db/mysql_tmpdir
slave-load-tmpdir = /var/db/mysql_tmpdir
secure-file-priv = /var/db/mysql_secure
log-bin = mysql-bin
log-output = TABLE
master-info-repository = TABLE
relay-log-info-repository = TABLE
relay-log-recovery = 1
slow-query-log = 1
server-id = 1
sync_binlog = 1
sync_relay_log = 1
binlog_cache_size = 16M
expire_logs_days = 30
default_password_lifetime = 0
enforce-gtid-consistency = 1
gtid-mode = ON
safe-user-create = 1
lower_case_table_names = 1
explicit-defaults-for-timestamp = 1
myisam-recover-options = BACKUP,FORCE
open_files_limit = 32768
table_open_cache = 16384
table_definition_cache = 8192
net_retry_count = 16384
key_buffer_size = 256M
max_allowed_packet = 64M
query_cache_type = 0
query_cache_size = 0
long_query_time = 0.5
innodb_buffer_pool_size = 1G
innodb_data_home_dir = /var/db/mysql
innodb_log_group_home_dir = /var/db/mysql
innodb_data_file_path = ibdata1:128M:autoextend
innodb_temp_data_file_path = ibtmp1:128M:autoextend
innodb_flush_method = O_DIRECT
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_autoinc_lock_mode = 2
skip-symbolic-links
[mysqldump]
max_allowed_packet = 256M
quote_names
quick
2. 文字コードを設定
日本語を扱うのであれば、2018年現在、ぜひ、UTF-8 を使用するべきであるし。
UTF-8 を使用するのであれば
/usr/local/etc/mysql/my.cnf
には必ず文字コードの設定を書いておきましょう。
[mysqld] ← のセクション内に
・・・
character-set-server = utf8 ← この1行を追加しておきます。
mysql のプロンプトを起動した状態で、下記のように表示されていれば一安心。
mysql> show variables like "chara%";
+--------------------------+----------------------------------+
| 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/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
mysql>
下記のように表示されるのであれば、文字化けが発生する可能性大なので my.cnf を編集して、データベースサーバを再起動しましょう。
mysql> show variables like "chara%";
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 | ← まずいかも
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 | ← まずいかも
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.46 sec)
mysql>
3. 設定のチェック
以降、編集したら、それを反映させるには
service mysql-server restart
で mysql-server を再起動するのですが。
編集を失敗していると停止だけして、起動できないことになります。
apache の configtest みたいなことはできないかなぁと思っていたら近いものがありました。
「MySQL で my.cnf のシンタックスチェックを行う方法」を参考にさせていただきました。
/usr/local/libexec/mysqld --verbose --help > /dev/null
で、設定に問題があればエラーが出力されます。
参考サイトに書いてある通り > /dev/null がミソで、これがないと現在の設定状態やらヘルプやら、だらだらと出力されるのですが、標準出力のみリダイレクトしているのでエラーがあればそこだけ出力されます。
試しに [mysqld] セクションに Z という1文字だけの行をいれてやってみます。
> /usr/local/libexec/mysqld --verbose --help > /dev/null
2018-03-01T13:43:19.324116+09:00 0 [ERROR] unknown option '--Z'
2018-03-01T13:43:19.332076+09:00 0 [ERROR] Aborting
うむ、上出来。
4. プロンプトを変更する
プロンプトが
ユーザ名@localhost [(none)]>
となってて、わたしは前のままがいいのです。
prompt = \u@\h [\d]>\_
の行を削除するなり、コメントアウトするなりすれば
mysql>
に戻ります。
5. パスワードの有効期限
何も指定しなければ MySQL のパスワードの有効期限はデフォルトで 360日なのだそうです。
ただし、デフォルトの設定で [mysqld] セクション、33行目に
default_password_lifetime = 0
という行があります。
これはパスワードの有効期限を無期限にする設定で、うっかり忘れると大変なことになりそうな気がしますが、幸いなことに ports でインストールした場合、デフォルトで上記設定になっているようです。
6. validate_password の謎
参考サイト「MySQL(5.7)メモ」を読むと
/usr/local/etc/mysql/my.cnf
の(参考サイトは Linux なのでディレクトリは異なります) [mysqld] セクションに
validate_password_length=4
validate_password_policy=LOW
と書けば、パスワードの最長文字数や強度を変えられると書いてあるのですが・・・。
実際に記述してチェックすると
> /usr/local/libexec/mysqld --verbose --help > /dev/null
[ERROR] unknown variable 'validate_password_length=4'
[ERROR] Aborting
となっちゃうのです。
と、なんとなく読んでてわかってきました。
mysql のクライアントで
mysql> SHOW GLOBAL VARIABLES LIKE 'validate%';
とやった結果
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
てな具合に表示されれば、パスワードのバリデーション(妥当性検査?)プラグインがインストールされてる。
Empty set (0.00 sec)
てな具合に表示されれば、それはインストールされてないっちゅうことで、インストールされてない機能のオプション値は「意味わかりませんぜ」ってことのようです。