突然想起以前laravel框架裏做的數據庫的備份和恢復,現在拿來和大家一起分享一下
首先先說下數據庫的備份吧
/**
* 數據庫備份
*/
public function backupsData()
{
$sql_filename='ftdm_'.date('YmdHis').'.'.'sql';
$to_file_name = 'database/'.$sql_filename;
$tables = DB::select('SHOW TABLES');
$object = json_decode( json_encode( $tables),true);
//print_r($object);die;
$names = array();
foreach($object as $k => $v){
$names[] = $v['Tables_in_cms'];
}
echo "運行中,請耐心等待...<br/>";
$info = "-- ----------------------------\r\n";
$info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n";
$info .= "-- 李凱\r\n";
$info .= "-- 備份\r\n";
$info .= "-- ----------------------------\r\n\r\n";
file_put_contents($to_file_name,$info,FILE_APPEND);
//將每個表的表結構導出到文件
foreach($names as $val) {
$sql = "show create table " . $val;
//$res = mysql_query($sql,$link);
$ress = DB::select($sql);
$res = json_decode(json_encode($ress), true);
//print_r($res);die;
// $row = mysql_fetch_array($res);
$info = "-- ----------------------------\r\n";
$info .= "-- Table structure for `" . $val . "`\r\n";
$info .= "-- ----------------------------\r\n";
$info .= "DROP TABLE IF EXISTS `" . $val . "`;\r\n";
$sqlStr = $info . $res[0]['Create Table'] . ";\r\n\r\n";
//追加到文件
file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
}
//將每個表的數據導出到文件
foreach($names as $val){
$sql = "select * from ".$val;
$ress = DB::select($sql);
$res = json_decode( json_encode( $ress),true);
//如果表中沒有數據,則繼續下一張表
if(count($res)<1) continue;
//
$info = "-- ----------------------------\r\n";
$info .= "-- Records for `".$val."`\r\n";
$info .= "-- ----------------------------\r\n";
file_put_contents($to_file_name,$info,FILE_APPEND);
//讀取數據
foreach($res as $z){
$sqlStr = "INSERT INTO `".$val."` VALUES (";
foreach($z as $zd){
$sqlStr .= "'".$zd."', ";
}
//去掉最後一個逗號和空格
$sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
$sqlStr .= ");\r\n";
file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
}
file_put_contents($to_file_name,"\r\n",FILE_APPEND);
}
//將備份信息入庫
$file_size = filesize('database/'.$sql_filename);
$times=date('Y-m-d H:i:s');
$re = DB::table('database_backups')->insert(
[
'file_name' => $sql_filename,
'file_size' => $file_size,
'backups_time' => $times,
]);
if($re){
echo "<script>alert('備份成功');location.href='showdatabase'</script>";
}
}
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showRecover(){
$re=DB::table('database_backups')->orderBy('sid', 'desc')->paginate(5);;
return view('Admin/database.recover',['re'=>$re]);
}
public function renewData(){
header('content-type:text/html;charset=utf-8');
$id=Request::input('id');
$results = DB::select('select * from database_backups where sid = :id', ['id' => $id]);
$filename=$results[0]->file_name;
$dbname="cms";
$mysql_file="database/".$filename; //指定要恢復的MySQL備份文件路徑,請自已修改此路徑
if (file_exists($mysql_file)) {
$sql_value="";
$cg=0;
$sb=0;
$sqls=file($mysql_file);
foreach($sqls as $sql)
{
$sql_value.=$sql;
}
// print_r($sql_value);die;
$a=explode(";\r\n", $sql_value); //根據";\r\n"條件對數據庫中分條執行
$total=count($a)-1;
DB::select("set names 'utf8'");
for ($i=0;$i<$total;$i++)
{
DB::select("set names 'utf8'");
//執行命令
if(DB::select($a[$i]))
{
$cg+=1;
}
else
{
$sb+=1;
$sb_command[$sb]=$a[$i];
}
}
echo "操作完畢,共處理 $total 條命令,成功 $sb 條,失敗 $cg 條--------";
echo "<a href='showdatabase'>點擊返回</a>";
//顯示錯誤信息
if ($sb>0)
{
echo "<hr><br><br>成功命令如下:<br>";
for ($ii=1;$ii<=$sb;$ii++)
{
echo "<p><b>第 ".$ii." 條命令(內容如下):</b><br>".$sb_command[$ii]."</p><br>";
}
} //-----------------------------------------------------------
}else{
echo "MySQL備份文件不存在,請檢查文件路徑是否正確!";
}
}