เฮ่อ ไม่รู้จะเอาสาระอะไรมาโพสท์ลงบล็อก ไหนๆก็กำลังทำอะไรเกี่ยวกับการแบ็คอับอยู่ก็เอามาโพสท์ซะเลยดีกว่า
การแบ็คอับที่ว่าก็คือ การอับฐานข้อมูล mysql เก็บไว้เพื่อป้องกันอุบัติเหตุไม่ว่าจากกรณีใดใดที่ทำให้ต้องเสียข้อมูลในฐานข้อมูลไป เพราะงั้นน่าจะมีการแบ็คอับฐานข้อมูลไว้ทุกวัน ซึ่งอาจจะแบ็คอับแล้ว zip เก็บไว้ที่โฮสท์หรืออาจจะส่งเมลล์ ถ้า gmail เราก็มีที่เก็บเยอะหน่อย แต่ไม่แน่ใจเหมือนกันว่า gmail จำกัดขนาด attachment file เท่าไหร่ แต่ช่างมันก่อน วันนี้จะยังไม่ครอบคุลมไปถึงการส่งเมลล์ แต่จะทำแค่เก็บ zip ไฟล์ไว้ในโฮสท์ก่อน (เมื่อมันเริ่มเยอะแล้วค่อยดาว์นโหลดมาไรท์แผ่นเก็บไว้สำรองข้อมูลก็ได้)
โค้ด ไฟล์ db_backup.php สั่งรันวันละครั้งก็พอ ไฟล์ backup จะถูกเก็บไว้ที่โฟลเดอร์เดียวกับ db_backup.php ถ้าจะเปลี่ยนที่เก็บเด๋วจะบอกวิธี
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
<?php /*=====================================================================================*/ /* SCRIPT CONFIGURATION */ /*=====================================================================================*/ $mysql['host'] = 'localhost'; // ussually localhost $mysql['user'] = ''; // mysql username $mysql['pass'] = ''; // mysql password $mysql['name'] = ''; // mysql database name $mysql['charset'] = 'utf8'; // connection charset $file = date('Y-m-d').'-db_backup.zip'; // will produce file like 2009-05-19-db_backup.zip /*=====================================================================================*/ /* DONOT EDIT BEYOND THIS LINE */ /*=====================================================================================*/ // show all error error_reporting(E_ALL); // you may need this //ini_set('max_execution_time',0); //ini_set('memory_limit','100M'); // file name of sql file , will be deleted when backup finished $sql_file = 'db_backup.sql'; // try to create file if ( ! $fp = @fopen($sql_file,'w')) { die('Cannot create file db_backup.sql please check file permission'); } // connect to mysql $mysql_link = mysql_connect($mysql['host'],$mysql['user'],$mysql['pass']) or die(mysql_error()); mysql_select_db($mysql['name'],$mysql_link) or die(mysql_error($mysql_link)); mysql_query("SET NAMES {$mysql['charset']}",$mysql_link); // close mysql on exit register_shutdown_function(create_function('$link','if (is_resource($link)) mysql_close($link);'),$mysql_link); // list all tables $tables = array(); $result = mysql_query("SHOW TABLES FROM `{$mysql['name']}`",$mysql_link); while (($row = mysql_fetch_array($result,MYSQL_NUM)) !== FALSE) { $tables[] = $row[0]; } mysql_free_result($result); // check if have no table if (count($tables) === 0) { die('No tables in database'); } function format_insert_value($value) { global $mysql_link; return ($value === '') ? "''" : "'".mysql_real_escape_string($value,$mysql_link)."'" ; } // export each table foreach ($tables as $table) { $result = mysql_query("SHOW CREATE TABLE `{$table}`",$mysql_link); $row = mysql_fetch_array($result,MYSQL_NUM); mysql_free_result($result); if ( ! $row) { echo 'Cannot create table structure for table "'.$table.'"'; continue; } $structure = "DROP TABLE IF EXISTS `{$table}`;\n\n"; $structure .= $row[1].";\n\n"; // write sql table structure to file fwrite($fp,$structure); // get data from table $result = mysql_query("SELECT * FROM `{$table}`",$mysql_link); while (($row = mysql_fetch_assoc($result)) !== FALSE) { $row = array_map('format_insert_value',$row); $sql = "INSERT INTO `{$table}` VALUES (".implode(',',$row).");\n"; fwrite($fp,$sql); } mysql_free_result($result); } fclose($fp); // zipfile require_once 'dZip.inc.php'; // change this if you put dZip.inc.php on other place $zip = new dZip($file); $zip->addFile($sql_file,$sql_file); $zip->save(); @unlink($sql_file); die("Database backup finished"); |
ให้ใส่ข้อมูลในส่วนของ SCRIPT CONFIGURATION ดูตรง charset ดีดีด้วยนะคับ เด๋ว backup ไว้แต่เป็นต่างดาวเด๋วจะเสียเปล่าเอา หากต้องการเซฟไฟล์ backup ไว้ที่อื่นให้แก้ที่ $file นะคับ เช่นอาจจะสร้างโฟลเดอร์ไว้ชื่อว่า backup เราก็แก้
1 2 3 |
// จะได้ประมาณนี้ backup/2009-05-19-db_backup.zip $file = 'backup/'.date('Y-m-d').'-db_backup.zip'; |
อาจจะเพิ่มโดเมนเข้าไปในชื่อไฟล์ก็ได้ เผื่อต้องการแยกว่าแบ็คอับไว้มาจากโดเมนไหน
เกือบลืม สคริปท์ข้างบนใช้ dzip class ในการ zip ไฟล์ ดาว์นโหลดได้ตามลิ้งค์ดาว์นโหลดลงมาแล้วเอาไฟล์ dZip.inc.php ไว้ที่เดียวกับไฟล์ db_backup.php หรือเอาไว้ที่อื่นก็เปลี่ยนที่อยู่ที่บรรทัด 104 ด้วยคับ
ไว้โอกาสหน้าอาจจะเพิ่มเติม ทางเลือกในการจัดเก็บอย่างเช่นที่บอกไปแล้วคือส่งเข้า mail หรืออาจจะ ftp ถ้าใครมีพื้นที่รองรับมากพอแต่อยู่ที่โฮสท์อื่น แล้วก็แบ็คอับดาต้าเบสไปแล้ว อาจจะมีภาคต่อเป็นแบ็คอับไฟล์บนเว็บด้วย แล้วแต่โอกาสจะอำนวย
ก๊ากกกๆๆๆ นี่แหละ โฉมหน้าผมแหละ