php実現mysqlデータベースバックアップ類
12339 ワード
1、实例化DbBakは、データサーバはどこにありますか?どのディレクトリにバックアップしますか? require_オンス('DbBak.php') require_once('TableBak.php') $connectid = mysqlconnect('local host','root','123456') $backudir = 'data; $DbBak = new DbBak($connectid、$backudir); 2、データベースのバックアップを開始します。そのデータベースのバックアップを指定するだけでなく、そのいくつかのテーブルだけを詳細に設定できます。 2.1 mbbbsライブラリのすべての表をバックアップしたいなら、それだけでいいです。 $DbBak->backudb('mybbbbbbs') 2.2 mybbbsライブラリのboard、face、friendlist表をバックアップしたいなら、1次元配列で指定できます。 2.3もし一つの表だけをバックアップしたいなら、例えば、board表:$DbBak->backudb('mybbbbbbs'、'board') 3,データの回復:2.1、2.1、2.3の3つの状況に対して、対応する修正文があれば、backupDbをrestoreDbに両替すれば、データの回復ができます。 SQLコード$DbBak->restoreDb('mybbbbbbbbbs'、arard'、'face'、'friends ite'); PHPコード$DbBak->restoreDb('mbbbbbbbbbbbbbbbs'); PHPコードrequire_once('TableBak.php') クラス DbBak { var $_mysqllink_id; var $_dataDir; var $_テーブルリスト var $_TableBak; 機能 DbBak($u)mysqllink_id,$dataDir) { ( (!is_string($dataDir) || streen($dataDir)==0) && ディエ('error:$datadir) is not a. ストリング !is_dir($dataDir) && mkdir($dataDir) $this->_dataDir = $dataDir; $this->_mysqllink_id。 = $_mysqllink_id; } 機能 backuDb($dbName、$table Name=null) { ( (!is_string($dbName) || streen($dbName)==0 ) && die('$dbName) must be a. ストリングス value;; //ステップ1:データベースを選択: mysqlselect_.db($dbName); //Step 2:データベースバックアップディレクトリの作成 $dbDir = $this->_dataDir.DIRECTORY_SEPARTOR.$dbName; !is_dir($dbDir) && mkdir($dbDir) //Step 3:データベースのすべてのテーブル名を取得します。 バックアップテーブルを開始します $this->_TableBak = new TableBak($this->>_mysqllink_id,$dbDir); if(is_)null($table Name){/backup all. テーブル in the db $this->_backupAllTable($dbName); return; } if(is_)string($table Name){ (strelen($table Name)==0) && die('.') $this->_backuplone Table($dbName、$table Name); return; } if (is_array($table Name){ foreach ($テーブルName as $テーブル){ ( (!is_string($table) || streen($table)==0 ) && die('.') } $this->_backup SomeTalbe($dbName、$table Name); return; } } 機能 restoreDb($dbName、$table Name=null){ ( (!is_string($dbName) || streen($dbName)==0 ) && die('$dbName) must be a. ストリングス value;; //Step 1:データベースがあるかどうかを確認します。 接続: @mysqlselect_.db($dbName) || die(the) database $dbName dose not exists"); //Step 2:データベースのバックアップディレクトリがあるか確認します。 $dbDir = $this->_dataDir.DIRECTORY_SEPARTOR.$dbName; !is_dir($dbDir) && die("$dbDir" not exists"); //Step 3:start ストール $this->_TableBak = new TableBak($this->>_mysqllink_id,$dbDir); if(is_)null($table Name){/backup all. テーブル in the db $this->_restore AllTable($dbName); return; } if(is_)string($table Name){ (strelen($table Name)==0) && die('.') $this->_restore OneTable($dbName); return; } if (is_array($table Name){ foreach ($テーブルName as $テーブル){ ( (!is_string($table) || streen($table)==0 ) && die('.') } $this->_restore SomeTalbe($dbName、$table Name); return; } } 機能 _getTable List($dbName) { $テーブルリスト = array(); $reult=mysql_リスト.tables($dbName、$this->_mysqllink_id) for ($i = 0; $i < mysqlnumローソン($result) $i+){ アラリpush($table List、mysql_)tableaname($result) $イ) } mysqlfree_レスリング return $テーブルリスト } 機能 _backupAllTable($dbName) { foreach ($this->_getTable List($dbName) as $table Name){ $this->_TableBak->backuplable($table Name); } } 機能 _backuploneTable($dbName、$table Name) { !同前array($table Name、$this->_getTable List($dbName)) && die(「指定されたテーブル名$table Name(/b)はデータベースに存在しません。」) $this->_TableBak->backuplable($table Name); } 機能 _backup SomeTalbe($dbName、$Table NameList) { foreach ($Table NameList as $table Name){ !同前array($table Name、$this->_getTable List($dbName)) && die(「指定されたテーブル名$table Name(/b)はデータベースに存在しません。」) } foreach ($Table NameList as $table Name){ $this->_TableBak->backuplable($table Name); } } 機能 _restore AllTable($dbName) { //Step 1:すべてのデータテーブルのバックアップファイルがあるか確認します。 および書くことができますか? foreach ($this->_getTable List($dbName) as $table Name){ $tableBakFile = $this->_dataDir.DIRECTORY_SEPAATOR . $db Name.DIRECTORY_SEPAATOR . $テーブルName.DIRECTORY_SEPAATOR . $table Name.'.sql' !is_writeable ($tableBakFile) && die("tableBakFile" not exists or unwirteable"); } //Step 2:start ストール foreach ($this->_getTable List($dbName) as $table Name){ $tableBakFile = $this->_dataDir.DIRECTORY_SEPAATOR . $db Name.DIRECTORY_SEPAATOR . $テーブルName.DIRECTORY_SEPAATOR . $table Name.'.sql' $this->_TableBak->restore Table($table BakFile); } } 機能 _restore OneTable($dbName、$table Name) { //Step 1:データテーブルがあるかどうかを確認します。 !同前array($table Name、$this->_getTable List($dbName)) && die(「指定されたテーブル名$table Name(/b)はデータベースに存在しません。」) //Step 2:データテーブルのバックアップファイルがあるか確認します。 および書くことができますか? $tableBakFile = $this->_dataDir.DIRECTORY_SEPAATOR . $db Name.DIRECTORY_SEPAATOR . $テーブルName.DIRECTORY_SEPAATOR . $table Name.'.sql' !is_writeable ($tableBakFile) && die("tableBakFile" not exists or unwirteable"); //Step 3:start ストール $this->_TableBak->restore Table($table BakFile); } 機能 _restore SomeTalbe($dbName、$Table NameList) { //Step 1:データテーブルがあるかどうかを確認します。 foreach ($Table NameList as $table Name){ !同前array($table Name、$this->_getTable List($dbName)) && die(「指定されたテーブル名$table Name(/b)はデータベースに存在しません。」) } //Step 2:データテーブルのバックアップファイルがあるか確認します。 および書くことができますか? foreach ($Table NameList as $table Name){ $tableBakFile = $this->_dataDir.DIRECTORY_SEPAATOR . $db Name.DIRECTORY_SEPAATOR . $テーブルName.DIRECTORY_SEPAATOR . $table Name.'.sql' !is_writeable ($tableBakFile) && die("tableBakFile" not exists or unwirteable"); } //Step 3:start レスター: foreach ($Table NameList as $table Name){ $tableBakFile = $this->_dataDir.DIRECTORY_SEPAATOR . $db Name.DIRECTORY_SEPAATOR . $テーブルName.DIRECTORY_SEPAATOR . $table Name.'.sql' $this->_TableBak->restore Table($table BakFile); } } } ?>
<?php
// DbBak
class TableBak{
var $_mysql_link_id;
var $_dbDir;
//private $_DbManager;
function TableBak($mysql_link_id,$dbDir)
{
$this->_mysql_link_id = $mysql_link_id;
$this->_dbDir = $dbDir;
}
function backupTable($tableName)
{
//step1: :
$tableDir = $this->_dbDir.DIRECTORY_SEPARATOR.$tableName;
!is_dir($tableDir) && mkdir($tableDir);
//step2: :
$this->_backupTable($tableName,$tableDir);
}
function restoreTable($tableName,$tableBakFile)
{
set_time_limit(0);
$fileArray = @file($tableBakFile) or die("can open file $tableBakFile");
$num = count($fileArray);
mysql_unbuffered_query("DELETE FROM $tableName");
$sql = $fileArray[0];
for ($i=1;$i<$num-1;$i++){
mysql_unbuffered_query($sql.$fileArray[$i]) or (die (mysql_error()));
}
return true;
}
function _getFieldInfo($tableName){
$fieldInfo = array();
$sql="SELECT * FROM $tableName LIMIT 1";
$result = mysql_query($sql,$this->_mysql_link_id);
$num_field=mysql_num_fields($result);
for($i=0;$i<$num_field;$i++){
$field_name=mysql_field_name($result,$i);
$field_type=mysql_field_type($result,$i);
$fieldInfo[$field_name] = $field_type;
}
mysql_free_result($result);
return $fieldInfo;
}
function _quoteRow($fieldInfo,$row){
foreach ($row as $field_name=>$field_value){
$field_value=strval($field_value);
switch($fieldInfo[$field_name]){
case "blob": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;
case "string": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;
case "date": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;
case "datetime": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;
case "time": $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); break;
case "real": $row[$field_name] = intval($field_value); break;
case "timestamp":$row[$field_name] = intval($field_value); break;
default: $row[$field_name] = intval($field_value); break;
}
}
return $row;
}
function _backupTable($tableName,$tableDir)
{
// :
$fieldInfo = $this->_getFieldInfo($tableName);
//step1: INSERT :
$fields = array_keys($fieldInfo);
$fields = implode(',',$fields);
$sqltext="INSERT INTO $tableName($fields)VALUES \r
";
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql';
(!$handle = fopen($datafile,'w')) && die("can not open file <b>$datafile</b>");
(!fwrite($handle, $sqltext)) && die("can not write data to file <b>$datafile</b>");
fclose($handle);
//step2: :
// :
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("can not open file <b>$datafile</b>");
// :
while ($row = mysql_fetch_assoc($result)) {
$row = $this->_quoteRow($fieldInfo,$row);
$record='(' . implode(',',$row) . ");\r
";
(!fwrite($handle, $record)) && die("can not write data to file <b>$datafile</b>");
}
mysql_free_result($result);
// :
fclose($handle);
return true;
}
}
?>
バックアップmbbsデータベース:SQLコード/example 1 backup: require_オンス('DbBak.php') require_once('TableBak.php') $connectid = mysqlconnect('local host','root','123456') $backudir = 'data; $DbBak = new DbBak($connectid、$backudir); $DbBak->backudb('mybbbbbbs') mbbsデータベースを復元:
require_once('DbBak.php');
require_once('TableBak.php');
$connectid = mysql_connect('localhost','root','123456');
$backupDir = 'data';
$DbBak = new DbBak($connectid,$backupDir);
$DbBak->restoreDb('mybbs');