start

FreeBSDのMariaDBでリモートクライアントからの接続を許可する

A5:SQL Mk-2を使って、実家からVPN経由で自宅鯖のMariaDBにアクセスしようとしたら「Access denied for user'xxxx'」と言われて繋がらなかった。デフォルトでは自ホストのクライアントからの接続しか許可してないらしいので、リモートクライアントからの接続を許可してみたメモ。丁寧なhttps://mariadb.com/kb/en/library/training-tutorials/basic-mariadb-articles/configuring-mariadb-for-remote-client-access/公式ドキュメントが用意されてるので、その通りに進めていくだけですけどね。

'my.cnf[mysqld]''セクションに以下の2行を追加する。

[mysqld]
skip-networking=0
skip-bind-address

ユーザーにリモート接続の権限を付加する。許可するホストとパスワードを追加してるっぽいので、接続元ごとにパスワードを変えられるっぽい?

GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.%' IDENTIFIED BY 'new-password' WITH GRANT OPTION;

こんな感じで追加されてればおk。

> SELECT user,host FROM mysql.user;
+--------------+-----------+
| user         | host      |
+--------------+-----------+
| root         | 127.0.0.1 |
| root         | 172.16.%  | ←これ

InnoDB File-Per-Tableモードではinnodb_data_home_dirは無視される

MySQL/MariaDBにinnodb_data_home_dirというシステム変数がある。InnoDBのデータファイル置き場を明示する変数だが、InnoDB File-Per-Tableモードでは指定値が無視される。File-Per-Tableモードとは、InnoDBのテーブル毎にファイルを作成するモードの事でinnodb_file_per_table変数で制御可能である。MySQL 5.6.6以降でデフォルト有効になったため、innodb_data_home_dirは事実上意味がなくなってしまった。

よって、File-Per-TableモードではZFSのrecordsizeprimarycacheをストレージエンジン毎に最適化する、という手法が取りにくくなった。(DBごとにフォルダが作成され、その中にInnoDBやMyISAMのファイルが混在することになるため。)自分のメモも兼ねて最適とされるパラメータを下表にまとめる。

ストレージエンジン recordsize primarycache
MyISAM 8kBall
InnoDB(データ) 16kBmetadata
InnoDB(ログ) 128kBmetadata

WITH_CHARSET, WITH_XCHARSETを指定するのは止めにしよう

FreeBSDでPrtsからPortsからMySQL/MariaDBを入れる際、よく指定されるオプションにWITH_CHARSET, WITH_XCHARSETがある。調べてみたら、なんとmysql55で廃止されていた。

今まで盲目的に指定していたのだけど、なんとなく気になってググってみても、これぞという解説が見当たらない謎オプション。とりあえずFreeBSD Ports独自のオプションで、日本以外での使用例は殆どない。やむなくportsの更新履歴や8-RELEASE以前の古いportsツリーをあさってみると、mysql51-serverのportsのMakefile(MySQLそのもののMakefileじゃないよ)には以下の記述があるが、mysql55-serverからは消えているという事実が判明。MariaDBはMySQL 5.5からのフォークなので言わずもがなである。

.if defined(WITH_CHARSET) && ${WITH_CHARSET} != ""
CONFIGURE_ARGS+=--with-charset=${WITH_CHARSET}
.endif
.if defined(WITH_XCHARSET) && ${WITH_XCHARSET} != ""
CONFIGURE_ARGS+=--with-extra-charsets=${WITH_XCHARSET}
.endif

御覧の通り、portsのWITH_CHARSET, WITH_XCHARSETオプションは、それぞれMySQLの–with-charset, –with-extra-charsetsオプションに対応している。そして、MySQL 5.5からは–with-charset自体が消えてるっぽい。似た所で–extra-charsetsってのはあるみたいだけど。そして–with-extra-charsetsの方もデフォルト値がallとなったため、ports側から敢えて指定する必要がなくなり、オプションが削除されたのだと思われる。

WITH_CHARSET, WITH_XCHARSETオプションは、2001年1月25日にmysql323-serverに対する追加が初出のようだ。その時のコミットメッセージは「Add options for alternate charsets (WITH_CHARSET and WITH_XCHARSET).」といったもの。

というわけで、MySQL/MariaDBインストールでWITH_CHARSET, WITH_XCHARSETを付けるのはもう止めよう

MySQL 5.6.8でmy.cnfのサンプルがなくなった

FreeBSD 10.1-RELEASEにMySQL 5.6.22をインストールしたら、おなじみのmy-medium.cnfが無くなっていた。my-default.cnfというものはあるが、中身を見るとどう見ても空っぽ。

公式サイトによれば、5.6.8から従来のcnfファイルの提供は中止され、mysql_install_dbコマンドで生成するようになったらしい。てなわけで実行してみる。

