在我们开发中数据库备份是很重要的环节,下面我们来分享两个php备份mysql数据库类,有需要的朋友可稍加修改即可使用.
先看备份的类文件backdata.class.php,代码如下:
- <?php
- /*
- *
- *简单的一个Mysql备份数据类
- *
- */
- classbackupData{
- private$mysql_link;//链接标识
- private$dbName;//数据库名
- private$dataDir;//数据所要存放的目录
- private$tableNames;//表名
- publicfunction__construct($mysql_link){
- $this->mysql_link=$mysql_link;
- }
- publicfunctionbackupTables($dbName,$dataDir,$tableNames){//开始备份
- $this->dbName=$dbName;
- $this->dataDir=$dataDir;
- $this->tableNames=$tableNames;
- $tables=$this->delarray($this->tableNames);
- $sqls='';
- foreach($tablesas$tablename){
- if($tablename==''){//表不存在时
- continue;
- }
- //************************以下是形成SQL的前半部分**************
- //如果存在表,就先删除
- $sqls.="DROPTABLEIFEXISTS$tablename;n";
- //读取表结构
- $rs=mysql_query("SHOWCREATETABLE$tablename",$this->mysql_link);
- $row=mysql_fetch_row($rs);
- //获得表结构组成SQL
- $sqls.=$row['1'].";nn";
- unset($rs);
- unset($row);
- //************************以下是形成SQL的后半部分**************
- //查寻出表中的所有数据
- $rs=mysql_query("select*from$tablename",$this->mysql_link);
- //表的字段个数
- $field=mysql_num_fields($rs);
- //形成此种SQL语句:"INSERTINTO`groups`VALUES('1499e0ca25988d','主任','','0');"
- while($rows=mysql_fetch_row($rs)){
- $comma='';//逗号
- $sqls.="INSERTINTO`$tablename`VALUES(";
- for($i=0;$i<$field;$i++){
- $sqls.=$comma."'".$rows[$i]."'";
- $comma=',';
- }
- $sqls.=");nnn";
- }
- }
- $backfilepath=$this->dataDir.date("Ymdhis",time()).'.sql';
- //写入文件
- $filehandle=fopen($backfilepath,"w");
- fwrite($filehandle,$sqls);
- fclose($filehandle);
- }
- privatefunctiondelarray($array){//处理传入进来的数组
- foreach($arrayas$tables){
- if($tables=='*'){//所有的表(获得表名时不能按常规方式来组成一个数组)
- $newtables=mysql_list_tables($this->dbName,$this->mysql_link);
- $tableList=array();
- for($i=0;$i<mysql_numrows($newtables);$i++){
- array_push($tableList,mysql_tablename($newtables,$i));
- }
- $tableList=$tableList;
- }else{
- $tableList=$array;
- break;
- }
- }
- return$tableList;
- }
- }
- ?>
数据库备份用法,代码如下:
- require_once("backdata.class.php");
- $link=@mysql_connect("localhost","数据库名","密码")ordie('Couldnotconnecttoserver.');
- mysql_query("usecms",$link);
- mysql_query("setnamesutf8",$link);
- $dbbck=newbackupData($link);//实例化它,只要一个链接标识就行了
- //备份数据时,如想备份一个数据库中的所有表,你可这样写:
- $dbbck->backupTables("cms","./",array('*'));
- //备份数据时,如想备份一个数据库中的仅一个表时,你可这样写:
- $dbbck->backupTables("cms","./",array('user'));
- //备份数据时,如想备份一个数据库中的多个表时,你可这样写:
- $dbbck->backupTables("cms","./",array('user','acl','informatoin'));
- //注解:$dbbck->backupTables("参1","参2",array());中,
参1为:数据库名.
参2为:要存放备份数据的位置,即目录地址.
第三个为:你要保存那些表.
再来分享一个数据库备份类,代码如下:
- /**
- *说明,该类适用于小型的网站的数据库备份,内置mysql连接,只需要简单配置数据连接
- *及存贮备份的位置即可。
- *类实列化并且连接数据库以后可执行以下操作
- *get_db_table($database)取得所有数据表
- *export_sql($table,$subsection=0))生成sql文件,注意生成sql文件只保存到服务器目录,不提供下载
- *import_sql($dir)恢复数据只导入服务器目录下的sql文件
- *该类制作简单,可任意传播,如何您对该类有什么提议,请发送邮件给小虾
- *@author赵红健[游天小虾]
- *email:328742379@qq.com
- *qq交流群:69574955聚义堂-网页制作交
- */
- classdata{
- public$data_dir="class/";//备份文件存放的路径
- public$transfer="";//临时存放sql[切勿不要对该属性赋值,否则会生成错误的sql语句]
- /**
- *数据库连接
- *@paramstring$host数据库主机名
- *@paramstring$user用户名
- *@paramstring$pwd密码
- *@paramstring$db选择数据库名
- *@paramstring$charset编码方式
- */
- functionconnect_db($host,$user,$pwd,$db,$charset='gbk'){
- if(!$conn=mysql_connect($host,$user,$pwd)){
- returnfalse;
- }
- mysql_select_db($db);
- mysql_query("setnames$charset");
- returntrue;
- }
- /**
- *生成sql语句
- *@param$table要备份的表
- *@return$tabledump生成的sql语句
- */
- publicfunctionset_sql($table,$subsection=0,&$tabledom=''){
- $tabledom.="droptableifexists$tablen";
- $createtable=mysql_query("showcreatetable$table");
- $create=mysql_fetch_row($createtable);
- $create[1]=str_replace("n","",$create[1]);
- $create[1]=str_replace("t","",$create[1]);
- $tabledom.=$create[1].";n";
- $rows=mysql_query("select*from$table");
- $numfields=mysql_num_fields($rows);
- $numrows=mysql_num_rows($rows);
- $n=1;
- $sqlarry=array();
- while($row=mysql_fetch_row($rows)){
- $comma="";
- $tabledom.="insertinto$tablevalues(";
- for($i=0;$i<$numfields;$i++)
- {
- $tabledom.=$comma."'".mysql_escape_string($row[$i])."'";
- $comma=",";
- }
- $tabledom.=")n";
- if($subsection!=0&&strlen($this->transfer)>=$subsection*1000){
- $sqlarry[$n]=$tabledom;
- $tabledom='';$n++;
- }
- }
- return$sqlarry;
- }
- /**
- *列表数据库中的表
- *@paramdatabase$database要操作的数据库名
- *@returnarray$dbarray所列表的数据库表
- */
- publicfunctionget_db_table($database){
- $result=mysql_list_tables($database);
- while($tmparry=mysql_fetch_row($result)){
- $dbarry[]=$tmparry[0];
- }
- return$dbarry;
- }
- /**
- *验证目录是否有效
- *@paramdiretory$dir
- *@returnbooln
- */
- functioncheck_write_dir($dir){
- if(!is_dir($dir)){@mkdir($dir,0777);}
- if(is_dir($dir)){
- if($link=opendir($dir)){
- $filearry=scandir($dir);
- for($i=0;$i<count($filearry);$i++){
- if($filearry[$i]!='.'||$filearry!='..'){
- @unlink($dir.$filearry[$i]);
- }
- }
- }
- }
- returntrue;
- }
- /**
- *将数据写入到文件中
- *@paramfile$filename文件名
- *@paramstring$str要写入的信息
- *@returnbooln写入成功则返回true,否则false
- */
- privatefunctionwrite_sql($filename,$str){
- $re=true;
- if(!@$fp=fopen($filename,"w+")){$re=false;echo"在打开文件时遇到错误,备份失败!";}
- if(!@fwrite($fp,$str)){$re=false;echo"在写入信息时遇到错误,备份失败!";}
- if(!@fclose($fp)){$re=false;echo"在关闭文件时遇到错误,备份失败!";}
- return$re;
- }
- /**
- *生成sql文件
- *@paramstring$sqlsql语句
- *@paramnumber$subsection分卷大小,以kb为单位,为0表示不分卷
- */
- publicfunctionexport_sql($table,$subsection=0){
- if(!$this->check_write_dir($this->data_dir)){echo'您没有权限操作目录,备份失败';returnfalse;}
- if($subsection==0){
- if(!is_array($table)){
- $this->set_sql($table,0,$this->transfer);
- }else{
- for($i=0;$i<count($table);$i++){
- $this->set_sql($table[$i],0,$this->transfer);
- }
- }
- $filename=$this->data_dir.date("ymd",time()).'_all.sql';
- if(!$this->write_sql($filename,$this->transfer)){returnfalse;}
- }else{
- if(!is_array($table)){
- $sqlarry=$this->set_sql($table,$subsection,$this->transfer);
- $sqlarry[]=$this->transfer;
- }else{
- $sqlarry=array();
- for($i=0;$i<count($table);$i++){
- $tmparry=$this->set_sql($table[$i],$subsection,$this->transfer);
- $sqlarry=array_merge($sqlarry,$tmparry);
- }
- $sqlarry[]=$this->transfer;
- }
- for($i=0;$i<count($sqlarry);$i++){
- $filename=$this->data_dir.date("ymd",time()).'_part'.$i.'.sql';
- if(!$this->write_sql($filename,$sqlarry[$i])){returnfalse;}
- }
- }
- returntrue;
- }
- /**
- *载入sql文件
- *@paramdiretory$dir
- *@returnbooln
- *注意:请不在目录下面存放其它文件,或者目录
- *以节省恢复时间
- */
- publicfunctionimport_sql($dir){
- if($link=opendir($dir)){
- $filearry=scandir($dir);
- $pattern="_part[0-9]+.sql$|_all.sql$";
- for($i=0;$i<count($filearry);$i++){
- if(eregi($pattern,$filearry[$i])){
- $sqls=file($dir.$filearry[$i]);
- foreach($sqlsas$sql){
- str_replace("r","",$sql);
- str_replace("n","",$sql);
- if(!mysql_query(trim($sql)))returnfalse;
- }//phpfensi.com
- }
- }
- returntrue;
- }
- }
- }
应用方法,代码如下:
- //$d=newdata();
- //连接数据库
- //if(!$d->connect_db('localhost','root','','guestbook','gbk')){
- //echo'数据库连接失败';
- //}
- //查找数据库内所有数据表
- //$tablearry=$d->get_db_table('guestbook');
- //备份并生成sql文件
- //if(!$d->export_sql($tablearry)){
- //echo'备份失败';
- //}else{
- //echo'备份成功';
- //}
- //恢复导入sql文件夹
- //if($d->import_sql($d->data_dir)){
- //echo'恢复成功';
- //}else{
- //echo'恢复失败';
- //}