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

PHP数据库备份与恢复

发布时间:2021-07-06 06:02:31 所属栏目:大数据 来源: https://www.jb51.cc
导读:先说下关于数据库备份与恢复的原理: 1、查找所有表-2、查找所有字段-3、查找所有数据-4、生成sql 备份注意点: 2=需要列出所有字段名,字段类型等相关信息 3=读取数据出来注意特殊符号的转换addslashes() 4= 把数据格式化 生成对应的 sql ? MysqL_list_tabl

先说下关于数据库备份与恢复的原理:

1、查找所有表->2、查找所有字段->3、查找所有数据->4、生成sql

备份注意点:

2=>需要列出所有字段名,字段类型等相关信息

3=>读取数据出来注意特殊符号的转换addslashes()

4=>把数据格式化生成对应的sql

?

MysqL_list_tables() 表查询函数,类似MysqL_query() 函数 ? MysqL_fetch_field() 字段信息函数,返回句柄 ? ? 恢复注意点: 1、 注意数据库的大小,过大或者过多的表分段处理
2、 生成的sql文件名或者存放不易被猜到
3、 备份生成文件可以表或者字段为单位保存
4、可以使用ZIP组件压缩生成的文件以便保持 ? 迷你版代码:
<?PHP
$MysqL_dbname = "PHP100";
MysqL_connect("localhost","root","");
MysqL_select_db($MysqL_dbname);

