当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP实现MySQL数据库备份的源码

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-30 09:57:20 浏览: 评论:0 

下面是一个php数据库备份的源代码,大家也可以根据自己的需求进行修改。

  1. <?php  
  2. // 备份数据库 
  3. $host = "localhost"
  4. $user = "root"//数据库账号 
  5. $password = ""//数据库密码 
  6. $dbname = "mysql"//数据库名称 
  7. // 这里的账号、密码、名称都是从页面传过来的 
  8. if (!mysql_connect($host$user$password)) // 连接mysql数据库 
  9.  echo '数据库连接失败,请核对后再试'
  10.     exit
  11. }  
  12. if (!mysql_select_db($dbname)) // 是否存在该数据库 
  13.  echo '不存在数据库:' . $dbname . ',请核对后再试'
  14.     exit
  15. }  
  16. mysql_query("set names 'utf8'"); 
  17. $mysql = "set charset utf8;\r\n"
  18. $q1 = mysql_query("show tables"); 
  19. while ($t = mysql_fetch_array($q1)) 
  20.     $table = $t[0]; 
  21.     $q2 = mysql_query("show create table `$table`"); 
  22.     $sql = mysql_fetch_array($q2); 
  23.     $mysql .= $sql['Create Table'] . ";\r\n"
  24.     $q3 = mysql_query("select * from `$table`"); 
  25.     while ($data = mysql_fetch_assoc($q3)) 
  26.     { 
  27.         $keys = array_keys($data); 
  28.         $keys = array_map('addslashes'$keys); 
  29.         $keys = join('`,`'$keys); 
  30.         $keys = "`" . $keys . "`"
  31.         $vals = array_values($data); 
  32.         $vals = array_map('addslashes'$vals); 
  33.         $vals = join("','"$vals); 
  34.         $vals = "'" . $vals . "'"
  35.         $mysql .= "insert into `$table`($keys) values($vals);\r\n"
  36.     }  
  37. }  
  38.  
  39. $filename = $dbname . date('Ymjgi') . ".sql"//存放路径,默认存放到项目最外层 
  40. $fp = fopen($filename'w'); 
  41. fputs($fp$mysql); 
  42. fclose($fp); 
  43. echo "数据备份成功"
  44. ?> 

