数据库的备份和还原.docx
- 文档编号:28893519
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:18
- 大小:18.69KB
数据库的备份和还原.docx
《数据库的备份和还原.docx》由会员分享,可在线阅读,更多相关《数据库的备份和还原.docx(18页珍藏版)》请在冰豆网上搜索。
数据库的备份和还原
数据库的备份和还原
折腾了好久终于可以完成了,为了让大家少走弯路,这里为大家做了下总结,这个是在thinkphp下做的
首先将DBMysqlController.class.php放到tools文件夹下:
代码如下:
<?
php
namespaceTools;
header('content-type:
text/html;charset=utf8');
classDBMysqlController{
var$db;//数据库连接
var$database;//所用数据库
var$sqldir;//数据库备份文件夹
var$record;
//换行符
private$ds="n";
//存储SQL的变量
public$sqlContent="";
//每条sql语句的结尾符
public$sqlEnd=";";
/**
*初始化
*
*@paramstring$host
*@paramstring$username
*@paramstring$password
*@paramstring$thisatabase
*@paramstring$charset
*/
function__construct($host='localhost',$username='root',$password='',$thisatabase='shop',$charset='utf8')
{
$this->host=$host;
$this->username=$username;
$this->password=$password;
$this->database=$thisatabase;
$this->charset=$charset;
//连接数据库
$this->db=mysql_connect($this->host,$this->username,$this->password)ordie("数据库连接失败.");
//选择使用哪个数据库
mysql_select_db($this->database,$this->db)ordie("无法打开数据库");
//数据库编码方式
mysql_query('SETNAMES'.$this->charset,$this->db);
}
/*
*------------------------------------------数据库备份start----------------------------------------------------------
*/
/**
*数据库备份
*参数:
备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)
*
*@param$string$dir
*@paramint$size
*@param$string$tablename
*/
functionbackup($tablename='',$dir='',$size=2000)
{
//$dir=$dir?
$dir:
'backup/';
//$size=$size?
$size:
2000;
$sql='';
//只备份某个表
if(!
empty($tablename))
{
echo'正在备份表'.$tablename.'<br/>';
//插入dump信息
$sql=$this->_retrieve();
//插入表结构信息
$sql.=$this->_insert_table_structure($tablename);
//插入数据
$data=mysql_query("select*from".$tablename);
//文件名前面部分
$filename=date('YmdHis')."_".$tablename;
//字段数量
$num_fields=mysql_num_fields($data);
//第几分卷
$p=1;
//循环每条记录
while($record=mysql_fetch_array($data))
{
//单条记录
$sql.=$this->_insert_record($tablename,$num_fields,$record);
//如果大于分卷大小,则写入文件
if(strlen($sql)>=$size*1000)
{
$file=$filename."_v".$p.".sql";
if($this->_write_file($sql,$file,$dir))
{
echo"表-".$tablename."-卷-".$p."-数据备份完成,生成备份文件<spanstyle='color:
#f00;'>$dir$filename</span><br/>";
}
else
{
echo"备份表-".$tablename."-失败<br/>";
}
//下一个分卷
$p++;
//重置$sql变量为空,重新计算该变量大小
$sql="";
}
}
//sql大小不够分卷大小
if($sql!
="")
{
$filename.="_v".$p.".sql";
if($this->_write_file($sql,$filename,$dir))
{
echo"表-".$tablename."-卷-".$p."-数据备份完成,生成备份文件<spanstyle='color:
#f00;'>$dir$filename</span><br/>";
}
else
{
echo"备份卷-".$p."-失败<br/>";
}
}
}
else
{//备份全部表
if($tables=mysql_query("showtablestatusfrom".$this->database))
{
echo"读取数据库结构成功!
<br/>";
}
else
{
exit("读取数据库结构成功!
<br/>");
}
//插入dump信息
$sql.=$this->_retrieve();
//文件名前面部分
$filename=date('YmdHis')."_all";
//查出所有表
$tables=mysql_query('SHOWTABLES');
//第几分卷
$p=1;
//循环所有表
while($table=mysql_fetch_array($tables))
{
//获取表名
$tablename=$table[0];
//获取表结构
$sql.=$this->_insert_table_structure($tablename);
$data=mysql_query("select*from".$tablename);
$num_fields=mysql_num_fields($data);
//循环每条记录
while($record=mysql_fetch_array($data))
{
//单条记录
$sql.=$this->_insert_record($tablename,$num_fields,$record);
//如果大于分卷大小,则写入文件
if(strlen($sql)>=$size*1000)
{
$file=$filename."_v".$p.".sql";
//写入文件
if($this->_write_file($sql,$file,$dir))
{
echo"-卷-".$p."-数据备份完成,生成备份文件<spanstyle='color:
#f00;'>$dir$file</span><br/>";
}
else
{
echo"备份卷-".$p."-失败<br/>";
}
//下一个分卷
$p++;
//重置$sql变量为空,重新计算该变量大小
$sql="";
}
}
}
//sql大小不够分卷大小
if($sql!
="")
{
$filename.="_v".$p.".sql";
if($this->_write_file($sql,$filename,$dir))
{
echo"-卷-".$p."-数据备份完成,生成备份文件<spanstyle='color:
#f00;'>$dir$filename<br/>";
}
else
{
echo"备份卷-".$p."-失败<br/>";
}
}
}
}
/**
*插入数据库备份基础信息
*
*@returnstring
*/
privatefunction_retrieve(){
$value='';
$value.='--'.$this->ds;
$value.='--MySQLdatabasedump'.$this->ds;
$value.='--CreatedbyDBManageclass,PowerByyanue.'.$this->ds;
$value.='--'.$this->ds;
$value.='--'.$this->ds;
$value.='--主机:
'.$this->host.$this->ds;
$value.='--生成日期:
'.date('Y').'年'.date('m').'月'.date('d').'日'.date('H:
i').$this->ds;
$value.='--MySQL版本:
'.mysql_get_server_info().$this->ds;
$value.='--PHP版本:
'.phpversion().$this->ds;
$value.=$this->ds;
$value.='--'.$this->ds;
$value.='--数据库:
`'.$this->database.'`'.$this->ds;
$value.='--'.$this->ds.$this->ds;
$value.='---------------------------------------------------------';
$value.=$this->ds.$this->ds;
return$value;
}
/**
*插入表结构
*
*@paramunknown_type$table
*@returnstring
*/
privatefunction_insert_table_structure($table){
$sql='';
$sql.="--".$this->ds;
$sql.="--表的结构".$table.$this->ds;
$sql.="--".$this->ds.$this->ds;
//如果存在则删除表
$sql.="DROPTABLEIFEXISTS`".$table.'`'.$this->sqlEnd.$this->ds;
//获取详细表信息
$res=mysql_query('SHOWCREATETABLE`'.$table.'`');
$row=mysql_fetch_array($res);
$sql.=$row[1];
$sql.=$this->sqlEnd.$this->ds;
//加上
$sql.=$this->ds;
$sql.="--".$this->ds;
$sql.="--转存表中的数据".$table.$this->ds;
$sql.="--".$this->ds;
$sql.=$this->ds;
return$sql;
}
/**
*插入单条记录
*
*@paramstring$table
*@paramint$num_fields
*@paramarray$record
*@returnstring
*/
privatefunction_insert_record($table,$num_fields,$record){
//sql字段逗号分割
$insert=$comma="";
$insert.="INSERTINTO`".$table."`VALUES(";
//循环每个子段下面的内容
for($i=0;$i<$num_fields;$i++){
$insert.=($comma."'".mysql_real_escape_string($record[$i])."'");
$comma=",";
}
$insert.=");".$this->ds;
return$insert;
}
/**
*写入文件
*
*@paramstring$sql
*@paramstring$filename
*@paramstring$dir
*@returnboolean
*/
privatefunction_write_file($sql,$filename,$dir){
$dir=$dir?
$dir:
'./backup/';
//不存在文件夹则创建
if(!
file_exists($dir)){
mkdir($dir);
}
$re=true;
if(!
@$fp=fopen($dir.$filename,"w+")){
$re=false;
echo"打开文件失败!
";
}
if(!
@fwrite($fp,$sql)){
$re=false;
echo"写入文件失败,请文件是否可写";
}
if(!
@fclose($fp)){
$re=false;
echo"关闭文件失败!
";
}
return$re;
}
/*
*
*-------------------------------上:
数据库导出-----------分割线----------下:
数据库导入--------------------------------
*/
/**
*导入备份数据
*说明:
分卷文件格式20120516211738_all_v1.sql
*参数:
文件路径(必填)
*
*@paramstring$sqlfile
*/
functionrestore($sqlfile)
{
//检测文件是否存在
if(!
file_exists($sqlfile))
{
exit("文件不存在!
请检查");
}
$this->lock($this->database);
//获取数据库存储位置
$sqlpath=pathinfo($sqlfile);
$this->sqldir=$sqlpath['dirname'];
//检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷
$volume=explode("_v",$sqlfile);
$volume_path=$volume[0];
echo"请勿刷新及关闭浏览器以防止程序被中止,如有不慎!
将导致数据库结构受损<br/>";
echo"正在导入备份数据,请稍等!
<br/>";
if(empty($volume[1]))
{
echo"正在导入sql:
<spanstyle='color:
#f00;'>".$sqlfile.'</span><br/>';
//没有分卷
if($this->_import($sqlfile)){
echo"数据库导入成功!
";
}
else
{
exit('数据库导入失败!
');
}
}
else
{
//$volume_id=array();
//存在分卷,则获取当前是第几分卷,循环执行余下分卷
$volume_id=explode(".sq",$volume[1]);
//当前分卷为$volume_id
$volume_id=intval($volume_id[0]);
while($volume_id)
{
$tmpfile=$volume_path."_v".$volume_id.".sql";
//存在其他分卷,继续执行
if(file_exists($tmpfile)){
//执行导入方法
echo"正在导入分卷<spanstyle='color:
#f00;'>".$tmpfile.'</span><br/>';
if($this->_import($tmpfile))
{
}
else
{
exit("导入分卷<spanstyle='color:
#f00;'>".$tmpfile.'</span>失败!
可能是数据库结构已损坏!
请尝试从分卷1开始导入');
}
}
else
{
echo"此分卷备份全部导入成功!
<br/>";
return;
}
$volume_id++;
}
}
}
/**
*将sql导入到数据库(普通导入)
*
*@paramstring$sqlfile
*@returnboolean
*/
privatefunction_import($sqlfile){
//sql文件包含的sql语句数组
$sqls=array();
$f=fopen($sqlfile,"rb");
//创建表缓冲变量
$create='';
while(!
feof($f)){
//读取每一行sql
$line=fgets($f);
//如果包含'--'等注释,或为空白行,则跳过
if(trim($line)==''||preg_match('/--*?
/',$line,$match)){
continue;
}
//如果结尾包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句),
if(!
preg_match('/;/',$line,$match)||preg_match('/ENGINE=/',$line,$match)){
//将本次sql语句与创建表sql连接存起来
$create.=$line;
//如果包含了创建表的最后一句
if(preg_match('/ENGINE=/',$create,$match)){
//则将其合并到sql数组
$sqls[]=$create;
//清空当前,准备下一个表的创建
$create='';
}
//跳过本次
continue;
}
$sqls[]=$line;
}
fclose($f);
//循环sql语句数组,分别执行
foreach($sqlsas$sql){
str_replace("n","",$sql);
if(!
mysql_query(trim($sql))){
echomysql_error();
returnfalse;
}
}
returntrue;
}
/*
*-------------------------------数据库导入end---------------------------------
*/
//关闭数据库连接
privatefunctionclose(){
mysql_close($this->db);
}
//锁定数据库,以免备份或
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 备份 还原