ホームページ > バックエンド開発 > PHPチュートリアル > PHP mysql バックアップとリカバリのボリューム処理 (データベースのインポートとエクスポート)_PHP チュートリアル

PHP mysql バックアップとリカバリのボリューム処理 (データベースのインポートとエクスポート)_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:06:37
オリジナル
976 人が閲覧しました

ボリューム処理とは、処理したいデータを小さなファイルに分割して処理することです。ここでは、mysql データベースのボリューム バックアップを実現し、バックアップ用のテーブルを選択し、単一の SQL を実現するための php mysql バックアップおよび復元ボリューム処理クラスを紹介します。ファイルとボリュームの SQL インポート。

各巻のインポートカテゴリとアイデアの詳細な説明

データベースのインポートとエクスポートはバックエンドに必要な機能です。ネットで検索するとデータベースのインポートとエクスポートについてたくさん見つかりますが、基本的には必要のないものがたくさん含まれている大規模なシステムです。独自のバックエンドの形で、他の人のものを自分のバックエンドに統合するのは好きではありません。私に必要なのは自分のものです。そこで、たくさんの参考資料を作成し、ボリュームインポートに関するクラスを作成しました。簡単に電話をかけることができます。みなさんもぜひレンガづくりをしてみてください。

ここでのボリューム ファイルは、単一 SQL ファイルとボリューム SQL インポートを実装するために「_v1.sql」で終わります。ボリューム インポートの場合、現在のボリュームを残りのボリュームにインポートするかどうかを選択できます。完了するには、クラスを直接呼び出すだけです。

//ホスト、ユーザー名、パスワード、データベース名、データベースエンコーディングです
$db = 新しい DataManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//SQL ファイル、単一の SQL のみをインポートするかどうか (つまり、他のボリュームがある場合はインポートされません)
$db->restore ( './backup/20120516211738_all_v1.sql', false ); バックアップ SQL ファイルを一覧表示する方法や SQL を選択する方法などに対応します。これはこのカテゴリに含まれていません。とてもシンプルです。

実際のデモンストレーション効果:


現時点ではデータベースのインポートのみが実装されており、データベースのエクスポートに関する関数を作成中です。

以下は完全なクラス コードです: (具体的なアイデアと実装コードについては説明されているため、ここでは詳しく説明しません)

コードは次のとおりです コードをコピー

/**
* @著者やぬえ
* @copyright 著作権 (c) 2012 www.yanue.net
* 注: ボリューム ファイルは _v1.sql で終わります
* 機能: 単一の SQL ファイルとボリュームの SQL インポートを実装します。ボリュームのインポートでは、現在のボリュームを残りのボリュームにインポートするかどうかを選択できます。 * 使用方法:
*
*
*------------------------------------------------ - -----------------
//それらは、ホスト、ユーザー名、パスワード、データベース名、データベースエンコーディングです
$db = 新しい DataManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//SQL ファイル、単一の SQL のみをインポートするかどうか (つまり、他のボリュームがある場合はインポートされません)
$db->restore ( './backup/20120516211738_all_v1.sql', false );
*------------------------------------------------ - -------------------------
​*/
クラス DataManage {
var $db; // データベース接続
var $database; // 使用するデータベース
var $sqldir; // データベースのバックアップ フォルダー

/**

  *初初期化
  *
  * @param string $host
  * @param string $ユーザー名
  * @param string $password
  * @param string $database
  * @param string $charset
 */
function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') {
$this->host = $host;
$this->ユーザー名 = $ユーザー名;
$this->password = $password;
$this->database = $database;
$this->charset = $charset;
// データベースに接続します
$this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "データベース接続に失敗しました。" );
//使用するデータベースを選択します
mysql_select_db ( $this->database, $this->db ) or die ( "データベースを開けません" );
// データベースのエンコード方式
mysql_query ( 'SET NAMES ' . $this->charset, $this->db );
}

