「MySQLほとんど知らないのにMySQLをセットアップしなくちゃいけない。
けれどもなぜか分からないけどMySQLが動いてくれないんだけど!」
そんな人に今回はスポットを当ててみました。
(要は、MySQLは動いてさえくれればいい、という人ですね)
具体的には、
「MySQLをセットアップする時のFAQ」
です。
前提として、LINUXにRPMパッケージでインストールするものとしています。
MySQLのバージョンは5.6または5.7(2016/1時点で最新)を想定しています。
もう少しチューニングもしたい、と言う方はこちらの記事も参照してみてください。
UCO-Tech(MySQL高速処理のための仕組み)
それでは中身に入っていきましょう。
MySQLがインストールできない系
インストール時のパッケージ依存性
★このメッセージが出たら怪しい!★
ファイル /usr/share/mysql/czech/errmsg.sys (パッケージ MySQL-server-5.6.28-1.el6.x86_64 から) は、パッケージ mysql-libs-5.1.71-1.el6.x86_64 からのファイルと競合しています。 (以下大量に競合)
エラー: 依存性の欠如: mysql-community-client(x86-64) = XXX は mysql-community-server-5.7.10-1.el6.x86_64 に必要とされています mysql-community-common(x86-64) = XXX は mysql-community-server-5.7.10-1.el6.x86_64 に必要とされています
MySQLをRPMパッケージで導入する際の依存性まわりの問題です。
RPMパッケージは、5.6と5.7でインストールすべきパッケージが違います。
5.6では
・MySQL-server ・MySQL-client ・MySQL-shared-compat
の3つですが、
5.7では
・mysql-community-server ・mysql-community-client ・mysql-community-libs-compat ・mysql-community-libs ・mysql-community-common
の5つです。
MySQL-serverとMySQL-clientはそれぞれ、
サーバ本体のプログラムと、MySQLクライアントのプログラムです。
shared-compatとlibs-compatとほぼ同じもので、
もともとCentOSやRHELに入っている、
mysql-libsやmariadb-libsとの競合を避けるためのパッケージです。
5.7の方のみ必要な、community-libsとcommunity-commonは、
libs-compatの依存性解決のために必要なパッケージです。
なので、インストールすべき手順の解としてはこうなります。
5.6
# rpm -Uvh MySQL-shared-compat-5.6.28-1.el6.x86_64.rpm # rpm -ivh MySQL-client-5.6.28-1.el6.x86_64.rpm # rpm -ivh MySQL-server-5.6.28-1.el6.x86_64.rpm
5.7
# rpm -Uvh mysql-community-libs-compat-5.7.10-1.el6.x86_64.rpm mysql-community-libs-5.7.10-1.el6.x86_64.rpm mysql-community-common-5.7.10-1.el6.x86_64.rpm # rpm -ivh mysql-community-client-5.7.10-1.el6.x86_64.rpm # rpm -ivh mysql-community-server-5.7.10-1.el6.x86_64.rpm
shared-compat、libs-compatはオプションがUvhであることに注意してください。
MySQLが起動しない系
まず、MySQLが起動しない時は、MySQLエラーログを見ます。
(OSログをみてもほとんどの場合、何も記載はありません)
エラーログはデフォルトでは、
5.6で/var/lib/mysql/(ホスト名).err
5.7で/var/log/mysqld.log
に作成されています。
変更している可能性がある場合は、/etc/my.cnfなどを見てみてください。
そこにでているエラーによって、対処を考えます。
データディレクトリの権限がおかしい
★このメッセージが出たら怪しい!★
MySQL起動時に
Starting MySQL...The server quit without updating PID file (/var/lib/mysql/default.pid). [失敗]
MySQLエラーログに
/usr/sbin/mysqld: File './auto.cnf' not found (Errcode: 13 - Permission denied)
データディレクトリは、OSのmysqlユーザが書き込みできる権限が必要です。
データディレクトリの権限を確認してください。
データディレクトリはデフォルトでは/var/lib/mysqlで、
権限は正しく設定されていますが、
ここからmy.cnfにdatadirを指定して動かした場合や、
mysql_install_db、mysqld –initializeなどによって、
データディレクトリを再作成した場合などにハマる可能性があります。
解決は下記コマンドでOKです。
# chown -R mysql:mysql /var/lib/mysql
socketファイルを参照できない
★このメッセージが出たら怪しい!★
MySQL起動時に
Starting MySQL...The server quit without updating PID file (/data/mysql/default.pid). [失敗]
MySQLエラーログに
[ERROR] Can't start server : Bind on unix socket: Permission denied
OSのmysqlユーザがソケットファイルを作成できないのが原因です。
MySQLではローカルマシン内でのMySQLサーバとの通信にはソケットファイルを使います。
これはMySQL起動時に、サーバパラメータ「socket」に従った場所に作られるのですが、
これが作れないとこのようなエラーがでてMySQLが起動できません。
デフォルトの位置は/var/lib/mysql/mysql.sockであり、
これはデータディレクトリを別の場所に指定しても従属して変更はされません。
ですので、データディレクトリを変更していようがいまいが、
/var/lib/mysqlディレクトリに対してmysqlユーザの書き込み権限を与えるか、
「socket」パラメータにmysqlユーザが書き込みできるディレクトリを指定する必要があります。
多重起動
★このメッセージが出たら怪しい!★
MySQL起動時に
mysqld_safe A mysqld process already exists
MySQLが既に起動しているのに、重ねて起動しようとした場合に起こるエラーです。
ps コマンドで確認すれば、MySQLがすでに起動しているはずです。
意図せずMySQLが起動しているのであれば、
# pkill mysqld
で停止できます(もちろん、PIDを確認して、killコマンドで停止しても問題ありません)。
killでMySQLを停止させるのは乱暴なようですが、
serviceコマンドを使っても結局は内部的に同じことをしているので、
killでの停止でも全く問題はありません。
ちなみに、MySQLを同一サーバで多重起動させる方法はあります。
通信を待ち受けるポート(デフォルト:3306)と、ソケットファイルと、データディレクトリを別個に用意して、port、socket、datadirを別のものに指定すればOKです。
ただし、リソースはそれぞれ排他的に使うので、
検証以外ではあまり用途はないと思います。
操作できない系
MySQL初期パスワードがわからない
★このメッセージが出たら怪しい!★
MySQL接続時に
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
RPMでMySQLデータベースを作成すると、初期パスワードが設定されています。
(5.6でのmysql_install_db、5.7でのmysqld –initializeでは設定されていません)
このパスワードは、5.6と5.7で確認の方法が違います。
5.6では、ユーザのホームディレクトリ直下に隠しファイル.mysql_secretとして作成されています。
5.7ではエラーログに記載されています。
このような文言がエラーログの最初のほうにあるはずです。
[Note] A temporary password is generated for root@localhost: pzb1wF>_/ixC
初期パスワード変更
★このメッセージが出たら怪しい!★
MySQL接続後、なにかコマンドを実行した時に、
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
MySQLの初期パスワードは、変更しないと一切のオペレーションができなくなっています。
これも5.6と5.7で記法が違います。
5.6
mysql> set password for 'root'@'localhost'=password('hogehoge');
5.7
mysql> set password for 'root'@'localhost'='hogehoge';
5.6まではパスワードの指定にpassword()関数でハッシュ化する必要がありましたが、
5.7ではMySQL側で勝手にやってくれるようになりました。
パスワードポリシー
★このメッセージが出たら怪しい!★
MySQLのパスワードを変更しようとした時に
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
MySQL5.7では、デフォルトインストールした際にパスワードポリシーが定められるようになりました。
・大文字小文字を含める
・記号を含める
・数字を含める
・8文字以上
の4つ全てを満たす必要があります。
このポリシーの制限を外すこともでき、
validate_passwordというプラグインをアンインストールすればOKです。
mysql> uninstall plugin validate_password;
ユーザ権限不足
★このメッセージが出たら怪しい!★
JAVA等、アプリ側のエラーで下記SQLExceptionがスロー(下記はJAVAの例)
java.sql.SQLException: Access denied for user 'hoge_user'@'192.168.2.221' (using password: YES)
MySQLではユーザ名と接続元をセットにして1つのユーザとしてみなしています。
例えば、デフォルトで存在する「root@localhost」は、
rootという名前でlocalhostから接続してくるユーザ、
ということです。
なので、DB以外のサーバ(APサーバなど)から接続する場合は、
こんなユーザがまず必要です。
ユーザ名@APサーバのIP
ユーザの作成は、grant文で権限を付与するのと同時に行えます。
mysql> grant select, insert, delete, update on world.* to 'hoge_user'@'192.168.2.%' identified by 'hoge_user';
on world.*の部分は、
「worldデータベース(=スキーマ)の全てのテーブル」
を意味します。
192.168.2.%は、
「192.168.2.0のネットワーク全て」
です。
ユーザ一覧は、
# select user, host from mysql.user;
権限は、
# show grants for 'hoge_user'@'192.168.2.%';
で確認できます。
まとめ
MySQLを使ったことない方が引っかかりそうなところをとりあえずまとめてみました。
ものによっては5.7からのものもあるので、
MySQLに慣れている方でも多少は参考になるかもですね。
MySQLは手軽に使えるRDBMSという点では随一のものだと思うので、
是非積極的に使ってみてほしいです。
では。