1. DbBak をインスタンス化するには、データ サーバーの場所 ($connectid) とバックアップ先のディレクトリ ($backupDir) という 2 つのことを DbBak に伝える必要があります。 复制代码代码如下: & lt;? PHP
require_once( 'TableBak.php');
$connectid = mysql_connect('localhost','root','123456');
$backupDir = 'data'; DbBak($connectid, $backupDir);
2. 次に、バックアップするデータベースを指定するだけでなく、バックアップするテーブルのみを詳細に設定することもできます。 up:
2.1 mybbs ライブラリをバックアップする場合は、すべてのテーブルに対して次のようにします:
$DbBak->backupDb('mybbs'); mybbs ライブラリ内のボード、フェイス、およびフレンドリストのテーブルのみをバックアップしたい場合は、次の 1 次元配列を指定します:
$DbBak->backupDb('mybbs',array('board' ,'face','friendsite'));
2.3 ボード テーブルなどのテーブルのみをバックアップする場合:
$DbBak->backupDb('mybbs','board' );
3、データ回復:
2.1、2.1、および 2.3 の 3 つのケースでは、対応するステートメントを変更し、backupDb をrestoreDb に置き換えてデータ回復を実現します:
$DbBak ->restoreDb('mybbs');
SQL コード
$DbBak->restoreDb(' mybbs',array('board','face','friendsite'));
$DbBak->restoreDb('mybbs','board');
PHP コード
require_once('TableBak.php');
class DbBak {
var $_mysql_link_id; 🎜>var $_dataDir;
var $_tableList; 🎜> function DbBak($_mysql_link_id,$dataDir)
{
( (!is_string($dataDir)) || strlen($dataDir)==0 ) && die('error:$datadir は文字列ではありません') ;
!is_dir($dataDir) && mkdir($dataDir);
$this->_dataDir = $dataDir; ->_mysql_link_id = $_mysql_link_id; 🎜>
関数backupDb($dbName,$tableName=null)
{
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName は文字列値である必要があります');
//ステップ 1: データベースを選択します:
mysql_select_db($dbName);
//ステップ 2: データベースのバックアップ ディレクトリを作成します
$dbDir = $this->dataDir.DIRECTORY_SEPARATOR;
!is_dir($dbDir) && mkdir($dbDir);
//ステップ 3: データベース内のすべてのテーブル名を取得し、テーブルのバックアップを開始します。 🎜>$this->_TableBak = new TableBak($this ->_mysql_link_id,$dbDir);
if(is_null($tableName)){//データベース内のすべてのテーブルをバックアップします
$this-> ;_backupAllTable($dbName);
return;
}
if(is_string($tableName)){
(strlen($tableName)==0) && die('....' );
$this->backupOneTable($dbName ,$tableName);
return;
if (is_array($tableName)){ || ) && die('....');
$this->_backupSomeTalbe($dbName,$tableName) >}
}
functionrestoreDb($dbName,$tableName=null){
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName はstring value');
//ステップ 1: データベースが存在するかどうかを確認して接続します:
@mysql_select_db($dbName) || データベース $dbName が存在しません。 ) ;
//ステップ 2: データベースのバックアップ ディレクトリが存在するかどうかを確認します
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir) && die("$dbDir not存在します" );
//ステップ 3:復元の開始
$this->_TableBak = new TableBak($this->gt;_mysql_link_id,$dbDir);
if(is_null($tableName)){/ /データベース内のすべてのテーブルをバックアップ
$this->_restoreAllTable($dbName); =0) && die('....'); );
return;
}
if (is_array($tableName) ){
foreach ($tableName as $table){
( (!is_string($table)) || strlen ($table)==0) && die('....');
}
$this->_restoreSomeTalbe($dbName,$tableName);
return;
}
function _getTableList($dbName)
{
$tableList = array();
$result=mysql_list_tables($dbName,$this->_mysql_link_id); >for ($i = 0; $i
}
mysql_free_result($)結果);
return $tableList;
}
function _backupAllTable($dbName)
}
function _backupOneTable($dbName,$tableName)
{
!in_array($tableName,$this->_getTableList($dbName)) && die("指定されたテーブル名$tableName はデータベースに存在しません"); ->_TableBak->backupTable($tableName);
}
function _backupSomeTalbe ($dbName,$TableNameList)
{
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->_getTableList($dbName)) && die("指定されたテーブル名$tableName はデータベースに存在しません");テーブル名);
}
}
function _restoreAllTable($dbName)
{
//ステップ 1: すべてのデータ テーブルのバックアップ ファイルが存在するかどうか、および書き込み可能かどうかを確認します:
foreach ($this->_getTableList) ($ dbName) as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
. $tableName.DI RECTORY_SEPARATOR 🎜>!is_writeable ($tableBakFile) && die ("$tableBakFile が存在しないか、書き込みできません");
}
//step2:startstore
foreach ($this->getTableList($dbName) as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
$dbName.DIRECTORY_SEPARATOR
. $tableName.DIRECTORY_SE PARATOR this->_TableBak->restoreTable($tableName,$tableBakFile);
}
}
function _restoreOneTable($dbName,$tableName)
{
//step1 :データテーブルが存在するか確認します:
!in_array($tableName,$this->_getTableList($dbName) )) && die("指定されたテーブル名$tableNameはデータベースに存在しません ");
//ステップ2: データテーブルのバックアップファイルが存在するかどうか、および書き込み可能かどうかを確認します:
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
.$tableName .DIRECTORY_SEPARATOR 🎜>$this ->_TableBak->restoreTable($tableName,$tableBakFile);
}
function _restoreSomeTalbe($dbName,$TableNameList)
{
//ステップ 1: データ テーブルが存在するかどうかを確認します:
foreach ($TableNameList as $tableName){
! in_array($tableName,$this->_getTableList($dbName)) && die("指定されたテーブル名$tableNameinはデータベースに存在しません"); //ステップ 2: データ テーブルのバックアップ ファイルが存在するかどうか、および書き込み可能であるかどうかを確認します:
foreach ($TableNameList as $tableName){
$tableBakFile = $this ->_dataDir.DIRECTORY_SEPARATOR $tableName。 sql';
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");
//step3:start restore:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
}
}
?>
// DBBAK のみがこのクラスを呼び出すことができます。
function TableBak($mysql_link_id,$dbDir)
{
$this->_mysql_link_id = $ mysql_link_id;
$this->dbDir = $dbDir; }
function backupTable($tableName)
{
//ステップ 1: テーブルのバックアップ ディレクトリ名を作成します:
$tableDir = $this->_dbDir.DIRECTORY_SEPARATOR.$tableName;
!is_dir( $tableDir) && mkdir($tableDir);
//ステップ 2: バックアップの開始:
$this ->_backupTable($tableName,$tableDir);
}
functionrestoreTable($tableName,$tableBakFile)
{
set_time_limit(0);
$fileArray = @ file($tableBakFile) または die("ファイル $tableBakFile を開くことができます");
$num = count( $fileArray);
mysql_unbuffered_query("DELETE FROM $tableName"); [0];
for ($i=1;$imysql_unbuffered_query($sql.$fileArray[$i]) または (die (mysql_error())) ;
}
return true;
}
function _getFieldInfo ($ tableName){
$fieldInfo = array(); LIMIT 1"; > =mysql_field_type($result,$i);
$fieldInfo[$field_name] = $field_type;
}
mysql_free_result($result);
return $fieldInfo;
}
function _quoteRow($fieldInfo,$row){ .mysql_escape_string($field_value)."";break;
case "日付": $row[$field_name] = "'"。 mysql_escape_string($field_value)."'";break;
case " datetime": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;
case "unknown": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;
case "int": $row[$ field_name] = intval($field_value) ); ブレーク;
ケース "$フィールド名" = intval($フィールド値) ブレーク;
ケース "タイムスタンプ":$row[$フィールド名] = ブレーク;
デフォルト: $row[$field_name] = intval($field_value)
}
}
return $row;
}
function _backupTable($tableName,$tableDir)
{
//テーブルのフィールド タイプを取得します:
$fieldInfo = $this-> ;_getFieldInfo ($tableName);
//ステップ 1: INSERT ステートメントの前半を作成し、ファイルに書き込みます:
$fields = array_keys($fieldInfo); implode(',',$ フィールド);
$sqltext="$tableName($fields)VALUES rn";
$datafile = $tableDir.DIRECTORY_SEPARATOR.'.sql'; >(!$handle = fopen ($datafile,'w')) && die("ファイル $datafile を開けません"); ファイル $datafile にデータを書き込みます;");
fclose($handle);
///ステップ 2: データを取得してファイルに書き込みます: リソース:
set_time_limit(0);
$sql = "select * from $tableName";
$result = mysql_query($sql,$this->_mysql_link_id);
//データのバックアップ ファイルを開きます: $tableName.xml
$datafile = $tableDir。 DIRECTORY_SEPARATOR.$tableName.'.sql';
(!$handle = fopen($datafile,'a')) && die("ファイル $datafile"); 🎜>//テーブルのレコードを 1 つずつ取得してファイルに書き込みます: $this->_quoteRow($fieldInfo,$row); $record)) && die("ファイル $ にデータを書き込めませんdatafile");
}
mysql_free_result($result);
// ファイルを閉じます: >fclose($handle); 🎜>
SQL コード
//例1 つのバックアップ:
require_once('DbBak.php');
$connectid = mysql_connect('localhost ','root','123456'); >$backupDir = 'data';
$DbBak = new DbBak($connectid,$backupDir);
$DbBak->backupDb('mybbs' ; DbBak.php'); TableBak.php');
$connectid = mysql_connect('localhost','root','123456'); 🎜>$DbBak = new DbBak($connectid,$backupDir);復元Db('mybbs');