/**
* バックアップデータをインポート
* 説明: ボリューム ファイル形式 20120516211738_all_v1.sql
*
* @param string $sqlfile
* @param bool $single
​*/
関数リストア($sqlfile, $single = FALSE) {
// ファイルが存在するかどうかを確認します
if (! file_exists ( $sqlfile )) {
exit ( "ファイルが存在しません。確認してください" );
}
$this->lock ( $this->database );
// データベースの保存場所を取得します
$sqlpath = パス情報 ($sqlfile);
$this->sqldir = $sqlpath ['ディレクトリ名'];
// サブボリュームが含まれているかどうかを確認します。_v からの 20120516211738_all_v1.sql のような別のファイルです。サブボリュームがある場合は、サブボリュームがあることを意味します
$volume = 爆発 ( "_v", $sqlfile );
$volume_path = $volume [0];
echo "プログラムが終了しないように、ブラウザを更新して閉じないでください。注意しないと、データベース構造が破損します
";
echo "バックアップ データをインポートしています。しばらくお待ちください!
";
if (空 ( $volume [1] ) || $single) {
echo "sql: '
';
// 紙の分割はありません
if ($this->_import ( $sqlfile )) {
echo "データベースは正常にインポートされました!";
} その他 {
exit (「データベースのインポートに失敗しました!」);
}
} その他 {
// サブボリュームがある場合は、現在のサブボリュームを取得し、残りのサブボリュームをループで実行します
$volume_id =explode ( ".sq", $volume [1] );
//現在のボリュームは $volume_id です
$volume_id = intval ( $volume_id [0] );
while ( $volume_id ) {
$tmpfile = $volume_path . ".sql";
// 他のボリュームが存在するため、実行を続行します
If (file_exists ( $tmpfile )) {
//インポートメソッドを実行
echo "ボリューム $volume_id: '';
If ($this->_import ( $tmpfile )) {

} 他 {
exit ( "ボリュームのインポート $volume_id: " . $tmpfile . '失敗! データベース構造が破損している可能性があります! ボリューム 1 のインポートから開始してください。 ');
}
} その他 {
echo "このボリュームのすべてのバックアップは正常にインポートされました!
";
戻る;
}
$volume_id ++;
}
}
}

/**
* SQLをデータベースにインポートします(通常のインポート)
*
* @param string $sqlfile
* @return boolean
​*/
プライベート関数 _import($sqlfile) {
$name = ベース名 ( $sqlfile );
$sqls = ファイル ($sqlfile);
foreach ( $sqls as $sql ) {
str_replace ( "r", "", $sql );
str_replace ( "n", "", $sql );
if (! mysql_query ( トリム ( $sql ), $this->db ))
false を返します;
}
true を返します;
}

//データベース接続を閉じる
プライベート関数 close() {
mysql_close ( $this->db );
}

//バックアップまたはインポート中のエラーを避けるためにデータベースをロックします
プライベート関数 lock($tablename, $op = "WRITE") {
if (mysql_query ( "ロックテーブル " . $tablename . " " . $op ))
true を返します;
それ以外
false を返します;
}

// ロックを解除する
プライベート関数unlock() {
if (mysql_query ( "テーブルのロックを解除" ))
true を返します;
それ以外
false を返します;
}

// 破壊
関数 __destruct() {
mysql_query ( "テーブルのロックを解除", $this->db );
mysql_close ( $this->db );
}
}

mysql のバックアップと復元のボリューム処理、呼び出しが簡単


ボリュームごとのインポートの考え方: SQL ファイルを 1 行ずつ読み取り、各行を完全な SQL ステートメントとして配列に保存し、ループしてデータベースへの挿入を実行します。ただし、create table ステートメントは複数に分割されます。行は個別に処理する必要があります (これだけで時間がかかりました);

(うわー、この記事はとても長く感じます。主にクラス ファイルが占めています)。

更新日: 2012年10月6日
更新手順: 1. SQL インポート時に SQL ファイル内のコメント「–」を削除することで、SQL 内の単一引用符と二重引用符がインポートできない問題を解決します
2. 単一行を読み取った後、SQL を直接実行します。これにより、SQL ステートメントを配列に再結合し、効率を向上させるために配列から SQL を読み取ってインポートする必要がなくなります

