私は、mysqlのデフォルトのインストールですべてのデータベースファイルを/var/lib/mysql
に配置するWebサーバーを持っています。 /var
がマウントされているパーティションには2GBのスペースしかないので、スペースで問題が発生した後、mysqlのデータディレクトリを再配置することにしました。
私の素朴なアプローチは、/var/lib/mysql
ディレクトリを完全に/web/dbs/mysql
にコピーし、/etc/mysql/my.cnf
を変更して、
datadir = /web/dbs/mysql
しかし、再起動後、mysqlエラーログに次のエラーが表示され、サーバーが起動しません。
130130 9:59:23 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
130130 9:59:23 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
130130 9:59:23 InnoDB: Initializing buffer pool, size = 8.0M
130130 9:59:23 InnoDB: Completed initialization of buffer pool
130130 9:59:23 InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.
すべてのファイルとディレクトリはmysql:mysql
に属しています。テストのために、今のところ/web/dbs/mysql
のアクセス権をrwxrwxrwx
に変更しました。
そして、はい、/web/dbs/mysql/mysql/plugin.frm
は存在します。
ここで何が問題になるのでしょうか?何か不足していますか?利用可能なより詳細な出力ログはありますか?
更新:
その他の情報:
次のコマンドですべてを再試行しました:
stop mysql
rm -r /web/dbs/mysql
cp -p -r /var/lib/mysql/ /web/dbs/
を使用してコピーしましたdatadir = /web/dbs/mysql
に設定します特権:
drwxr-xr-x 4 mysql mysql 34 2013-01-30 15:55 /web/dbs
drwx------ 19 mysql mysql 4096 2013-01-30 15:44 /web/dbs/mysql
drwx------ 2 mysql mysql 4096 2012-10-11 11:25 /web/dbs/mysql/mysql
-rw-rw---- 1 mysql mysql 8586 2012-08-14 19:15 /web/dbs/mysql/mysql/plugin.frm
Datadirをdatadir = /var/lib/mysql
にリセットすると、サーバーは問題なく起動します。
以下を試しました:
root:/# su - mysql
mysql:~$ /usr/sbin/mysqld --verbose
130130 16:01:05 [Warning] Can't create test file /web/dbs/mysql/s15800994.lower-test
130130 16:01:05 [Warning] Can't create test file /web/dbs/mysql/s15800994.lower-test
mysql:~$ touch /web/dbs/mysql/s15800994.lower-test
mysql:~$ ls -l /web/dbs/mysql/s15800994.lower-test
-rw-r--r-- 1 mysql mysql 0 2013-01-30 16:01 /web/dbs/mysql/s15800994.lower-test
したがって、データディレクトリは正しく設定されます。 mysqlユーザーは書き込みアクセス権を持っていますが、mysqlプロセスはファイルを作成できません。
何が悪いのでしょうか?
完全を期すための完全な回答としてコメントで得た解決策を追加しています...
Su/Sudoを使用したテストでは、mysqldがアクセス権エラーについて不平を言っているのに対し、mysqlユーザーは実際にフォルダーに正常に書き込むことができ、これがファイルシステムのアクセス権の問題ではないことを明らかにしました。 (同様の問題に直面した場合に役立つ最初のステップ)
Linuxの一部のディストリビューション(すべてではないにしても?)には、実行可能ファイルへのアクセスを許可するファイル/フォルダーを制限するAppArmorが付属しています。
この場合の解決策は、/etc/apparmor.d/usr.sbin.mysqld
ポリシーファイルに新しいパスを単に追加することでした。
ほとんどのrpmベースのlinuxでselinuxが表示されるため、seLinuxのAppArmor検索がない場合。無効にしてください。
#setenforce 0
#getenforce
Getenforceコマンドは、パーマシブになります。