![]() |
|
首页 │ Apache │ Linux│ Java│ MySQL│ 注册│帮助 | |||
<?
//[项目标识]--------------------------------------------------------
/*------------------------------------------------------------------
[项目]: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
";
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数据库备份文件!!");
?>
开始检查备份文件合法性以决定是否进行下一步操作:
(注意:如果该备份文件是数据结构备份文件,用该文件进行数据恢复只恢复数据库的结构,数据库为空;
如果是数据内容备份文件或结构和内容完全备份文件,则恢复会将系统数据还原到备份时的状态,所有新数据将失去,它们的不同是完全备份文件会将数据库清空后重建,而内容备份文件则仅在数据表不存在时新建,请确定你知道这步操作的意义,否则请不要随便使用本功能..)

