しかし、問題があります。
まず、php を実行しているユーザーは、nobody などの Apche ユーザーであり、通常、/usr/local/mysql/data ディレクトリにアクセスする権限がありません。
第 2 に、たとえアクセス許可があったとしてもでは、/usr/local/mysql/data ディレクトリ内のファイルをコピーするにはどうすればよいでしょうか? mysql の実行中はアクセスできないため、ユーザー誰も mysql サービスを停止する権限を持ちませんが、これは不可能です。
考えれば考えるほどおかしい、まずはPHPでデータベースを操作できないか、ということでphpMyadminとDiscuz!を調べてみました。コードは、笑、Discuz をコピーしました!このコードは、データベースをバックアップする次のメソッドを形成します。 (Discuz の開発者様、ありがとうございます!)
データベースのバックアップには、データベースの構造のみをバックアップする方法と、構造とすべてのデータをバックアップする方法があります。もちろん、2 番目の方法は良い方法ですが、考えられるニーズを考慮してこの方法をとっただけです。
/****** データベース構造のバックアップ ******/
/*
関数名: table2sql()
関数: テーブル構造を SQL に変換
関数パラメータ: $table: 抽出するテーブル名
戻り値: 抽出結果を返す、SQL コレクション
関数作成者: heiyeluren
*/
function table2sql($table)
{
global $db;
$tabledump = "DROP TABLE IF EXISTS $table;n";
$createtable = $db->query("SHOW CREATE TABLE $table"); create = $db->fetch_row($createtable);
$tabledump .= $create[1].";nn";
return $tabledump; >
/****** データベース構造とすべてのデータをバックアップします ******/
/*
関数名: data2sql()
関数関数: テーブル構造とデータを SQL に変換
関数パラメータ :$table:抽出するテーブル名
戻り値: 抽出結果を返す、SQL コレクション
関数作成者: heiyeluren
*/
function data2sql($table)
{
global $ db;
$tabledump = "$table が存在する場合はテーブルを削除します。";
$createtable = $db->query("SHOW CREATE TABLE $table"); >fetch_row($createtable);
$tabledump .= $create[1].";nn";
$rows = $db->query("SELECT * FROM $table") ;
$numfields = $db->num_fields($rows);
$numrows = $db->num_rows($rows);
while ($row = $db->fetch_row( $rows))
{
$comma = "";
$tabledump .= "INSERT INTO $table VALUES(";
for($i = 0; $i < ; $numfields; $i )
{
$tabledump .= $comma."'".mysql_escape_string($row[$i])."'";
$comma = "," >}
$tabledump .= ");n";
}
return $tabledump;
/****** 特定の実装操作 ******/
コードを書き出したところで、特定のプログラムでバックアップを実装する方法を見てみましょう。
/* データベースのバックアップ*/
// 注: データベース操作では phplib の DB クラスを使用します
// 保存するデータ テーブル、プレフィックス、保存場所
$tables = array('us_sort', 'us_download', 'us_article', 'us_guestbook'); // 保存するデータテーブルを定義します。
$prefix = 'us_'; // 保存される .sql ファイルのプレフィックス
$saveto = 'server' // ローカルまたはサーバー上の保存場所、デフォルトはサーバーです
$back_mode = 'all'; ; // 保存方法、データベース構造をすべてバックアップするか、のみ保存するか
$admin = 'heiyeluren' //管理者名
$admin_email = 'heiyeluren@163.com'; email
// データ保存用のファイル名を定義
$local_filename = $prefix.date('Ymd_His').'.sql"';
if (!$filename) { $filename = $db_backup_path . date('Ymd_Check_code(4) . ".sql" }
$filename = $prefix.date(Ymd_His_).".sql"; // サーバー上に保存 ファイル名
// 最後の create_check_code() 関数に注目してください。これはランダムなコードを生成する関数です。詳細は、
// http:/ を参照してください。 /www.jb51.net/article/17423.htm
//データベース構造とデータ内容を取得します
foreach($tables as $table)
{
if ($back_mode = = 'all') { $sqldump .= data2sql($table ); }
if ($back_mode == 'table') { $sqldump .= table2sql($table) }
}
// データの内容が空でない場合は保存を開始します
if(trim($sqldump))
{
// 開始情報を書き込みます
$sqldump =
"# -- ---------------------------------------------------- ----n".
"# データ テーブル バックアップ n".
"#n".
"# サーバー: $db->Hostn".
"# データベース: $db ->Databasen".
"# バックアップ番号: " . create_sess_id() ."n". // ここにセッション ID を生成する関数があります
"# バックアップ時間: ".time_to_date('',6) )."n". // 現在時刻を取得する関数です
"#n".
"# 管理者: $admin ($admin_email)n" // 管理者のユーザー名とメール アドレス
"# $copyrightn".
"# -- ----------------------------------- -------------- ----nnn".
$sqldump;
// ローカルに保存
if($saveto == "local" )
{
ob_end_clean();
header('Content-Encoding: none');
header('Content-Type: '.(strpos($HTTP_SERVER_VARS['HTTP_USER_AGENT']) MSIE') ? 'application/octetstream' : 'application/octet -stream'));
header('Content-Disposition: '.(strpos($HTTP_SERVER_VARS['HTTP_USER_AGENT'], 'MSIE') ? 'インライン; ' : 'attachment; ').'filename="' .$local_filename);
header('Content-Length: '.strlen($sqldump));
header('Pragma: no-cache' );
header('Expires: 0');
echo $sqldump;
}
// ローカルエンドに保存
// サーバーに保存$saveto == "サーバー")
{
if($filename != "")
{
@$fp = fopen($filename, "w "); $fp)
{
@flock($ fp, 3);
if(@!fwrite($fp, $sqldump))
{
@fclose($fp); 🎜>exit_msg("データ ファイルをサーバーに保存できません。ディレクトリ属性を確認してください。書き込み権限がありますか? ");
}
else
{
exit_msg("データはサーバー$filenameに正常にバックアップされました。");
}
}
else
{
exit_msg("指定したディレクトリ ". $filename ." を開けません。ディレクトリが存在するか、対応する権限があることを確認してください。"); }
}
else
{
exit_msg("バックアップ ファイル名が入力されていません。戻って変更してください。");
}
}
// 保存サーバーへ End
}
else
{
exit_msg("データテーブルにコンテンツがありません")
}
/* バックアップデータベースの終了*/
ははは、基本的にはそれだけです。次に、問題の 1 つは、データをデータベースに復元する方法です。これは複雑ではないと思いますが、両方のスレーブを満足させることができるのが最善です。クライアントとスレーブサーバーのデータ回復機能。