無効なデータベースが選択されました というエラー。自分は以下がでました
incorrect database name '#mysql50#.ssh' when selecting the database
で、実際データベース一覧見てみてもこいつがいます。なんだこれ
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| #mysql50#.ssh | <- これ
| mysql |
| performance_schema |
| test |
+--------------------+
原因
mysqlのディレクトリの中にディレクトリを作ると、データベースと誤認されてこれがでます。
私の場合は .ssh
ですね。
$ ls -la /var/lib/mysql/
...
drwx--x--x. 2 mysql mysql 4096 Jun 20 2017 mysql
srwxrwxrwx 1 mysql mysql 0 Dec 9 13:00 mysql.sock
drwx------. 2 mysql mysql 4096 Jun 20 2017 performance_schema
drwxr-xr-x 2 mysql mysql 4096 Dec 23 11:28 .ssh
drwxr-xr-x. 2 mysql mysql 4096 Jul 3 2017 test
.ssh
ディレクトリがあります。そういえば作りました。これをなんとかしないといけません。
mysqlのディレクトリがどこにあるかわからない場合は、 SHOW VARIABLES LIKE 'datadir';
を実行することで場所がわかります
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
対処法
3つあります。
1. 消す
これがあるからデータベースと誤認されているわけです。消していいならしまいましょう
ただ、できた原因とかわかってないとまだ出来上がる可能性はあります。
rm -rf /var/lib/mysql/.ssh
2. このディレクトリを無効化する
my.cnf
に、このディレクトリを無効化してという記述をすることで無視できるようになります。
vi /var/lib/mysql/my.cnf
ignore-db-dir='.ssh' <- これを追記
再起動して読み込ませ、一覧から消えればOK
$ /etc/init.d/mysqld restart
3. クエリを見直す
このエラーがでるクエリを発行しているということは、そのディレクトリを見に行ってしまうようなクエリを書いているということです。
僕の場合は以下のクエリを使ってパーティションの確認をしようとしてエラーが出ました。
SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS;
これでなんで見てしまうかというと、条件として TABLE_SCHEMA
を指定していなかったのでそれが原因でした。
見たいテーブルだけ指定してあげます
SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'test';
これで .ssh テーブルを見に行かなくなるのでエラーは消えました
1番は消していいものかの精査が必要
2番は再起動が必要(本番稼働サービスなどはやりたくない)
3番はクエリによる
とのことで、どの解決方法がいいか考えて適宜使っていくのがいいと思います。