ダウンロードアドレス: https://github.com/yanue/Dbmanage

コードは次のとおりです コードをコピー

エクスポートされた SQL ファイル形式は次のとおりです:

---
--MySQL データベース ダンプ
-- DBManage クラス、Power By yanue によって作成されました。 --
-- ホスト: ローカルホスト
-- 作成日: 2012年10月06日 22:32
--MySQL バージョン: 5.1.50-コミュニティ
-- PHP バージョン: 5.3.9-ZS5.6.0

---

-- データベース: `テスト`
--

------------------------------------------------- -----------

---

-- テーブル構造 aa
--

存在する場合はテーブルを削除 `aa`;

テーブルを作成します `aa` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content` テキストが NULL ではありません、
主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

---

-- テーブル aa のデータを転送します
--

INSERT INTO `aa` VALUES('1','

私はテストデータです笑');以下はクラスコードです:

/**
* @著者やぬえ
* @copyright Copyright (c) 2012 yanue.net
* @link http://yanue.net/archives/174.html
* @バージョン1.1
※作成時期:2012年5月21日

更新日: 2012年10月6日

更新手順: 1. SQL インポート時に SQL ファイル内のコメント '--' を削除することで、SQL 内の単一引用符と二重引用符がインポートできない問題を解決します
2. 単一行を読み取った後、SQL を直接実行します。これにより、SQL ステートメントを配列に再結合し、効率を向上させるために配列から SQL を読み取ってインポートする必要がなくなります

* 注: ボリューム ファイルは _v1.sql (20120522021241_all_v1.sql) で終わります

* 機能: mysql データベースのボリュームバックアップを実現し、バックアップ用のテーブルを選択し、単一の SQL ファイルとボリュームの SQL インポートを実現します
* 使用方法:
*
* ------1. データベースのバックアップ(エクスポート) ---------------------------------- -- ------------------------
//それらは、ホスト、ユーザー名、パスワード、データベース名、データベースエンコーディングです
$db = 新しい DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
// パラメータ: バックアップするテーブル (オプション)、バックアップ ディレクトリ (オプション、デフォルトはバックアップ)、ボリューム サイズ (オプション、デフォルトは 2000、つまり 2M)
$db->バックアップ();
* ------2. データベースのリカバリ(インポート) ---------------------------------- -- ------------------------
//それらは、ホスト、ユーザー名、パスワード、データベース名、データベースエンコーディングです
$db = 新しい DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//パラメータ: SQLファイル
$db->restore ('./backup/20120516211738_all_v1.sql');
*------------------------------------------------ - -------------------------
​*/
クラス DbManage {
var $db; // データベース接続
var $database; // 使用するデータベース
var $sqldir; // データベースのバックアップ フォルダー
// 改行文字
プライベート $ds = "n";
//ストレージ SQL 変数
パブリック $sqlContent = "";
//各 SQL ステートメントの終了文字
パブリック $sqlEnd = ";";

/**
     *初初期化
     *
     * @param string $host
     * @param string $ユーザー名
     * @param string $password
     * @param string $database
     * @param string $charset
    */
    function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') {
        $this->host = $host;
        $this->ユーザー名 = $ユーザー名;
        $this->password = $password;
        $this->database = $database;
        $this->charset = $charset;
        set_time_limit(0);//無時間制限
@ob_end_flush();
        // 接続データ库
        $this->db = @mysql_connect ( $this->host, $this->username, $this->password ) または die( '

Mysql 接続エラー: '.mysql_error().'

');
        // 选择使用哪个データテーブル
        mysql_select_db ( $this->database, $this->db ) または die('

Mysql 接続エラー:' .mysql_error().'

');
        // データ库编コード方式
        mysql_query ( 'SET NAMES ' . $this->charset, $this->db );

}

/*
     * 新しい增查询データベース库表
     */
    関数 getTables() {
        $res = mysql_query ( "SHOW TABLES" );
        $tables = 配列 ();
        while ( $row = mysql_fetch_array ( $res ) ) {
            $tables [] = $row [0];
        }
        $tables を返します;
    }

/*
     *
     * --------------------------------------データ据库备份開始---- -------------------------------------------------- ----
     */

/**
* データベースのバックアップ
* パラメーター: バックアップするテーブル (オプション)、バックアップ ディレクトリ (オプション、デフォルトはバックアップ)、ボリューム サイズ (オプション、デフォルトは 2000、つまり 2M)
*
* @param $string $dir
* @param int $size
* @param $string $テーブル名
​​*/
関数バックアップ($tablename = '', $dir, $size) {
$dir = $dir ? : './backup/';
//ディレクトリを作成します
if (! is_dir ( $dir )) {
mkdir ( $dir, 0777, true ) または die ( 'フォルダーの作成に失敗しました' );
}
$size = $size ? $size : 2048;
$sql = '';
// 特定のテーブルのみをバックアップします
if (! empty ( $tablename )) {
If(@mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tablename."'")) == 1) {
} else {
$this->_showMsg('Table-' . $tablename .'-存在しません、確認してください!',true);
die();
}
$this->_showMsg('テーブル ' . $tablename.'');
// ダンプ情報を挿入します
$sql = $this->_retrieve ();
//テーブル構造情報を挿入
$sql .= $this->_insert_table_structor ( $tablename );
//データを挿入
$data = mysql_query ( "select * from " . $tablename );
//ファイル名の最初の部分
$filename = date ( 'YmdHis' ) . $tablename;
//フィールドの数
$num_fields = mysql_num_fields ( $data );
                                                                                              $p = 1;
// 各レコードをループします
while ( $record = mysql_fetch_array ( $data ) ) {
//シングルレコード
$sql .= $this->_insert_record ( $tablename, $num_fields, $record );
// ボリュームサイズより大きい場合はファイルを書き込みます
If (strlen ( $sql ) >= $size * 1024) {
$file = $ファイル名 . $p ;
If ($this->_write_file ($sql, $file, $dir)) {
$this->_showMsg("Table-" . $tablename . "- Volume-" . $p . "-データのバックアップが完了しました、バックアップ ファイル[ " .$dir . $file ." ]");
} else {
以来 falseを返します;
}
                                                                                                                                                            $p ++;
// $ SQL 変数を空にリセットし、変数のサイズを再計算します
$sql = "";
}
}
//時間内にデータをクリアします
unset($data,$record);
// SQL のサイズだけではサイズをスコアリングするのに十分ではありません
if ($sql != "") {
$ファイル名 .= "_v" . $p . If ($this->_write_file ($sql, $filename, $dir)) {
$this->_showMsg( "テーブル-" . $tablename . "-ボリューム-" . $p . "-データのバックアップが完了しました、バックアップ ファイル[ " .$dir . $filename ." ]");
} else {
$this->_showMsg("バックアップ ボリューム-" . $p . "-失敗
");
return false;
}
}
$this->showMsg("おめでとうございます! バックアップ成功");
} else {
$this->_showMsg('バックアップ中');
// すべてのテーブルをバックアップします
If ($tables = mysql_query ( "show table status from " . $this->database )) {
$ This-& gt; _Showmsg ("データベース構造の読み取りに成功しました!"); } else {
$this->_showMsg("データベース構造の読み取りに失敗しました!");
終了 (0);
}
// ダンプ情報を挿入します
$sql .= $this->_retrieve ();
//ファイル名の最初の部分
$filename = date ( 'YmdHis' ) . // すべてのテーブルを検索します
$tables = mysql_query ( 'SHOW TABLES' );
                                                                                              $p = 1;
// すべてのテーブルをループします
while ( $table = mysql_fetch_array ( $tables ) ) {
                                                                                                                                                                        $tablename = $table [0];
// テーブル構造を取得します
$sql .= $this->_insert_table_struct ($tablename);
$data = mysql_query ( "select * from " . $tablename );
$num_fields = mysql_num_fields ( $data );

// 各レコードをループします

while ( $record = mysql_fetch_array ( $data ) ) {

//シングルレコード
$sql .= $this->_insert_record ( $tablename, $num_fields, $record );
// ボリュームサイズより大きい場合はファイルを書き込みます
If (strlen ( $sql ) >= $size * 1000) {

$file = $filename .sql .                                                                                                                                                                                                                                                                                                          If ($this->_write_file ($sql, $file, $dir)) {
$this->_showMsg("-ボリューム-" . $p . "-データのバックアップが完了しました。バックアップ ファイル [ ".$dir.$ファイル。" ]");
} else {
$this->_showMsg("ボリューム-" . $p . "-バックアップに失敗しました!",true);
falseを返します;
                                                                                                                                                                                                                                                                                                                                                                                            // $sql 変数を空にリセットし、変数のサイズを再計算します
$sql = "";
}
}
}
// SQL のサイズだけではサイズをスコアリングするのに十分ではありません
if ($sql != "") {
$ファイル名 .= "_v" . $p . If ($this->_write_file ($sql, $filename, $dir)) {
$this->_showMsg("-ボリューム-" . $p . "-データのバックアップが完了しました。バックアップ ファイル[".$dir.$ファイル名。" ]");
} else {
$this->_showMsg("ボリューム-" . $p . "-バックアップに失敗しました",true);
return false;
}
}
$this->showMsg("おめでとうございます! バックアップ成功");
}
}

// 時間内に情報を出力します
プライベート関数 _showMsg($msg,$err=false){
$err = $err ? "エラー:" ;
echo "

".$msg."

";
フラッシュ();

}

/**
* 基本的なデータベースのバックアップ情報を挿入します
*
* @戻り文字列
​​*/
    プライベート関数 _retrieve() {
        $value = '';
        $value .= '--' 。 $this->ds;
        $value .= '-- MySQL データベース ダンプ' 。 $this->ds;
        $value .= '-- DbManage クラス、Power By yanue によって作成されました。 ' 。 $this->ds;
        $value .= '-- http://yanue.net' 。 $this->ds;
        $value .= '--' 。 $this->ds;
        $value .= '-- 主机: ' . $this->ホスト 。 $this->ds;
        $value .= '-- 生成日期: ' .日付 ( 'Y' ) 。 「年 」。日付 ( 'm' ) 。 「 月 」 。日付 ( 'd' ) 。 「 日 」 。日付 ( 'H:i' ) 。 $this->ds;
        $value .= '-- MySQL バージョン: ' . mysql_get_server_info() 。 $this->ds;
        $value .= '-- PHP バージョン: ' . phpversion() 。 $this->ds;
        $value .= $this->ds;
        $value .= '--' 。 $this->ds;
        $value .= '-- データテーブル: `' . $this->データベース 。 「」。 $this->ds;
        $value .= '--' 。 $this->ds 。 $this->ds;
        $value .= '-- -------------------------------------- ------------';
        $value .= $this->ds . $this->ds;
        $value を返します;
    }

