1. DbBak をインスタンス化するには、データ サーバーの場所 ($connectid) とバックアップ先のディレクトリ ($backupDir) の 2 つを指定する必要があります。
require_once('DbBak.php'); .php');
$connectid = mysql_connect('localhost','root','123456');
$DbBak = new DbBak($connectid,$backupDir);データベースのバックアップを開始できます。 これで、バックアップするデータベースを指定するだけでなく、バックアップするテーブルのみを詳細に設定することもできます:
2.1 mybbs ライブラリ内のすべてのテーブルをバックアップしたい場合は、これを実行します:
$DbBak->backupDb('mybbs');
2.2 mybbs ライブラリ内のボード、フェイス、およびフレンドリストのテーブルのみをバックアップしたい場合は、1 次元配列で指定できます。 $DbBak->backupDb('mybbs',array('board','face','friendsite '));
2.3 ボード テーブルなど 1 つのテーブルのみをバックアップする場合:
$DbBak-> ;backupDb('mybbs','board');
3. データの回復:
2.1、2.1、および 2.3 の状況では、それに応じてステートメントを変更し、backupDb をrestoreDb に置き換えるだけで、データの回復を実現できます:
$ DbBak->restoreDb('mybbs');
SQL コード
$DbBak->restoreDb('mybbs',array( 'board','face','friendsite'));
PHP コード
$DbBak-> ;restoreDb('mybbs','board');
PHP コード
require_once('TableBak.php');
var $_tableList; function DbBak($_mysql_link_id,$dataDir)
{
( (!is_string($dataDir)) || strlen($dataDir) ==0) && die('error:$datadir は文字列ではありません'); ($dataDir) && mkdir($dataDir);
$this->dataDir = $dataDir; _mysql_link_id = $_mysql_link_id;
関数のバックアップDb($dbName,$tableName=null) ( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName は文字列値である必要があります');
//ステップ 1: データベースを選択します:
mysql_select_db($dbName); //ステップ 2: データベースのバックアップ ディレクトリを作成します
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName! 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('....'); ;_backupOneTable($dbName,$tableName);
return;
if (is_array($tableName)){
foreach ($tableName として){
( (!is_string($table)) || strlen($ table)==0 ) && die('....');
$this->_backupSomeTalbe($dbName,$tableName );
}
function restoreDb($dbName,$tableName=null){
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName は文字列値である必要があります');
//ステップ 1: データベース库が存在するかどうか 并接続:
@mysql_select_db($dbName) || die("データベース$dbName線量は存在しません");
//ステップ 2:检查が存在するかどうかデータ据库备份目录
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir) && die("$dbDir 存在しません");
//ステップ 3:復元の開始
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);
if(is_null($tableName)){//データベース内のすべてのテーブルをバックアップします
$this->_restoreAllTable($dbName);
戻る;
}
if(is_string($tableName)){
(strlen($tableName)==0) && die('....');
$this->_restoreOneTable($dbName,$tableName);
戻る;
}
if (is_array($tableName)){
foreach ($tableName as $table){
( (!is_string($table)) || strlen($table)==0 ) && die('... .');
}
$this->_restoreSomeTalbe($dbName,$tableName);
戻る;
}
}
function _getTableList($dbName)
{
$tableList = array();
$result=mysql_list_tables($dbName,$this->_mysql_link_id);
for ($i = 0; $i < mysql_num_rows($result); $i++){
array_push($tableList,mysql_tablename($result, $i));
}
mysql_free_result($result);
$tableList を返す;
}
function _backupAllTable($dbName)
{
foreach ($this->_getTableList($dbName) as $tableName){
$this->_TableBak->backupTable($tableName);
}
}
function _backupOneTable($dbName,$tableName)
{
!in_array($tableName,$this->_getTableList($dbName)) && die("指定された表名$tableName b>データ库中に存在しません");
$this->_TableBak->backupTable($tableName);
}
function _backupSomeTalbe($dbName,$TableNameList)
{
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->_getTableList($dbName)) && die("指定された表名$tableNameデータベース库中に存在しません");
}
foreach ($TableNameList as $tableName){
$this->_TableBak->backupTable($tableName);
}
}
function _restoreAllTable($dbName)
{
//step1:检查がすべてのデータテーブルのファイルに存在するかどうか、および可写るかどうか:
foreach ($this->_getTableList($dbName) as $tableName){
$tableBakファイル = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");
}
//step2:start restore
foreach ($this->_getTableList($dbName) as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';
$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
。 $tableName.'.sql';
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");
//ステップ 3:復元の開始
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
function _restoreSomeTalbe($dbName,$TableNameList)
{
//step1:检查が存在するかどうかデータ表:
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->) ;_getTableList($ dbName)) && die("指定された表名$tableNameデータベース库中に存在しません");
}
//ステップ 2:检查が存在するかどうかデータテーブル备份文件およびどうか書き込み可能:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
。 $dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
$tableName.'.sql';
!is_writeable ($tableBakFile) && die("$tableBakFile が存在しないか、書き込みできません");
}
//ステップ 3:復元の開始:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
$dbName.DIRECTORY_SEPARATOR
。 $tableName.DIRECTORY_SEPARATOR
。 $tableName.'.sql';
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
}
}
?>
复制代码代码如下:
//DbBak のみがこのクラスを呼び出すことができます
class TableBak{
var $_mysql_link_id;
var $_dbDir
//private $_DbManager)
{
$ 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);
}
function Restoretable ($ tablename, $ tablebakfile) {
Set_time_limit (0);
$ FileArray = @file ($ tablebakfile) または DIE ("ファイルを開くことができます $ TableBakfile");
Mysql_unbuffered_qury ("$tableName から削除");
$sql = $fileArray[0];
for ($i=1;$imysql_unbuffered_query($sql.$fileArray[ $i ) or (die (mysql_error()));
}
return true;
function _getFieldInfo($tableName){
$fieldInfo = array(); ;
$result = mysql_query($sql,$this->_mysql_link_id);
$num_field=mysql_num_fields($result);
for($i<$num_field;$i++); mysql_field_name ($result,$i);
$field_type=mysql_field_type($result,$i);
mysql_free_result($result); function _quoteRow($fieldInfo,$row){ $row[$field; _name] = "'".mysql_escape_string($field_value)."'";break; $row[$field_name] ;休憩;
ケース「日付」: $row[$field_name] = "'".mysql_escape_string($field_value)."'";break ($field_value)."'";break;持っている 持っている 持っている 持っている 持っている 持っている 持っている 持っている 持っている 持っている 持っている 持っている ($field_value) .フィールド名] = "'".mysql_escape_string($フィールド値)."'"; フィールド名] = intval($フィールド値);
case "タイムスタンプ":$row[$フィールド値];ブレーク;
デフォルト: $row[$field_name] = intval($field_value);
return $row;
}
function _backupTable($tableName,$tableDir)
{
//テーブルのフィールドタイプを取得します:
$fieldInfo = $this->_getFieldInfo($tableName);
//step1: INSERT ステートメントの前半を作成し、ファイルに書き込みます:
$fields = array_keys($fieldInfo)
$sqltext="INSERT INTO $tableName($fields); )VALUES rn";
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql';
(!$handle = fopen($datafile,'w')) && die("ファイルを開けません $datafile ");
(!fwrite($handle, $sqltext)) && die("ファイル $datafile");
fclose($handle) ;
//ステップ 2: データを取得してファイルに書き込みます:
//テーブル リソースを取得します:
$sql = "select * from $tableName"; ,$this->_mysql_link_id);
//データのバックアップ ファイルを開きます: $tableName.xml
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql'
(!$handle = fopen($datafile) ,'a')) && die("ファイルを開けません $datafile");
//テーブルのレコードを 1 つずつ取得し、ファイルに書き込みます:
while ($row = mysql_fetch_assoc ($result)) {
$row = $this->_quoteRow ($fieldInfo,$row); $record='(' $record=' データをファイルに書き込みます $datafile") ; Mysql_free_result($ result); 1 つのバックアップ:
require_once('TableBak.php');
$connectid = mysql_connect('localhost' ,'root ','123456');
$DbBak = new DbBak($connectid,$backupDir);
$DbBak->backupDb('mybbs');
mybbs データベースを復元します:
コードをコピーします
コードは次のとおりです:
require_once('DbBak.php');