文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php教程>php实现mysql数据库备份类

php实现mysql数据库备份类

时间:2021-02-01  来源:互联网

备份程序一共只有两个类:数据库备份器(DbBak)和表备份器(TableBak): 这个程序仅仅备份和恢复数据,使用方法很简单,实例化DbBak,然后调用bakupDb和restoreDb方法:

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'); 

相关阅读更多 +
最近更新
排行榜 更多 +
元梦之星最新版手游

元梦之星最新版手游

棋牌卡牌 下载
我自为道安卓版

我自为道安卓版

角色扮演 下载
一剑斩仙

一剑斩仙

角色扮演 下载