收起左侧

    [其他教程] 推荐没有虚拟主机的小巧的Mysql数据库备份脚本(PHP)

    16
    回复
    3169
    查看
      [复制链接]

    管理员

    3556

    主题

    3606

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16461

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2015-10-3 17:00:32 | 显示全部楼层 |阅读模式
    最近工作中常常需要备份远程服务器上的Mysql数据库到本机,一开始采用直接备份Mysql的data目录的办法,但由于编码不同的原因经常产生问题。后来朋友推荐我使用一个非常方便小巧的PHP程序——MyDB。一共包含三个文件:
    1. mydb.php //DB类
    [U]复制代码[/U] 代码如下:
    linkid)  @$this->linkid = mysql_connect($host, $username, $password) or die("连接服务器失败.");
        @mysql_select_db($database,$this->linkid) or die("无法打开数据库");
        return $this->linkid;}
    function query($sql)
        {if($this->sqlid=mysql_query($sql,$this->linkid)) return $this->sqlid;
        else {
            $this->err_report($sql,mysql_error);
        return false;}
        }
    function nr($sql_id="")
        {if(!$sql_id) $sql_id=$this->sqlid;
        return mysql_num_rows($sql_id);}
    function nf($sql_id="")
        {if(!$sql_id) $sql_id=$this->sqlid;
        return mysql_num_fields($sql_id);}
    function nextrecord($sql_id="")
        {if(!$sql_id) $sql_id=$this->sqlid;
        if($this->record=mysql_fetch_array($sql_id))  return $this->record;
        else return false;
        }
    function f($name)
        {
        if($this->record[$name]) return $this->record[$name];
        else return false;
        }
    function close() {mysql_close($this->linkid);}
    function lock($tblname,$op="WRITE")
        {if(mysql_query("lock tables ".$tblname." ".$op)) return true; else return false;}
    function unlock()
        {if(mysql_query("unlock tables")) return true; else return false;}
    function ar() {
        return @mysql_affected_rows($this->linkid);
      }
    function i_id() {
            return mysql_insert_id();
        }
    function err_report($sql,$err)
        {
    echo "Mysql查询错误
    ";
    echo "查询语句:".$sql."
    ";
    echo "错误信息:".$err;
        }
    /****************************************类结束***************************/
    }?>
    2. backup.php //备份脚本
    [U]复制代码[/U] 代码如下:


      
    数据备份
    备份方式
            备份全部数据备份全部数据表中的数据到一个备份文件
    备份单张表数据  
            请选择
              query("show table status from $mysqldb");
            while($d->nextrecord()){
            echo "f('Name')."'>".$d->f('Name')."";}
            ?>
            
    备份选中数据表中的数据到单独的备份文件
    使用分卷备份

            分卷备份 K
    选择目标位置
    备份到服务器

            备份到本地

    query("show table status from $mysqldb"))
        {$msgs[]="读数据库结构错误"; show_msg($msgs); pageend();}
    $sql="";
    while($d->nextrecord($tables))
        {
        $table=$d->f("Name");
        $sql.=make_header($table);
        $d->query("select * from $table");
        $num_fields=$d->nf();
        while($d->nextrecord())
        {$sql.=make_record($table,$num_fields);}
        }
    $filename=date("Ymd",time())."_all.sql";
    if($_POST['weizhi']=="localpc") down_file($sql,$filename);
    elseif($_POST['weizhi']=="server")
        {if(write_file($sql,$filename))
    $msgs[]="全部数据表数据备份完成,生成备份文件'./backup/$filename'";
        else $msgs[]="备份全部数据表失败";
        show_msg($msgs);
        pageend();
        }
    /*-----------------不要卷结束*/}/*-----------------------*/
    /*-----------------分卷*/else{/*-------------------------*/
    if(!$_POST['filesize'])
        {$msgs[]="请填写备份文件分卷大小"; show_msg($msgs);pageend();}
    if(!$tables=$d->query("show table status from $mysqldb"))
        {$msgs[]="读数据库结构错误"; show_msg($msgs); pageend();}
    $sql=""; $p=1;
    $filename=date("Ymd",time())."_all";
    while($d->nextrecord($tables))
    {
        $table=$d->f("Name");
        $sql.=make_header($table);
        $d->query("select * from $table");
        $num_fields=$d->nf();
        while($d->nextrecord())
        {$sql.=make_record($table,$num_fields);
        if(strlen($sql)>=$_POST['filesize']*1000){
                $filename.=("_v".$p.".sql");
                if(write_file($sql,$filename))
                $msgs[]="全部数据表-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";
                else $msgs[]="备份表-".$_POST['tablename']."-失败";
                $p++;
                $filename=date("Ymd",time())."_all";
                $sql="";}
        }
    }
    if($sql!=""){$filename.=("_v".$p.".sql");         
    if(write_file($sql,$filename))
    $msgs[]="全部数据表-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";}
    show_msg($msgs);
    /*---------------------分卷结束*/}/*--------------------------------------*/
    /*--------备份全部表结束*/}/*---------------------------------------------*/
    /*--------备份单表------*/elseif($_POST['bfzl']=="danbiao"){/*------------*/
    if(!$_POST['tablename'])
        {$msgs[]="请选择要备份的数据表"; show_msg($msgs); pageend();}
    /*--------不分卷*/if(!$_POST['fenjuan']){/*-------------------------------*/
    $sql=make_header($_POST['tablename']);
    $d->query("select * from ".$_POST['tablename']);
    $num_fields=$d->nf();
    while($d->nextrecord())
        {$sql.=make_record($_POST['tablename'],$num_fields);}
    $filename=date("Ymd",time())."_".$_POST['tablename'].".sql";
    if($_POST['weizhi']=="localpc") down_file($sql,$filename);
    elseif($_POST['weizhi']=="server")
        {if(write_file($sql,$filename))
    $msgs[]="表-".$_POST['tablename']."-数据备份完成,生成备份文件'./backup/$filename'";
        else $msgs[]="备份表-".$_POST['tablename']."-失败";
        show_msg($msgs);
        pageend();
        }
    /*----------------不要卷结束*/}/*------------------------------------*/
    /*----------------分卷*/else{/*--------------------------------------*/
    if(!$_POST['filesize'])
        {$msgs[]="请填写备份文件分卷大小"; show_msg($msgs);pageend();}
    $sql=make_header($_POST['tablename']); $p=1;  
        $filename=date("Ymd",time())."_".$_POST['tablename'];
        $d->query("select * from ".$_POST['tablename']);
        $num_fields=$d->nf();
        while ($d->nextrecord())  
        {     
            $sql.=make_record($_POST['tablename'],$num_fields);
           if(strlen($sql)>=$_POST['filesize']*1000){
                $filename.=("_v".$p.".sql");
                if(write_file($sql,$filename))
                $msgs[]="表-".$_POST['tablename']."-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";
                else $msgs[]="备份表-".$_POST['tablename']."-失败";
                $p++;
                $filename=date("Ymd",time())."_".$_POST['tablename'];
                $sql="";}
        }
    if($sql!=""){$filename.=("_v".$p.".sql");         
    if(write_file($sql,$filename))
    $msgs[]="表-".$_POST['tablename']."-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";}
    show_msg($msgs);
    /*----------分卷结束*/}/*--------------------------------------------------*/
    /*----------备份单表结束*/}/*----------------------------------------------*/
    /*---*/}/*-------------主程序结束------------------------------------------*/
    function write_file($sql,$filename)
    {
    $re=true;
    if(!@$fp=fopen("./backup/".$filename,"w+")) {$re=false; echo "failed to open target file";}
    if(!@fwrite($fp,$sql)) {$re=false; echo "failed to write file";}
    if(!@fclose($fp)) {$re=false; echo "failed to close target file";}
    return $re;
    }
    function down_file($sql,$filename)
    {
        ob_end_clean();
        header("Content-Encoding: none");
        header("Content-Type: ".(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ? 'application/octetstream' : 'application/octet-stream'));
        header("Content-Disposition: ".(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ? 'inline; ' : 'attachment; ')."filename=".$filename);
        header("Content-Length: ".strlen($sql));
        header("Pragma: no-cache");
        header("Expires: 0");
        echo $sql;
        $e=ob_get_contents();
        ob_end_clean();
    }
    function writeable($dir)
    {
        if(!is_dir($dir)) {
        @mkdir($dir, 0777);
        }
        if(is_dir($dir))  
        {
        if($fp = @fopen("$dir/test.test", 'w'))
            {
    @fclose($fp);
        @unlink("$dir/test.test");
        $writeable = 1;
    }  
        else {
    $writeable = 0;
        }
    }
        return $writeable;
    }
    function make_header($table)
    {global $d;
    $sql="DROP TABLE IF EXISTS ".$table."\n";
    $d->query("show create table ".$table);
    $d->nextrecord();
    $tmp=preg_replace("/\n/","",$d->f("Create Table"));
    $sql.=$tmp."\n";
    return $sql;
    }
    function make_record($table,$num_fields)
    {global $d;
    $comma="";
    $sql .= "INSERT INTO ".$table." VALUES(";
    for($i = 0; $i record[$i])."'"); $comma = ",";}
    $sql .= ")\n";
    return $sql;
    }
    function show_msg($msgs)
    {
    $title="提示:";
    echo "";
    echo "".$title."";
    echo "
    ";
    while (list($k,$v)=each($msgs))
        {
        echo "
    ".$v."";
        }
    echo "
    ";
    }
    function pageend()
    {
    exit();
    }
    ?>
    3. restore.php //还原脚本
    [U]复制代码[/U] 代码如下:


    数据恢复

    从服务器文件恢复

        -请选择-
    $file";}
    closedir($handle);  
    ?>
       
           从本地文件恢复

    query(trim($sql))) return false;
        }
    return true;
    }
    function show_msg($msgs)
    {
    $title="提示:";
    echo "";
    echo "".$title."";
    echo "
    ";
    while (list($k,$v)=each($msgs))
        {
        echo "
    ".$v."";
        }
    echo "
    ";
    }
    function pageend()
    {
    exit();
    }
    ?>
    文件结构非常清晰,只要在文件2和3里面设置好数据库服务器的地址、用户名、密码就可以备份还原数据了。需要注意的是:
    ·使用时候要在同级目录下建一个Backup目录,权限需要可写,用于存放导出的脚本。
    ·当备份的数据库比较大的时候,服务器脚本超时时间要调大一些。
    ·支持分卷备份,还原时候只要选择分卷备份的第一个脚本就会自动还原所有的脚本。
    ·分卷文件大小不要太大,最好不超过2MB。
    ·安全起见,脚本不用时候记得从服务器上删除。
    打包文件下载
    温馨提示:
    1、本站所有信息都来源于互联网有违法信息与本网站立场无关。
    2、当有关部门,发现本论坛有违规,违法内容时,可联系站长删除,否则本站不承担任何责任。
    3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
    4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    5、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    6、如果使用本帖附件,本站程序只提供学习使用,请24小时内删除!使用者搭建运营触犯法律,违法,违规,本站不承担任何责任。
    回复

    使用道具 举报

    注册会员

    0

    主题

    14

    帖子

    91

    积分

    注册会员

    Rank: 2

    积分
    91
    发表于 2015-10-3 17:00:40 | 显示全部楼层
    很不错
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    7

    帖子

    72

    积分

    注册会员

    Rank: 2

    积分
    72
    发表于 2015-10-3 16:21:05 | 显示全部楼层
    不错!不错!不错!不错!不错!
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    19

    帖子

    111

    积分

    注册会员

    Rank: 2

    积分
    111
    发表于 2015-10-3 16:13:05 | 显示全部楼层
    支持,赞一个支持,赞一个
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    10

    帖子

    79

    积分

    注册会员

    Rank: 2

    积分
    79
    发表于 2015-10-3 16:13:41 | 显示全部楼层
    发发呆,回回帖,工作结束~
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    15

    帖子

    85

    积分

    注册会员

    Rank: 2

    积分
    85
    发表于 2015-10-3 16:31:33 | 显示全部楼层
    现在正在找电子商务的方案,谢谢分享
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    16

    帖子

    99

    积分

    注册会员

    Rank: 2

    积分
    99
    发表于 2015-10-3 17:24:44 | 显示全部楼层
    难得一见的好帖
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    14

    帖子

    86

    积分

    注册会员

    Rank: 2

    积分
    86
    发表于 2015-10-3 17:35:29 | 显示全部楼层
    大人,此事必有蹊跷!
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    4

    帖子

    54

    积分

    注册会员

    Rank: 2

    积分
    54
    发表于 2015-10-3 17:13:57 | 显示全部楼层
    支持支持再支持
    回复 支持 反对

    使用道具 举报

    注册会员

    0

    主题

    8

    帖子

    69

    积分

    注册会员

    Rank: 2

    积分
    69
    发表于 2015-10-3 17:24:39 | 显示全部楼层
    小白一个 顶一下
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在线客服
    热线电话

    微信扫一扫
    专注源码分享6年
    全国免费热线电话

    400-225-995

    周一至周日9:00-23:00

    反馈建议

    a5887776@163.com 在线QQ咨询

    Powered by Discuz! X3.4 Licensed © 2001-2013 Comsenz Inc.