$ sudo mysql_install_db --user=mysql --basedir=/usr/local --datadir=/usr/home/mysql/data
Installing MySQL system tables...2014-12-31 23:47:49 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2014-12-31 23:47:49 67043 [Note] InnoDB: Using atomics to ref count buffer pool pages
2014-12-31 23:47:49 67043 [Note] InnoDB: The InnoDB memory heap is disabled
2014-12-31 23:47:49 67043 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2014-12-31 23:47:49 67043 [Note] InnoDB: Memory barrier is not used
2014-12-31 23:47:49 67043 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-12-31 23:47:49 67043 [Note] InnoDB: Using CPU crc32 instructions
2014-12-31 23:47:49 67043 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2014-12-31 23:47:49 67043 [Note] InnoDB: Completed initialization of buffer pool
2014-12-31 23:47:49 67043 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created!
2014-12-31 23:47:49 67043 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB
2014-12-31 23:47:49 67043 [Note] InnoDB: Database physically writes the file full: wait...
2014-12-31 23:47:49 67043 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB
2014-12-31 23:47:50 67043 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB
2014-12-31 23:47:50 67043 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
2014-12-31 23:47:50 67043 [Warning] InnoDB: New log files created, LSN=45781
2014-12-31 23:47:50 67043 [Note] InnoDB: Doublewrite buffer not found: creating new
2014-12-31 23:47:50 67043 [Note] InnoDB: Doublewrite buffer created
2014-12-31 23:47:50 67043 [Note] InnoDB: 128 rollback segment(s) are active.
2014-12-31 23:47:50 67043 [Warning] InnoDB: Creating foreign key constraint system tables.
2014-12-31 23:47:50 67043 [Note] InnoDB: Foreign key constraint system tables created
2014-12-31 23:47:50 67043 [Note] InnoDB: Creating tablespace and datafile system tables.
2014-12-31 23:47:50 67043 [Note] InnoDB: Tablespace and datafile system tables created.
2014-12-31 23:47:50 67043 [Note] InnoDB: Waiting for purge to start
2014-12-31 23:47:50 67043 [Note] InnoDB: 5.6.22 started; log sequence number 0
2014-12-31 23:47:52 67043 [Note] Binlog end
2014-12-31 23:47:52 67043 [Note] InnoDB: FTS optimize thread exiting.
2014-12-31 23:47:52 67043 [Note] InnoDB: Starting shutdown...
2014-12-31 23:47:53 67043 [Note] InnoDB: Shutdown completed; log sequence number 1625977
OK
 
Filling help tables...2014-12-31 23:47:53 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2014-12-31 23:47:53 67044 [Note] InnoDB: Using atomics to ref count buffer pool pages
2014-12-31 23:47:53 67044 [Note] InnoDB: The InnoDB memory heap is disabled
2014-12-31 23:47:53 67044 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2014-12-31 23:47:53 67044 [Note] InnoDB: Memory barrier is not used
2014-12-31 23:47:53 67044 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-12-31 23:47:53 67044 [Note] InnoDB: Using CPU crc32 instructions
2014-12-31 23:47:53 67044 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2014-12-31 23:47:53 67044 [Note] InnoDB: Completed initialization of buffer pool
2014-12-31 23:47:53 67044 [Note] InnoDB: Highest supported file format is Barracuda.
2014-12-31 23:47:53 67044 [Note] InnoDB: 128 rollback segment(s) are active.
2014-12-31 23:47:53 67044 [Note] InnoDB: Waiting for purge to start
2014-12-31 23:47:53 67044 [Note] InnoDB: 5.6.22 started; log sequence number 1625977
2014-12-31 23:47:53 67044 [Note] Binlog end
2014-12-31 23:47:53 67044 [Note] InnoDB: FTS optimize thread exiting.
2014-12-31 23:47:53 67044 [Note] InnoDB: Starting shutdown...
2014-12-31 23:47:55 67044 [Note] InnoDB: Shutdown completed; log sequence number 1625987
OK
 
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
 
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
 
  /usr/local/bin/mysqladmin -u root password 'new-password'
  /usr/local/bin/mysqladmin -u root -h MY.HOSTNAME password 'new-password'
 
Alternatively you can run:
 
  /usr/local/bin/mysql_secure_installation
 
which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.
 
See the manual for more instructions.
 
You can start the MySQL daemon with:
 
  cd . ; /usr/local/bin/mysqld_safe &
 
You can test the MySQL daemon with mysql-test-run.pl
 
  cd mysql-test ; perl mysql-test-run.pl
 
Please report any problems at http://bugs.mysql.com/
 
The latest information about MySQL is available on the web at
 
  http://www.mysql.com
 
Support MySQL by buying support/licenses at http://shop.mysql.com
 
New default config file was created as /usr/local/my.cnf and
will be used by default by the server when you start it.
You may edit this file to change server settings

/usr/local/my.cnfが出来たようだ。中身はというと…

/usr/local/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
 
[mysqld]
 
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
 
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
 
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....
 
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M 
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

これはひどい。どう見ても/usr/local/share/mysql/my-default.cnfをコピーしただけです。本当にありがとうございました。

スクリプトにbasedirとdatadirを渡してるんだから、せめて反映したcnfくらい作ってくれてもいいんじゃないかなぁ…。自分みたいなMySQLの子細は分からないけど、とりあえず使ってみたいユーザーにとっては非常に厳しい。

さて、どうしたものか。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo