ignore_user_abort();//關(guān)掉瀏覽器,PHP腳本也可以繼續(xù)執(zhí)行.set_time_limit(0);// 通過(guò)set_time_limit(0)可以讓程序無(wú)限制的執(zhí)行下去$interval=60*30;// 每隔半小時(shí)運(yùn)行do{//這里是你要執(zhí)行的代碼 添加備份php或者還原的php的腳本,sleep($interval);// 等待5分鐘}while(true);一、備份數(shù)據(jù)庫(kù)
ignore_user_abort();//關(guān)掉瀏覽器,PHP腳本也可以繼續(xù)執(zhí)行.
set_time_limit(0);// 通過(guò)set_time_limit(0)可以讓程序無(wú)限制的執(zhí)行下去
$interval=60*30;// 每隔半小時(shí)運(yùn)行
do{
//這里是你要執(zhí)行的代碼 添加備份php或者還原的php的腳本,
sleep($interval);// 等待5分鐘
}while(true);
一、備份數(shù)據(jù)庫(kù)并下載到本地【db_backup.php】
Php代碼
<?php // 設(shè)置SQL文件保存文件名 $filename=date("Y-m-d_H-i-s")."-".$cfg_dbname.".sql"; // 所保存的文件名 header("Content-disposition:filename=".$filename); header("Content-type:application/octetstream"); header("Pragma:no-cache"); header("Expires:0"); // 獲取當(dāng)前頁(yè)面文件路徑,SQL文件就導(dǎo)出到此文件夾內(nèi) $tmpFile = (dirname(__FILE__))."\\".$filename; // 用MySQLDump命令導(dǎo)出數(shù)據(jù)庫(kù) exec("mysqldump -u$cfg_dbuser -p$cfg_dbpwd --default-character-set=utf8 $cfg_dbname > ".$tmpFile); $file = fopen($tmpFile, "r"); // 打開文件 echo fread($file,filesize($tmpFile)); fclose($file); exit; ?>
二、還原數(shù)據(jù)庫(kù)【db_restore.php】
Php代碼
<form id="form1" name="form1" method="post" action=""> 【數(shù)據(jù)庫(kù)SQL文件】:<input id="sqlFile" name="sqlFile" type="file" /> <input id="submit" name="submit" type="submit" value="還原" /> </form> <?php // 我的數(shù)據(jù)庫(kù)信息都存放到config.php文件中,所以加載此文件,如果你的不是存放到該文件中,注釋此行即可; require_once((dirname(__FILE__).'/../../include/config.php')); if ( isset ( $_POST['sqlFile'] ) ) { $file_name = $_POST['sqlFile']; //要導(dǎo)入的SQL文件名 $dbhost = $cfg_dbhost; //數(shù)據(jù)庫(kù)主機(jī)名 $dbuser = $cfg_dbuser; //數(shù)據(jù)庫(kù)用戶名 $dbpass = $cfg_dbpwd; //數(shù)據(jù)庫(kù)密碼 $dbname = $cfg_dbname; //數(shù)據(jù)庫(kù)名 set_time_limit(0); //設(shè)置超時(shí)時(shí)間為0,表示一直執(zhí)行。當(dāng)php在safe mode模式下無(wú)效,此時(shí)可能會(huì)導(dǎo)致導(dǎo)入超時(shí),此時(shí)需要分段導(dǎo)入 $fp = @fopen($file_name, "r") or die("不能打開SQL文件 $file_name");//打開文件 mysql_connect($dbhost,<mark>6來(lái)源gaodaimacom搞#^代%!碼網(wǎng)</mark><strong>搞gaodaima代碼</strong> $dbuser, $dbpass) or die("不能連接數(shù)據(jù)庫(kù) $dbhost");//連接數(shù)據(jù)庫(kù) mysql_select_db($dbname) or die ("不能打開數(shù)據(jù)庫(kù) $dbname");//打開數(shù)據(jù)庫(kù) echo "<p>正在清空數(shù)據(jù)庫(kù),請(qǐng)稍等....<br>"; $result = mysql_query("SHOW tables"); while ($currow=mysql_fetch_array($result)) { mysql_query("drop TABLE IF EXISTS $currow[0]"); echo "清空數(shù)據(jù)表【".$currow[0]."】成功!<br>"; } echo "<br>恭喜你清理MYSQL成功<br>"; echo "正在執(zhí)行導(dǎo)入數(shù)據(jù)庫(kù)操作<br>"; // 導(dǎo)入數(shù)據(jù)庫(kù)的MySQL命令 exec("mysql -u$cfg_dbuser -p$cfg_dbpwd $cfg_dbname < ".$file_name); echo "<br>導(dǎo)入完成!"; mysql_close(); } ?>
網(wǎng)上摘抄2:
前段時(shí)間主機(jī)提供商服務(wù)器發(fā)生了問(wèn)題,讓人郁悶的事是將數(shù)據(jù)恢復(fù)到了一星期以前,導(dǎo)致好些博客數(shù)據(jù)丟失。
痛定思痛,想出了一個(gè)自動(dòng)備份網(wǎng)站數(shù)據(jù)的方法。
1. 在服務(wù)器上實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)成SQL
為了實(shí)現(xiàn)服務(wù)器上的數(shù)據(jù)轉(zhuǎn)成SQL腳本,需要在服務(wù)器上放一個(gè)PHP文件,這個(gè)PHP文件的目的是連接到數(shù)據(jù)庫(kù),然后將數(shù)據(jù)讀取出來(lái),最后再轉(zhuǎn)成SQL。例如,我們放一個(gè)tosql.php文件在服務(wù)器htdocs目錄,內(nèi)容如下:
<?phperror_reporting(E_ALL & ~E_NOTICE);include_once 'application/configs/dbconfig.php';include_once 'application/includes/db.class.php';header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s') . ' GMT');header('Cache-Control: no-store, no-cache, must-revalidate');header('Cache-Control: post-check=0, pre-check=0', false);header('Pragma: no-cache');header("Content-type: text/plain; charset=utf-8");$db = new db();$db->connect($config['db']['host'], $config['db']['user'], $config['db']['pass']);$db->select_db($config['db']['name']);$db->query('set names utf8');$sqldump = '';// 我的表名都以tbs_開頭$sql = "SHOW TABLE STATUS WHERE name like 'tbs_%'";$query = $db->query($sql);while($table = $db->fetch_array($query)) { $sqldump .= sql_dumptable($table['Name']);}echo $sqldump; function sql_dumptable($table) { global $db; $tabledump = "DROP TABLE IF EXISTS $table;\n"; $createtable = $db->query("SHOW CREATE TABLE $table"); $create = $db->fetch_array($createtable); $tabledump .= $create[1].";\n\n"; $rows = $db->query("SELECT * FROM $table"); $numfields = $db->num_fields($rows); $numrows = $db->num_rows($rows); while ($row = $db->fetch_array($rows)) { $comma = ""; $tabledump .= "INSERT INTO $table VALUES("; for($i = 0; $i < $numfields; $i++){ $tabledump .= $comma."'".mysql_escape_string($row[$i])."'"; $comma = ","; } $tabledump .= ");\n"; } $tabledump .= "\n"; return $tabledump;}
2. 在本地新增一個(gè)PHP文件,目的是從服務(wù)器上獲取SQL基本,然后寫入到本地文件。這個(gè)PHP文件取名為nextdata.php,內(nèi)容如下:
<?php$filename = dirname(__FILE__) . '/data/tbs_' . date('YmdHis', mktime() + 3600 * 8) . '.sql';$sqldump = file_get_contents('http://www.nextphp.com/tosql.php');file_put_contents($filename, $sqldump);
3. 實(shí)現(xiàn)定時(shí)備份
本地使用的是Windows操作系統(tǒng),可以使用計(jì)劃任務(wù)定時(shí)的執(zhí)行備份任務(wù),這樣需要一個(gè)批處理文件。批處理文件名稱為nextdata.bat,內(nèi)如如下:
D:\wamp\bin\php\php5.3.5\php nextdata.php
經(jīng)過(guò)上述三個(gè)步驟后,我們的計(jì)劃任務(wù)就會(huì)定時(shí)的執(zhí)行服務(wù)器上的tosql.php文件,然后將其內(nèi)容寫入到本地,從而實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的備份任務(wù)。