mysqldump でバックアップが取れない件から MySQL の場所とかを物凄い追求しました

以下のように mysqldump でデータベースのバックアップを取るプログラムを書いて使っていました。サーバーとかでは上手く動いていたのですが、Mac に落として使ったところ上手く動かず困っていました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function dbBackup()
{
	$finename = $_SERVER["DOCUMENT_ROOT"] . "/backup/backup_" . date('YmdHis') . '.sql';
	if(touch($finename)) {
		if(chmod($finename, 0777)) {
			$command = "mysqldump -u root --password=password database > {$finename}";
			system($command);
		} else {
			die('バックアップの取得に失敗しました。');
		}
	} else {
		die('バックアップの取得に失敗しました。');
	}
}

バックアップを実行すると、空のファイルが生成されます。悩んでいたら mac のローカルで mysql -u hoge -p って打つとどうなるかを確かめれば良いというアドバイスを頂きました。パスワードを聞かれるのか、エラーとなるのかという事です。実際に調べてみると接続すらできない、以下の様になりました。

1
-bash: mysql: command not found

これはパスが通っていないんではということで以下のコマンドで探す。

1
sudo find / -name 'mysql'

そうすると以下の結果が出てきました。

1
2
3
4
5
6
7
8
9
10
11
12
ahogemac:/ hoge$ sudo find / -name 'mysql'
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/opt/local/include/mysql5/mysql
/opt/local/lib/mysql5/bin/mysql
/opt/local/lib/mysql5/mysql
/opt/local/share/mysql5/mysql
/opt/local/var/db/mysql5/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/include/mysql5/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/lib/mysql5/bin/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/lib/mysql5/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/share/mysql5/mysql

色々出てきました。完全に自動化に頼っていたせいによって、良くわからない結果となっております。何がどうなのか分からなく、上から順番に実行していったらまずこれでログインできました。

1
/opt/local/lib/mysql5/bin/mysql --user=hoge --password=password

しかし、おそらく普段使ってる奴じゃなく、Macports で入ってるものだと思いました。そもそもの問題は mysqldump であるので、いろいろ見ていたら以下のページを発見しました。

再度検索を実行します。

1
2
3
4
5
ahogemac:/ hoge$ sudo find / -name 'mysqldump'
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/opt/local/lib/mysql5/bin/mysqldump
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/lib/mysql5/bin/mysqldump

すると以下の関数の mysqldump の部分を書き換えたら良いのではないでしょうか。おそらく Macports で MySQL などをインストールしたので、以下の Macports の方で実行したらバックアップが取れるのではないかと推測します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function dbBackup()
{
	$finename = $_SERVER["DOCUMENT_ROOT"] . "/backup/backup_" . date('YmdHis') . '.sql';
	if(touch($finename)) {
		if(chmod($finename, 0777)) {
			$command = "/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/lib/mysql5/bin/mysqldump -u hoge --password=password databasename > {$finename}";
			system($command);
		} else {
			die('バックアップの取得に失敗しました。');
		}
	} else {
		die('バックアップの取得に失敗しました。');
	}
}

推測通りバックアップを作成することができました。念のため先ほど確認したもう片方の Macports でもバックアップが取れるか試してみます。現在の私の知識ではおそらくできないと推測しています。

6
$command = "/opt/local/lib/mysql5/bin/mysqldump -u hoge --password=password databasename > {$finename}";

しかし推測は正しくなく取ることができてしまいました。この点について悩んでいた所、ちょうど echo $PATH でパスを確認してみてくださいというアドバイスを頂きましたので実行してみます。

1
2
3
4
5
6
7
8
9
10
11
12
/opt/local/bin
/opt/local/sbin
/opt/local/bin
/opt/local/sbin
/opt/local/bin
/opt/local/sbin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/usr/X11/bin

同じのがたくさん出てきました。どうやら同じパスを何度も追加しているようです。この点は今回の問題とは直接関係ありませんが、このパスを通したどこかに(具体的には /opt/local/bin 直下に)mysql がある必要があるとのことです。 この点については先程の検索結果から確認してみればあることが分かります。

1
2
3
4
5
6
7
8
9
10
11
12
ahogemac:/ hoge$ sudo find / -name 'mysql'
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/opt/local/include/mysql5/mysql
/opt/local/lib/mysql5/bin/mysql
/opt/local/lib/mysql5/mysql
/opt/local/share/mysql5/mysql
/opt/local/var/db/mysql5/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/include/mysql5/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/lib/mysql5/bin/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/lib/mysql5/mysql
/opt/local/var/macports/software/mysql5/5.1.49_0/opt/local/share/mysql5/mysql

要はここの mysql にパスを通す必要があるとのことです。ちなみに mysql5 というコマンドは実行できるとのことでしたので試した所実行することができました。

1
mysql5 --user=hoge --password=password

mysql5 で行けるのは、さっき echo $PATH した時の結果みてもよく分かりませんでした。ちなみに検索方法を間違えております。mysql ではなく *mysql* のようにワイルドカードを指定することで全ての検索結果を得ることができます。

そして中に /opt/local/bin/mysql5 を見つける事ができると思うので、シンボリックリンクを作成すれば問題が解決するとのことです。

1
2
sudo ln -s /opt/local/bin/mysql5 /opt/local/bin/mysql
mysql --user=hoge --password=password

今まで見ていた MySQL が気になる場合は下記のコマンドで調べることができます。

1
php -i

HTML で見たい場合は phpinfo() を実行した結果を見ても良いです。

1
pdo_mysql.default_socket=/var/mysql/mysql.sock

実際には mysql.sock を確認すれば良いわけです。

mysql.default_socket /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket /var/mysql/mysql.sock
pdo_mysql.default_socket /var/mysql/mysql.sock

mysql と mysqli の違いは下記のページが参考になります。

コメント

コメントは受け付けていません。