0

0

备份数据库

php中文网

php中文网

发布时间:2016-06-07 11:45:35

|

1030人浏览过

|

来源于php中文网

原创

全写在模块内了,可备份整个库,也可以选择部分表备份

纠正一处错误,361行empty 用错了
<?php <br /><br> class BaksqlAction extends CommonAction {<br><br>     public $config = '';                                                        //相关配置<br>     public $model = '';                                                         //实例化一个model<br>     public $content;                                                            //内容<br>     public $dbName = '';                                                        //数据库名<br>     public $dir_sep = '/';                                                      //路径符号<br><br>     //初始化数据<br><br>     function _initialize() {<br>         parent::_initialize();<br>         header("Content-type: text/html;charset=utf-8");<br>         set_time_limit(0);                                                      //不超时<br>         ini_set('memory_limit','500M');<br>         $this->config = array(<br>             'path' => C('DB_BACKUP'),                                           //备份文件存在哪里<br>             'isCompress' => 0,                                                  //是否开启gzip压缩      【未测试】<br>             'isDownload' => 0                                                   //备份完成后是否下载文件 【未测试】<br>         );<br>         $this->dbName = C('DB_NAME');                                           //当前数据库名称<br>         $this->model = new Model();<br>         //$sql = 'set interactive_timeout=24*3600';                             //空闲多少秒后 断开链接<br>         //$this->model>execute($sql);<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 已备份数据列表<br>      * +------------------------------------------------------------------------<br>      */<br><br>     function index() {<br>         $path = $this->config['path'];<br>         $fileArr = $this->MyScandir($path);<br>         foreach ($fileArr as $key => $value) {<br>             if ($key > 1) {<br>                 //获取文件创建时间<br>                 $fileTime = date('Y-m-d H:i:s', filemtime($path . '/' . $value));<br>                 $fileSize = filesize($path . '/' . $value) / 1024;<br>                 //获取文件大小<br>                 $fileSize = $fileSize                          number_format($fileSize / 1024, 2) . ' MB';<br>                 //构建列表数组<br>                 $list[] = array(<br>                     'name' => $value,<br>                     'time' => $fileTime,<br>                     'size' => $fileSize<br>                 );<br>             }<br>         }<br>         $this->assign('list', $list);<br>         $this->display();<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 获取数据表<br>      * +------------------------------------------------------------------------<br>      */<br><br>     function tablist() {<br>         $list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}");  //得到表的信息<br>         //echo $Backup->getLastSql();<br>         $this->assign('list', $list);<br>         $this->display();<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 备份整个数据库<br>      * +------------------------------------------------------------------------<br>      */<br><br>     function backall() {<br>         $tables = $this->getTables();<br>         if ($this->backup($tables)) {<br>             $this->success('数据库备份成功!', '/public/ok');<br>         } else {<br>             $this->error('数据库备份失败!');<br>         }<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 按表备份,可批量<br>      * +------------------------------------------------------------------------<br>      */<br><br>     function backtables() {<br>         $tab = $_REQUEST['tab'];<br>         if (is_array($tab))<br>             $tables = $tab;<br>         else<br>             $tables[] = $tab;<br>         if ($this->backup($tables)) {<br>             if (is_array($tab))<br>                 $this->success('数据库备份成功!');<br>             else<br>                 $this->success('数据库备份成功!', '/public/ok');<br>         } else {<br>             $this->error('数据库备份失败!');<br>         }<br>     }<br><br>     //还原数据库<br>     function recover() {<br>         if ($this->recover_file($_GET['file'])) {<br>             $this->success('数据还原成功!', '/public/ok');<br>         } else {<br>             $this->error('数据还原失败!');<br>         }<br>     }<br><br>     //删除数据备份<br>     function deletebak() {<br>         if (unlink($this->config['path'] . $this->dir_sep . $_GET['file'])) {<br>             $this->success('删除备份成功!', '/public/ok');<br>         } else {<br>             $this->error('删除备份失败!');<br>         }<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 下载备份文件<br>      * +------------------------------------------------------------------------<br>      */<br><br>     function downloadBak() {<br>         $file_name = $_GET['file'];<br>         $file_dir = $this->config['path'];<br>         if (!file_exists($file_dir . "/" . $file_name)) { //检查文件是否存在<br>             return false;<br>             exit;<br>         } else {<br>             $file = fopen($file_dir . "/" . $file_name, "r"); // 打开文件<br>             // 输入文件标签<br>             header('Content-Encoding: none');<br>             header("Content-type: application/octet-stream");<br>             header("Accept-Ranges: bytes");<br>             header("Accept-Length: " . filesize($file_dir . "/" . $file_name));<br>             header('Content-Transfer-Encoding: binary');<br>             header("Content-Disposition: attachment; filename=" . $file_name);  //以真实文件名提供给浏览器下载<br>             header('Pragma: no-cache');<br>             header('Expires: 0');<br>             //输出文件内容<br>             echo fread($file, filesize($file_dir . "/" . $file_name));<br>             fclose($file);<br>             exit;<br>         }<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 获取 目录下文件数组<br>      * +------------------------------------------------------------------------<br>      * * @ $FilePath 目录路径<br>      * * @ $Order    排序<br>      * +------------------------------------------------------------------------<br>      * * @ 获取指定目录下的文件列表,返回数组<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function MyScandir($FilePath = './', $Order = 0) {<br>         $FilePath = opendir($FilePath);<br>         while ($filename = readdir($FilePath)) {<br>             $fileArr[] = $filename;<br>         }<br>         $Order == 0 ? sort($fileArr) : rsort($fileArr);<br>         return $fileArr;<br>     }<br><br>     /*     * ******************************************************************************************** */<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 读取备份文件<br>      * +------------------------------------------------------------------------<br>      * * @ $fileName 文件名<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function getFile($fileName) {<br>         $this->content = '';<br>         $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $fileName);<br>         if (is_file($fileName)) {<br>             $ext = strrchr($fileName, '.');<br>             if ($ext == '.sql') {<br>                 $this->content = file_get_contents($fileName);<br>             } elseif ($ext == '.gz') {<br>                 $this->content = implode('', gzfile($fileName));<br>             } else {<br>                 $this->error('无法识别的文件格式!');<br>             }<br>         } else {<br>             $this->error('文件不存在!');<br>         }<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 把数据写入磁盘<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function setFile() {<br>         $recognize = '';<br>         $recognize = $this->dbName;<br>         $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $recognize . '_' . date('YmdHis') . '_' . mt_rand(100000000, 999999999) . '.sql');<br>         $path = $this->setPath($fileName);<br>         if ($path !== true) {<br>             $this->error("无法创建备份目录目录 '$path'");<br>         }<br>         if ($this->config['isCompress'] == 0) {<br>             if (!file_put_contents($fileName, $this->content, LOCK_EX)) {<br>                 $this->error('写入文件失败,请检查磁盘空间或者权限!');<br>             }<br>         } else {<br>             if (function_exists('gzwrite')) {<br>                 $fileName .= '.gz';<br>                 if ($gz = gzopen($fileName, 'wb')) {<br>                     gzwrite($gz, $this->content);<br>                     gzclose($gz);<br>                 } else {<br>                     $this->error('写入文件失败,请检查磁盘空间或者权限!');<br>                 }<br>             } else {<br>                 $this->error('没有开启gzip扩展!');<br>             }<br>         }<br>         if ($this->config['isDownload']) {<br>             $this->downloadFile($fileName);<br>         }<br>     }<br><br>     private function trimPath($path) {<br>         return str_replace(array('/', '\', '//', '\\'), $this->dir_sep, $path);<br>     }<br><br>     private function setPath($fileName) {<br>         $dirs = explode($this->dir_sep, dirname($fileName));<br>         $tmp = '';<br>         foreach ($dirs as $dir) {<br>             $tmp .= $dir . $this->dir_sep;<br>             if (!file_exists($tmp) && !@mkdir($tmp, 0777))<br>                 return $tmp;<br>         }<br>         return true;<br>     }<br><br>     //未测试<br>     private function downloadFile($fileName) {<br>         ob_end_clean();<br>         header("Cache-Control: must-revalidate, post-check=0, pre-check=0");<br>         header('Content-Description: File Transfer');<br>         header('Content-Type: application/octet-stream');<br>         header('Content-Length: ' . filesize($fileName));<br>         header('Content-Disposition: attachment; filename=' . basename($fileName));<br>         readfile($fileName);<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 给字符串添加 ` `<br>      * +------------------------------------------------------------------------<br>      * * @ $str 字符串<br>      * +------------------------------------------------------------------------<br>      * * @ 返回 `$str`<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function backquote($str) {<br>         return "`{$str}`";<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 获取数据库的所有表<br>      * +------------------------------------------------------------------------<br>      * * @ $dbName  数据库名称<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function getTables($dbName = '') {<br>         if (!empty($dbName)) {<br>             $sql = 'SHOW TABLES FROM ' . $dbName;<br>         } else {<br>             $sql = 'SHOW TABLES ';<br>         }<br>         $result = $this->model->query($sql);<br>         $info = array();<br>         foreach ($result as $key => $val) {<br>             $info[$key] = current($val);<br>         }<br>         return $info;<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 把传过来的数据 按指定长度分割成数组<br>      * +------------------------------------------------------------------------<br>      * * @ $array 要分割的数据<br>      * * @ $byte  要分割的长度<br>      * +------------------------------------------------------------------------<br>      * * @ 把数组按指定长度分割,并返回分割后的数组<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function chunkArrayByByte($array, $byte = 5120) {<br>         $i = 0;<br>         $sum = 0;<br>         $return = array();<br>         foreach ($array as $v) {<br>             $sum += strlen($v);<br>             if ($sum                  $return[$i][] = $v;<br>             } elseif ($sum == $byte) {<br>                 $return[++$i][] = $v;<br>                 $sum = 0;<br>             } else {<br>                 $return[++$i][] = $v;<br>                 $i++;<br>                 $sum = 0;<br>             }<br>         }<br>         return $return;<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 备份数据 { 备份每张表、视图及数据 }<br>      * +------------------------------------------------------------------------<br>      * * @ $tables 需要备份的表数组<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function backup($tables) {<br>         if (empty($tables))<br>             $this->error('没有需要备份的数据表!');<br>         $this->content = '/* This file is created by MySQLReback ' . date('Y-m-d H:i:s') . ' */';<br>         foreach ($tables as $i => $table) {<br>             $table = $this->backquote($table);                                  //为表名增加 ``<br>             $tableRs = $this->model->query("SHOW CREATE TABLE {$table}");       //获取当前表的创建语句<br>             if (!empty($tableRs[0]["Create View"])) {<br>                 $this->content .= "  /* 创建视图结构 {$table}  */";<br>                 $this->content .= "  DROP VIEW IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create View"] . ";/* MySQLReback Separation */";<br>             }<br>             if (!empty($tableRs[0]["Create Table"])) {<br>                 $this->content .= "  /* 创建表结构 {$table}  */";<br>                 $this->content .= "  DROP TABLE IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create Table"] . ";/* MySQLReback Separation */";<br>                 $tableDateRow = $this->model->query("SELECT * FROM {$table}");<br>                 $valuesArr = array();<br>                 $values = '';<br>                 if (false != $tableDateRow) {<br>                     foreach ($tableDateRow as &$y) {<br>                         foreach ($y as &$v) {<br>                            if ($v=='')                                  //纠正empty 为0的时候  返回tree<br>                                 $v = 'null';                                    //为空设为null<br>                             else<br>                                 $v = "'" . mysql_escape_string($v) . "'";       //非空 加转意符<br>                         }<br>                         $valuesArr[] = '(' . implode(',', $y) . ')';<br>                     }<br>                 }<br>                 $temp = $this->chunkArrayByByte($valuesArr);<br>                 if (is_array($temp)) {<br>                     foreach ($temp as $v) {<br>                         $values = implode(',', $v) . ';/* MySQLReback Separation */';<br>                         if ($values != ';/* MySQLReback Separation */') {<br>                             $this->content .= "  /* 插入数据 {$table} */";<br>                             $this->content .= "  INSERT INTO {$table} VALUES {$values}";<br>                         }<br>                     }<br>                 }<br> //                dump($this->content);<br> //                exit;<br>             }<br>         }<br><br>         if (!empty($this->content)) {<br>             $this->setFile();<br>         }<br>         return true;<br>     }<br><br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 还原数据<br>      * +------------------------------------------------------------------------<br>      * * @ $fileName 文件名<br>      * +------------------------------------------------------------------------<br>      */<br><br>     private function recover_file($fileName) {<br>         $this->getFile($fileName);<br>         if (!empty($this->content)) {<br>             $content = explode(';/* MySQLReback Separation */', $this->content);<br>             foreach ($content as $i => $sql) {<br>                 $sql = trim($sql);<br>                 if (!empty($sql)) {<br>                     $mes = $this->model->execute($sql);<br>                     if (false === $mes) {                                       //如果 null 写入失败,换成 ''<br>                         $table_change = array('null' => '''');<br>                         $sql = strtr($sql, $table_change);<br>                         $mes = $this->model->execute($sql);<br>                     }<br>                     if (false === $mes) {                                       //如果遇到错误、记录错误<br>                         $log_text = '以下代码还原遇到问题:';<br>                         $log_text.="  $sql";<br>                         set_log($log_text);<br>                     }<br>                 }<br>             }<br>         } else {<br>             $this->error('无法读取备份文件!');<br>         }<br>         return true;<br>     }<br><br> }<br> ?>

AD:真正免费,域名+虚机+企业邮箱=0元

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

76

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

117

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

350

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

63

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

109

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

108

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

243

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

684

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

179

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
动力学院设计模式PHP视频教程
动力学院设计模式PHP视频教程

共15课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号