$sql_list = MysqL_list_tables(while ($row_data = MysqL_fetch_row($sql_list)) {
echo $row_data[0] . "<br>";
get_table_fd($row_data[0],"sql");

//  $fp=fopen("sql/$tablename.sql","w+");
//  fwrite($fp,$field);
//  fclose($fp);
}

function get_table_fd($tablename) {
$field = "CREATE TABLE `$tablename`(n";
$result = MysqL_query("select * from $tablename"$Meta = MysqL_fetch_field($resultif ($Meta->not_null)
$not_null = "not_null"$field .= "`$Meta->name` $Meta->type($Meta->max_length) $not_null; n";
}
$field .= ")n"return $field;
}


?>

?

在网上找到个不错的类库,可直接拿来用,记录一下

1、db.PHP 数据库类

2、backup.PHP 备份

3、restore.PHP 恢复

?

下载附件

?

db.PHP

 1 <?
 2 class db{
 3 
 4 var $linkid 5 $sqlid 6 $record 7 
 8 function db($host="",$username="",1)">$password="",1)">$database="")
 9     {
10     if(!$this->linkid)  @$this->linkid = MysqL_connect($host,1)">$username,1)">$password) or die("连接服务器失败."11     @$database,1)">$this->linkid) or die("无法打开数据库"12     MysqL_query('set names gbk'13     $this->linkid;}
14 
15 function query($sql16     {if($this->sqlid=MysqL_query($sql,1)">$this->linkid)) sqlid;
17     else {
18         $this->err_report(MysqL_error19     return false;}
20     }
21 
22 function nr($sql_id=""23     {$sql_id) $sql_id=24     MysqL_num_rows($sql_id);}
25 
26 function nf(27     {28     MysqL_num_fields(29 
30 function nextrecord(31     {32     $this->record=MysqL_fetch_array($sql_id))  record;
33     else 34 35 
36 function f($name37 38     $this->record[$name]) ];
39     40 41 
42 function close() {MysqL_close(linkid);}
43 
44 function lock($tblname,1)">$op="WRITE"45     {if(MysqL_query("lock tables ".$tblname." ".$op)) true; 46 
47 function unlock()
48     {MysqL_query("unlock tables")) 49 
50  ar() {
51     return @MysqL_affected_rows(linkid);
52   }
53 
54  i_id() {
55         MysqL_insert_id();
56 57 
58 function err_report($err59 60 echo "MySQL查询错误<br>"61 echo "查询语句:".$sql."<br>"62 echo "错误信息:".63 64 }?>

?

backup.PHP

  1 <?
  2 global $MysqLhost,1)">$MysqLuser,1)">$MysqLpwd,1)">$MysqLdb  3 $MysqLhost=""; host name
  4 $MysqLuser="";              login name
  5 $MysqLpwd="";              password
  6 $MysqLdb="";        name of database
  7 
  8 include("mydb.PHP"  9 $d=new db( 10 /*--------------界面--------------*/$_POST['act']){----------------------*/
 11 $msgs[]="服务器备份目录为backup" 12 $msgs[]="对于较大的数据表,强烈建议使用分卷备份" 13 $msgs[]="只有选择备份到服务器,才能使用分卷备份功能" 14 show_msg($msgs 15 ?>
 16 <form name="form1" method="post" action="backup.PHP">
 17   <table width="99%" border="1" cellpadding='0' cellspacing='1'>
 18     <tr align="center" class='header'><td colspan="2">数据备份</td></tr>
 19     <tr><td colspan="2">备份方式</td></tr>
 20     <tr><td><input type="radio" name="bfzl" value="quanbubiao">        备份全部数据</td><td>备份全部数据表中的数据到一个备份文件</td></tr>
 21     <tr><td><input type="radio" name="bfzl" value="danbiao">备份单张表数据 
 22         <select name="tablename"><option value="">请选择</option>
 23           <?
 24         $d->query("show table status from $MysqLdb" 25         while($d->nextrecord()){
 26         echo "<option value='".$d->f('Name')."'>".$d->f('Name')."</option>" 27         ?>
 28         </select></td><td>备份选中数据表中的数据到单独的备份文件</td></tr>
 29     <tr><td colspan="2">使用分卷备份</td></tr>
 30     <tr><td colspan="2"><input type="checkBox" name="fenjuan" value="yes">
 31         分卷备份 <input name="filesize" type="text" size="10">K</td></tr>
 32     <tr><td colspan="2">选择目标位置</td></tr>
 33     <tr><td colspan="2"><input type="radio" name="weizhi" value="server" checked>备份到服务器</td></tr><tr class="cells"><td colspan='2'> <input type="radio" name="weizhi" value="localpc">
 34         备份到本地</td></tr>
 35     <tr><td colspan="2" align='center'><input type="submit" name="act" value="备份"></td></tr>
 36   </table></form>
 37 <?-------------界面结束-------------*/}--------------------------------- 38 ----else{--------------主程序----------------------------------------- 39 $_POST['weizhi']=="localpc"&&$_POST['fenjuan']=='yes' 40     { 41 show_msg(); pageend();}
 42 $_POST['fenjuan']=="yes"&&!$_POST['filesize'])
 43     {$msgs[]="您选择了分卷备份功能,但未填写分卷文件大小" 44 show_msg( 45 $_POST['weizhi']=="server"&&!writeable("./backup"))
 46     {$msgs[]="备份文件存放目录'./backup'不可写,请修改目录属性" 47 show_msg( 48 
 49 ----------备份全部表-------------$_POST['bfzl']=="quanbubiao"){ 50 ----不分卷$_POST['fenjuan']){-------------------------------- 51 $tables= 52     {$msgs[]="读数据库结构错误"; show_msg( 53 $sql="" 54 $d->nextrecord($tables 55  56     $table=$d->f("Name" 57     $sql.=make_header($table 58     $d->query("select * from $table" 59     $num_fields=nf();
 60     nextrecord())
 61     {$sql.=make_record($table,1)">$num_fields 62  63 $filename=date("Ymd",1)">time())."_all.sql" 64 $_POST['weizhi']=="localpc") down_file($filename 65 elseif($_POST['weizhi']=="server" 66     {if(write_file( 67 $msgs[]="全部数据表数据备份完成,生成备份文件'./backup/$filename'" 68     else $msgs[]="备份全部数据表失败" 69     show_msg( 70     pageend();
 71  72 -----------------不要卷结束----------------------- 73 -----------------分卷------------------------- 74  75     {$msgs[]="请填写备份文件分卷大小"; show_msg();pageend();}
 76  77     { 78 $sql=""; $p=1 79 time())."_all" 80  81 {
 82      83      84      85      86      87     { 88     strlen($sql)>=$_POST['filesize']*1000){
 89             $filename.=("_v".$p.".sql" 90              91             $msgs[]="全部数据表-卷-".$p."-数据备份完成,1)"> 92             $msgs[]="备份表-".$_POST['tablename']."-失败" 93             $p++ 94              95              96  97 }
 98 $sql!=""){);        
 99 100 101 show_msg(102 ---------------------分卷结束--------------------------------------103 --------备份全部表结束---------------------------------------------104 
105 --------备份单表------$_POST['bfzl']=="danbiao"){------------106 $_POST['tablename'107     {$msgs[]="请选择要备份的数据表"; show_msg(108 --------不分卷-------------------------------109 $sql=make_header(]);
110 $d->query("select * from ".111 112 113     {$_POST['tablename'],1)">114 time())."_".$_POST['tablename'].".sql"115 116 117     {118 $msgs[]="表-".$_POST['tablename']."-数据备份完成,1)">119     120     show_msg(121 122 123 ----------------不要卷结束------------------------------------124 ----------------分卷125 126     {127 $_POST['tablename']); ; 
128     129     130     131     nextrecord()) 
132     {    
133         134        135             136             137             $_POST['tablename']."-卷-".138             139             140             141             142 143 144 145 146 show_msg(147 ----------分卷结束--------------------------------------------------148 ----------备份单表结束----------------------------------------------149 
150 ----------------主程序结束------------------------------------------151 
152 function write_file(153 154 $re=true155 if(!@$fp=fopen("./backup/".$filename,"w+")) {false; echo "Failed to open target file"156 if(!@fwrite($fp,1)">$sql)) {echo "Failed to write file"157 fclose($fp)) {echo "Failed to close target file"158 $re159 160 
161 function down_file(162 163     ob_end_clean164     header("Content-Encoding: none"165     header("Content-Type: ".(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE') ? 'application/octetstream' : 'application/octet-stream'));
166             
167     header("Content-Disposition: ".(168             
169     header("Content-Length: ".170     header("Pragma: no-cache"171             
172     header("Expires: 0"173     174     $e=ob_get_contents175     176 177 
178 function writeable($dir179 180     
181     if(!is_dir(182     @mkdir($dir,0777183 184     
185     )) 
186 187     
188     $fp = @fopen("$dir/test.test",'w'189         {
190 @$fp191     @unlink("$dir/test.test"192     $writeable = 1193 } 
194     195 $writeable = 0196 197     
198 199     
200     $writeable201 
202 203 
204 function make_header(205 {$d206 $sql="DROP TABLE IF EXISTS ".$table."n"207 $d->query("show create table ".208 nextrecord();
209 $tmp=preg_replace("/n/","",1)">$d->f("Create Table"210 $sql.=$tmp."n"211 212 213 
214 function make_record(215 {216 $comma=""217 $sql .= "INSERT INTO ".$table." VALUES("218 for($i = 0; $i < $num_fields; $i++) 
219 {$sql .= ($comma."'".MysqL_escape_string($d->record[$i])."'"); $comma = ","220 $sql .= ")n"221 222 223 
224 function show_msg(225 226 $title="提示:"227 echo "<table width='100%' border='1'  cellpadding='0' cellspacing='1'>"228 echo "<tr><td>".$title."</td></tr>"229 echo "<tr><td><br><ul>"230 while (list($k,1)">$v)=each(231 232     echo "<li>".$v."</li>"233 234 echo "</ul></td></tr></table>"235 236 
237  pageend()
238 239 exit240 241 ?>

?

restore.PHP

<?
session_start$MysqLhost="";          host name
login name
password
name of database

);
*****界面$_POST['act']&&!$_SESSION['data_file']){*********************/
$msgs[]="本功能在恢复备份数据的同时,将全部覆盖原有数据,请确定是否需要恢复,以免造成数据损失"$msgs[]="数据恢复功能只能恢复由dShop导出的数据文件,其他软件导出格式可能无法识别"$msgs[]="从本地恢复数据需要服务器支持文件上传并保证数据尺寸小于允许上传的上限,否则只能使用从服务器恢复"$msgs[]="如果您使用了分卷备份,只需手工导入文件卷1,其他数据文件会由系统自动导入";
show_msg();
?>
<form action="" method="post" enctype="multipart/form-data" name="restore.PHP">
<table width="91%" border="0" cellpadding="0" cellspacing="1">
<tr align="center" class="header"><td colspan="2" align="center">数据恢复</td></tr>
<tr><td width="33%"><input type="radio" name="restorefrom" value="server" checked>
从服务器文件恢复 </td><td width="67%"><select name="serverfile">
    <option value="">-请选择-</option>
<?
$handle=opendir('./backup'$file = readdir($handle)) {
    eregi("^[0-9]{8,8}([0-9a-z_]+)(.sql)$",1)">$file)) echo "<option value='$file'>$file</option>"closedir(); 
?>
  </select> </td></tr>
<tr><td><input type="radio" name="restorefrom" value="localpc">       从本地文件恢复</td>
<td><input type="hidden" name="MAX_FILE_SIZE" value="1500000"><input type="file" name="myfile"></td></tr>
<tr><td colspan="2" align="center"> <input type="submit" name="act" value="恢复"></td>  </tr></table></form>


<?*************************界面结束**************************************************************主程序$_POST['act']=="恢复"){**************************服务器恢复$_POST['restorefrom']=="server"){$_POST['serverfile'])
    {$msgs[]="您选择从服务器文件恢复备份,但没有指定备份文件";
     show_msg(); pageend();    }
eregi("_v[0-9]+",1)">]))
    {$filename="./backup/".];
    if(import($filename)) $msgs[]="备份文件".$_POST['serverfile']."成功导入数据库";
    $_POST['serverfile']."导入失败";
    show_msg(); pageend();        
    }

    {
    else {$_POST['serverfile']."导入失败";show_msg();pageend();}
    $voltmp=explode("_v",1)">]);
    $volname=$voltmp[0];
    $volnum=explode(".sq",1)">$voltmp[1intval($volnum[0])+1;
    $tmpfile=$volname."_v".$volnum.".sql"file_exists("./backup/".$tmpfile))
        {
        $msgs[]="程序将在3秒钟后自动开始导入此分卷备份的下一部份:文件".$tmpfile.",请勿手动中止程序的运行,以免数据库结构受损";
        $_SESSION['data_file']=;
        show_msg();
        sleep(3echo "<script language='javascript'>"; 
        echo "location='restore.PHP';"echo "</script>"; 
        }
    
        {
        $msgs[]="此分卷备份全部导入成功");
        }
    }
*************服务器恢复结束**********************************************************本地恢复$_POST['restorefrom']=="localpc"){*/
    switch ($_FILES['myfile']['error'])
    {
    case 1:
    case 2:
    $msgs[]="您上传的文件大于服务器限定值,上传未成功"breakcase 3:
    $msgs[]="未能从本地完整上传备份文件"case 4:
    $msgs[]="从本地上传备份文件失败"case 0:
    ;
    }
    $msgs){show_msg();pageend();}
$fname=time())."_".sjs(5).".sql"if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
    copy($_FILES['myfile']['tmp_name'],"./backup/".$fname);}

)) 
    {
    $msgs[]="本地备份文件上传成功"if(import("./backup/".$fname)) {$msgs[]="本地备份文件成功导入数据库"; unlink("./backup/".);}
    $msgs[]="本地备份文件导入数据库失败";
    }
else ();
show_msg(***本地恢复结束*********************************************************************************主程序结束********************************************************剩余分卷备份恢复*********************************$_POST['act']&&$_SESSION['data_file'])
{
    $_SESSION['data_file']."成功导入数据库"$_SESSION['data_file']."导入失败";show_msg(;
        unset(]);
        show_msg();
        }
}
*********************剩余分卷备份恢复结束******************************function import()
{$sqls=file(foreach($sqls as )
    {
    str_replace("r",1)">);
    str_replace("n",1)">$d->query(trim($sql))) ;
}
)
{
))
    {
    ;
}

 pageend()
{
();
}
?>

?

(编辑:北几岛)

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

    推荐文章
      热点阅读