分析MySQL的备份还原(PHP实现)

2022-11-12 09:31:36
内容摘要
这篇文章主要为大家详细介绍了分析MySQL的备份还原(PHP实现),具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记!手把手教你实现MYSQL的备份还
文章正文

这篇文章主要为大家详细介绍了分析MySQL的备份还原(PHP实现),具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

手把手教你实现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);

注:关于分析MySQL的备份还原(PHP实现)的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!