php实现MySQL数据库备份与还原类实例
本文实例讲述了php实现MySQL数据库备份与还原类。分享给大家供大家参考。具体分析如下:
这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的在dbmange中配置好连接地址用户名与数据库即可,下面我们一起来看这个例子,代码如下:
<?php /** *创建时间:2012年5月21日 * *说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql) *功能:实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入 *使用方法: * *------1.数据库备份(导出)------------------------------------------------------------ //分别是主机,用户名,密码,数据库名,数据库编码 $db=newDBManage('localhost','root','root','test','utf8'); //参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) $db->backup(); *------2.数据库恢复(导入)------------------------------------------------------------ //分别是主机,用户名,密码,数据库名,数据库编码 $db=newDBManage('localhost','root','root','test','utf8'); //参数:sql文件 $db->restore('./backup/20120516211738_all_v1.sql'); *---------------------------------------------------------------------- */ classDBManage { 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='test',$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(!emptyempty($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.='--http://yanue.net'.$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(emptyempty($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); } //锁定数据库,以免备份或导入时出错 privatefunctionlock($tablename,$op="WRITE"){ if(mysql_query("locktables".$tablename."".$op)) returntrue; else returnfalse; } //解锁 privatefunctionunlock(){ if(mysql_query("unlocktables")) returntrue; else returnfalse; } //析构 function__destruct(){ mysql_query("unlocktables",$this->db); mysql_close($this->db); } } $db=newDBManage('localhost','root','','tao','gbk'); //$db->backup('tao_admin'); $db->restore('./backup/20140228222713_tao_admin_v1.sql'); ?>
希望本文所述对大家的PHP程序设计有所帮助。