MySQL数据库备份恢复的两个实用方法
作者:20733 发布时间:2008-12-31 15:09:00
方法1:
/*
* 功能:数据备份/恢复文件简易方法
* 以日期为单位,一天一个备份文件,以当天最后备份为准
* 用提交表单的形式进行操作,
* 其中$_POST["tbl_name"]为预备份表名称数组
* $_POST["sqlfile"]为预恢复数据文件的名称
* 注意:该备份没有结构备份,只有数据备份
*
* 备份文件格式:
* `表名称1`{{数据1}}`表名称2`{{数据2}}`表名称3`{{数据3}}...
*
* 创建时间:2005-02-25
* E-mail: kingerq AT msn.com
* 来源:http://blog.csdn.net/kingerq
*/
include
("../inc/globals.inc.php");//省略包函文件db_mysql.inc和MYSQL连接信息
set_time_limit(0);
$dbdir = "d:/site/dbbak/";//用绝对路径
$txtname = array();
if($_POST){
if(!is_writable($dbdir)) {
echo "对不起!指定的备份目录不可写!请修改权限";
exit;
}
//op为一个隐形域,识别备份或者恢复
if($_POST["op"]){//备份数据
//生成每个表的临时备份文件
foreach($_POST["tbl_name"] as $tbl){
$txtname[] = $tbl.".txt";
$sql = "SELECT * FROM `$tbl`
INTO OUTFILE '".$dbdir.end($txtname)."'";
$db->query($sql);
}
//将生成的临时备份文件合在一起
$outfile = date("Y-m-d").".sql";
if(file_exists($dbdir.$outfile)) @unlink($dbdir.$outfile);
$fpr = fopen($dbdir.$outfile, "a");
foreach($txtname as $txt){
if(file_exists($dbdir.$txt)){
//读取临时备份文件
$tdata = readfiles($dbdir.$txt);
//生成备份文件
$tbl = explode(".", $txt);
$str = "`".$tbl[0]."`{{".$tdata."}}";
if(fwrite($fpr, $str)){
echo $tbl[0]."...写入 $outfile 成功!
\n";
}else{
echo $tbl[0]."...写入 $outfile 失败!
\n";
}
@unlink($dbdir.$txt);
}
}
fclose($fpr);
}else{//恢复数据
$tdata = readfiles($dbdir.$_POST["sqlfile"]);
preg_match_all("/`(.*)`\{\{(.*)\}\}/isU", $tdata, $data_ar);
foreach($data_ar[1] as $k => $tt){
if(empty($data_ar[2][$k])) continue;
$tfile = $dbdir.$tt.".txt";
$fp = fopen($tfile, "w");
if(fwrite($fp, $data_ar[2][$k])){
//清空表
$sql = "TRUNCATE TABLE `$tt`";
$db->query($sql);
//重新装入数据
$sql = "LOAD DATA LOW_PRIORITY INFILE '
".$dbdir.$tt.".txt"."' INTO TABLE `$tt`";
if($db->query($sql)){
fclose($fp);
echo $tt."表数据恢复成功!
\n";
unlink($dbdir.$tt.".txt");
}else{
echo $tt."表数据恢复失败!
\n";
}
}
}
//echo $tdata;
//print_r($data_ar);
//exit;
}
}
/*
* 读取文件内容
* 参数 $file 为文件名及完整路径
* 返回文件内容
*/
function readfiles($file){
$tdata = "";
$fp = fopen($file, "r");
if(filesize($file) <= 0) return;
while($data = fread($fp, filesize($file))){
$tdata .= $data;
}
fclose($fp);
return $tdata;
}
?>


猜你喜欢
- 什么是反射大多数时候,Go中的变量,类型和函数非常简单直接。当需要一个类型、变量或者是函数时,可以直接定义它们:type Foo struc
- Excel是微软办公套装软件的一个重要的组成部分,它可以进行各种数据的处理、统计分析和辅助决策操作,广泛地应用于管理、统计财经、金融等众多领
- Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将
- 通过一个简单的实例,来让大家了解一下golang flag包的一个简单的用法package mainimport ( "
- jQuery能够极大提高html的编写效率,其中checkbox的选中判断有几种:1, $(checkbox的id).prop("
- 对其中的参数进行解释plt.subplots(figsize=(9, 9))设置画面大小,会使得整个画面等比例放大的sns.heapmap(
- 1.字符串大小写转value = "wangdianchao"# 转换为大写big_value = value.uppe
- 本文实例为大家分享了Bootstrap导航条实现的具体代码,供大家参考,具体内容如下navbar-header:导航的头部,一般情况下用来放
- 目录1.代码的编写过程2.结果的可视化展示3.结论前言:前不久,我刷到这样一条短视频,“1.7亿的90后仅有约1000万对结婚,结婚率不到1
- 项目:基于Pymysql的专家随机抽取系统引入库函数:>>> import treelib>>> fro
- 1.数据的增删改查----------增加数据在视图函数中导入User模型类,然后使用下面的方法添加数据:from django.http
- #python中的函数定义,使用和传参###------------------- 必要参数 -----------------------
- element换肤所有主题色和基础色均可自主配置1.element-ui官方提供的动态切换主题方法换肤 但此方法只可修改$&ndas
- 本文实例讲述了Python轻量级ORM框架Peewee访问sqlite数据库的方法。分享给大家供大家参考,具体如下:ORM框架就是 obje
- 持续更新一些常用的Tensor操作,比如List,Numpy,Tensor之间的转换,Tensor的拼接,维度的变换等操作。其它Tensor
- 排序算法排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是
- 一、使用三种方法实现0-n累加求和定义函数分别使用while循环、for循环、递归函数实现对0-n的累加求和1、使用while循环定义一个累
- 前言随着我们不断地在一个文件中添加新的功能, 就会使得文件变得很长。 即便使用了继承,也抑制不住类的成长。为了解决这一问题,我们可以将类存储
- 注:本文所说的视觉设计师专指网页视觉设计师。网页设计师与平面设计师都归类为设计师,其实这两个职业是跨行业的,虽然有很多设计师一直在跨行业工作
- 对于个人网站来说,受到建站条件的制约,Access数据库成了广大个人网站站长的首选。然而,Access数据库本身存在很多安全隐患,攻击者一旦