sys_backup_db.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. /**
  3. * 数据库备份
  4. *
  5. * @createtime 2018/4/19
  6. * @author 空竹
  7. * @copyright 芝麻开发(http://www.zhimawork.com)
  8. */
  9. require_once('admin_init.php');
  10. require_once('admincheck.php');
  11. $POWERID = '9002';//权限
  12. Admin::checkAuth($POWERID, $ADMINAUTH);
  13. set_time_limit(600);
  14. //$content = "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\n";
  15. //$content .= "SET time_zone = \"+00:00\";\r\n\r\n\r\n";
  16. //$content .= "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r\n"
  17. //$content .= "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r\n"
  18. //$content .= "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r\n"
  19. //$content .= "/*!40101 SET NAMES utf8 */;\r\n";
  20. $content = "-- Server: ".gethostbyname($_SERVER['SERVER_NAME'])." \r\n";
  21. $content .= "-- Database: ".$DB_name." \r\n";
  22. $content .= "-- Backup Time: ".date('Y-m-d H:i:s')." \r\n";
  23. $content .= "-- Generated by: ZhimaPHP \r\n";
  24. $content .= "\r\n\r\n\r\n";
  25. $tables = array();
  26. $tables = $mypdo->sqlQuery('SHOW TABLES');
  27. foreach($tables as $val){
  28. $table = $val[0];//表名
  29. if(empty($table)){
  30. continue;
  31. }
  32. //表结构
  33. $content .= "-- 表结构 `$table` \r\n";
  34. $table_struct = $mypdo->sqlQuery('SHOW CREATE TABLE `'.$table.'`');
  35. //print_r($table_struct);
  36. $content .= "\r\n".$table_struct[0]['Create Table'].";\r\n\r\n";
  37. //表字段
  38. $COLUMNS = array();
  39. $rs = $mypdo->sqlQuery('SHOW COLUMNS FROM `'.$table.'`');
  40. foreach($rs as $k => $v){
  41. $COLUMNS[] = $v['Field'];
  42. }
  43. $COLUMNS_count = count($COLUMNS);
  44. $COLUMNS_str = implode(', ', $COLUMNS);
  45. //echo $str_COLUMNS;
  46. //TODO 创建索引
  47. //表数据
  48. $content .= "-- 表数据 `$table` \r\n";
  49. $p = 100; //定义每$p行用一个insert into
  50. $q = 0;
  51. $rs = $mypdo->sqlQuery('SELECT * FROM `'.$table.'`');
  52. $rs_count = count($rs);
  53. foreach($rs as $k => $v){
  54. $q ++;
  55. if($q % $p == 1){
  56. $content .= "\r\nINSERT INTO `".$table."`(".$COLUMNS_str.") VALUES";
  57. }
  58. $content .= "\r\n(";
  59. for($x = 0; $x < $COLUMNS_count; $x++){
  60. $v[$x] = str_replace("\n", "\\n", addslashes($v[$x]) );
  61. if (isset($v[$x])){
  62. $content .= "'".$v[$x]."'" ;
  63. }else{
  64. $content .= "''";
  65. }
  66. if($x < ($COLUMNS_count - 1)){
  67. $content .= ',';
  68. }
  69. }
  70. if($q % $p == 0 || $q == $rs_count){
  71. $content .= ");";
  72. }else{
  73. $content .= "),";
  74. }
  75. }
  76. $content .= "\r\n\r\n\r\n\r\n";
  77. }
  78. //$content .= "\r\n\r\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r\n";
  79. //$content .= "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r\n";
  80. //$content .= "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;";
  81. //记录管理员日志
  82. $msg = '备份数据库';
  83. Adminlog::add($msg);
  84. try{
  85. //更新备份日志时间
  86. $mylog->filelog('OK', $LOG_PATH.'backupdb.log', true);
  87. }catch(MyException $e){
  88. $e_msg = json_decode($e->jsonMsg());
  89. echo $e_msg->msg;
  90. exit();
  91. }
  92. //输出文件
  93. $backup_name = $DB_name."_".date('YmdHis')."_".rand(1000, 9999).".sql";
  94. ob_get_clean();
  95. header('Content-Type: application/octet-stream');
  96. header("Content-Transfer-Encoding: Binary");
  97. header("Content-disposition: attachment; filename=\"".$backup_name."\"");
  98. echo $content;
  99. exit;
  100. ?>