MySQL データディレクトリのパーミッション設定とかの話
知っている方にはどうでもいい情報なのですが、例えばMySQLのレプリケーションスレーブを作成する際に、mysqldumpからのダンプファイルを、リストアする・・なんていうのがどうしようもなくめんどくさい人は、データディレクトリ丸ごとスレーブサーバに転送してレプリケーションスレーブサーバを構築するのだと思いますが、その際のパーミッションには注意をお願いしますね。という話です。
▼パーミッションがおかしいの何がどうなるのか? ・こんなエラーが出たりします [shell] InnoDB: The error means mysqld does not have the access rights to InnoDB: the directory. InnoDB: Error: could not open single-table tablespace file InnoDB: ./crmdb/vv_mysql_indexes.ibd! InnoDB: We do not continue the crash recovery, because the table may become InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it. InnoDB: To fix the problem and start mysqld: InnoDB: 1) If there is a permission problem in the file and mysqld cannot InnoDB: open the file, you should modify the permissions. InnoDB: 2) If the table is not needed, or you can restore it from a backup, InnoDB: then you can remove the .ibd file, and InnoDB will do a normal InnoDB: crash recovery and ignore that table. InnoDB: 3) If the file system or the disk is broken, and you cannot remove InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf InnoDB: and force InnoDB to continue crash recovery here. 120313 12:22:50 mysqld_safe mysqld from pid file /var/lib/mysql/dbcrmh01..pid ended [/shell] ・あと、仮にサービスが再開できたとしても・・ テーブルがあるのに、存在しないとかわけのわからんエラーがでます(not exist!)
▼作業の前提とか・・ ・サーバを停止できるものであれば・・・ 例えばサーバを停止できるのであれば、やっぱりとめちゃったほうが安全かと思うのです。今回の例では、マスターデータベース停止した際のデータディレクトリをまんまるスレーブサーバに転送してレプリケーションを構築する例です。。あ・・レプリケーションの話にはまったく触れません。。
▼ オーナ・パーミッションの変更作業 下記例では、MySQL5.5のrpm版をベースに書いてます。またデータディレクトリは、/var/lib/mysql です。 ・サービスの停止 mysqlサービスはとめておいてください。 [shell] [root@db1 mysql]# /etc/init.d/mysql stop [/shell]
・オーナーの変更 オーナーは、全て mysql グループも mysql でかまいません [shell] [root@db1mysql]# chown -Rf mysql:mysql /var/lib/mysql [/shell]
・不要なファイルを削除します [shell] [root@db1 mysql]# cd /var/lib/mysql [root@db1 mysql]# rm -f mysql-bin. [root@db1mysql]# rm -f mysqld-slow [root@db1 mysql]# rm -f *.err [root@db1 mysql]# rm -f query.log [/shell]
・パーミッションの変更 今回の例では、スキーマ名にmyschema1,myschema2というものが存在しております。スキーマにつきましては、データディレクトリ内のサブディレクトリとして作成されます。なので、複数スキーマを構築している場合は、全てのスキーマのパーミッションを変更する必要がございます。
[shell] chmod -Rf 600 mysql/ chmod 711 mysql/
chmod -Rf 660 performance_schema/ chmod 700 performance_schema/
chmod -Rf 660 myschema1/ chmod -Rf 660 myschema2
chmod 700 myschema1/ chmod 700 myschema2/
[/shell] ・サービスの再開をします [shell] [root@dbcrmh01 mysql]# /etc/init.d/mysql start [/shell]
以上、やることはきまっているのでたいした話ではないのですが、突然このような状態になった場合、結構パニックになるので注意が必要です。