1. 程式人生 > 其它 >如何從遠端伺服器備份資料庫表,並且把備份的sql檔案轉儲成資料表。

如何從遠端伺服器備份資料庫表,並且把備份的sql檔案轉儲成資料表。

<?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);
 
    }
	
	
}