• 締切済み

mysqlの自動バックアップ

crontabを実行してmysqlのバックアップを取ろうとしています。 まず、以下のunixコマンドでバックアップできることを確認しました。 mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql これをcrontabで実行するためにphpファイルにして以下のように記述しました。 <?php $output = shell_exec('mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql'); echo "<pre>$output</pre>"; ?> このファイルを実行すると以下のメッセージが返されます /***/sql_backup.php: line 1: ?php: そのようなファイルやディレクトリはありません /***/sql_backup.php: line 2: syntax error near unexpected token `(' /***/sql_backup.php: line 2: `$output = shell_exec('mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql');' phpでコマンドを実行するにはshell_execを使うとあり、試してみたのですが、こういう方法では使えないのでしょうか? 最終的にはcrontabを使ってmysqlのバックアップが取れれば良いので、他に方法があるようでしたら教えて頂ければ助かります。 宜しくお願いします。

  • PHP
  • 回答数5
  • ありがとう数0

みんなの回答

回答No.5

まずphpが置いてあるパスを確認しましょう which php を打ってみてください。 そして例えば、 /usr/bin/php と表示されたらこれを覚えておいて自作のphpファイルと併せて次のように打ってみましょう /usr/bin/php /home/user/appli/bin/backup.php これで動くのではないでしょうか

回答No.4

> それ以前に、telnetからパスをたたいて実行しようとしていて 具体的にどういうふうにたたいていますか その1行をよろしければ省略せずに示して頂けますか

bacchus047
質問者

補足

ファイルの置いてあるパスを指定しています。 /home/user/appli/bin/backup.sh /home/user/appli/bin/backup.php といった形です。

回答No.3

phpスクリプトのつもりで作ったものが残念ながらbash等のシェルスクリプトと して解釈されているようです。 仮にphpのパスが/usr/bin/phpでphpファイル名がbkup.phpだとするなら /usr/bin/php bkup.php とすれば動くんじゃないでしょうか

bacchus047
質問者

補足

/var/spool/cron/userでは同様の設定をしているのですが.... それ以前に、telnetからパスをたたいて実行しようとしていて、上記のような症状が出ています。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

そもそもphpとして実行されていませんね。お使いのサーバでのcronの書き方は確認されていますでしょうか? つまり「拡張子が.phpであればcronでphpスクリプトとして実行される」ことは確認されていますか? シェルスクリプトにして、 #!/bin/sh /usr/local/bin/php (phpスクリプトのサーバパス) などと書かないといけない環境などもありますので。 >最終的にはcrontabを使ってmysqlのバックアップが取れれば良いので、 phpで書く必要がなければ、単にshellで #!/bin/sh mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql でもいいのでは? なお「#!/bin/sh」が必要なのかどうか(またshell名が妥当か)はサーバの仕様を確認してください。

bacchus047
質問者

補足

ありがとうございます。 #!/bin/sh mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql をbackup.shとして保存し実行できました。 が、/var/spool/cron/user 側の設定がわかりません。 0 1 * * * のように起動時刻を設定した後、backup.shへのパスを書くだけでは実行できないようです。

回答No.1

phpを経由させずにcrontabに直接mysqldumpを記述するのでは駄目なのでしょうか?

bacchus047
質問者

補足

今、試している所ですが、/var/spool/cron/user の書き方がわかりません。