/**
* テーブル構造を挿入します
*
* @param 不明なタイプ $table
* @戻り文字列
​​*/
    プライベート関数 _insert_table_structor($table) {
        $sql = '';
        $sql .= "--" 。 $this->ds;
        $sql .= "-- 表の構造" . $テーブル 。 $this->ds;
        $sql .= "--" 。 $this->ds 。 $this->ds;

// 如果存在则删除表
        $sql .= "存在する場合はテーブルを削除 `" . $テーブル 。 「」。 $this->sqlEnd 。 $this->ds;
        // 获取详细表情報
        $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' );
        $row = mysql_fetch_array ( $res );
        $sql .= $row [1];
        $sql .= $this->sqlEnd 。 $this->ds;
        // 加上
        $sql .= $this->ds;
        $sql .= "--" 。 $this->ds;
        $sql .= "-- 转存表中のデータ " . $テーブル 。 $this->ds;
        $sql .= "--" 。 $this->ds;
        $sql .= $this->ds;
        $sql を返します;
    }

/**
* 単一レコードを挿入します
*
* @param string $table
* @param int $num_fields
* @param 配列 $record
* @戻り文字列
​​*/
プライベート関数 _insert_record($table, $num_fields, $record) {
// カンマ区切りの SQL フィールド
$insert = '';
$comma = "";
$insert .= "INSERT INTO `" . "` VALUES(";
) // 各サブセクションのコンテンツをループします
for($i = 0; $i $insert .= ($comma . "'" . mysql_escape_string ( $record [$i] ) . "'");
$comma = ",";
}
$insert .= ");" . return $insert;
}

