麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
偶的一个数据库备份/恢复模块
悬赏分:20 - 2007年08月18日

<? //[项目标识]-------------------------------------------------------- /*------------------------------------------------------------------ [项目]:TEST [文件]:db_back.php [功能]:数据备份 [作者]:meineson [日期]:2005-08-22 13:47 [版权]:mbstudio (C) copyright by bluebottle. http://mbstudio.yeah.net 魔瓶工作室-- 我们是程序员,我们不只有技术. [说明]:------------------------ -----------------------------------------------------------------*/ //[使用说明]------------------------------------------------------- /*----------------------------------------------------------------- 直接链接调用; 这里可以通过mysqldump.exe操作生成备份文件 注意:恢复数据时需使用相同的结构的数据文件,如版本不同,请手动查看后自行修改; 恢复效果自负; -----------------------------------------------------------------*/ //[修定说明]------------------------------------------------------- /*----------------------------------------------------------------- [修定人员]:-------- [修定日期]:-------- [修定描述]:-------- -----------------------------------------------------------------*/ ob_start(); include "./chkpos.php"; //来源页检测,不允许直接输入网址进入页面 chkpos("index_left.php|sys_data_back.php"); //只允许指定页来源访问 include "./user.php"; //用户类对象定义,全局用户授权验证 session_start(); if($_SESSION["ipxn_uinfo"]=="") err("请按F5正确登录后使用系统!"); if(!$_SESSION["ipxn_uinfo"]->chkuser()) err("用户身份验证出错,请按F5重新退出登录!"); if(!$_SESSION["ipxn_uinfo"]->chkrule("数据备份")) err("您的操作权限不够,请不要越权操作,或您可联系管理员!"); $crlf="\n"; //换行符 //$crlf="
"; //换行符 $simdb = new simdb; $conn = $simdb->getconn(); function get_table_def($conn, $table ,$drop=true) { //$drop设为真时,生成的数据库结构前有DROP项,防止恢复时数据表重复定义 //这里直接将$crlf回车符设为\n调用 global $crlf; $schema_create = ""; if($drop) $schema_create .= "DROP TABLE IF EXISTS `$table`;$crlf"; $result = mysql_query("SHOW CREATE TABLE $table",$conn) or die("数据库SQL查询串错误!"); $row = mysql_fetch_array($result); $schema_create .= $row[1].";$crlf"; $schema_create = str_replace("CREATE TABLE","CREATE TABLE IF NOT EXISTS",$schema_create); //防止数据表已存在时重复建表出错 //$schema_create = str_replace("\n",$crlf,$schema_create); //仅输出检测时使用 return (stripslashes($schema_create)); } //这里的$handler即为使生成的insert语句能输出来,其参数为生成的insert语名, //所以handler在本地使用时即为使$bksql更新的函数 function get_table_content($conn,$table,$handler) { global $bksql,$crlf; //导出的SQL语句变量 $result = mysql_query("SELECT * FROM $table",$conn) or die("数据库SQL查询串错误!"); while($row = mysql_fetch_row($result)) { $table_list = "("; for($j=0; $j history.go(-1); </script> <? break; case "newbk": if(!is_array($_POST["bktype"])) err("请至少选中备份数据结构或数据内容中一个选项!"); //选择备份还是恢复操作 header("Content-Type: application/mb-bkd"); header("Content-Disposition: attachment; filename=IPXNdb".date("ymdHis").".bkd"); header("Content-Description: IPXN database backup file!!"); header("Pragma: no-cache"); header("Expires: 0"); //echo "开始备份系统文件工作!
"; foreach($_POST["bktype"] as $type) { //检测备份方法:备份数据结构,数据内容或全部备份 if($type=='struct') $bkstruct=true; if($type=='data') $bkdata=true; } //echo "配置数据库备份信息!
"; $bksql="# 备份版本|".$_POST["bkver"]."■■$crlf# 备 份 人|".$_SESSION["ipxn_uinfo"]->urname."■■$crlf# 备份日期|".date("Y-m-d H:i:s")."■■$crlf# 备份描述|".$_POST["bkintro"]."$crlf# 备份内容:"; if($bkstruct) $bksql.="数据结构!"; if($bkdata) $bksql.="数据内容!"; $bksql.="$crlf# 备份数据表:"; $bktable = explode(",",$_POST["bktables"]); foreach($bktable as $table) { $bksql.=$table.","; } $bksql.="■■$crlf$crlf# 以下为数据库结构和内容信息 $crlf$crlf"; //echo "开始编码数据库数据结构,数据:
"; foreach($bktable as $table) { //开始编码备份数据库数据结构和数据,检测$bkstruct,$bkdata //echo "TABLE:".$table."//"; //备份时,如只备份数据结构,需有DROP; //如都备份,同样需要有DROP //如只备份数据内容,和全备份一样,只是没有DROP,表不存在时才新建 if($bkstruct==true) { //备份数据结构 //不进行数据库操作,如数据库不存在了,则不可能使用本页进行恢复,要手动恢复了 $bksql.="#".$table."表数据结构备份开始>>>>>>>>>>>>>>>>>>>>>>>>>>>;".$crlf.$crlf; $bksql.=get_table_def($conn,$table); $bksql.=$crlf."#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<数据表数据结构备份结束;".$crlf.$crlf; } if($bkdata==true||$table=="preset") //特殊情况:需备份系统配置数据 { //备份数据库中数据 if(!$bkstruct) { //只备份数据内容,需加上不DROP数据表的表结构备份,防止表不存在 $bksql.="#".$table."表数据结构备份开始>>>>>>>>>>>>>>>>>>>>>>>>>>>;".$crlf.$crlf; $bksql.=get_table_def($conn,$table,false); $bksql.=$crlf."#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<数据表数据结构备份结束;".$crlf.$crlf; } $bksql.="#".$table."表数据内容备份开始>>>>>>>>>>>>>>>>>>>>>>>>>>>;".$crlf.$crlf; $bksql.="delete from `$table`;".$crlf.$crlf; get_table_content($conn,$table,"my_handler"); $bksql.=$crlf."#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<数据表内容备份结束;".$crlf.$crlf; } } //echo "完成!
"; //可选的数据表备份完成 //还有其它非重要的表fileinfo系统文件扫描信息 //这些表只需备份结构就可;在不存在时创建 $bksql.="# 其它信息表数据结构备份开始>>>>>>>>>>>>>>>>>>>>>>>>>>>;".$crlf.$crlf; // $bksql.=get_table_def($conn,"online",false); // $bksql.=$crlf; $bksql.=$crlf."#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<数据表数据结构备份结束;".$crlf; echo $bksql.$crlf."# 全部数据备份结束!!;"; exit; break; case "viewbk": ?> <? $bkfile=$_FILES["bkfile"]; //echo $bkfile.$bkfile_type.$bkfile_size.$bkfile_name.$bkver; $fext=explode(".",$bkfile["name"]); $fext=$fext[count($fext)-1]; //取出文件后缀名 if($fext!="bkd") err("请选中后缀名为.bkd的数据备份文件!!"); if($bkfile["size"]<10) err("请不要使用不完整的数据备份文件!!"); $fr=fopen($bkfile["tmp_name"], "r" ); if(!$fr) err("读取备份文件失败,请确定该文件地址正确!!"); $contents=fread($fr,$bkfile["size"]); //读取文件内容 fclose($fr); $clist=explode("■■",$contents); if(count($clist)<5) err("该文件不是全法的IPXN数据库备份文件!!"); ?> 开始检查备份文件合法性以决定是否进行下一步操作:
(注意:如果该备份文件是数据结构备份文件,用该文件进行数据恢复只恢复数据库的结构,数据库为空; 如果是数据内容备份文件或结构和内容完全备份文件,则恢复会将系统数据还原到备份时的状态,所有新数据将失去,它们的不同是完全备份文件会将数据库清空后重建,而内容备份文件则仅在数据表不存在时新建,请确定你知道这步操作的意义,否则请不要随便使用本功能..)

该备份文件备份信息如下:
<? $iname=explode("|",$clist[0]); ?> 【备份版本】:<?=$iname[1]?>
<? $iname=explode("|",$clist[1]); ?> 【备 份 人】:<?=$iname[1]?>
<? $iname=explode("|",$clist[2]); ?> 【备份日期】:<?=$iname[1]?>
<? $iname=explode("|",$clist[3]); ?> 【备份描述】:<?=$iname[1]?>
<? $nwversion=explode(".",$_POST["bkver"]); $bkversion=explode("|",$clist[0]); $bkversion=$bkversion[1]; $version=$bkversion; $bkversion=explode(".",$bkversion); echo " 备份文件版本号为:".$bkversion[0].".".$bkversion[1].".".$bkversion[2]."! "; echo " 当前系统版本号为:".$nwversion[0].".".$nwversion[1].".".$nwversion[2]."!
"; //恢复规定:如果只是备份文件的修定号不同于当前系统版本,可以继续; //主副版本号不同则不能继续 echo "
检查结果:
"; if($bkversion[0]!=$nwversion[0]) showumsg("主版本号不一致,不能进行恢复工作!【返回】"); else echo "主版本号一致,"; if($bkversion[1]!=$nwversion[1]) showumsg("副版本号不一致,不能进行恢复工作!【返回】"); else echo "副版本号一致,"; if($bkversion[2]!=$nwversion[2]) echo "修定号不一致,能继续恢复工作,但请注意修改备份文件中的已知的错误!
"; else echo "修定号也一致辞,可以进行恢复工作!
"; if($_POST["donow"]!='true') { ?> 如果你看到这行字,表示可以进行恢复工作;请仔细查看上面的备份信息。 如果你决定使用这个备份文件对系统进行恢复,请点这里 【返回】上一页选中"恢复数据"单选项, 再点击恢复系统下一步! <? exit; } //解码文件并进行分解并恢复系统 echo "正在恢复数据:
正在分解数据:
"; $bkfile=$clist[4]; $pieces = explode(";$crlf",$bkfile); $haserr = false; for ($i=0; $i##执行成功!
"; } else { echo "SQL语句错误:".$pieces[$i]."
"; $haserr = true; } } } if($haserr) echo "
数据库恢复时遇到了一些错误,这些错误可能由于外键关联等原因引起,系统无法自动解决,如果数据库没有完全恢复到备份状态,请手动修改备份文件或参照备份文件自行恢复数据库!
"; echo "系统数据库恢复操作完成!请注意,不同的备份文件会有不同的恢复效果,请检查系统当前数据是否是您要恢复的!!否则请更换其它备份文件或手动编辑备份文件!"; @mysql_close($conn); exit; break; } } ?> →系统数据信息灾难恢复页面,在数据库信息发生意外时,可以用备份数据最快速地进行恢复:
(注意:当数据库错误导致管理员用户信息或系统配置信息破坏时不能访问本页时,可以直接用 mysql客户端通过mysql -uroot -p ipxn < 'bkfilename.bkd'将由本页生成的完整数据库备份bkfilename.bkd导入数据库来对系统数据库进行完全恢复!) 〖创建备份〗----------------------------------------------------------------------------------------------------------------
【备份路径】在你点击开始备份时系统将提示你备份文件存放的路径,请确保目录安全性!)
【备份版本】:
【备份内容】: 备份系统数据库所有表:数据结构 数据内容!
 
【备份描述】生成以bkd为后缀名的bkfilename.bkd备份文件..)
 
 
〖恢复数据〗----------------------------------------------------------------------------------------------------------------
【备份文件】:(请选中备份时创建的备份文件"bkfilename.bkd")
【系统版本】:     【操作方式】:恢复数据 查看备份

 

提问者:meineson   08-18 08:08
答复
路过。。。顺便帮顶:)
回答者:玉米づ冰冻可乐 - 瓦岗村民 8-22 09:10
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
35 + 84 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM