PHP实现MYSQL的备份还原

2019-07-24 08:55:19来源:爱站网 阅读 ()

新老客户大回馈,云服务器低至5折

如何才能实现MYSQL的备份还原呢?对于MYSQL的备份还原相信很多人还是不理解的,接下来的内容就是爱站小编为大家整理关于PHP实现MYSQL的备份还原的内容,感兴趣的小伙伴们一起来看看吧。
一、新建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);

本文主要介绍的就是PHP实现MYSQL的备份还原,当你看完并理解了其中的思路,相信你也可以快速地用你熟悉的语言自己写出来。?


原文链接:https://js.aizhan.com/data/mysql/7432.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SQL找出2个表里值不同的列的方法

下一篇:解决hibernate+mysql写入数据库乱码