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面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
Feb 15 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
Yii 框架入口脚本示例分析
May 19 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
模拟flock实现文件锁定
2007/02/14 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
php中文验证码实现方法
2015/06/18 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
Python脚本获取操作系统版本信息
2016/12/17 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
浅析python实现动态规划背包问题
2020/12/31 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
高二英语教学反思
2014/01/19 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
应急处置方案
2014/06/16 职场文书
学雷锋感言
2015/08/03 职场文书
小组口号霸气押韵
2015/12/24 职场文书