加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

php 成功实现 mysql 数据库备份

发布时间:2023-09-19 15:54:46 所属栏目:MySql教程 来源:
导读:之前看过很多数据库的备份的功能,今天有时间自己也琢磨一下,实现思路就是生成 sql 脚本文件,我想也没几个会去硬备份文件库文件的吧?下面把详细的代码贴出来,实现过程中遇到 了诸多的问题,就不一一列出来了,代
之前看过很多数据库的备份的功能,今天有时间自己也琢磨一下,实现思路就是生成 sql 脚本文件,我想也没几个会去硬备份文件库文件的吧?下面把详细的代码贴出来,实现过程中遇到 了诸多的问题,就不一一列出来了,代码关键易出错的部分备注的很详细,下面就看看代码吧(此实现基于 thinkphp 框架)
 
<?php
 
namespace Home\Controller;
 
use Think\Controller;
 
class IndexController extends Controller {
 
    public function index(){
 
$m = M();
 
$list = $m->query("SHOW TABLE STATUS FROM "."`".C('DB_NAME')."`");//查询所有的库
 
$tables = array();
 
        foreach ($list as $key => $val)
 
{
 
$tables[$key]['name'] = $val['Name'];//表名
 
$tables[$key]['rows'] = $val['Rows'];//记录数
 
$tables[$key]['engine'] = $val['Engine'];//引擎
 
$tables[$key]['data_length'] = sizecount($val['Data_length']);//表大小
 
$tables[$key]['create_time']=$val['Create_time'];//表创建时间
 
$tables[$key]['collation']=$val['Collation'];//编码类型
 
        }
 
$this->assign('list',$tables);//将数据传到页面,让用户选择备份的表
 
$this->display();    
 
    }
 
    
 
    //数据备份
 
    public function backup(){
 
        $tbs = $_POST['tables'];//获得所有的表名
 
        if(!$tbs){
 
            $this->error('请选中记录!');
 
        }
 
        //初始化将要保存的sql字符串。设置外键约束失效,防止数据还原时,原表的外键约束干扰表的删除
 
        $data = "SET FOREIGN_KEY_CHECKS = 0;\n";
 
        foreach($tbs as $tab){
 
            $obj = M($tab);//实例化一个表模型
 
            $row = $obj->query("SHOW CREATE TABLE $tab");
 
            $data .= "DROP TABLE IF EXISTS `".$tab."`;\n" . $row[0]['Create Table'] . ";\n";//如果存在这个表就删除
 
             //$row[0]['Create Table']//这个包含了创建表的信息
 
            $datalist = $obj->select();//依次查询每个表的数据         
 
            foreach($datalist as $val){
 
                $data .= "INSERT INTO `".$tab."` VALUES (";
 
                $vals = array();
 
                foreach($val as $v){  
 
                    if($v=="")
 
                    {
 
                        $vals[] = 'NULL';//解决mysql5.0以上空字符串报错的问题
 
                    }
 
                    else
 
                    {
 
                         $vals[] = "'" . $v . "'";
 
                    }
 
                }
 
                $data .= implode(', ', $vals) . ");\n";//implode:把数组用,组装成字符串
 
            }
 
            $data .= "\n";     
 
        }
 
        $data.="SET FOREIGN_KEY_CHECKS = 1;\n";//把外键约束重新设置回来
 
       //------------------以上脚本sql拼接完成了,下面把这个字符串保存起来------------------
 
        $datadir = 'backupdata/';//保存备份文件的文件夹
 
        $filename = $datadir . C('DB_NAME')."_" . time() . ".sql";//保存的文件名
 
        if(!$fp = @fopen($filename, "w+")){//创建文件
 
            echo "<font coloe='red'>提示:在创建文件时遇到错误!</font>";
 
           $this->error('备份数据失败!');
 
        }
 
        if(!@fwrite($fp, $data)){//写入文件
 
            echo "<font color='red'>提示:在写入信息时遇到错误!</font>";
 
            fclose($fp);
 
            unlink($filename);//如果写入失败。就删除刚刚创建的文件
 
             $this->error('备份数据失败!');
 
        }
 
        fclose($fp);
 
        $this->success('备份数据成功!');  
 
    }
 
}
 
 

(编辑:聊城站长网)

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

    推荐文章