如果使用的是thinkphp可以使用下面代码来备份mysql数据库

  1. <?php 
  2.  // www.phpfensi.com 
  3. class BaksqlAction extends CommonAction { 
  4.  
  5.     public $config = '';                                                        //相关配置 
  6.     public $model = '';                                                         //实例化一个model 
  7.     public $content;                                                            //内容 
  8.     public $dbName = '';                                                        //数据库名 
  9.     public $dir_sep = '/';                                                      //路径符号 
  10.  
  11.     //初始化数据 
  12.  
  13.     function _initialize() { 
  14.         parent::_initialize(); 
  15.         header("Content-type: text/html;charset=utf-8"); 
  16.         set_time_limit(0);                                                      //不超时 
  17.         ini_set('memory_limit','500M'); 
  18.         $this->config = array
  19.             'path' => C('DB_BACKUP'),                                           //备份文件存在哪里 
  20.             'isCompress' => 0,                                                  //是否开启gzip压缩      【未测试】 
  21.             'isDownload' => 0                                                   //备份完成后是否下载文件 【未测试】 
  22.         ); 
  23.         $this->dbName = C('DB_NAME');                                           //当前数据库名称 
  24.         $this->model = new Model(); 
  25.         //$sql = 'set interactive_timeout=24*3600';                             //空闲多少秒后 断开链接 
  26.         //$this->model>execute($sql); 
  27.     } 
  28.  
  29.     /* - 
  30.      * +------------------------------------------------------------------------ 
  31.      * * @ 已备份数据列表 
  32.      * +------------------------------------------------------------------------ 
  33.      */ 
  34.  
  35.     function index() { 
  36.         $path = $this->config['path']; 
  37.         $fileArr = $this->MyScandir($path); 
  38.         foreach ($fileArr as $key => $value) { 
  39.             if ($key > 1) { 
  40.                 //获取文件创建时间 
  41.                 $fileTime = date('Y-m-d H:i:s'filemtime($path . '/' . $value)); 
  42.                 $fileSize = filesize($path . '/' . $value) / 1024; 
  43.                 //获取文件大小 
  44.                 $fileSize = $fileSize < 1024 ? number_format($fileSize, 2) . ' KB' : 
  45.                         number_format($fileSize / 1024, 2) . ' MB'
  46.                 //构建列表数组 
  47.                 $list[] = array
  48.                     'name' => $value
  49.                     'time' => $fileTime
  50.                     'size' => $fileSize 
  51.                 ); 
  52.             } 
  53.         } 
  54.         $this->assign('list'$list); 
  55.         $this->display(); 
  56.     } 
  57.  
  58.     /* - 
  59.      * +------------------------------------------------------------------------ 
  60.      * * @ 获取数据表 
  61.      * +------------------------------------------------------------------------ 
  62.      */ 
  63.  
  64.     function tablist() { 
  65.         $list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}");  //得到表的信息 
  66.         //echo $Backup->getLastSql(); 
  67.         $this->assign('list'$list); 
  68.         $this->display(); 
  69.     } 
  70.  
  71.     /* - 
  72.      * +------------------------------------------------------------------------ 
  73.      * * @ 备份整个数据库 
  74.      * +------------------------------------------------------------------------ 
  75.      */ 
  76.  
  77.     function backall() { 
  78.         $tables = $this->getTables(); 
  79.         if ($this->backup($tables)) { 
  80.             $this->success('数据库备份成功!''/public/ok'); 
  81.         } else { 
  82.             $this->error('数据库备份失败!'); 
  83.         } 
  84.     } 
  85.  
  86.     /* - 
  87.      * +------------------------------------------------------------------------ 
  88.      * * @ 按表备份,可批量 
  89.      * +------------------------------------------------------------------------ 
  90.      */ 
  91.  
  92.     function backtables() { 
  93.         $tab = $_REQUEST['tab']; 
  94.         if (is_array($tab)) 
  95.             $tables = $tab
  96.         else 
  97.             $tables[] = $tab
  98.         if ($this->backup($tables)) { 
  99.             if (is_array($tab)) 
  100.                 $this->success('数据库备份成功!'); 
  101.             else 
  102.                 $this->success('数据库备份成功!''/public/ok'); 
  103.         } else { 
  104.             $this->error('数据库备份失败!'); 
  105.         } 
  106.     } 
  107.  
  108.     //还原数据库 
  109.     function recover() { 
  110.         if ($this->recover_file($_GET['file'])) { 
  111.             $this->success('数据还原成功!''/public/ok'); 
  112.         } else { 
  113.             $this->error('数据还原失败!'); 
  114.         } 
  115.     } 
  116.  
  117.     //删除数据备份 
  118.     function deletebak() { 
  119.         if (unlink($this->config['path'] . $this->dir_sep . $_GET['file'])) { 
  120.             $this->success('删除备份成功!''/public/ok'); 
  121.         } else { 
  122.             $this->error('删除备份失败!'); 
  123.         } 
  124.     } 
  125.  
  126.     /* - 
  127.      * +------------------------------------------------------------------------ 
  128.      * * @ 下载备份文件 
  129.      * +------------------------------------------------------------------------ 
  130.      */ 
  131.  
  132.     function downloadBak() { 
  133.         $file_name = $_GET['file']; 
  134.         $file_dir = $this->config['path']; 
  135.         if (!file_exists($file_dir . "/" . $file_name)) { //检查文件是否存在 
  136.             return false; 
  137.             exit
  138.         } else { 
  139.             $file = fopen($file_dir . "/" . $file_name"r"); // 打开文件 
  140.             // 输入文件标签 
  141.             header('Content-Encoding: none'); 
  142.             header("Content-type: application/octet-stream"); 
  143.             header("Accept-Ranges: bytes"); 
  144.             header("Accept-Length: " . filesize($file_dir . "/" . $file_name)); 
  145.             header('Content-Transfer-Encoding: binary'); 
  146.             header("Content-Disposition: attachment; filename=" . $file_name);  //以真实文件名提供给浏览器下载 
  147.             header('Pragma: no-cache'); 
  148.             header('Expires: 0'); 
  149.             //输出文件内容 
  150.             echo fread($filefilesize($file_dir . "/" . $file_name)); 
  151.             fclose($file); 
  152.             exit
  153.         } 
  154.     } 
  155.  
  156.     /* - 
  157.      * +------------------------------------------------------------------------ 
  158.      * * @ 获取 目录下文件数组 
  159.      * +------------------------------------------------------------------------ 
  160.      * * @ $FilePath 目录路径 
  161.      * * @ $Order    排序 
  162.      * +------------------------------------------------------------------------ 
  163.      * * @ 获取指定目录下的文件列表,返回数组 
  164.      * +------------------------------------------------------------------------ 
  165.      */ 
  166.  
  167.     private function MyScandir($FilePath = './'$Order = 0) { 
  168.         $FilePath = opendir($FilePath); 
  169.         while ($filename = readdir($FilePath)) { 
  170.             $fileArr[] = $filename
  171.         } 
  172.         $Order == 0 ? sort($fileArr) : rsort($fileArr); 
  173.         return $fileArr
  174.     } 
  175.  
  176.     /*     * ******************************************************************************************** */ 
  177.  
  178.     /* - 
  179.      * +------------------------------------------------------------------------ 
  180.      * * @ 读取备份文件 
  181.      * +------------------------------------------------------------------------ 
  182.      * * @ $fileName 文件名 
  183.      * +------------------------------------------------------------------------ 
  184.      */ 
  185.  
  186.     private function getFile($fileName) { 
  187.         $this->content = ''
  188.         $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $fileName); 
  189.         if (is_file($fileName)) { 
  190.             $ext = strrchr($fileName'.'); 
  191.             if ($ext == '.sql') { 
  192.                 $this->content = file_get_contents($fileName); 
  193.             } elseif ($ext == '.gz') { 
  194.                 $this->content = implode('', gzfile($fileName)); 
  195.             } else { 
  196.                 $this->error('无法识别的文件格式!'); 
  197.             } 
  198.         } else { 
  199.             $this->error('文件不存在!'); 
  200.         } 
  201.     } 
  202.  
  203.     /* - 
  204.      * +------------------------------------------------------------------------ 
  205.      * * @ 把数据写入磁盘 
  206.      * +------------------------------------------------------------------------ 
  207.      */ 
  208.  
  209.     private function setFile() { 
  210.         $recognize = ''
  211.         $recognize = $this->dbName; 
  212.         $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $recognize . '_' . date('YmdHis') . '_' . mt_rand(100000000, 999999999) . '.sql'); 
  213.         $path = $this->setPath($fileName); 
  214.         if ($path !== true) { 
  215.             $this->error("无法创建备份目录目录 '$path'"); 
  216.         } 
  217.         if ($this->config['isCompress'] == 0) { 
  218.             if (!file_put_contents($fileName$this->content, LOCK_EX)) { 
  219.                 $this->error('写入文件失败,请检查磁盘空间或者权限!'); 
  220.             } 
  221.         } else { 
  222.             if (function_exists('gzwrite')) { 
  223.                 $fileName .= '.gz'
  224.                 if ($gz = gzopen($fileName'wb')) { 
  225.                     gzwrite($gz$this->content); 
  226.                     gzclose($gz); 
  227.                 } else { 
  228.                     $this->error('写入文件失败,请检查磁盘空间或者权限!'); 
  229.                 } 
  230.             } else { 
  231.                 $this->error('没有开启gzip扩展!'); 
  232.             } 
  233.         } 
  234.         if ($this->config['isDownload']) { 
  235.             $this->downloadFile($fileName); 
  236.         } 
  237.     } 
  238.  
  239.     private function trimPath($path) { 
  240.         return str_replace(array('/''\\', '//', '\\\\'), $this->dir_sep, $path); 
  241.     } 
  242.  
  243.     private function setPath($fileName) { 
  244.         $dirs = explode($this->dir_sep, dirname($fileName)); 
  245.         $tmp = ''
  246.         foreach ($dirs as $dir) { 
  247.             $tmp .= $dir . $this->dir_sep; 
  248.             if (!file_exists($tmp) && !@mkdir($tmp, 0777)) 
  249.                 return $tmp
  250.         } 
  251.         return true; 
  252.     } 
  253.  
  254.     //未测试 
  255.     private function downloadFile($fileName) { 
  256.         ob_end_clean(); 
  257.         header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
  258.         header('Content-Description: File Transfer'); 
  259.         header('Content-Type: application/octet-stream'); 
  260.         header('Content-Length: ' . filesize($fileName)); 
  261.         header('Content-Disposition: attachment; filename=' . basename($fileName)); 
  262.         readfile($fileName); 
  263.     } 
  264.  
  265.     /* - 
  266.      * +------------------------------------------------------------------------ 
  267.      * * @ 给字符串添加 ` ` 
  268.      * +------------------------------------------------------------------------ 
  269.      * * @ $str 字符串 
  270.      * +------------------------------------------------------------------------ 
  271.      * * @ 返回 `$str` 
  272.      * +------------------------------------------------------------------------ 
  273.      */ 
  274.  
  275.     private function backquote($str) { 
  276.         return "`{$str}`"
  277.     } 
  278.  
  279.     /* - 
  280.      * +------------------------------------------------------------------------ 
  281.      * * @ 获取数据库的所有表 
  282.      * +------------------------------------------------------------------------ 
  283.      * * @ $dbName  数据库名称 
  284.      * +------------------------------------------------------------------------ 
  285.      */ 
  286.  
  287.     private function getTables($dbName = '') { 
  288.         if (!emptyempty($dbName)) { 
  289.             $sql = 'SHOW TABLES FROM ' . $dbName
  290.         } else { 
  291.             $sql = 'SHOW TABLES '
  292.         } 
  293.         $result = $this->model->query($sql); 
  294.         $info = array(); 
  295.         foreach ($result as $key => $val) { 
  296.             $info[$key] = current($val); 
  297.         } 
  298.         return $info
  299.     } 
  300.  
  301.     /* - 
  302.      * +------------------------------------------------------------------------ 
  303.      * * @ 把传过来的数据 按指定长度分割成数组 
  304.      * +------------------------------------------------------------------------ 
  305.      * * @ $array 要分割的数据 
  306.      * * @ $byte  要分割的长度 
  307.      * +------------------------------------------------------------------------ 
  308.      * * @ 把数组按指定长度分割,并返回分割后的数组 
  309.      * +------------------------------------------------------------------------ 
  310.      */ 
  311.  
  312.     private function chunkArrayByByte($array$byte = 5120) { 
  313.         $i = 0; 
  314.         $sum = 0; 
  315.         $return = array(); 
  316.         foreach ($array as $v) { 
  317.             $sum += strlen($v); 
  318.             if ($sum < $byte) { 
  319.                 $return[$i][] = $v
  320.             } elseif ($sum == $byte) { 
  321.                 $return[++$i][] = $v
  322.                 $sum = 0; 
  323.             } else { 
  324.                 $return[++$i][] = $v
  325.                 $i++; 
  326.                 $sum = 0; 
  327.             } 
  328.         } 
  329.         return $return
  330.     } 
  331.  
  332.     /* - 
  333.      * +------------------------------------------------------------------------ 
  334.      * * @ 备份数据 { 备份每张表、视图及数据 } 
  335.      * +------------------------------------------------------------------------ 
  336.      * * @ $tables 需要备份的表数组 
  337.      * +------------------------------------------------------------------------ 
  338.      */ 
  339.  
  340.     private function backup($tables) { 
  341.         if (emptyempty($tables)) 
  342.             $this->error('没有需要备份的数据表!'); 
  343.         $this->content = '/* This file is created by MySQLReback ' . date('Y-m-d H:i:s') . ' */'
  344.         foreach ($tables as $i => $table) { 
  345.             $table = $this->backquote($table);                                  //为表名增加 `` 
  346.             $tableRs = $this->model->query("SHOW CREATE TABLE {$table}");       //获取当前表的创建语句 
  347.             if (!emptyempty($tableRs[0]["Create View"])) { 
  348.                 $this->content .= "\r\n /* 创建视图结构 {$table}  */"
  349.                 $this->content .= "\r\n DROP VIEW IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create View"] . ";/* MySQLReback Separation */"
  350.             } 
  351.             if (!emptyempty($tableRs[0]["Create Table"])) { 
  352.                 $this->content .= "\r\n /* 创建表结构 {$table}  */"
  353.                 $this->content .= "\r\n DROP TABLE IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create Table"] . ";/* MySQLReback Separation */"
  354.                 $tableDateRow = $this->model->query("SELECT * FROM {$table}"); 
  355.                 $valuesArr = array(); 
  356.                 $values = ''
  357.                 if (false != $tableDateRow) { 
  358.                     foreach ($tableDateRow as &$y) { 
  359.                         foreach ($y as &$v) { 
  360.                            if ($v=='')                                  //纠正empty 为0的时候  返回tree 
  361.                                 $v = 'null';                                    //为空设为null 
  362.                             else 
  363.                                 $v = "'" . mysql_escape_string($v) . "'";       //非空 加转意符 
  364.                         } 
  365.                         $valuesArr[] = '(' . implode(','$y) . ')'
  366.                     } 
  367.                 } 
  368.                 $temp = $this->chunkArrayByByte($valuesArr); 
  369.                 if (is_array($temp)) { 
  370.                     foreach ($temp as $v) { 
  371.                         $values = implode(','$v) . ';/* MySQLReback Separation */'
  372.                         if ($values != ';/* MySQLReback Separation */') { 
  373.                             $this->content .= "\r\n /* 插入数据 {$table} */"
  374.                             $this->content .= "\r\n INSERT INTO {$table} VALUES {$values}"
  375.                         } 
  376.                     } 
  377.                 } 
  378. //                dump($this->content); 
  379. //                exit; 
  380.             } 
  381.         } 
  382.  
  383.         if (!emptyempty($this->content)) { 
  384.             $this->setFile(); 
  385.         } 
  386.         return true; 
  387.     } 
  388.  
  389.     /* - 
  390.      * +------------------------------------------------------------------------ 
  391.      * * @ 还原数据 
  392.      * +------------------------------------------------------------------------ 
  393.      * * @ $fileName 文件名 
  394.      * +------------------------------------------------------------------------ 
  395.      */ 
  396.  
  397.     private function recover_file($fileName) { 
  398.         $this->getFile($fileName); 
  399.         if (!emptyempty($this->content)) { 
  400.             $content = explode(';/* MySQLReback Separation */'$this->content); 
  401.             foreach ($content as $i => $sql) { 
  402.                 $sql = trim($sql); 
  403.                 if (!emptyempty($sql)) { 
  404.                     $mes = $this->model->execute($sql); 
  405.                     if (false === $mes) {                                       //如果 null 写入失败,换成 '' 
  406.                         $table_change = array('null' => '\'\''); 
  407.                         $sql = strtr($sql$table_change); 
  408.                         $mes = $this->model->execute($sql); 
  409.                     } 
  410.                     if (false === $mes) {                                       //如果遇到错误、记录错误 
  411.                         $log_text = '以下代码还原遇到问题:'
  412.                         $log_text.="\r\n $sql"
  413.                         set_log($log_text); 
  414.                     } //phpfensi.com 
  415.                 } 
  416.             } 
  417.         } else { 
  418.             $this->error('无法读取备份文件!'); 
  419.         } 
  420.         return true; 
  421.     } 
  422.  
  423. ?> 

Tags: PHP数据库备份 MySQL备份

分享到: