PHP 备份 MySQL数据库

时间:2021-07-30 22:18:07
  1 set_time_limit(0);
  2 
  3 
  4 // 库名
  5 $db = 'dbname';
  6 
  7 
  8 
  9 /********** 连接 MySQL 数据库 **********/
 10 
 11 $dsn = 'mysql:dbname='.$db.';host=127.0.0.1';
 12 
 13 $user = 'root';
 14 
 15 $password = 'root';
 16 
 17 
 18 try{
 19 
 20     $pdo = new PDO($dsn,$user,$password);
 21 
 22     $pdo->exec('SET NAMES UTF8');
 23 
 24     // 捕获异常
 25     $pdo->setAttribute(PDO::ATTR_ERRMODE,2);
 26 
 27 }catch(PDOException $e){
 28 
 29     echo 'Error: '.$e->getMessage();
 30 
 31 }
 32 
 33 // 查询多条数据
 34 function query($sql){
 35 
 36     global $pdo;
 37 
 38     $res = $pdo->prepare($sql);
 39     $res->execute();
 40     $data = $res->fetchAll(PDO::FETCH_ASSOC);
 41 
 42     return $data;
 43 
 44 }
 45 
 46 
 47 /********** 备份代码 **********/
 48 
 49 
 50 // 查询库下所有表名称
 51 $sql = sprintf('SHOW TABLES FROM %s',$db);
 52 $tablesData = query($sql);
 53 
 54 // 库中是否有表
 55 if(count($tablesData) < 1){
 56 
 57     exit($db.' 库中没有数据表');
 58 }
 59 
 60 // 备份存放路径
 61 $dirPath = 'backup';
 62 
 63 // 判断目录是否存在
 64 if(!file_exists($dirPath)){
 65 
 66     $res = mkdir($dirPath);
 67     if($res !== true){
 68 
 69         exit('目录创建失败1');
 70     }
 71 }
 72 
 73 // 当前日期
 74 $toDir = date("Ymd",time());
 75 
 76 // 当前日期的备份目录
 77 $toDir = $dirPath.'/'.$toDir;
 78 
 79 // 当前日期目录是否存在
 80 if(!file_exists($toDir)){
 81 
 82     // 创建以当前日期为名称的目录
 83     $res = mkdir($toDir);
 84     if($res !== true){
 85 
 86         exit('目录创建失败2');
 87     }
 88 }
 89 
 90 // 如果目录存在 生成备份的文件名
 91 if(file_exists($toDir)){
 92 
 93     $fileName = $toDir.'/'.date("Y-m-d_H-i-s",time()).'.sql';
 94 
 95 }else{
 96 
 97     exit('目录创建失败3');
 98 }
 99 
100 // 循环数据
101 foreach($tablesData as $key=>$val){
102 
103     // 表键名
104     $tableKey = 'Tables_in_'.$db;
105 
106     // 获取表结构
107     $sql = sprintf('SHOW CREATE TABLE %s',$val[$tableKey]);
108     $tableBody[$key] = query($sql);
109 
110     // 写sql文件到本地 ( 写入表名称 )
111     error_log("\n\n\n# ".$tableBody[$key][0]['Table'],3,$fileName);
112 
113     // 如果存在则先删除表
114     $delTab = 'DROP TABLE IF EXISTS `'.$tableBody[$key][0]['Table'].'`;';
115     error_log("\n\n".$delTab,3,$fileName);
116 
117     // 写入表结构  结尾多输出一个; ( 分号 sql的结束符 )
118     error_log("\n\n".$tableBody[$key][0]['Create Table'].";\n\n",3,$fileName);
119 
120     // 查询表数据
121     $sql = sprintf('SELECT * FROM %s',$val[$tableKey]);
122     $tableData = query($sql);
123 
124     // 循环表中每条数据
125     foreach($tableData as $k=>$v){
126 
127         $sqlHeadStr = 'INSERT INTO '.$val[$tableKey];
128         $keyStr = '';
129         $valStr = '';
130 
131         // 循环insert的键和值
132         foreach($v as $kk=>$vv){
133 
134             // 拼接键
135             $keyStr .= '`'.$kk.'`,';
136             // 拼接值
137             $valStr .= '\''.$vv.'\',';
138         }
139 
140         // 去除右侧多余逗号
141         $keyStr = trim($keyStr,",");
142         $valStr = trim($valStr,",");
143 
144         // 键值添加括号
145         $keyStr = '('.$keyStr.')';
146         $valStr = '('.$valStr.')';
147 
148         // 拼接完整sql
149         $sqlStr = $sqlHeadStr.$keyStr.'VALUES'.$valStr.';';
150 
151         // 写入 insert 语句到文件
152         error_log($sqlStr."\n",3,$fileName);
153     }
154 }
155 
156 echo 'ok';
157 exit;