如何從遠端伺服器備份資料庫表,並且把備份的sql檔案轉儲成資料表。
阿新 • • 發佈:2022-05-06
<?php namespace app\api\controller; use think\Controller; use think\Db; use think\Log; class Databackup extends Controller { /*** * * 【步驟一】從線上備份資料表 * */ public function redrict(){ $doc_root=$_SERVER['DOCUMENT_ROOT']; $file_path_name=$doc_root.'/sqlbackup'; if(!file_exists($file_path_name)){ mkdir($file_path_name,0777); } //mysqldump.exe的絕對路徑,安裝mysql自帶的有,可以搜尋一下路徑 $mysqldump_url='/www/server/mysql/bin/mysqldump'; $host='';//資料庫所在的伺服器地址 $User='root';//資料庫使用者名稱 $Password='123321';//資料庫密碼 $databaseName='';//資料庫名 //【important】這裡把表分開來執行,一次性執行會報錯。 // $tables = 'eb_driverinfo,eb_drivingorder_ton,eb_mine_field,eb_china_code'; $tablesArray = explode(',',$tables); foreach ($tablesArray as $items){ $name = $items; $process=$mysqldump_url." -h".$host." -u".$User." -p".$Password." ".$databaseName." ".$name." >".$file_path_name."/".$name.'.sql'; $er=system($process); if($er!==false){ echo $name.':匯出成功<br/>'; }else{ echo $name.':匯出失敗<br/>'; } } } /*** * * 【步驟二】把匯出的sql檔案準成資料表 * * */ public function executeSqlfile(){ $tables = 'eb_driverinfo,eb_drivingorder_ton,eb_mine_field,eb_china_code'; // $tables = 'eb_business_mix,eb_fixed_order,eb_fixed_suborder,eb_car_plate,eb_orderinfo_ton'; $tablesArray = explode(',',$tables); foreach ($tablesArray as $items){ $name = $items; $_sql = file_get_contents('/www/wwwroot/ceshicn/sqlbackup/'.$name.'.sql'); //建立表格的語句 $createSql = self::cut('CREATE TABLE','DEFAULT CHARSET=utf8',$_sql); // dump($createSql); $createSql = 'CREATE TABLE '.$createSql.' DEFAULT CHARSET=utf8;'; $userids = Db::connect('db4')->execute($createSql); if($userids){ echo $name.':建立成功<br/>'; }else{ echo $name.':建立失敗<br/>'; } // exit; //寫入的語句 $start = substr($_sql,stripos($_sql,"INSERT INTO")); $result = substr($start,0,strrpos($start,");")); $result = $result.');'; $result = explode('INSERT INTO', $result); foreach ($result as $_value) { if($_value){ $sql = 'INSERT INTO '.$_value.';'; $userids = Db::connect('db4')->execute($sql); if($userids){ echo $name.':寫入成功<br/>'; }else{ echo $name.':寫入失敗<br/>'; } } } } } /*** * * 【步驟四】把這個環境的eb_driver_systemlabel錶轉儲成檔案 * * */ public function redrict2(){ $doc_root=$_SERVER['DOCUMENT_ROOT']; $file_path_name=$doc_root.'/sqlbackup'; if(!file_exists($file_path_name)){ mkdir($file_path_name,0777); } $mysqldump_url='/www/server/mysql/bin/mysqldump';//mysqldump.exe的絕對路徑,安裝mysql自帶的有,可以搜尋一下路徑 $host='localhost';//資料庫所在的伺服器地址 $User='';//資料庫使用者名稱 $Password='';//資料庫密碼 $databaseName='';//資料庫名 $tables = 'eb_driver_systemlabel'; $tablesArray = explode(',',$tables); foreach ($tablesArray as $items){ $name = $items; $process=$mysqldump_url." -h".$host." -u".$User." -p".$Password." ".$databaseName." ".$name." >".$file_path_name."/".$name.'.sql'; $er=system($process); if($er!==false){ echo $name.':匯出成功<br/>'; }else{ echo $name.':匯出失敗<br/>'; } self::executeSqlfileToData($name); } } /*** * * 【步驟五】把轉儲的sql檔案更新到線上資料庫 * * */ public static function executeSqlfileToData($tables){ $tablesArray = explode(',',$tables); foreach ($tablesArray as $items){ $name = $items; $_sql = file_get_contents('/www/wwwroot/ceshicn/sqlbackup/'.$name.'.sql'); //建立表格的語句 $createSql = self::cut('CREATE TABLE','DEFAULT CHARSET=utf8',$_sql); // dump($createSql); $createSql = 'CREATE TABLE '.$createSql.' DEFAULT CHARSET=utf8;'; $userids = Db::connect('www')->execute($createSql); if($userids){ echo $name.':建立成功<br/>'; }else{ echo $name.':建立失敗<br/>'; } // exit; //寫入的語句 $start = substr($_sql,stripos($_sql,"INSERT INTO")); $result = substr($start,0,strrpos($start,");")); $result = $result.');'; $result = explode('INSERT INTO', $result); foreach ($result as $_value) { if($_value){ $sql = 'INSERT INTO '.$_value.';'; $userids = Db::connect('www')->execute($sql); if($userids){ echo $name.':寫入成功<br/>'; }else{ echo $name.':寫入失敗<br/>'; } } } } } public static function cut($begin,$end,$str){ $b = mb_strpos($str,$begin) + mb_strlen($begin); $e = mb_strpos($str,$end) - $b; return mb_substr($str,$b,$e); } }