rinald_未来往事

php分卷备份恢复mysql数据库

PHP
本文主要阐述在大数据量下通过php程序分卷备份恢复mysql数据库的方法,代码已合并为一个文件,即为php页面版MySQL大数据库分卷备份恢复工具。由于时间关系,代码未做整理,结构相对混乱,如果你在该结构基础上做了整理也欢迎你反馈给我~~~

工具实现功能:
1.支持MySQL数据库按指定大小分卷备份和恢复;
2.支持单文件备份及下载
3.分卷备份存储在服务器端,可以直接上传导入

操作过程截图:
输入mysql链接配置信息
点击在新窗口中浏览此图片
当前权限链接下的数据库表信息
点击在新窗口中浏览此图片
选择导出备份方式
点击在新窗口中浏览此图片
导出备份选项
点击在新窗口中浏览此图片
导出备份执行进度
点击在新窗口中浏览此图片
导出备份的文件信息及导出
点击在新窗口中浏览此图片
……

附:代码部分
  1. //配置部分:   
  2. //注意,如果您没有在后面的注释的地方加上管理员身份验证程序,  
  3. //请不要配置正确的数据库用户名和密码!  
  4. //采用默认配置运行,程序会给出表单你填写的。  
  5. //最后更新修改作者:未来往事 http://fity.cn  
  6.   
  7. date_default_timezone_set('Asia/Shanghai');  
  8.   
  9. $db_host="localhost";    //数据库服务器  
  10. $db_username="root";     //数据库用户名  
  11. $db_password="";         //数据库密码  
  12. $db_dbname="";          //选择的数据库  
  13.   
  14. //兼容低版本PHP  
  15. function requestValues(){  
  16.   return ' if(!isset($_POST)){ $_POST = $HTTP_POST_VARS; $_GET = $HTTP_GET_VARS; $_SERVER = $HTTP_SERVER_VARS;} ';  
  17. }  
  18.   
  19. eval(requestValues());  
  20.   
  21. $_POST["frametopheight"]=90;  //FrameTop 的高  
  22.   
  23. define("VERSION","4.0"); //版本  
  24.   
  25. error_reporting(1);  
  26. @set_time_limit(0);  
  27.   
  28. function num_bitunit($num){  
  29.   $bitunit=array(' B',' KB',' MB',' GB');  
  30.   for($key=0;$key<count($bitunit);$key++){  
  31.   if($num>=pow(2,10*$key)-1){ //1023B 会显示为 1KB  
  32.     $num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]";  
  33.   }  
  34.   }  
  35.   return $num_bitunit_str;  
  36. }  
  37.   
  38. //frame 分开标题  
  39. function frameset_html(){  
  40.   global $_POST;  
  41.   return "if(!\$_GET[framename]){ 
  42.     echo \"<html> 
  43.     <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
  44.     <title>MySQL自导入数据库备份程序</title> 
  45.     </head> 
  46.     <frameset rows='*,0' frameborder='NO' border='0' framespacing='0' name='myframeset'> 
  47.       <frame src='\$_SERVER[PHP_SELF]?\$_SERVER[QUERY_STRING]&framename=main' name='mainFrame1'> 
  48.       <frame src='about:blank' name='mainFrame2'>   
  49.     </frameset> 
  50.     <BODY></BODY> 
  51.     </html>\"; 
  52.     exit; 
  53.   }";  
  54. }  
  55.   
  56. function postvars_function(){  
  57.   return ' 
  58.   function fsql_StrCode($string,$action="ENCODE"){ 
  59.     global $_SERVER; 
  60.     if($string=="") return ""; 
  61.     if($action=="ENCODE") $md5code=substr(md5($string),8,10); 
  62.     else{ 
  63.       $md5code=substr($string,-10);  
  64.       $string=substr($string,0,strlen($string)-10);  
  65.     } 
  66.     $key = md5($md5code.$_SERVER["HTTP_USER_AGENT"].filemtime($_SERVER["SCRIPT_FILENAME"])); 
  67.     $string = ($action=="ENCODE"?$string:base64_decode($string)); 
  68.     $len = strlen($key); 
  69.     $code = ""; 
  70.     for($i=0; $i<strlen($string); $i++){ 
  71.       $k = $i%$len; 
  72.       $code .= $string[$i]^$key[$k]; 
  73.     } 
  74.     $code = ($action == "DECODE" ? (substr(md5($code),8,10)==$md5code?$code:NULL) : base64_encode($code)."$md5code"); 
  75.     return $code; 
  76.   } 
  77.   if($_POST[faisunsql_postvars]){ 
  78.     if($faisunsql_postvars=unserialize(fsql_StrCode($_POST[faisunsql_postvars],"DECODE"))){ 
  79.       foreach($faisunsql_postvars as $key=>$value){ 
  80.         if(!isset($_POST[$key])) $_POST[$key] = $value; 
  81.       } 
  82.     }else{ die("<script language=\'JavaScript\'>alert(\'由于文档更改,提交信息已丢失,需要重新开始.\');</script>"); } 
  83.     unset($_POST[faisunsql_postvars],$faisunsql_postvars,$key,$value); 
  84.   }';    
  85. }  
  86.   
  87. eval(frameset_html().postvars_function());  
  88.   
  89. if($_POST["totalsize"]){  
  90.   $totalsize_chunk=num_bitunit($_POST["totalsize"]);  
  91. }  
  92.   
  93. //css 样式定义  
  94. function csssetting(){  
  95.   return "<style type='text/css'> 
  96.   <!-- 
  97.   body, td, input, a{color:#985b00;font-family: '宋体';font-size: 9pt;} 
  98.   body, td, a{line-height:180%;} 
  99.   .tabletitle{color:#FFFFFF;background-color:#FF6600;} 
  100.   .tabledata{background-color:#FFEECC;} 
  101.   .tabledata_on{background-color:#FFFFCC;}   
  102.   input, .borderdiv {border:1px inset;} 
  103.   --> 
  104.   </style>";  
  105. }  
  106.   
  107. //各页相同的页面头  
  108. function fheader(){  
  109.   global $_POST;  
  110.   $str = fsql_StrCode(serialize($_POST),"ENCODE");  
  111.   echo "<html> 
  112.   <head>  
  113.   <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
  114.   <title>MySQL自导入数据库备份程序</title> 
  115.   ".csssetting()." 
  116.   </head><body    link='#0000FF' vlink='#0000FF' alink='#0000FF' bgcolor='#FFFFFF'> 
  117.   <center><script language='Javascript'>document.doshowmywin=1;</script> 
  118.   <form name='myform' method='post' action=''><input type='hidden' name='faisunsql_postvars' value='".$str."'>";  
  119. }  
  120.   
  121. function showmywin_script(){  
  122.   global $_POST;  
  123.   return "<script language='Javascript'> 
  124.   function showmywin(){ 
  125.     if(!document.doshowmywin) return; 
  126.     if(top.myframeset&&this.window.name=='mainFrame1'){ 
  127.       top.myframeset.rows='$_POST[frametopheight],*,0'; 
  128.     } 
  129.     if(top.myframeset&&this.window.name=='mainFrame2'){ 
  130.       top.myframeset.rows='$_POST[frametopheight],0,*'; 
  131.     } 
  132.   } 
  133.   document.body.onload=showmywin; 
  134.   </script>";  
  135. }  
  136.   
  137. //各页相同的页面尾  
  138. function ffooter(){  
  139.   echo "<div id='pageendTag'></div></form> 
  140.   <a href='http://fity.cn' target='_blank'>欢迎来访 <b>未来往事</b> 博客</a> 
  141.  
  142.   <a href='http://fity.cn' target='_blank'><b>http://fity.cn</b></a> 
  143.  
  144.   </center>".showmywin_script()."</body></html>";  
  145. }  
  146.   
  147. //开始说明表格  
  148. function tabletext($ttext="",$twidth=400){  
  149.   return "<table width='$twidth' border='0' cellspacing='1' cellpadding='3' align=center><tr><td>$ttext</td></tr></table> 
  150. \r\n";  
  151. }  
  152.   
  153. //开始一个表格  
  154. function tablestart($ttitle="",$twidth=400){  
  155.   return "<table width='1' border='0' cellspacing='0' cellpadding='0' align=center class='tabletitle'> 
  156.   <tr><td class='tabletitle'><strong> $ttitle</strong></td></tr> <tr><td> 
  157.   <table width='$twidth' border='0' cellspacing='1' cellpadding='2' align=center>";  
  158. }  
  159.   
  160. //插入数据到表格  
  161. function tabledata($data,$widths=""){  
  162.   $pdata=explode("|",$data);  
  163.   $pwidths=explode("|",$widths);  
  164.   $str="<tr class='tabledata' onmouseover='this.className=\"tabledata_on\";' onmouseout='this.className=\"tabledata\";'>\r\n";  
  165.   for(@reset($pdata);@list($key,$val)=@each($pdata);){  
  166.     $str.="\t<td style='padding-left:4px' ".(intval($pwidths[$key])?"width='$pwidths[$key]'":"")." nowrap>$pdata[$key]</td>\r\n";  
  167.   }  
  168.   $str.="</tr>\r\n";  
  169.   return $str;  
  170. }  
  171.   
  172. //结束一个表格  
  173. function tableend(){  
  174.   return "</table></td></tr></table><BR>\r\n";  
  175. }  
  176.   
  177. //按钮样式  
  178. function fbutton($type="submit",$name="Submit",$value="确定",$script="",$return=0,$marginRight=0){  
  179.   $str="<input type='$type' name='$name' value='$value' class='tabletitle' style='border:3px double #FF6600;cursor:pointer;padding:2px 5px;font-weight:bold;margin-right:".$marginRight.";' $script>";  
  180.   if($returnreturn $str;else echo $str;  
  181. }  
  182.   
  183. //列出所有备份的文件  
  184. function getFile($dir=''){  
  185.   $num=1;    //用来记录目录下的文件个数  
  186.   $dirname='./'.$dir//要遍历的目录名字  
  187.   $dir_handle=opendir($dirname);  
  188.   $res = '';  
  189.   while($file=readdir($dir_handle)){  
  190.     if($file!="."&&$file!=".."&&$file!="index.php"){  
  191.     $dirFile = $dirname."/".$file;  
  192.     $key = filectime($dirFile)*1000+rand(100,999); //根据文件创建时间生成key  
  193.     $files[$key] = $file;  
  194.     }  
  195.   }  
  196.   ksort($files);//排序  
  197.   foreach($files as $key => $val){  
  198.     $dirFile = $dirname."/".$val;  
  199.     $res .= tabledata($num.'|<a href="'.$val.'" target="_blank">'.$val.'</a>|'.filesize($dirFile).'|'.filetype($dirFile).'|'.date("Y/m/d H:i:s",filemtime($dirFile)));  
  200.     $num++;  
  201.   }  
  202.   return $res;  
  203.   closedir($dir_handle);  
  204. }  
  205.   
  206.   
  207. //topFrame  
  208. if($_GET["action"]=="topframe"&&$_GET["framename"]=="topframe"){  
  209.   fheader();  
  210.   echo "</font></center></body></html>";  
  211.   exit;  
  212. }  
  213.   
  214.   
  215. /*  
  216. 如果您在开头配置部分填写了正确的配置, 
  217. 您可以在这里加上管理员身份验证, 
  218. 并把下面声明常量的语句用在代码中: 
  219. define("IS_ADMIN","yes");  //用于检验是否加了管理员身份验证代码。 
  220. */  
  221.   
  222. if(!isset($_POST[dosubmit])){  
  223.   $_POST["db_host"]=$db_host;  
  224.   $_POST["db_username"]=$db_username;  
  225.   $_POST["db_password"]=$db_password;  
  226.   $_POST["db_dbname"]=$db_dbname;  
  227. }  
  228.   
  229. // 配置表单  
  230. if(!@mysql_connect($_POST[db_host],$_POST[db_username],$_POST[db_password])||!@mysql_select_db($_POST[db_dbname])){  
  231.   fheader();  
  232.   if(isset($_POST['finByte']) and isset($_POST['db_dbname'])){  
  233.     echo "连接数据库超时,请<a href='javascript:submitme();'>刷新重试</a>.<font id='timeescapepls'>10</font>秒后将自动重试.<BR>也可能是配置不对,请检查您的配置.<BR>";  
  234.     echo " 
  235.     <script language='JavaScript'> 
  236.     document.doshowmywin=0; 
  237.     retryTime=10; 
  238.     function timeescape(){ 
  239.       if(!retryTime) return; 
  240.       timeescapepls.innerHTML=retryTime--; 
  241.     }setInterval('timeescape()',1000); 
  242.     function submitme(){ 
  243.       for(i=myform.elements.length-1;i>=0;i--){if(myform.elements[i].name==\"action\")break;} 
  244.       myform.elements[i].value=\"databackup\"; 
  245.       myform.submit(); 
  246.     } 
  247.     setTimeout('submitme()',retryTime*1000); 
  248.     </script>";  
  249.   }  
  250.   else if(isset($_POST[dosubmit])){  
  251.     echo "<script language='JavaScript'>alert('连接数据库错误,请检查您的配置.');</script>";  
  252.   }  
  253.   echo tabletext("输入正确的配置以连接数据库。 
  254.  如果无法连接数据库,请联系您的主机管理员以获得正确配置值。");  
  255.   echo tablestart("请检查您的配置");  
  256.   echo tabledata("服务器主机:|<input name='db_host' value='$_POST[db_host]' type='text'>");  
  257.   echo tabledata("要导出的数据库:|<input name='db_dbname' value='$_POST[db_dbname]' type='text'>");  
  258.   echo tabledata("数据库用户名:|<input name='db_username' value='$_POST[db_username]' type='text'>");  
  259.   echo tabledata("数据库密码:|<input name='db_password' value='$_POST[db_password]' type='password'>");  
  260.   echo tableend();  
  261.   fbutton('submit','dosubmit','连接','','',20);  
  262.   fbutton('reset','doreset','重置');  
  263.   ffooter();  
  264.   exit;  
  265. }  
  266. mysql_query("SET NAMES utf8;");  
  267.   
  268. if(!defined("IS_ADMIN"and !isset($_POST['db_dbname'])){die("您在程序开头部分填写了正确的配置,但没有加上任何管理员身份验证代码。为了安全,请不要配置正确的数据库用户名和密码!");}  
  269.   
  270. //选择要备份的数据表  
  271. if (!isset($_POST['action'])){  
  272.   $currow=mysql_fetch_array(mysql_query("select version() as v"));  
  273.   $_POST['mysql_version']=$currow['v'];  
  274.   fheader();  
  275.   echo tabletext("以下列出的是该数据库中所有的数据表。 
  276. 默认情况下全部导出,您也可以选择只导出其中一部分表。",500);  
  277.   echo tablestart("请选择要备份的数据表   (当前数据库版本: $_POST[mysql_version])",500);  
  278.   echo tabledata("<center><B><a href='#' onclick='selrev();return false;'>[反选]</a></B></center>|<strong>表名</strong>|<strong>注释</strong>|<strong>记录数</strong>|<strong>大小</strong>","10%|30%|30%|17%|23%");  
  279.   $query=mysql_query("SHOW TABLE STATUS");  
  280.   while ($currow=mysql_fetch_array($query)){  
  281.     echo tabledata("<center><input name='fsqltable[{$currow[Name]}]' id='fsqltable_$currow[Name]' type='checkbox' value='".($currow[Data_length]+$currow[Index_length]).",".$currow[Avg_row_length]."' checked onclick='getsize()'></center>|<label for='fsqltable_$currow[Name]'>$currow[Name]</label>|$currow[Comment]|$currow[Rows]|".num_bitunit($currow[Data_length]+$currow[Index_length])."");  
  282.   }  
  283.   echo tabledata("<center><B><a href='#' onclick='selrev();return false;'>[反选]</a></B></center>|<B>目前选择表的总大小:</B>| | |<B><label id='totalsizetxt'></label></B>");  
  284.   echo tableend();  
  285.   echo "<script language='JavaScript'> 
  286.   <!-- 
  287.     function selrev() { 
  288.     with(myform) { 
  289.       for(i=0;i<elements.length;i++) { 
  290.         thiselm = elements[i]; 
  291.         if(thiselm.name.match(/fsqltable\[\w+\]/)) 
  292.           thiselm.checked = !thiselm.checked; 
  293.       } 
  294.     } 
  295.     getsize(); 
  296.     } 
  297.       
  298.     function num_bitunit(num){ 
  299.      var bitunit=new Array(' B',' KB',' MB',' GB'); 
  300.      for(key=0;key<bitunit.length;key++){ 
  301.        if(num>=Math.pow(2,10*key)-1){ //1023B 会显示为 1KB 
  302.         num_bitunit_str=(Math.ceil(num/Math.pow(2,10*key)*100)/100)+' '+bitunit[key]; 
  303.        }    
  304.      } 
  305.      return num_bitunit_str; 
  306.     } 
  307.    
  308.     function getsize(){ 
  309.     var ts=0; 
  310.     with(document.myform) { 
  311.       for(i=0;i<elements.length;i++) { 
  312.         thiselm = elements[i]; 
  313.         if(thiselm.name.match(/fsqltable\[\w+\]/)) 
  314.           ts += parseInt(thiselm.value); 
  315.       } 
  316.       totalsizetxt.innerHTML=num_bitunit(ts); 
  317.     } 
  318.     } 
  319.     getsize(); 
  320.   --> 
  321.   </script> 
  322.   <input name='action' type='hidden' id='action' value='selecttype'>";  
  323.   fbutton('submit','dosubmit','下一步','','',20);  
  324.   fbutton('reset','doreset','重置',"onmouseup=setTimeout('getsize()',100)");  
  325.   ffooter();  
  326. }  
  327.   
  328. //选择导出方式  
  329. if($_POST['action']=="selecttype"){  
  330.   $_POST["totalsize"]=0;  
  331.   for(@reset($_POST[fsqltable]);count($_POST[fsqltable])&&@list($key,$val)=@each($_POST[fsqltable]);) {  
  332.     $_POST["totalsize"]+=$val;  
  333.   }  
  334.   fheader();  
  335.   $_POST["totalsize"]>1024*1024 ? $partsaveck="checked" : $downloadck="checked";  
  336.   echo tabletext("选择导出单文件还是多文件: 
  337.  
  338.           数据库太大的话,建议选择多文件导出方式。 
  339.  
  340.           系统会根据所要导出数据量的大小,给出推荐的默认值, 
  341.  
  342.           如果您无法判断您的数据量大小,按默认选定即可。",500);  
  343.   echo tablestart("请选择导出方式",500);  
  344.   echo tabledata("导出方式:| 
  345.  
  346.           <input name='back_type' value='download' type='radio' $downloadck>生成单个文件并下载 (备份的数据量较大时不建议使用) 
  347.  
  348.           <input name='back_type' value='partsave' type='radio' $partsaveck>分为多个文件并保存在服务器  
  349.  
  350. ");  
  351.   echo tableend();  
  352.   echo " 
  353.   <script language='JavaScript'> 
  354.   function confirmit(){ 
  355.     with(myform){ 
  356.       if(back_type[0].checked && ".intval($_POST["totalsize"]).">1024*1024 && !confirm(\"您要导出的数据量比较多({$totalsize_chunk}),建议选择多文件导出方式。\\r\\n点击“确定”继续导出单文件,“取消”返回更改。\")) 
  357.         return false; 
  358.     } 
  359.     return true; 
  360.   } 
  361.   myform.onsubmit=new Function('return confirmit();'); 
  362.   </script> 
  363.   <input name='action' type='hidden' id='action' value='selectoption'>";  
  364.   fbutton('submit','dosubmit','下一步','','',20);  
  365.   fbutton('reset','doreset','重置');  
  366.   ffooter();  
  367. }  
  368.   
  369.   
  370. if($_POST['action']=="selectoption"){  
  371.   if($_POST['back_type']=="partsave"){//多文件保存选项  
  372.     fheader();  
  373.     echo tabletext("您选择了多文件导出方式,总数据量 $totalsize_chunk 字节。 
  374.  
  375.  
  376.             导出的文件将包括一个主文件和多个数据文件,都放在同一个目录下。 
  377.  
  378.             每个数据文件不宜过大,否则容易造成导出或导入超时;而设置得越小则导出的页数越多。 
  379.  
  380.             导入密码在数据库导入时和HTTP方式下载数据文件时使用,请务必牢记。",500);  
  381.     echo tablestart("保存选项:",500);  
  382.     echo tabledata("存放目录:|<input name='dir' value='{$_POST[db_dbname]}data' type='text' size=20>|相对本程序所在目录,必须有写入权限");  
  383.     echo tabledata("主文件名:|<input name='filename' value='index' type='text' size=16>.php|不含扩展名!");  
  384.     echo tabledata("生成文件格式:|<input name='extension' value='php' type='radio' checked>.php | 生成php文件可直接上传到新服务器恢复");  
  385.     echo tabledata("每个数据文件大小:|<input name='filesize' value='1000' type='text' size=10>|单位 KB,1 MB = 1024 KB");  
  386.     echo tabledata("导出一页时间间隔:|<input name='nextpgtimeout' value='0' type='text' size=10>|秒,若您的空间不支持频繁提交请设大一点");     
  387.     echo tabledata("数据导入密码:|<input name='back_pass' value='' type='password' size=10>|导入和HTTP下载.php文件时的密码");     
  388.     echo tabledata("确认导入密码:|<input name='back_pass2' value='' type='password' size=10>|不添默认为<a href='http://fity.cn' target='_blank'>fity.cn</a>");  
  389.     echo tableend();  
  390.     echo " 
  391.     <script language='JavaScript'> 
  392.     function confirmit(){ 
  393.       with(myform){ 
  394.         if(back_pass.value!=back_pass2.value){ 
  395.           alert('导入密码两次输入密码必须相同。'); 
  396.           return false; 
  397.         } 
  398.       } 
  399.       return true; 
  400.     } 
  401.     myform.onsubmit=new Function('return confirmit();'); 
  402.     </script> 
  403.     <input name='action' type='hidden' id='action' value='databackup'>";  
  404.     fbutton('submit','dosubmit','下一步','','',20);  
  405.     fbutton('reset','doreset','重置');  
  406.     ffooter();  
  407.   }  
  408.   
  409.   if($_POST['back_type']=="download"){//单文件下载选项  
  410.     fheader();  
  411.     echo tabletext("您选择了单文件导出方式,总数据量 $totalsize_chunk 字节。",500);  
  412.     echo tablestart("单文件导出:",500);  
  413.     echo tabledata("导出文件名:|<input name='sqlfilename' value='$_POST[db_dbname](".date("Ymd").")_Mysql_txt.php' type='text' size='40'>");  
  414.     echo tabledata("生成文件格式:|<input name='extension' value='php' type='radio' checked>.php");  
  415.     echo tableend();  
  416.     echo "<input name='action' type='hidden' id='action' value='databackup'>";  
  417.     fbutton('submit','dosubmit','导出','','',20);  
  418.     fbutton('reset','doreset','重置');  
  419.     ffooter();  
  420.   }  
  421. }  
  422.   
  423. if($_POST['action']=="databackup"){  
  424.   
  425.   function escape_string($str){  
  426.     $str=mysql_escape_string($str);  
  427.     $str=str_replace('\\\'','\'\'',$str);  
  428.     $str=str_replace("\\\\","\\\\\\\\",$str); 
  429.     $str=str_replace('$','\$',$str); 
  430.     return $str; 
  431.   } 
  432.  
  433.   function sqldumptable($table,$tableid,$part=0) { 
  434.     if($part) global $lastcreate_temp,$current_size,$_POST;; 
  435.  
  436.     //structure 
  437.     if($tableid>=intval($_POST[nextcreate]) or $part==0){ 
  438.       @mysql_query("SET SQL_QUOTE_SHOW_CREATE = 1"); 
  439.       $query=mysql_query("SHOW CREATE TABLE `$table`"); 
  440.       $row=mysql_fetch_row($query); 
  441.       $sql=str_replace("\n","\\n",str_replace("\"","\\\"",$row[1]));  
  442.       $sql=preg_replace("/^(CREATE\s+TABLE\s+`$table`)/mis","",$sql);  
  443.       $dumpstring="create(\"$table\",\"$sql\");\r\n\r\n";  
  444.       $_POST[nextcreate]++;  
  445.       dealdata($dumpstring);  
  446.       mysql_free_result($query);  
  447.     }      
  448.   
  449.     //data  
  450.     $query = mysql_query("SELECT count(*) as count FROM `$table` ");  
  451.     $count = mysql_fetch_array($query);  
  452.     $query = mysql_query("SELECT * FROM `$table` limit ".intval($_POST[lastinsert]).",$count[count] ");  
  453.     $numfields = mysql_num_fields($query);  
  454.     $dump_values = "";  
  455.     while ($row = mysql_fetch_row($query)) {  
  456.       $dump_values .= ($dump_values?",\r\n":"")."(";  
  457.       for ($i=0;$i<$numfields;$i++) {  
  458.         if(stristr(mysql_field_flags($query,$i),"BINARY")){ //二进制处理  
  459.           $row[$i] = '\''."\".base64_decode('".base64_encode(addslashes($row[$i]))."').\"".'\'';  
  460.         }else if (!isset($row[$i]) or is_null($row[$i])) {  
  461.           $row[$i] = "NULL";  
  462.         }else {  
  463.           $row[$i] = '\''.escape_string($row[$i]).'\'';  
  464.         }  
  465.       }  
  466.       $dump_values .= implode(",",$row).")";  
  467.       $value_stop = 0;  
  468.       $value_len = strlen($dump_values);  
  469.   
  470.       $_POST[lastinsert]++;  
  471.   
  472.       if($value_len>100000 || ($part && $current_size+$value_len>=intval($_POST["filesize"])*1024)){ //0.1M 左右  
  473.         $dumpstring = "insert(\"$dump_values\");\r\n\r\n";  
  474.         dealdata($dumpstring);  
  475.         $dump_values = "";  
  476.       }  
  477.     }  
  478.     if($dump_values){  
  479.       $dumpstring = "insert(\"$dump_values\");\r\n\r\n";  
  480.       dealdata($dumpstring);  
  481.     }  
  482.     mysql_free_result($query);  
  483.       
  484.     //end of table  
  485.     $dumpstring = "tableend(\"$table\");\r\n\r\n";  
  486.     dealdata($dumpstring);  
  487.     $_POST[tabledumping]++;  
  488.     $_POST[lastinsert]=0;  
  489.   }  
  490.   
  491.   function timeformat($time){  
  492.     return substr("0".floor($time/3600),-2).":".substr("0".floor(($time%3600)/60),-2).":".substr("0".floor($time%60),-2);  
  493.   }    
  494.   function mysql_functions(){  
  495.     return ' 
  496.     @mysql_connect($_POST[db_host],$_POST[db_username],$_POST[db_password]) or die("<div id=pageendTag></div><BR><BR><center>不能连接服务器或连接超时!请返回检查您的配置。</center> $showmywin0"); 
  497.     if(!@mysql_select_db($_POST[db_dbname])){ 
  498.       global $_POST; 
  499.       if(!$_POST[db_autocreate]){echo "<div id=pageendTag></div><BR><BR><center>数据库[{$_POST[db_dbname]}]不存在!请返回检查您的配置。</center> $showmywin0";exit;  } 
  500.       if(!mysql_query("CREATE DATABASE `$_POST[db_dbname]`")){echo "<div id=pageendTag></div><BR><BR><center>数据库[{$_POST[db_dbname]}]不存在且自动创建失败!请返回检查您的配置。</center> $showmywin0";exit;} 
  501.       mysql_select_db("$_POST[db_dbname]"); 
  502.     }mysql_query("SET NAMES utf8;"); 
  503.     function query($sql){ 
  504.       global $_POST; 
  505.       if(!mysql_query($sql)){ 
  506.         echo "<BR><BR><font color=red>MySQL语句错误!您可能发现了程序的BUG!<a href=\"mailto:faisun@sina.com\">请报告开发者。</a> 
  507.             <BR>版本:V'.VERSION.'<BR>语句:<XMP>$sql</XMP>错误信息: ".mysql_error()." </font>" ; 
  508.         if(trim($_POST[db_temptable])) query("DROP TABLE IF EXISTS `$_POST[db_temptable]`;"); 
  509.         exit; 
  510.       } 
  511.     } 
  512.     function create($table,$sql){ 
  513.       global $_POST; 
  514.       if(!trim($_POST[db_temptable])){ 
  515.         do{ 
  516.           $_POST[db_temptable]="_faisunsql".rand(100,10000); 
  517.         }while(@mysql_query("select * from `$_POST[db_temptable]`")); 
  518.       } 
  519.       query("CREATE TABLE `$_POST[db_temptable]` $sql"); 
  520.       if(!$_POST[db_safttemptable]) query("DROP TABLE IF EXISTS `$table`;"); 
  521.     } 
  522.     function insert($data){ 
  523.       global $_POST; 
  524.       query("INSERT IGNORE INTO `$_POST[db_temptable]` VALUES $data;"); 
  525.     } 
  526.     function tableend($table){ 
  527.       global $_POST; 
  528.       if($_POST[db_safttemptable]) query("DROP TABLE IF EXISTS `$table`;"); 
  529.       query("ALTER TABLE `$_POST[db_temptable]` RENAME `$table`"); 
  530.     }';  
  531.   }  
  532.     
  533.   function auto_submit_script(){  
  534.     return "echo \"<script language='Javascript'> 
  535.         try{finisheditem.focus();}catch(e){} 
  536.         function checkerror(frame){ 
  537.           if(top.mainFrame1.location.href!=top.mainFrame2.location.href||(frame.document && !frame.document.all.postingTag && frame.document.all.pageendTag)){ 
  538.             postingTag.innerHTML='MySQL:提交出现错误.正在自动<a href=\'javascript:myform.submit();\'>重新提交</a>...'; 
  539.             myform.submit(); 
  540.           } 
  541.         } 
  542.         nextpgtimeout = parseFloat('\$_POST[nextpgtimeout]')?parseFloat('\$_POST[nextpgtimeout]'):0; 
  543.         if(top.myframeset&&this.window.name=='mainFrame1'){ 
  544.           myform.target='mainFrame2'; 
  545.           setInterval('checkerror(top.mainFrame2)',10000+1000*nextpgtimeout); 
  546.         } 
  547.         if(top.myframeset&&this.window.name=='mainFrame2'){ 
  548.           myform.target='mainFrame1'; 
  549.           setInterval('checkerror(top.mainFrame1)',10000+1000*nextpgtimeout); 
  550.         } 
  551.         setTimeout('myform.submit();',1000*nextpgtimeout); 
  552.         </script>\"; 
  553.     ";  
  554.   }  
  555.     
  556.   if($_POST[back_type]=="partsave"): ////////////////////////   Save Data ////////////////////////////  
  557.   
  558.     if(!$_POST[tabledumping]) $_POST[tabledumping]=0; //正在导出的表  
  559.     if(!$_POST[nextcreate]) $_POST[nextcreate]=0; //待建立的表  
  560.     if(!$_POST[lastinsert]) $_POST[lastinsert]=0;  
  561.     if(!$_POST[page]) $_POST[page]=0;  
  562.   
  563.     if(!is_dir("$_POST[dir]"and !@mkdir("$_POST[dir]",0777)){  
  564.       fheader();echo "<BR><BR><center>目录'$_POST[dir]'不存在且不能自动创建!请检查目录权限(权限为 777 方可写文件)。</center><BR><BR>";ffooter();exit;  
  565.     }  
  566.     @chmod("$_POST[dir]",0777);  
  567.   
  568.     //是否有多余的文件  
  569.     $dfileNo=0;  
  570.     $open=opendir($_POST["dir"]);  
  571.     $delhtml="";  
  572.     while($afilename=readdir($openand !$_POST[filedeled]){  
  573.       $checked="";  
  574.       if(substr($afilename,0,strlen($_POST[filename]))==$_POST[filename]){  
  575.         $checked="checked";  
  576.       }  
  577.       if(is_file("$_POST[dir]/$afilename")){  
  578.         $delhtml.=tabledata("$afilename|".date("Y-m-d",filectime("$_POST[dir]/$afilename"))."|".num_bitunit(filesize("$_POST[dir]/$afilename"))."|<center><input name='dfile[$dfileNo]' type='checkbox' value='$_POST[dir]/$afilename' $checked></center>");  
  579.         $dfileNo++;  
  580.       }  
  581.     }  
  582.   
  583.     //多余文件处理  
  584.     if($dfileNo){  
  585.       $_POST[filedeled]=1;  
  586.       fheader();  
  587.       echo tabletext("'$_POST[dir]/'中以下文件已存在,它们可能被覆盖或成为额外的文件。 
  588. 您可以有选择地删除它们或返回上一步重新设定:",500);  
  589.       echo tablestart("选择要删除的文件:",500);  
  590.       echo tabledata("<strong>文件名</strong>|<strong>修改日期</strong>|<strong>大小</strong>|<center><strong>反选</strong><input type='checkbox' name='checkbox' value='' onclick='selrev();'></center>","31%|32%|21%|16%");  
  591.       echo $delhtml;  
  592.       echo tableend();  
  593.       echo " 
  594.       <script language='JavaScript'> 
  595.       function selrev() { 
  596.         with(myform) { 
  597.           for(i=0;i<elements.length;i++) { 
  598.             thiselm = elements[i]; 
  599.             if(thiselm.name.match(/dfile\[\w+\]/))  thiselm.checked = !thiselm.checked; 
  600.           } 
  601.         } 
  602.       } 
  603.       </script>";  
  604.       fbutton('submit','dosubmit','删除并继续','','',20);  
  605.       fbutton('reset','doreset','重置','','',20);  
  606.       fbutton('button','dogoback','返回修改','onclick=\'history.back();\'');  
  607.       ffooter();  
  608.       exit;  
  609.     }  
  610.   
  611.     //删除多余文件  
  612.     if($_POST[filedeled]==1){  
  613.       for(@reset($_POST["dfile"]);@list($key,$val)=@each($_POST["dfile"]);){  
  614.         if($val) unlink($val);  
  615.       }  
  616.       unset($_POST["dfile"]);  
  617.     }  
  618.     $_POST[filedeled]=2;  
  619.   
  620.     //开始导出前的预处理  
  621.     if($_POST[page]==0){  
  622.       if(!file_exists($_POST[dir]))mkdir($_POST[dir], 0777);  
  623.       $_POST[page]=1;  
  624.       if(is_writable($_POST[dir])){  
  625.       fheader();  
  626.       echo tablestart("目录权限正确");  
  627.       echo tabledata(" 
  628. 经测试,该目录可以写入文件。 
  629.  
  630. ");  
  631.       echo tableend();  
  632.       fbutton('submit','dosubmit','开始自动导出');  
  633.       ffooter();  
  634.       exit;  
  635.       }  
  636.     }  
  637.   
  638.   
  639.       
  640.     if(!$_POST["StartTime"]) $_POST["StartTime"]=time();  
  641.   
  642.     $writefile_data = '';  
  643.       
  644.     function writefile($data,$method='w'){  
  645.       global $fsqlzip,$_POST;;  
  646.       $file = "{$_POST[filename]}_pg{$_POST[page]}.php";  
  647.       $fp=fopen("$_POST[dir]/$file","$method");  
  648.       flock($fp,2);  
  649.       fwrite($fp,$data);  
  650.     }  
  651.   
  652.     $current_size = 0;  
  653.     function dealdata($data){  
  654.       global $current_size,$tablearr,$writefile_data,$_POST;;  
  655.       $current_size += strlen($data);  
  656.       $writefile_data .= $data;  
  657.       if($current_size>=intval($_POST["filesize"])*1024){  
  658.         $current_size=0;  
  659.         $writefile_data .= "\r\n?".">";  
  660.   
  661.         writefile($writefile_data,"w");  
  662.   
  663.         $_POST[page]=intval($_POST[page])+1;  
  664.   
  665.         fheader();  
  666.         echo tablestart("正在从数据库'$_POST[db_dbname]'中导出数据……",500);  
  667.   
  668.         $str1=" 
  669. -= 以下数据表处理完成 =- <div class='borderdiv' style='width:150px;height:100px;overflow:auto;' align=left>";  
  670.           
  671.         $finishByte=0;  
  672.         for(reset($tablearr);list($key,$val)=each($tablearr);){  
  673.           if($key<$_POST[tabledumping]){  
  674.             $str1.="√ $val<BR>\r\n";  
  675.             $finishByte+=$_POST[fsqltable][$val];  
  676.           }else if($key==$_POST[tabledumping]){  
  677.             $str1.="<a href='#' id='finisheditem'> </a></div> 
  678.              
  679. -= 以下数据表正待处理 =- 
  680.             <div class='borderdiv' style='width:150px;height:100px;overflow:auto;' align=left> 
  681.             <font style='color:#FF0000'>→ $val</font> 
  682. \r\n";  
  683.             $finishByte+=$_POST[lastinsert]*substr(strstr($_POST[fsqltable][$val],','),1);  
  684.             $finish=intval($finishByte/$_POST[totalsize]*100);              
  685.           }else{  
  686.             $str1.="・ $val 
  687. \r\n";  
  688.           }  
  689.         }  
  690.         $str1.="</div><BR>";  
  691.   
  692.         $str2=tablestart("导出状态",300);  
  693.         $str2.=tabledata("共有数据:|".num_bitunit($_POST[totalsize])."","100|200");  
  694.         $str2.=tabledata("现已导出:|".num_bitunit($finishByte)."");  
  695.         $str2.=tabledata("每页导出:|".num_bitunit(intval($finishByte/$_POST[page]))."");  
  696.         $str2.=tabledata("导出时间间隔:|$_POST[nextpgtimeout] 秒");  
  697.         $str2.=tabledata("每页生成数据文件|≥ ".num_bitunit($_POST["filesize"]*1024)."");  
  698.         $str2.=tabledata("已生成数据文件:|".($_POST[page]-1)." 个");  
  699.         $str2.=tabledata("正在自动进入:|<a href='javascript:myform.submit();'>第 $_POST[page] 页</a>");  
  700.         $str2.=tabledata("已用时:|".timeformat(time()-$_POST["StartTime"])."");  
  701.         $str2.=tabledata("已完成:|{$finish}% ");  
  702.         $str2.=tabledata("完成进度:|<table width=100% height=12  border=0 cellspacing=1 cellpadding=0 class='tabletitle' align=center><tr><td width='$finish%'><div></div></td><td width='".(100-$finish)."%'  class='tabledata'><div></div></td></tr></table>");  
  703.         $str2.=tableend();  
  704.         $str2.="<B><div id='postingTag'></div></B>";  
  705.         echo tabledata("$str1|$str2");  
  706.         echo tableend();  
  707.         ffooter();  
  708.         eval(auto_submit_script());  
  709.         exit();  
  710.       }  
  711.     }  
  712.   
  713.   
  714. // 开始导出一页  
  715. $writefile_data = "<?\r\nif(!defined('VERSION')){echo \"<meta http-equiv=refresh content='0;URL={$_POST[filename]}.php'>\";exit;}\r\n";  
  716.   
  717. $tablearr=array();  
  718. for(@reset($_POST[fsqltable]);count($_POST[fsqltable])&&@list($key,$val)=@each($_POST[fsqltable]);) {  
  719.   $tablearr[]=$key;  
  720. }  
  721.   
  722. for($i=$_POST[tabledumping];$i<count($tablearr);$i++){  
  723.   sqldumptable($tablearr[$i],$i,1);  //导出表  
  724. }  
  725.   
  726. //结束最后文件  
  727. $data="echo '<center><BR><BR><BR><BR>完成。所有数据都已经导入数据库中。</center>'; exit; ?".">";  
  728.   
  729. $writefile_data .= "$data";  
  730. writefile($writefile_data,"w");  
  731. $backpassword=$_POST[back_pass]?$_POST[back_pass]:"fity.cn";  
  732.   
  733. //引导文件内容  
  734. $data='<? 
  735.  
  736. $usedumppass=1;  //导入数据时是否使用导入密码。如果您忘记了导入密码,请把值改为 0 。HTTP方式下载数据文件不能取消导入密码。 
  737.  
  738. define("VERSION","'.VERSION.'"); 
  739. error_reporting(1); 
  740. @set_time_limit(0); 
  741. $md5pass="'.md5($backpassword).'"; 
  742.  
  743. '.requestValues().frameset_html().postvars_function().'?'.'><html><head> 
  744. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  745. <title>MySQL 数据库自导入程序</title>'.csssetting().'</head> 
  746. <body    link="#0000FF" vlink="#0000FF" alink="#0000FF"> 
  747. <center> 
  748.  
  749. <script language="Javascript">document.doshowmywin=1;</script>     
  750. '.showmywin_script().' 
  751. <? 
  752. $showmywin0=$_POST[loadpage]?"<script language=Javascript>document.doshowmywin=0;</script></body>":""; 
  753.   if(!$_POST["action"] and !$_GET["action"]){ 
  754. ?'.'><center><form name="configform" method="post" action="">'.  
  755. tablestart('备份信息一览').  
  756. tabledata("共有数据量:|".num_bitunit($_POST[totalsize])."","50%|50%").  
  757. tabledata("共有数据表:|".count($_POST[table])).  
  758. tabledata("每页生成数据文件|≥ ".num_bitunit($_POST["filesize"]*1024)).  
  759. tabledata("数据文件数:|".$_POST[page]).  
  760. tabledata("文件总数:|".($_POST[page]+2)).  
  761. tabledata("备份时间:|".date("Y-m-d H:i")).  
  762. tabledata("原数据库版本:|".$_POST[mysql_version]).  
  763. tableend().  
  764.   
  765. tablestart('备份文件一览(个数:'.$_POST[page].')').  
  766. tabledata("序号|名称|大小|类型|修改时间").  
  767. getFile($_POST[dir]).  
  768. tableend().  
  769.   
  770. tablestart('导入数据库配置').  
  771. tabledata('服务器:|<input name="db_host" value="'.$_POST[db_host].'" type="text">',"50%|50%").  
  772. tabledata('数据库:|<input name="db_dbname" value="'.$_POST[db_dbname].'" type="text">').  
  773. tabledata('该数据库不存在时自动创建|<input name="db_autocreate" value="1" type="checkbox" checked>').  
  774. tabledata('用户名:|<input name="db_username" value="root" type="text">').  
  775. tabledata('密 码:|<input name="db_password" value="" type="password">').  
  776. tabledata('导入一页时间间隔:|<input name="nextpgtimeout" value="'.$_POST[nextpgtimeout].'" type="text"> 秒').  
  777. tabledata('导入密码:|<input name="db_pass" value="" type="password">').  
  778. tabledata('安全的临时表(<a href="javascript:alert(\'使用临时表插入完整无误的数据后再删除原表,要临时占用数据库空间.\');" title="帮助">?</a>):|<input name="db_safttemptable" type="checkbox" id="db_safttemptable" value="yes" checked>').  
  779. tableend().  
  780. fbutton('submit','action','导入','',1).  
  781. '</form> 
  782. </center> 
  783. <? 
  784. exit; 
  785. } 
  786. if($usedumppass and md5($_POST[db_pass])!=$md5pass) die("<div id=pageendTag></div>导入密码不正确!如果您忘记了导入密码,请把本源文件开头的 \$usedumppass 的值改为 0 。 $showmywin0"); 
  787. '.mysql_functions().' 
  788.  
  789. $totalpage='.$_POST[page].'; 
  790. if(!$_POST[loadpage]){$_POST[loadpage]=1;} 
  791. if($totalpage>=$_POST[loadpage]){ 
  792. include("'.$_POST[filename].'_pg$_POST[loadpage].php"); 
  793. echo "<center><form name=myform method=\'post\' action=\'\'>"; 
  794. $_POST[loadpage]++; 
  795.  
  796. echo "<input type=\'hidden\' name=\'faisunsql_postvars\' value=\'".fsql_StrCode(serialize($_POST),"ENCODE")."\'> 
  797. <BR><BR>正在导入数据到数据库\'$_POST[db_dbname]\'……<BR><BR>本页运行完成! 正在自动进入<a href=\'javascript:myform.submit();\'>第 $_POST[loadpage] 页</a>,共 $totalpage 页…… 
  798. <BR><BR>(除非进程长久不动,否则请不要点击以上页码链接。)"; 
  799. ?'.'> 
  800. <BR><BR><B><div id="postingTag"></div></B> 
  801. <? '.auto_submit_script().' ?'.'> 
  802. <div id="pageendTag"></div> 
  803. </form></center><?php }else{echo "<center>完成导入数据到数据库\'$_POST[db_dbname]\'</center>";}?> 
  804. </body></html>';  
  805.   
  806.     //写入引导文件  
  807.     if(isset($fsqlzip)){  
  808.       $fsqlzip->addfile($data,"$_POST[filename].php","$fsqlzip->gzfilename.tmp");  
  809.       rename("$fsqlzip->gzfilename.tmp","$fsqlzip->gzfilename");  
  810.     }else{  
  811.       $file="$_POST[dir]/$_POST[filename].php";  
  812.       $fp=fopen($file,"w");  
  813.       flock($fp,2);  
  814.       fwrite($fp,$data);  
  815.       fclose($fp);  
  816.     }  
  817.   
  818.     //提示导出完成  
  819.     fheader();  
  820.     echo tabletext("<BR><BR>全部完成,用时 ".timeformat(time()-$_POST["StartTime"])." 。 
  821.     <BR><BR>数据库'$_POST[db_dbname]'已全部保存到文件夹'$_POST[dir]'中,共 ".intval($_POST[page])." 页,".(intval($_POST[page])+2)." 个文件。 
  822.     <BR><BR>将此文件夹置于服务器可访问目录,并运行'$_POST[filename].php'即可将数据导入。 
  823.  
  824.     <a href='$_POST[dir]/{$_POST[filename]}.php' target='_blank'><H3>运行备份文件 {$_POST[filename]}.php </H3></a> 
  825.     <BR><BR>",500);  
  826.     echo "<div id='postingTag'></div>";  
  827.     ffooter();  
  828.     exit;  
  829.   endif;  
  830. }  

附:程序文件
点击下载dbbak.zip
欢迎补充完善~~ [emot]dog[/emot]
原文作者:rinald
原文地址:http://fity.cn/post/583.html
互联网技术更新较快,本站很多文章具有实效性,我会及时更新原文,但转载的文章无法通知更新。为了不给读者造成困惑或误导,请您在转载时保留此出处信息,尊重别人也是尊重自己。

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。