sql >> データベース >  >> RDS >> Mysql

データベースバックアップスクリプトがPHPで機能しないのはなぜですか?

    これは、データベースが単なるおもちゃのデータベースであり、「hello world」スクリプトに相当する場合を除いて、データベースをSQLスクリプトとしてバックアップするためには機能しません。

    そのスクリプトはぞっとします。データベースのバックアップには使用しないでください。そのスクリプトは以前に投稿されています:PHPデータベースダンプスクリプト-問題はありますか?

    • mysql_connect()またはmysql_queries()の後にエラーチェックはありません。おそらく間違ったパスワードなどを入力しただけですが、スクリプトが接続が成功したことを確認しないため、わかりません。

    • データベースにNULLが含まれている場合、正しいINSERTステートメントは生成されません。

    • 文字セットは処理されません。

    • addlashes()は適切ではありません データをエスケープするため。

    • テーブル名は区切られていません。

    • ビュー、プロシージャ、関数、またはトリガーをバックアップしません。

    • mysql_query()は結果をバッファリングするため、数千行以上のテーブルがある場合は、PHPのメモリ制限を超えます。実際、スクリプトは一連のINSERTステートメントを単一のPHP変数に連結します。したがって、終了する前に、全体があります。 メモリで表されるデータベース。

    誰もそのスクリプトを使用しないでください。 それはまったくのゴミであり、私はそれを軽くは言いません。

    shellexec()を使用してmysqldumpを実行するだけです。

    @ÁlvaroG。Vicarioには良い点があります。このタスクに、PHPを使用する必要はありません。 PHPスクリプトからバックアップを作成する必要があると想定していました。 cronスクリプトからバックアップを作成する方法は次のとおりです。

    シェルスクリプトを作成します。たとえば、任意の名前を付けることができます。 mymysqldump.sh。これが私がそれを書く方法です:

    :
    : ${BACKUP_HOST:="localhost"}
    : ${BACKUP_DATABASE:="mydatabase"}
    : ${BACKUP_DIR:="/opt/local/var/db/mysql5/backups"}
    : ${BACKUP_FILE:="${DATABASE}-`date +%Y%m%d%H%M%S`"}
    
    mysqldump -h ${BACKUP_HOST} ${BACKUP_DATABASE} > ${BACKUP_DIR}/${BACKUP_FILE}
    

    もちろん、環境に応じて変数の値をカスタマイズしてください。

    ユーザー名とパスワードがないことに気付くかもしれません。 このファイルで。誰もがパスワードを読めるように、パスワードをプレーンテキストのスクリプトに入れないでください。代わりに、それらをオプションファイルに入れて、より安全にします。

    cronからバックアップを実行する特別なオペレーティングシステムユーザーを作成します。システムには、MySQLサーバーを実行するための特別なユーザー「mysql」または「_mysql」がある場合がありますが、このユーザーは有効なホームディレクトリを持たないように構成されている場合があります。ホームディレクトリを持つユーザーが必要です。それを「mybackup」と呼びましょう。

    そのユーザーのホームディレクトリの下に、ファイル.my.cnfを作成します。 次の内容で:

    [mysqldump]
    user = alupto_backup
    password = xyzzy
    

    ここで、「alupto_backup」と「xyzzy」はMySQLのユーザー名とそのパスワードです(ご使用の環境に合わせて変更してください)。このファイルの所有権とモードを設定して、その所有者だけがファイルを読み取れるようにします。

    chown mybackup .my.cnf
    chmod 600 .my.cnf
    

    このユーザーのホームの下にbinディレクトリを作成し、シェルスクリプトをその中に配置します。

    mkdir ~mybackup/bin
    mv mymysqldump ~mybackup/bin
    

    これで、シェルスクリプトを実行してテストできます:

    sh ~mybackup/bin/mymysqldump
    

    次に、このユーザーのcronファイルを作成します:

    crontab -u mybackup
    
    @daily ~mybackup/bin/mymysqldump
    

    それでいいのです。



    1. Connect DATABASEエラータイプ:2002:アクセスが拒否されました

    2. 複数のデータベースに付与します。 MySQL

    3. Sequelizeに単一のテーブル名を使用させる方法

    4. SQL Server(T-SQL)のデータベースメールアカウントのリストを取得する