详解MYSQL的备份还原(PHP实现)
发布时间:2023-10-06 10:44:23
标签:php,mysql备份还原
手把手教你实现MYSQL的备份还原
示例代码用我比较熟悉的PHP,当然你看完并理解了其中的思路,相信你也可以快速地用你熟悉的语言自己写出来。
一、新建dbBackup类,设置默认参数。
class dbBackup {
public $host='localhost'; //数据库地址
public $user='root'; //登录名
public $pwd=''; //密码
public $database; //数据库名
public $charset='utf8'; //数据库连接编码:mysql_set_charset
}
二、添加数据库连接function。
/**
* 连接数据库 ...
*/
function db() {
$con = mysql_connect($this->host,$this->user,$this->pwd);
if (!$con){
die('Could not connect');
}
$db_selected = mysql_select_db($this->database, $con);
if (!$db_selected) {
die('Can\'t use select db');
}
mysql_set_charset($this->charset);//设置编码
return $con;
}
三、查询数据库表集合
/**
* 表集合 ...
*/
function tblist() {
$list=array();
$rs=mysql_query("SHOW TABLES FROM $this->database");
while ($temp=mysql_fetch_row($rs)) {
$list[]=$temp[0];
}
return $list;
}
四、查询表结构
/**
* 表结构SQL ...
*/
function sqlcreate() {
$sql='';
$tb=$this->tblist();
foreach ($tb as $v) {
$rs=mysql_query("SHOW CREATE TABLE $v");
$temp=mysql_fetch_row($rs);
$sql.="-- 表的结构:{$temp[0]} --\r\n";
$sql.="{$temp[1]}";
$sql.=";-- <xjx> --\r\n\r\n";
}
return $sql;
}
注:$sql.=";-- <xjx> --\r\n\r\n"; 每句SQL后面必须加上分号(;)分割,MYSQL导入才能识别。-- <xjx> -- 是程序对SQL语句分割的标识,可以自定义但必须是注释语句,否则影响SQL语句。\r\n无实际意义用于文本美观
五、INSERT INTO语句
/**
* 数据插入SQL ...
*/
function sqlinsert() {
$sql='';
$tb=$this->tblist();
foreach ($tb as $v) {
$rs=mysql_query("SELECT * FROM $v");
if (!mysql_num_rows($rs)) {//无数据返回
continue;
}
$sql.="-- 表的数据:$v --\r\n";
$sql.="INSERT INTO `$v` VALUES\r\n";
while ($temp=mysql_fetch_row($rs)) {
$sql.='(';
foreach ($temp as $v2) {
if ($v2===null) {
$sql.="NULL,";
}
else {
$v2=mysql_real_escape_string($v2);
$sql.="'$v2',";
}
}
$sql=mb_substr($sql, 0, -1);
$sql.="),\r\n";
}
$sql=mb_substr($sql, 0, -3);
$sql.=";-- <xjx> --\r\n\r\n";
}
return $sql;
}
注:
1.无数据返回时必须跳出本次循环,避免生成多余代码
2.当字段值为(NULL)时,插入字符为(NULL)而不是('NULL'),没有单引号。3.$v2=mysql_real_escape_string($v2),这是必要的转义
4.mb_substr($sql, 0, -1)、mb_substr($sql, 0, -3),必须去除最后一个逗号(,) 否则SQL语句出错5.$sql.=";-- <xjx> --\r\n\r\n",详见第四步注
六、备份操作
/**
* 备份 ...
* @param $filename 文件路径
*/
function beifen($filename) {
$this->db(); //连接数据库
$sql=$this->sqlcreate();
$sql2=$this->sqlinsert();
$data=$sql.$sql2;
return file_put_contents($filename, $data);
}
七、还原操作
/**
* 还原 ...
* @param $filename 文件路径
*/
function huanyuan($filename) {
$this->db(); //连接数据库
//删除数据表
$list=$this->tblist();
$tb='';
foreach ($list as $v) {
$tb.="`$v`,";
}
$tb=mb_substr($tb, 0, -1);
if ($tb) {
$rs=mysql_query("DROP TABLE $tb");
if ($rs===false) {
return false;
}
}
//执行SQL
$str=file_get_contents($filename);
$arr=explode('-- <xjx> --', $str);
array_pop($arr);
foreach ($arr as $v) {
$rs=mysql_query($v);
if ($rs===false) {
return false;
}
}
return true;
}
备份示例:
$x=new dbBackup();
$x->database='test';
$rs=$x->beifen('db.sql');
var_dump($rs);
还原示例:
$x=new dbBackup();
$x->database='test';
$rs=$x->huanyuan('db.sql');
var_dump($rs);
完整代码:
class dbBackup {
public $host='localhost'; //数据库地址
public $user='root'; //登录名
public $pwd=''; //密码
public $database; //数据库名
public $charset='utf8'; //数据库连接编码:mysql_set_charset
/**
* 备份 ...
* @param $filename 文件路径
*/
function beifen($filename) {
$this->db(); //连接数据库
$sql=$this->sqlcreate();
$sql2=$this->sqlinsert();
$data=$sql.$sql2;
return file_put_contents($filename, $data);
}
/**
* 还原 ...
* @param $filename 文件路径
*/
function huanyuan($filename) {
$this->db(); //连接数据库
//删除数据表
$list=$this->tblist();
$tb='';
foreach ($list as $v) {
$tb.="`$v`,";
}
$tb=mb_substr($tb, 0, -1);
if ($tb) {
$rs=mysql_query("DROP TABLE $tb");
if ($rs===false) {
return false;
}
}
//执行SQL
$str=file_get_contents($filename);
$arr=explode('-- <xjx> --', $str);
array_pop($arr);
foreach ($arr as $v) {
$rs=mysql_query($v);
if ($rs===false) {
return false;
}
}
return true;
}
/**
* 连接数据库 ...
*/
function db() {
$con = mysql_connect($this->host,$this->user,$this->pwd);
if (!$con){
die('Could not connect');
}
$db_selected = mysql_select_db($this->database, $con);
if (!$db_selected) {
die('Can\'t use select db');
}
mysql_set_charset($this->charset); //设置编码
return $con;
}
/**
* 表集合 ...
*/
function tblist() {
$list=array();
$rs=mysql_query("SHOW TABLES FROM $this->database");
while ($temp=mysql_fetch_row($rs)) {
$list[]=$temp[0];
}
return $list;
}
/**
* 表结构SQL ...
*/
function sqlcreate() {
$sql='';
$tb=$this->tblist();
foreach ($tb as $v) {
$rs=mysql_query("SHOW CREATE TABLE $v");
$temp=mysql_fetch_row($rs);
$sql.="-- 表的结构:{$temp[0]} --\r\n";
$sql.="{$temp[1]}";
$sql.=";-- <xjx> --\r\n\r\n";
}
return $sql;
}
/**
* 数据插入SQL ...
*/
function sqlinsert() {
$sql='';
$tb=$this->tblist();
foreach ($tb as $v) {
$rs=mysql_query("SELECT * FROM $v");
if (!mysql_num_rows($rs)) {//无数据返回
continue;
}
$sql.="-- 表的数据:$v --\r\n";
$sql.="INSERT INTO `$v` VALUES\r\n";
while ($temp=mysql_fetch_row($rs)) {
$sql.='(';
foreach ($temp as $v2) {
if ($v2===null) {
$sql.="NULL,";
}
else {
$v2=mysql_real_escape_string($v2);
$sql.="'$v2',";
}
}
$sql=mb_substr($sql, 0, -1);
$sql.="),\r\n";
}
$sql=mb_substr($sql, 0, -3);
$sql.=";-- <xjx> --\r\n\r\n";
}
return $sql;
}
}
//备份
//$x=new dbBackup();
//$x->database='test';
//$rs=$x->beifen('db.sql');
//var_dump($rs);
//还原
//$x=new dbBackup();
//$x->database='test';
//$rs=$x->huanyuan('db.sql');
//var_dump($rs);
0
投稿
猜你喜欢
- 功能很简单,代码也很简洁,这里就不多废话了。package mainimport ( "fmt
- SQL Server会把经常使用到的数据缓存在内存里(就是数据页缓存),用以提高数据访问速度。因为磁盘访问速度远远低于内存,所以减少磁盘访问
- 字符替换是一个非常重要的功能,javascript 中有一个 String.replace( ),但是此方法有
- 之前有写过一篇浏览器的tab设计,这回说说网站的tab设计。一说到tab很自然地就想到了导航、信息架构。随着网站信息结构的复杂化,选择tab
- 一个很简单的画像素画的小工具,有意思的地方在于可以把画的图案保存成数组,以方便之后快速还原出原图..<!DOCTYPE html PU
- 本文实例讲述了PHP+Mysql基于事务处理实现转账功能的方法。分享给大家供大家参考。具体如下:<?php header(
- 在任何编辑器中,获取光标位置都是非常重要的,很多人可能认为较难,其实只要处理好浏览器的兼容,还是比较容易实现的。下面我们一起来看看如何获取到
- 在支持FSO的情况下,可以显示本站内的所有ASP页面的代码适用于代码演示时在效果页面上直接显示该页面的代码而不用再对代码制作专门的页面使用方
- 因为即将开始淘宝的项目,在前端方面必然要深入了解taobao ued规范,规范还是比较全的,只是对taobao.com的编码和字符集的选择有
- ASP 本身不支持动态包含文件,现在的动态包含是通过 FSO 把被包含的文件合并到主文件里再运行。以下也有把形如 <!--#
- 这段时间写了很多页面代码,除了一些知识重复以外,也学到css的一些新东西,或许是旧东西,但是还是希望能对大家有用。其实在css里面有很多对a
- 方案5 使用xml参数 对sql server xml类型参数不熟悉的童鞋需要先了解下XQuery概念,这里简单提下XQuery 是用来从
- 几个月来好像就现在暂时无需求,稍微轻松一下,然后在Q群中发现有人提问,怎么用CSS实现数学公式“四又二分之一”。对于这个公式个人
- 本文实例讲述了javascript设计模式 – 简单工厂模式。分享给大家供大家参考,具体如下:介绍:简单工厂模式是最常用的一类创建型设计模式
- 我差不多是与做web design的同时接触的flash design,因为那会普遍认为flash神通广大、无所不能。这些年我看Adobe的
- 又发一个js版幻灯片,接口比较少,但功能和外观都还不错的,可自定义切换时间:)method: adRotator.initialize(容器
- 在很多情况下,我们可能需要控制某一段代码只执行一次,比如做某些初始化操作,如初始化数据库连接等。 对于这种场景,go 为我们提供了 sync
- 为了组织search线的设计师交流会,特地去准备了一些资料。《SERP 2010》是其中一个,但是由于时间关系没有进行讨论。原著是英文报告,
- <%'使用说明'Dim a'Set a=new CreateExce
- 这个绝对是IE6的bug。我想要达到的是如下的效果。通过三个div,排布好侧栏和内容区。我用了如下的css:<style type=&