php实现mysql数据库备份类


Posted in PHP onMarch 20, 2008

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 相关文章推荐
php 文章采集正则代码
Dec 28 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
php实现简单的MVC框架实例
Sep 23 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
May 21 PHP
php 常用字符串函数总结
Mar 15 #PHP
php str_replace的替换漏洞
Mar 15 #PHP
PHP执行速率优化技巧小结
Mar 15 #PHP
请php正则走开
Mar 15 #PHP
可以在线执行PHP代码包装修正版
Mar 15 #PHP
PHP Token(令牌)设计
Mar 15 #PHP
php项目打包方法
Feb 18 #PHP
You might like
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
图解上海144收音机
2021/03/02 无线电
WINXP下apache+php4+mysql
2006/11/25 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
详解javascript函数的参数
2015/11/10 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
js实现数字滚动特效
2019/12/16 Javascript
python的即时标记项目练习笔记
2014/09/18 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
多个python文件调用logging模块报错误
2020/02/12 Python
python实时监控logstash日志代码
2020/04/27 Python
Python 爬虫性能相关总结
2020/08/03 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
学生档案自我鉴定
2013/10/07 职场文书
工作迟到检讨书
2014/02/21 职场文书
法律专业自荐信
2014/06/03 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers