如何从远程服务器备份数据库表,并且把备份的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);
 
    }
	
	
}

  

posted on 2022-05-06 17:30  微凉六月长老抱怀里  阅读(83)  评论(1编辑  收藏  举报