php数据库还原_php数据库备份还原类方法

本文介绍如何使用ThinkPHP5(TP5)进行数据库表结构备份,包括获取表名、结构、数据,并提供一键备份和还原的方法。通过实例展示了如何创建备份文件并模仿Navicat格式,以及相关的数据库操作技巧。
摘要由CSDN通过智能技术生成

大致步骤如下:

从数据库中拿到要备份的数据表

//拿数据表

$sql = 'show tables';

$tables_in_db = Db::query($sql);//你需要一个模型 (没有?下面附一个 这里是Tp5的模型)

dump($tables_in_db);//打印

下面是打印结果

//遍历这个数组 调整一下结构 最后得到一个包含表名称的索引数组

$tables = array();

foreach ( $tables_in_db as $k =>$v )

{

$tables[$k] = $v['Tables_in_'.$dbname];//$dbname 是xxx 则键名是 Tables_in_xxx

}

拿到表结构

$sql = "show create table `tableName`";//tableName 要查看的表名

$create_table = Db::query($sql);

dump($create_table );

打印结果如下

很关键, “Create Table” 字段里的值, 就是你的表结构!!

拿对应表的数据 (这个没什么可说的)

接下来是重点了

将表结构和对应数据记录保存到 一个名为 .sql 的文件里

还原的话就是从这个文件中拿sql语句 执行

下面是自己写的一个 一键备份, 和一键还原(很弱!=.= ,没有分包什么的)

.sql 里的文件格式是模仿 Navicat for MySQL 导出的sql 文件 来写的

顺便附一个数据库操作类

https://blog.csdn.net/csdn_zhongwu/article/details/84257921

/**

* 数据库备份

*/

class Backup

{

private $tables = array();//要备份的数据表

private $path;//文件保存路径

private $dbname;//database name;

private $model;//数据库模型对象

function __construct()

{

$this->model = new Db();//你需要一个模型 请自行解决

$this->path = ROOT.'/sql/';//常量ROOT 定义的项目根目录 请自行解决

$this->dbname = DB_DBNAME;// database 名称 请自行解决

$this->check_path();

$this->get_tables();

}

//备份方法

public function backupAll ()

{

if( $this->tables )

{

$data = $this->genTitle();

foreach ( $this ->tables as $table )

{

//拿相关 create table 数据

$ctable = $this->get_create_table($table);

//生成表结构

$data .= $this->get_table_structure($ctable);

//表记录

$data .= $this->get_table_records($table);

}

$filename = $this->path . time() .'.sql';

return file_put_contents($filename, $data);

}

}

//还原方法 拆分sql语句, 因为之前保存到文件中的语句都是以 ;\r\n 结尾的, 所以...

public function restore ($file)

{

$filename = $file;

if( !file_exists($filename) )

{

return false;

}

$str = fread( $hd = fopen($filename, "rb") , filesize($filename) );

$sqls = explode(";\r\n", $str);//所以... 这里拆分sql

if($sqls)

{

foreach($sqls as $sql)

{

$this->model ->query($sql);//逐条执行

}

}

fclose($hd);

return true;

}

//备份文件相关

public function getFileInfo()

{

$temp = array();

if( is_dir($this->path) )

{

$handler = opendir($this->path);

$num = 0;

while ( $file = readdir($handler) ){

if( $file !== '.' && $file !== '..' )

{

$filename = $this->path.$file;

$temp[$num]['name'] = $file;

$temp[$num]['size'] = ceil(filesize($filename)/1024);

$temp[$num]['time'] = date("Y-m-d H:i:s" ,filemtime($filename));

$temp[$num]['path'] = $filename;

$num ++;

}

}

}

return $temp;

}

//删除文件

public function delFile ($file)

{

if( file_exists($file) )

{

return unlink($file);

}

return false;

}

//sql 文件开头部分 可以省略 但 SET FOREIGN_KEY_CHECKS=0 最好有

private function genTitle()

{

$time = date("Y-m-d H:i:s" ,time());

$str = "/*************************\r\n";

$str.= " * {$time} \r\n";

$str.= " ************************/\r\n";

$str.= "SET FOREIGN_KEY_CHECKS=0;\r\n";

return $str;

}

private function get_tables ()

{

$sql = 'show tables';

if( $data = $this->model ->fetchAll($sql) ) {

foreach ( $data as $val ) {

$this->tables[] = $val['Tables_in_'.$this->dbname];

}

}

}

//返回一个数组, 0=>表名称 ,1=>表结构(Create Table)

private function get_create_table ($table)

{

$sql = "show create table $table";

$arr = $this->model ->fetchOne($sql);

return array_values($arr);

}

//生成表结构

private function get_table_structure ($ctable)

{

$str = "-- ----------------------------\r\n";

$str .= "-- Table structure for `{$ctable[0]}`\r\n";

$str .= "-- ----------------------------\r\n";

$str .= "DROP TABLE IF EXISTS `{$ctable[0]}`;\r\n".$ctable[1].";\r\n\r\n";

return $str;

}

//表记录的sql语句拼接 当还原的时候 就是逐条插入记录 到对应的表

private function get_table_records ($table)

{

$sql = "select * from {$table}";

if( $data = $this->model ->fetchAll($sql) ) {

$str = "-- ----------------------------\r\n";

$str.= "-- Records of $table \r\n";

$str.= "-- ----------------------------\r\n";

foreach ( $data as $val ) {

if( $val ) {

//$keyArr = array();

$valArr = array();

//这里看情况了,

foreach ( $val as $k => $v ) {

//$keyArr[] = "`".$k."`";

//对单引号和换行符进行一下转义

$valArr[] = "'".str_replace( array("'","\r\n"), array("\'","\\r\\n"), $v )."'";

}

//$keys = implode(', ', $keyArr);

$values = implode(', ', $valArr);

$str .= "INSERT INTO `{$table}` VALUES ($values);\r\n";//省略了字段名称

}

}

$str .= "\r\n";

return $str;

}

return '';

}

private function check_path ()

{

if( !is_dir($this->path) ) {

mkdir($this->path ,0777 ,true);

}

}

}

