当前位置:Gxlcms > PHP教程 > php备份整个MySQL数据库,或者指定表

php备份整个MySQL数据库,或者指定表

时间:2021-07-01 10:21:17 帮助过:5人阅读

php类实现完整备份数据库,或者备份数据库中指定表的功能:

  1. class Backup
  2. {
  3. /**
  4. * @var stores the options
  5. */
  6. var $config;
  7. /**
  8. * @var stores the final sql dump
  9. */
  10. var $dump;
  11. /**
  12. * @var stores the table structure + inserts for every table
  13. */
  14. var $struktur = array();
  15. /**
  16. * @var zip file name
  17. */
  18. var $datei;
  19. /**
  20. * this function is the constructor and phrase the options
  21. * and connect to the database
  22. * @return
  23. */
  24. public function Backup($options)
  25. {
  26. // write options
  27. foreach($options AS $name => $value)
  28. {
  29. $this->config[$name] = $value;
  30. }
  31. // check mysql connection
  32. mysql_connect($this->config['mysql'][0], $this->config['mysql'][1], $this->config['mysql'][2]) or die(mysql_error());
  33. mysql_select_db($this->config['mysql'][3]) or die(mysql_error());
  34. }
  35. /**
  36. * this function start the backup progress its the core function
  37. * @return
  38. */
  39. public function backupDB()
  40. {
  41. // start backup
  42. if(isset($_POST['backup']))
  43. {
  44. // check if tables are selected
  45. if(empty($_POST['table']))
  46. {
  47. die("Please select a table.");
  48. }
  49. /** start backup **/
  50. $tables = array();
  51. $insert = array();
  52. $sql_statement = '';
  53. // lock tables
  54. foreach($_POST['table'] AS $table)
  55. {
  56. mysql_query("LOCK TABLE $table WRITE");
  57. // Read table structure
  58. $res = mysql_query('SHOW CREATE TABLE '.$table.'');
  59. $createtable = mysql_result($res, 0, 1);
  60. $str = "\n\n".$createtable."\n\n";
  61. array_push($tables, $str);
  62. // Read table "inserts"
  63. $sql = 'SELECT * FROM '.$table;
  64. $query = mysql_query($sql) or die(mysql_error());
  65. $feld_anzahl = mysql_num_fields($query);
  66. $sql_statement = '--
  67. -- Data Table `$table`
  68. --
  69. ';
  70. // start reading progress
  71. while($ds = mysql_fetch_object($query)){
  72. $sql_statement .= 'INSERT INTO `'.$table.'` (';
  73. for ($i = 0;$i <$feld_anzahl;$i++){
  74. if ($i ==$feld_anzahl-1){
  75. $sql_statement .= mysql_field_name($query,$i);
  76. } else {
  77. $sql_statement .= mysql_field_name($query,$i).', ';
  78. }
  79. }
  80. $sql_statement .= ') VALUES (';
  81. for ($i = 0;$i <$feld_anzahl;$i++){
  82. $name = mysql_field_name($query,$i);
  83. if (empty($ds->$name)){
  84. $ds->$name = 'NULL';
  85. }
  86. if ($i ==$feld_anzahl-1){
  87. $sql_statement .= '"'.$ds->$name.'"';
  88. } else {
  89. $sql_statement .= '"'.$ds->$name.'", ';
  90. }
  91. }
  92. $sql_statement .= ");\n";
  93. }
  94. // insert "Inserts" into an array if not exists
  95. if(!in_array($sql_statement, $insert))
  96. {
  97. array_push($insert, $sql_statement);
  98. unset($sql_statement);
  99. }
  100. unset($sql_statement);
  101. }
  102. // put table structure and inserts together in one var
  103. $this->struktur = array_combine($tables, $insert);
  104. // create full dump
  105. $this->createDUMP($this->struktur);
  106. // create zip file
  107. $this->createZIP();
  108. /** end backup **/
  109. // send an email with the sql dump
  110. if(isset($this->config['email']) && !empty($this->config['email']))
  111. {
  112. $this->sendEmail();
  113. }
  114. // output
  115. echo '

    Backup war erfolgreich

    datei.'">Download Backup


  116. ';
  117. }
  118. }
  119. /**
  120. * this function generate an email with attachment
  121. * @return
  122. */
  123. protected function sendEmail()
  124. {
  125. // start sending emails
  126. foreach($this->config['email'] AS $email)
  127. {
  128. $to = $email;
  129. $from = $this->config['email'][0];
  130. $message_body = "This email contains the database backup as a zip file.";
  131. $msep = strtoupper (md5 (uniqid (time ())));
  132. // set email header (only text)
  133. $header =
  134. "From: $from\r\n" .
  135. "MIME-Version: 1.0\r\n" .
  136. "Content-Type: multipart/mixed; boundary="$msep"\r\n\r\n" .
  137. "--$msep\r\n" .
  138. "Content-Type: text/plain\r\n" .
  139. "Content-Transfer-Encoding: 8bit\r\n\r\n" .
  140. $message_body . "\r\n";
  141. // file name
  142. $dateiname = $this->datei;
  143. // get filesize of zip file
  144. $dateigroesse = filesize ($dateiname);
  145. // open file to read
  146. $f = fopen ($dateiname, "r");
  147. // save content
  148. $attached_file = fread ($f, $dateigroesse);
  149. // close file
  150. fclose ($f);
  151. // create attachment
  152. $attachment = chunk_split (base64_encode ($attached_file));
  153. // set attachment header
  154. $header .=
  155. "--" . $msep . "\r\n" .
  156. "Content-Type: application/zip; name='Backup'\r\n" .
  157. "Content-Transfer-Encoding: base64\r\n" .
  158. "Content-Disposition: attachment; filename='Backup.zip'\r\n" .
  159. "Content-Description: Mysql Datenbank Backup im Anhang\r\n\r\n" .
  160. $attachment . "\r\n";
  161. // mark end of attachment
  162. $header .= "--$msep--";
  163. // eMail Subject
  164. $subject = "Database Backup";
  165. // send email to emails^^
  166. if(mail($to, $subject, '', $header) == FALSE)
  167. {
  168. die("The email could not be sent. Please check the email address.");
  169. }
  170. echo "

    Email was successfully sent.

    ";
  171. }
  172. }
  173. /**
  174. * this function create the zip file with the database dump and save it on the ftp server
  175. * @return
  176. */
  177. protected function createZIP()
  178. {
  179. // Set permissions to 777
  180. chmod($this->config['folder'], 0777);
  181. // create zip file
  182. $zip = new ZipArchive();
  183. // Create file name
  184. $this->datei = $this->config['folder'].$this->config['mysql'][3]."_".date("j_F_Y_g:i_a").".zip";
  185. // Checking if file could be created
  186. if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {
  187. exit("cannot open <".$this->datei.">\n");
  188. }
  189. // add mysql dump to zip file
  190. $zip->addFromString("dump.sql", $this->dump);
  191. // close file
  192. $zip->close();
  193. // Check whether file has been created
  194. if(!file_exists($this->datei))
  195. {
  196. die("The ZIP file could not be created.");
  197. }
  198. echo "

    The zip was created.

    ";
  199. }
  200. /**
  201. * this function create the full sql dump
  202. * @param object $dump
  203. * @return
  204. */
  205. protected function createDUMP($dump)
  206. {
  207. $date = date("F j, Y, g:i a");
  208. $header = <<-- SQL Dump
  209. --
  210. -- Host: {$_SERVER['HTTP_HOST']}
  211. -- Erstellungszeit: {$date}
  212. --
  213. -- Datenbank: `{$this->config['mysql'][3]}`
  214. --
  215. -- --------------------------------------------------------
  216. HEADER;
  217. foreach($dump AS $name => $value)
  218. {
  219. $sql .= $name.$value;
  220. }
  221. $this->dump = $header.$sql;
  222. }
  223. /**
  224. * this function displays the output form to select tables
  225. * @return
  226. */
  227. public function outputForm()
  228. {
  229. // select all tables from database
  230. $result = mysql_list_tables($this->config['mysql'][3]);
  231. $buffer = '
  232. Select some tables
  233. ';
  234. echo $buffer;
  235. }
  236. }
  237. ?>

备份用法:
  1. //You can add as many email addresses as you like
  2. $options = array('email' => array('email1', 'email2'),
  3. 'folder' => './backup/',
  4. 'mysql' => array('localhost', 'root', '****', 'database'));
  5. $b = new Backup($options);
  6. // if submit form start backup
  7. if(isset($_POST['backup']))
  8. {
  9. // start backup
  10. $b->backupDB();
  11. }
  12. // display tables
  13. $b->outputForm();
  14. ?>

php, MySQL

人气教程排行