/**

*ファイルに書き込む
*
* @param 文字列 $sql
* @param string $ファイル名
* @param string $dir
* @return boolean
​​*/
プライベート関数 _write_file($sql, $filename, $dir) {
$dir = $dir ? : './backup/';
//ディレクトリを作成します
if (! is_dir ( $dir )) {
mkdir ( $dir, 0777, true );
}
$re = true;
If (! @$fp = fopen ( $dir . $filename, "w+" )) {
$re = false;
$this->_showMsg("SQL ファイルを開けませんでした!",true);
}
if (! @fwrite ( $fp, $sql )) {
$re = false;
$this->_showMsg("SQL ファイルの書き込みに失敗しました。ファイルが書き込み可能かどうかを確認してください",true);
}
if (! @fclose ( $fp )) {
$re = false;
$this->_showMsg("SQL ファイルを閉じることができませんでした!",true);
}
$re;
を返します }

/*

*
* ---------------------------- 上: データベースのエクスポート ----------- 分割線 ---- ------次: データベースのインポート--------------------------------
*/

/**
* バックアップデータをインポート
* 説明: ボリューム ファイル形式 20120516211738_all_v1.sql
* パラメータ: ファイルパス (必須)
*
* @param string $sqlfile
​​*/
関数復元($sqlfile) {
// ファイルが存在するかどうかを確認します
If (! file_exists ( $sqlfile )) {
$this->_showMsg("SQL ファイルが存在しません。確認してください。",true);
終了 ();
}
$this->lock ( $this->database );
// データベースの保存場所を取得します
$sqlpath = pathinfo ($sqlfile);
$this->sqldir = $sqlpath ['dirname'];
// サブボリュームが含まれているかどうかを確認します。20120516211738_all_v1.sql などの _v とは別のファイルです。存在する場合は、サブボリュームがあることを意味します
$volume =explode ( "_v", $sqlfile );
$volume_path = $volume [0];
$this->_showMsg("プログラムが終了するのを防ぐため、ブラウザを更新して閉じないでください。注意しないとデータベース構造が破損します。");
$this->_showMsg("バックアップ データをインポート中です。お待​​ちください!");
if (空 ( $volume [1] )) {
$this->_showMsg ( "SQL のインポート: " . $sqlfile . '');
                                                                                                                                                                                                                                                              If ($this->_import ( $sqlfile )) {
$ This-& gt; _ShowMSG ("データベースのインポートが成功しました!"); } else {
$ this-> _showmsg( 'データベースのインポートに失敗!'、true);
終了 ();
}
} else {
// スクロールがある場合、current は現在のロール数となり、残りのスクロールが実行されます。 $volume_id =explode ( ".sq", $volume [1] );
// 現在のボリュームは $volume_id です
$volume_id = intval ( $volume_id [0] );
while ( $volume_id ) {
$tmpfile = $volume_path . ".sql";
// 他のボリュームが存在するため、実行を続行します
If (file_exists ( $tmpfile )) {
// importメソッドを実行します
$this->msg .= "ボリューム $volume_id: '
';
If ($this->_import ($tmpfile)) {

} else {
$volume_id = $volume_id :1;
exit ( "ボリュームのインポート: " . $tmpfile . '失敗! データベース構造が破損している可能性があります! ボリューム 1 からインポートしてみてください' );
}
} else {
$ This-& gt; msg. = "このサブバックアップは正常に導入されました! & Lt; br /& gt;"; return;
}
$volume_id ++;
}
}if (空 ( $volume [1] )) {
$this->_showMsg ( "SQL のインポート: " . $sqlfile . '');
                                                                                                                                                                                                                                                      If ($this->_import ( $sqlfile )) {
$this->_showMsg( "データベースは正常にインポートされました!");
} else {
$ this-> _showmsg( 'データベースのインポートに失敗!'、true);
終了 ();
}
} else {
// スクロールがある場合、現在の 1 ポイント ボリュームが表示され、残りのスクロールが実行されます。 $volume_id =explode ( ".sq", $volume [1] );
// 現在のボリュームは $volume_id です
$volume_id = intval ( $volume_id [0] );
while ( $volume_id ) {
$tmpfile = $volume_path . ".sql";
// 他のボリュームが存在するため、実行を続行します
If (file_exists ( $tmpfile )) {
// importメソッドを実行します
$this->msg .= "ボリューム $volume_id: '
';
If ($this->_import ($tmpfile)) {

} else {
$volume_id = $volume_id :1;
exit ( "ボリュームのインポート: " . $tmpfile . '失敗! データベース構造が破損している可能性があります! ボリューム 1 からインポートしてみてください' );
}
} else {
$ This-& gt; msg. = "このサブバックアップは正常に導入されました! & Lt; br /& gt;"; return;
}
$volume_id ++;
}
}
}