php版mysql大数据库备份和恢复工具,这是亮仔修改的无乱码版 在原faisunSQL 4.0的基础上,针对数据备份过程中出现乱码的问题,做了优化. 增强的功能: 1.自动识别数据库版本,对于MySQL 4.1以上,备份数据时提示选择字符集. 2.导入数据时,提示原数据库编码,并自动识别. 3.增加导入目标数据库字符集选项. 4.支持GBK、BIG5、UTF8之间的编码转换(见特别说明4). 特别说明: 1.乱码问题一般仅出现在MySQL 4.1/MySQL 5 版本以后,如果你的数据库低于这个版本,基本可以不用考虑这个问题. 2.确保原始数据的完整是至关重要的.就算导出时出现乱码,但只要原始数据完整,总有解决的办法.所以,导出时数据库字符集的选择必须正确,保证导出数据无乱码.一般为GBK,UTF8或Latin1.导出后,可以用文本编辑器先查看一下,看是否出现问号(?)等乱码. 3.导出和导入数据编码要保持一致(见特别说明4). 4.虽然程序目前支持GBK、BIG5、UTF8之间的编码转换,但这种转换不是安全的.首先你的目标导入服务器要支持iconv,即在导入时如果"编码转换功能"提示为支持,则可以使用此功能.反之则不可以.其次,转换时的数据必须是"干净"的.即GBK、BIG5、UTF8不能混合.如果你想将原来备份出的GBK数据导入到编码为UTF8数据库,则你的GBK数据中仅能含有GBK或GB2312的简体中文字符.不可以出现BIG5等繁体字符,否则转换将失败.基本上,一般的博客/论坛数据都不能保证这种纯净性,谁也不能保证你的文章中不会混合使用简体和繁体文字,所以这种跨字符集的导入导出数据难度很大.绝对不要轻易尝试这种游戏.目前的主流论坛如Discuz、PHPWind等都提供支持GBK、BIG5和UTF8的不同程序.你在最初安装时,一定先想好自己需要那种字符的程序,一旦选定,以后不是迫不得已,不要更改.以上仅针对 5.鉴于上面特别说明4,如果你是从MySQL 4.0.X/MySQL 3的老数据版本导入到MySQL 4.1/MySQL 5的高数据库版本,导入时请选择GBK编码.如果是UTF8编码的数据,如我的博客(http://www.zhouliang.name)采用WordPress程序,默认使用UTF8编码,则只能在MySQL 4.1/MySQL 5以上的数据库中导入导出,因为低版本的MySQL不支持UTF8. 6.以上说明仅针对本程序而言,在编码转换方面,不排除通过其他手段实现的可能性. 程序使用中出现任何问题(编码转换方面),欢迎与我联络: 我的E-Mail: php@zhouliang.name 本程序讨论主页:http://www.zhouliang.name/archives/198.htm 我的博客:http://www.zhouliang.name 此程序只是针对"乱码"问题做了改进,faisunSQL 4.0其他方面的故有功能效率与本增强版无关,如有问题请联系原作者.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值