1、实例化DbBak需要告诉它两件事:数据服务器在哪里($connectid)、备份到哪个目录($backupDir):
require_once('DbBak.php');
require_once('TableBak.php');
$connectid = mysql_connect('localhost','root','123456');
$backupDir = 'data';
$DbBak = new DbBak($connectid,$backupDir);
2、然后就可以开始备份数据库了,你不仅能够指定备份那个数据库,而且能详细设置只备份那几个表:
2.1如果你想备份mybbs库中的所有表,只要这样:
$DbBak->backupDb('mybbs');
2.2如果你只想备份mybbs库中的board、face、friendlist表,可以用一个一维数组指定:
$DbBak->backupDb('mybbs',array('board','face','friendsite'));
2.3如果只想备份一个表,比如board表:
$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');
class DbBak {
var $_mysql_link_id;
var $_dataDir;
var $_tableList;
var $_TableBak;
function DbBak($_mysql_link_id,$dataDir)
{
( (!is_string($dataDir)) || strlen($dataDir)==0) && die('error:$datadir is not a string');
!is_dir($dataDir) && mkdir($dataDir);
$this->_dataDir = $dataDir;
$this->_mysql_link_id = $_mysql_link_id;
}
function backupDb($dbName,$tableName=null)
{
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName must be a string value');
//step1:选择数据库:
mysql_select_db($dbName);
//step2:创建数据库备份目录
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir) && mkdir($dbDir);
//step3:得到数据库所有表名 并开始备份表
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);
if(is_null($tableName)){//backup all table in the db
$this->_backupAllTable($dbName);
return;
}
if(is_string($tableName)){
(strlen($tableName)==0) && die('....');
$this->_backupOneTable($dbName,$tableName);
return;
}
if (is_array($tableName)){
foreach ($tableName as $table){
( (!is_string($table)) || strlen($table)==0 ) && die('....');
}
$this->_backupSomeTalbe($dbName,$tableName);
return;
}
}
function restoreDb($dbName,$tableName=null){
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName must be a string value');
//step1:检查是否存在数据库 并连接:
@mysql_select_db($dbName) || die("the database <b>$dbName</b> dose not exists");
//step2:检查是否存在数据库备份目录
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir) && die("$dbDir not exists");
//step3:start restore
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);
if(is_null($tableName)){//backup all table in the db
$this->_restoreAllTable($dbName);
return;
}
if(is_string($tableName)){
(strlen($tableName)==0) && die('....');
$this->_restoreOneTable($dbName,$tableName);
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_num_rows($result); $i++){
array_push($tableList,mysql_tablename($result, $i));
}
mysql_free_result($result);
return $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("指定的表名<b>$tableName</b>在数据库中不存在");
$this->_TableBak->backupTable($tableName);
}
function _backupSomeTalbe($dbName,$TableNameList)
{
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->_getTableList($dbName)) && die("指定的表名<b>$tableName</b>在数据库中不存在");
}
foreach ($TableNameList as $tableName){
$this->_TableBak->backupTable($tableName);
}
}
function _restoreAllTable($dbName)
{
//step1:检查是否存在所有数据表的备份文件 以及是否可写:
foreach ($this->_getTableList($dbName) as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
. $tableName.DIRECTORY_SEPARATOR
. $tableName.'.sql';
!is_writeable ($tableBakFile) && die("$tableBakFile not exists or unwirteable");
}
//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("指定的表名<b>$tableName</b>在数据库中不存在");
//step2:检查是否存在数据表备份文件 以及是否可写:
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
. $tableName.DIRECTORY_SEPARATOR
. $tableName.'.sql';
!is_writeable ($tableBakFile) && die("$tableBakFile not exists or unwirteable");
//step3:start restore
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
function _restoreSomeTalbe($dbName,$TableNameList)
{
//step1:检查是否存在数据表:
foreach ($TableNameList as $tableName){
!in_array($tableName,$this->_getTableList($dbName)) && die("指定的表名<b>$tableName</b>在数据库中不存在");
}
//step2:检查是否存在数据表备份文件 以及是否可写:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
. $tableName.DIRECTORY_SEPARATOR
. $tableName.'.sql';
!is_writeable ($tableBakFile) && die("$tableBakFile not exists or unwirteable");
}
//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);
}
}
}
?>
<?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\n"; $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\n"; (!fwrite($handle, $record)) && die("can not write data to file <b>$datafile</b>"); } mysql_free_result($result); //关闭文件: fclose($handle); return true; } } ?>
备份mybbs数据库:
SQL代码
//example 1 backup:
require_once('DbBak.php');
require_once('TableBak.php');
$connectid = mysql_connect('localhost','root','123456');
$backupDir = 'data';
$DbBak = new DbBak($connectid,$backupDir);
$DbBak->backupDb('mybbs');
恢复mybbs数据库:
require_once('DbBak.php'); require_once('TableBak.php'); $connectid = mysql_connect('localhost','root','123456'); $backupDir = 'data'; $DbBak = new DbBak($connectid,$backupDir); $DbBak->restoreDb('mybbs');
php实现mysql数据库备份类
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@