/**
* SQLをデータベースにインポートします(通常のインポート)
*
* @param string $sqlfile
* @return boolean
​​*/
プライベート関数 _import($sqlfile) {
// SQL ファイルに含まれる SQL ステートメントの配列
$sqls = array ();
$f = fopen ( $sqlfile, "rb" );
//テーブルバッファ変数を作成します
$create_table = '';
while ( ! feof ( $f ) ) {
//sql
の各行を読み取ります $line = fgets ( $f );
// このステップでは、作成されたテーブルを完全な SQL ステートメントに合成します
// 末尾に「;」が含まれておらず (つまり、完全な SQL ステートメント、ここに挿入ステートメントがあります)、「ENGINE=」 (つまり、テーブルを作成する最後の文) が含まれていない場合
If (! preg_match ( '/;/', $line ) || preg_match ( '/ENGINE=/', $line )) {
// この SQL ステートメントと作成されたテーブル SQL 接続を保存します
$create_table .= $line;
// テーブルを作成する最後の文が含まれている場合
If (preg_match ( '/ENGINE=/', $create_table)) {
//SQL文を実行してテーブルを作成します
                                                                                                                                                                  // 現在のテーブルをクリアし、次のテーブルの作成を準備します
$create_table = '';
}
// これをスキップします時間
続行;
}
//SQL文を実行します
$this->_insert_into($line);
}
fclose ( $f );
true を返します;
}

//単一の SQL ステートメントを挿入します

プライベート関数 _insert_into($sql){
If (! mysql_query ( トリム ( $sql ) )) {
$this->msg .= mysql_error ();
false を返す;
}
}

/*

* -----------------------------データベースインポート終了--------------- - -----------------
*/

//データベース接続を閉じる

プライベート関数 close() {
mysql_close ($this->db);
}

// バックアップまたはインポート中のエラーを避けるためにデータベースをロックします

プライベート関数 lock($tablename, $op = "WRITE") {
If (mysql_query ( "lock tables " . $tablename . " " . $op ))
true を返します;
その他
false を返す;
}

// ロックを解除する
プライベート関数unlock() {
if (mysql_query ( "テーブルのロックを解除" ))
true を返します;
その他
false を返す;
}

// 破壊
関数 __destruct() {
If($this->db){
mysql_query ( "テーブルのロックを解除", $this->db );
mysql_close ($this->db);
}
}

}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/630687.html技術記事ボリューム処理とは、処理したいデータを小さなファイルに分割して処理することです。今回は、mysql データベースのボリュームを実現するための php mysql バックアップおよびリカバリのボリューム処理クラスを紹介します。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート