内容は2020年6月のものです。
Mac OS Catalina(10.15)にアップデートしたら起きた問題。外付けディスクに割り当てていたローカル環境へアクセス権限がないとのことで、ドキュメントルートが forbidden(アクセス不可)になってしまいますた。
原因 - User Consent
原因は、Mac OS Catalina で強化された User Consent とかいうプライバシー保護のためのセキュリティ機能らしく、アプリケーションが外部ディスクや共有フォルダにアクセスする際にユーザーの承認が必要になる、というものだというのがわかりました。
実際に、Photoshop などのアプリでも、外付けディスクのファイルを開こうとすると「Photoshopがリムーバブルボリュームにあるファイルにアクセスしようとしています」と出だしました。Mac も Adobe も20何年使ってるけど、マシンが速くなる代わりに雑用は増えていく一方なのでメンドイです。
解決 - フルディスクアクセスを許可
「システム設定 › セキュリティとプライバシー › プライバシー › フルディスクアクセス」から、アプリケーションに権限を与えます。
システム設定を開いて「セキュリティとプライバシー」へ移動。
「プライバシー」のタブから「フルディスクアクセス(Full Disc Access)」へ移動。左下の鍵を解除する。
今回はローカルのサーバ環境なので、+ボタンで 'httpd' を追加。
'httpd' と検索するか、不可視ファイルを表示できる状態であればFinderからアイコンをドラッグ。httpd へのパスは httpd.conf の ServerRoot のとおり。
フルディスクアクセスの下にある「ファイルとフォルダ」を見ると 'httpd' が追加されているのが確認できる。
最初うまく行かなかったけど再度試したら無事アクセスできるようになりやんした。
終わったらターミナルで Apache をリスタート。
sudo apachectl restart
おまけ - Time Machine から復帰させた MySQL が使い物にならない
その後の問題は、アップデート時に不具合を起こしたため MySQLを Time Machine から復元させたら全く使い物にならなかったこと。
WordPress で接続エラーが起きて、phpMyAdmin ではユーザーがうまく読み込めてなかったりデータベースを作り直そうにも削除できなくなったり、地味に時間を取られた。
新しいバージョン5.7をインストールすると問題の切り分けができない、というよりやってみたけどログインで問題が起きて先へ進めなくなって面倒だったので、とりあえず当時のバージョンの5.6.26を探してインストール。
テーブルを読み込めないので権限を変更
sudo chown -R mysql:mysql /usr/local/
mysql-5.6.41...
ログ見てもよくわからんのですが、破損っつかコピーしてきたろってことでしょうか。
2018-09-18 08:44:18 7fffab87f380 InnoDB: Error: page 4 log sequence number 13765065630
InnoDB: is in the future! Current system log sequence number 1626067.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: for more information.
ググっていて一番最初見つけた対策
my.cnf で innodb_force_recovery に 値を設定する
でも治らず。
いろんな方のブログで、データフォルダにある.ibdのファイルが整合性取れてなくてエラーになるっぽいことはわかったけどこのファイルを全削除しても、起動するようにはなったもののテーブルが空のままだったので、結果オフィシャルにあるマニュアルを参考に。
MySQL MySQL 5.6 リファレンスマニュアル 14.6.2 別のマシンへの InnoDB テーブルの移動またはコピー
このページの 「.ibd ファイルの移植性に関する考慮事項」の作業行っただけでOKでした。
要は.ibdを削除した上で新たに正しい.ibdを作るだけ。
ただしループで回さないといけないくらい大量だったのでPHPでターミナルに貼り付ける命令文テキストを作るようにしますた。
<?php
// テーブルのファイル一覧をコピペ
$files ='
mywp_aiowps_events.frm
mywp_aiowps_events.ibd
~
mywp_users.frm
mywp_users.ibd
';
// 拡張子の除去
$files = str_replace(array('.frm','.ibd'), array('',''), trim($files));
// .frm と .ibd をいっぺんに変数に入れると2回同じ命令文を作ってしまうので重複する値を排除する
$files_array = array_unique(explode("\n", $files));
// ターミナルに貼り付けるための命令文を書き出す
foreach( $files_array as $file ) {
// 古い ***.ibdを削除
echo sprintf( 'ALTER TABLE %s DISCARD TABLESPACE;<br />', $file );
// 新たに.ibdを作る
echo sprintf( 'ALTER TABLE %s IMPORT TABLESPACE;<br />', $file );
}
Mac の Finder でデータフォルダを開いたうえで各テーブルのファイルを選択してコピー(テキストが要求される場面ではファイル名を改行で区切った文字列を取得できる)、これを変数に入れて処理。フォルダ内を読むとかでもいいけど一時的なものなのでこれで十分やと思います。