加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php实现mysql数据库备份类

发布时间:2020-12-13 05:22:35 所属栏目:PHP教程 来源:网络整理
导读:1、实例化DbBak需要告诉它两件事:数据服务器在哪里($connectid)、备份到哪个目录($backupDir):require_once('DbBak.php'); require_once('TableBak.php'); $connectid=mysql_connect('localhost','root','123456'); $backupDir='data'; $DbBak=newDbBak($c

1、实例化DbBak需要告诉它两件事:数据服务器在哪里($connectid)、备份到哪个目录($backupDir):require_once('DbBak.php');
require_once('TableBak.php');
$connectid=mysql_connect('localhost','root','123456');
$backupDir='data';
$DbBak=newDbBak($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','friendsite'));
PHP代码
$DbBak->restoreDb('mybbs','board');
PHP代码
require_once('TableBak.php');
classDbBak{
var$_mysql_link_id;
var$_dataDir;
var$_tableList;
var$_TableBak; functionDbBak($_mysql_link_id,$dataDir)
{
((!is_string($dataDir))||strlen($dataDir)==0)&&die('error:$datadirisnotastring');
!is_dir($dataDir)&&mkdir($dataDir);
$this->_dataDir=$dataDir;
$this->_mysql_link_id=$_mysql_link_id;
} functionbackupDb($dbName,$tableName=null)
{
((!is_string($dbName))||strlen($dbName)==0)&&die('$dbNamemustbeastringvalue');
//step1:选择数据库:
mysql_select_db($dbName);
//step2:创建数据库备份目录
$dbDir=$this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir)&&mkdir($dbDir);
//step3:得到数据库所有表名并开始备份表
$this->_TableBak=newTableBak($this->_mysql_link_id,$dbDir);
if(is_null($tableName)){//backupalltableinthedb
$this->_backupAllTable($dbName);
return;
}
if(is_string($tableName)){
(strlen($tableName)==0)&&die('....');
$this->_backupOneTable($dbName,$tableName);
return;
}
if(is_array($tableName)){
foreach($tableNameas$table){
((!is_string($table))||strlen($table)==0)&&die('....');
}
$this->_backupSomeTalbe($dbName,$tableName);
return;
}
} functionrestoreDb($dbName,$tableName=null){
((!is_string($dbName))||strlen($dbName)==0)&&die('$dbNamemustbeastringvalue');
//step1:检查是否存在数据库并连接:
@mysql_select_db($dbName)||die("thedatabase$dbNamedosenotexists");
//step2:检查是否存在数据库备份目录
$dbDir=$this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir)&&die("$dbDirnotexists");
//step3:startrestore
$this->_TableBak=newTableBak($this->_mysql_link_id,$dbDir);
if(is_null($tableName)){//backupalltableinthedb
$this->_restoreAllTable($dbName);
return;
}
if(is_string($tableName)){
(strlen($tableName)==0)&&die('....');
$this->_restoreOneTable($dbName,$tableName);
return;
}
if(is_array($tableName)){
foreach($tableNameas$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("指定的表名$tableName在数据库中不存在");
$this->_TableBak->backupTable($tableName);
} function_backupSomeTalbe($dbName,$TableNameList)
{
foreach($TableNameListas$tableName){
!in_array($tableName,$this->_getTableList($dbName))&&die("指定的表名$tableName在数据库中不存在");
}
foreach($TableNameListas$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("$tableBakFilenotexistsorunwirteable");
}
//step2:startrestore
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("指定的表名$tableName在数据库中不存在");
//step2:检查是否存在数据表备份文件以及是否可写:
$tableBakFile=$this->_dataDir.DIRECTORY_SEPARATOR
.$dbName.DIRECTORY_SEPARATOR
.$tableName.DIRECTORY_SEPARATOR
.$tableName.'.sql';
!is_writeable($tableBakFile)&&die("$tableBakFilenotexistsorunwirteable");
//step3:startrestore
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
function_restoreSomeTalbe($dbName,$TableNameList)
{
//step1:检查是否存在数据表:
foreach($TableNameListas$tableName){
!in_array($tableName,$this->_getTableList($dbName))&&die("指定的表名$tableName在数据库中不存在");
}
//step2:检查是否存在数据表备份文件以及是否可写:
foreach($TableNameListas$tableName){
$tableBakFile=$this->_dataDir.DIRECTORY_SEPARATOR
.$dbName.DIRECTORY_SEPARATOR
.$tableName.DIRECTORY_SEPARATOR
.$tableName.'.sql';
!is_writeable($tableBakFile)&&die("$tableBakFilenotexistsorunwirteable");
}
//step3:startrestore:
foreach($TableNameListas$tableName){
$tableBakFile=$this->_dataDir.DIRECTORY_SEPARATOR
.$dbName.DIRECTORY_SEPARATOR
.$tableName.DIRECTORY_SEPARATOR
.$tableName.'.sql';
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
}
}
?>
<div class="codetitle"><a style="CURSOR: pointer" data="21427" class="copybut" id="copybut21427" onclick="doCopy('code21427')"> 代码如下:<div class="codebody" id="code21427">
<?php
//只有DbBak才能调用这个类
classTableBak{
var$_mysql_link_id;
var$_dbDir;
//private$_DbManager;
functionTableBak($mysql_link_id,$dbDir)
{
$this->_mysql_link_id=$mysql_link_id;
$this->_dbDir=$dbDir;
} functionbackupTable($tableName)
{
//step1:创建表的备份目录名:
$tableDir=$this->_dbDir.DIRECTORY_SEPARATOR.$tableName;
!is_dir($tableDir)&&mkdir($tableDir);
//step2:开始备份:
$this->_backupTable($tableName,$tableDir);
} functionrestoreTable($tableName,$tableBakFile)
{
set_time_limit(0);
$fileArray=@file($tableBakFile)ordie("canopenfile$tableBakFile");
$num=count($fileArray);
mysql_unbuffered_query("DELETEFROM$tableName");
$sql=$fileArray[0];
for($i=1;$i<$num-1;$i++){
mysql_unbuffered_query($sql.$fileArray[$i])or(die(mysql_error()));
}
returntrue;
} function_getFieldInfo($tableName){
$fieldInfo=array();
$sql="SELECTFROM$tableNameLIMIT1";
$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($rowas$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="INSERTINTO$tableName($fields)VALUESrn";
$datafile=$tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql';
(!$handle=fopen($datafile,'w'))&&die("cannotopenfile$datafile");
(!fwrite($handle,$sqltext))&&die("cannotwritedatatofile$datafile");
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("cannotopenfile$datafile");
//逐条取得表记录并写入文件:
while($row=mysql_fetch_assoc($result)){
$row=$this->_quoteRow($fieldInfo,$row);
$record='('.implode(',$row).");rn";
(!fwrite($handle,$record))&&die("cannotwritedatatofile$datafile");
}
mysql_free_result($result);
//关闭文件:
fclose($handle); returntrue;
} }
?>
备份mybbs数据库: SQL代码
//example1backup:
require_once('DbBak.php');
require_once('TableBak.php');
$connectid=mysql_connect('localhost',$backupDir);
$DbBak->backupDb('mybbs'); 恢复mybbs数据库:<div class="codetitle"><a style="CURSOR: pointer" data="13141" class="copybut" id="copybut13141" onclick="doCopy('code13141')"> 代码如下:<div class="codebody" id="code13141">
require_once('DbBak.php');
require_once('TableBak.php');
$connectid=mysql_connect('localhost',$backupDir);
$DbBak->restoreDb('mybbs');

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读