関連するQ&A

  • PHPからMySQLのバックアップをとるには?

    レンタルサーバのLinux+PHP4.2.1+MySQL3.23.42の環境で行っております。 HTML(PHP)フォームから、「バックアップ」ボタンが押されたときに、 MySQLのバックアップをとる(mysqldump)するプログラムを作りたいのですが、 mysqldumpコマンドは、SQLとしてクエリ送信できるのでしょうか? 例えば、 $strSQL = "mysqldump -u **** -p**** DB名 テーブル名 > dumptest.bak"; mysql_db_query($strSQL); のような感じでは、成功しませんでした。 mysql("DB名","mysqldump -u **** -p**** DB名 テーブル名 > dumptest.bak"; さらに、このような方法もあるみたいですが、 エラーも起こらないしdumpもされませんでした。 phpMyAdminなどは、どうやって実行しているんでしょうね。。。 知っている方がいましたら、是非ご教授くださいませ。

    • ベストアンサー
    • PHP
  • cronでAmazon RDSのバックアップ

    以下のようなスクリプトをcron起動で実行し、Amazon RDS上のMySQLデータベースのバックアップを取ろうとしています。 ---------------------------------------- #!/bin/sh MYSQLDUMP=/usr/local/bin/mysqldump BACKUPDIR=/home/backup DATE=`/bin/date +%F` $MYSQLDUMP -u xxx --password="yyy" --host=mysqlsdb.zzz.rds.amazonaws.com --ssl-ca=mysql-ssl-ca-cert.pem xxx > $BACKUPDIR/xxx_$DATE.sql gzip $BACKUPDIR/*_$DATE.sql find $BACKUPDIR -mtime +7 -exec rm -f {} \; ---------------------------------------- コマンドでスクリプトを実行すると正常に実行されるのですが、cron起動で実行されると、dumpファイルは作成されるのですが、中身が空になります。 cronだと動かないというケースはよく見るのですが、今回の場合、スクリプトが実行されているようです。 何がいけないのでしょうか?

  • mysqldumpでの文字化けに関して教えてください。

    WindowsXPにMySQL4.1.15-nt,Apache2.0.55,PHP5.05をインストールしてプログラムを作りました。 MySQLのインストール先: C:\Program Files\MySQL\MySQL Server 4.1 MySQLにはEUCでデータが格納されています。mysqldumpで同一のWindowsXPへダンプしたところそのファイルを開くと文字化けしていました。以下を試しましたが解決しませんでした。 (1) shell> mysqldump -u userneme -p database > c:\backup.sql 秀丸で開くとUTF-8で開かれEUCで読み直しても解決しませんでした。 (2) shell> mysqldump default-character-set=ujis -u userneme -p database > c:\backup.sql 秀丸で開くとShift_JISで開かれEUCで読み直しても解決しませんでした。 (3)mysql.iniに末尾に下記を追加しましたが、解決できませんでした。 [mysqldump] default-character-set=ujis 将来的にはレンタルサーバー上で利用したいと思いPHPからMySQLへの格納をEUCにしました。 ダンプが文字化けをして大変困っています。なにか手がかりでもご教授いただければと思っています。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • cronでバックアップsh

    現在、hetemlというレンタルサーバでバックアップ用のシェルをcron登録しているのですが、 権限エラーが出てしまいます。何の権限エラーなのか解らないのですが、 どなたかご存知ないでしょうか? [エラーメッセージ] /bin/sh: /home/sites/heteml/users/xxx/db_bakkup.sh: Permission denied [シェル] #!/bin/sh # ---------- 設定 ---------- # バックアップ元のデータベース db_host=xx db_name=xx db_user=xx db_pass=xx # バックアップ先のディレクトリ・ファイル bk_file=/xx/bak.sql # ---------- ファイル名を設定 ---------- # ファイル名を設定 file_temp=$bk_file.sql # ---------- バックアップ処理 ---------- # バックアップ先のディレクトリに移動 cd $bk_dir if [ $? != 0 ]; then echo "Backup directory does not exist." exit 1 fi # データベースをダンプ mysqldump -h$db_host $db_name -u$db_name -p$db_pass --opt > $bk_file if [ $? != 0 -o ! -e $file_temp ]; then echo "Cannot dump database." exit 1 fi exit 0 ------------------------------------ 有識者の方、ご教授お願い致します。

  • cronでGPGが使えない

    次のようなデータベースをバックアップするシェルスクリプトを作成しました。 #! /bin/sh BACKUP_DIR=/home/backup FILE_NAME=testdb`date +%Y%m%d`.sql mysqldump -udumpuser -pパスワード testdb > ${BACKUP_DIR}/${FILE_NAME} gpg -r ○○@○○ -e ${BACKUP_DIR}/${FILE_NAME} rm -rf ${BACKUP_DIR}/${FILE_NAME} sqlbackup.shと名前を付けてrootで実行してみたところ問題なくバックアップできました。 しかし、/etc/crontabに 0 0 * * * root /bin/sqlbackup.sh と記述して実行してみたところ gpg: ○○@○○: skipped: public key not found となってしまいました。 rootで「gpg --import」で○○@○○の公開鍵をインポートし、「gpg --edit-key」で信頼度をI trust ultimatelyにしています。 どのような原因が考えられますでしょうか。 よろしくお願いいたします。

  • crontabでDBのバックアップについて

    OS:Redhat ES 2.1 DB:PostgreSQL7.2 という環境のパソコンを2台(A,B)を用意し、 日常業務ではAを更新していき、 深夜にAの内容をBにバックアップする。 といった処理を構築しております。 backup.shというシェルで、 BからAにssh接続し、PostgreSQL内のDBの ダンプを書き出し、 rsyncでダンプファイルをBへコピーし、 B内でリストアするという処理です。 シェルファイルを直接実行した場合は、 問題なく動作するのですが、 crontabに登録して実行させると、 rsyncまでは動作しているのですが、 データベースへのリストアで処理が止まってしまい、 うまくリストアできません。 /etc/crontabファイル内のPathに、 /usr/local/pgsql/binとPostgreSQLのパスも 追加しているのですが、うまく動作せず、 なにが原因かよくわかりません。 ご教授願います。

  • データベースのバックアップについて教えて下さい

    業務でMYSQLのDBバックアップを取りたいと思いインターネットで調べ、mysqldumpコマンドを利用する事にしました。 但し業務の関係上、musqldumpコマンド中にもDBへの書き込みが発生してしまう場合があります。 そこでお聞きしたいのですが、mysqldumpコマンドを実行中のDBへの書き込みは、バックアップ後のダンプファイルへ正常に反映されるのでしょうか。それとも全く反映されないのでしょうか。 ちなみに環境は、RHEL4とMYSQL4.1.2、バックアップ対象のDBは2つあります。片方のDBのテーブルはMyISAM型オンリー、もう一つのDBは逆にInnoDBオンリーです。

    • ベストアンサー
    • MySQL
  • Linux環境下(CentOS)でPostgreSQL8.1の自動バックアップを取りたいのですが、四苦八苦しています。

    Linux環境下(CentOS)でPostgreSQL8.1の自動バックアップを取りたいのですが、四苦八苦しています。 rootユーザにてcrontab -eで【10 0 * * * pg_dump -U postgres hogeraradb > /home/backupuser/backup.sql】と入力し保存しました。 しかし実際にバックアップが取れているのかなど確認の方法もわからず困っています。 思いつく範囲ではpg_dumpの設定も必要なのかも知れないのですが、どの画面で何を入力すればいいのかもわかりません。 何かアドバイスをよろしくお願いします。

  • PHPからcronを編集したい

    ブラウザから時間を指定してリクエストを投げると下記PHPを実行するプログラムがあります。 shell_exec("echo {$pass} | sudo -S sh -c 'cat {$root_dir}/craw/crontab.txt > /var/spool/cron/crontabs/{$cron_user}'"); shell_exec("echo {$pass} | sudo -S chown {$cron_user}:crontab /var/spool/cron/crontabs/{$cron_user}"); shell_exec("echo {$pass} | sudo -S chmod 600 /var/spool/cron/crontabs/{$cron_user}"); 実行はちゃんと行われて、/var/spool/cron/crontabs/userの中身もちゃんと期待したとおりに変更されています。 しかし、いくら待っても登録したjobが実行されることはありません。(/var/log/syslogを見ても実行された形跡はありません) shell_exec("echo {$cron_pass} | sudo service cron restart"); を付け加えてみても結果は同じでした。 crontab -eで編集→保存とするとちゃんと反映されるようです。 どのようにすればPHPからcronを登録できるでしょうか。 よろしくお願い致します。

  • PHPでMySQLのテーブルをダンプする

    宜しくお願いします。 ※PHP5、 MySQL5、 Win7、 ローカル環境 本番環境(公開レンサバ)上では、cronを使って、自動的にバックアップを取ろうとしています。 1つのデーターベースのなかに、 10個のテーブルがあります。 テーブル別にダンプしたく思います。 そこで下記のPHPスクリプトを考えています。 しかし、ダンプ処理は行われているが(ファイルは出力されているという意味。成功していない)、 テーブル別に処理が進んでいるようではなく、 しかも、 INSERT文や、そもそもテーブルに格納されている値がSQLで書き出されていません。 まったく空白ということではないのですが・・・。※出力されたテキストは書き参照 ※テーブル名($db[$i]に格納されている)ごとにループ処理していますが、そこは省略して書きます。 $fileName = $db[$i]."-".$now.".sql"; $cmd = "D:/xampp/mysql/bin/mysqldump ".$dbName.".".$db[$i]." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$BackPath.$fileName; if (system($cmd)) ErrorOut("次のコマンド実行でエラーになりました。$cmd"); --------------出力されたテキスト------------------------- ▼ -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32) -- -- Host: localhost Database: ここは「データーベース名.テーブル名」が記載されています。 -- ------------------------------------------------------ -- Server version 5.1.41 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; ▲ ---------------------------------------------- 今自分のなかで思いつく原因は、 $cmd = "D:/xampp/mysql/bin/mysqldump ".$dbName.".".$db[$i]." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$BackPath.$fileName; の中の、 ".$dbName.".".$db[$i]." という記述で、  ここは、データーベース名とテーブル名を取得したく、このように書きましたが、 正直 適当です。調べまくりましたが見つからず・・・・。 どなたか、PHPで、mysqldumpを使い、テーブル別にダンプさせる書き方を教えてください。 宜しくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう