php实现mysql备份,php实现mysql数据库备份

之前看过很多数据库的备份的功能,今天有时间自己也琢磨一下,实现思路就是生成sql脚本文件,我想也没几个会去硬备份文件库文件的吧?下面把详细的代码贴出来,实现过程中遇到 了诸多的问题,就不一一列出来了,代码关键易出错的部分备注的很详细,下面就看看代码吧(此实现基于thinkphp框架)

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 "提示:在创建文件时遇到错误!";

$this->error('备份数据失败!');

}

if(!@fwrite($fp, $data)){//写入文件

echo "提示:在写入信息时遇到错误!";

fclose($fp);

unlink($filename);//如果写入失败。就删除刚刚创建的文件

$this->error('备份数据失败!');

}

fclose($fp);

$this->success('备份数据成功!');

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值