簡體   English   中英

如何使用php將mysql DB從本地主機復制到服務器?

[英]how to copy mysql DB from localhost to server using php?

我有一個在本地計算機上運行的php項目(angular,php,mysql)。在線運行的項目的相同副本。 我的目標是每隔一小時通過使用角度“設置間隔”功能運行任何PHP腳本來同步(將本地數據庫復制到服務器數據庫)。 我應該使用此功能背后的IDEA是什么? 或者我將如何實現這一目標? 任何建議對我都會有很大的幫助,在此先謝謝您。

如果您的數據庫表不會改變,您可以做的是創建一個函數,從本地數據庫中選擇所有數據,然后將該數據傳遞給聯機功能,以使用新記錄或更新記錄來更新聯機數據庫。

例如:

如果您有一個稱為用戶的表。 從AJAX中,您將選擇所有本地數據並創建JSON對象,將數據傳遞給腳本函數。 從該JSON對象,您將把數據傳遞到在線php文件並從中更新您的在線數據庫。

注意:您必須謹慎處理大量條件,以檢查數據是否丟失或覆蓋。

您必須編寫服務和一些代碼來轉儲數據庫(如果您想每次都同步完整的數據庫),請遵循以下答案

在轉儲sql之后,您必須通過該服務將文件上傳到服務器。 收到后,您可以再次加載數據mysql -u username -p database_name < file.sql

但是,我不建議這樣做,請嘗試探索Master-Slave數據庫的數據庫方法,其中本地服務器的數據庫將為主服務器,而遠程服務器為從屬服務器。 您的數據將自動同步。請參閱本教程

您可以實現接口以選擇要實時導入的表。 使用以下代碼生成所選表的CSV文件並准備數組。

<?php
$file_name_flat = 'TABLE-NAME.csv';  // Replace TABLE-NAME with your selected table name.

$fpointer = fopen(FOLDER-LOCATION.$file_name_flat, 'w+');  // Open CSV file. Replace 
FOLDER-LOCATION with your local folder path where you want to save this CSV files.

//Execute query to get all columns data
$query = "select * FROM TABLE-NAME WHERE 1";  // Replace TABLE-NAME with your selected 
table name. You can set other conditions based on your requirement.

//Execute query as per your CMS / Framework coding standards and write CSV file.
$result_flat = $DB_Connection->query($query)->fetchAll('assoc');
foreach ($result_flat as $fields) {          
  fputcsv($fpointer, $fields);
}

//Prepare Array of CSVs to create ZIP file
$files = array($file_name_flat);

fclose($fpointer); // close CSV file after successfully write.
?>

創建CSV的ZIP

//Create ZIP
$zipname = 'tables_'.date('Y-m-d-H-i-s').'.zip';
createZipFile($files,$zipname,FOLDER_LOCATION);  //Replace FOLDER-LOCATION with your 
local folder path where you saved CSV files. 

/* createZipFile Funcation to create zip file Both params are mandatory */
function createZipFile($files_names = array(),$zipfileName, $files_path=""){

    $zip = new \ZipArchive;
    $zip->open(TMP.$zipfileName, \ZipArchive::CREATE);
    foreach ($files_names as $file) {
        $zip->addFile($files_path.$file,$file);
    }
    $zip->close();

    foreach ($files_names as $file) {
        unlink($files_path.$file);
    }

    ///Then download the zipped file.
    header('Content-Type: application/zip');
    header('Content-disposition: attachment; filename='.$zipfileName);
    header('Content-Length: ' . filesize(FOLDER_LOCATION.$zipfileName));
    readfile(TMP.$zipfileName);
    unlink(TMP.$zipfileName);
    die;
}

現在,實現一個表單以將該zip文件上傳到實時服務器上。 在此表單的發布操作中,添加代碼以獲取zip文件。

$filename = $_FILES['filename']['name'];
$source = $_FILES["filename"]["tmp_name"];

//Upload zip file to server location. Replace SERVER_FOLDER_PATH to server's location 
where you want to save uploaded zip.
if(move_uploaded_file($source, SERVER_FOLDER_PATH)) {

   //Extract ZIP file

    $zip = new \ZipArchive();
    $x = $zip->open($target_path);
    if($x === true) {
       $zip->extractTo(PATH_TO_SAVE_EXTRACTED_ZIP); // change this to the correct site path                    
       $zip->close();

       $cdir = scandir(PATH_TO_SAVE_EXTRACTED_ZIP);  // Read DIR

       $fieldSeparator = ",";
       $lineSeparator = '\n';

       foreach ($cdir as $key => $value)
       {                
          if (!in_array($value,array(".","..")))
          {
             $fileName =  PATH_TO_SAVE_EXTRACTED_ZIP.$value; // replace 
PATH_TO_SAVE_EXTRACTED_ZIP with your server path
             $tableName = SET_TABLE_NAME;  // You have to set the logic to get the table name.

             if (is_file($fileName))  
             {
                 // User MYSQL "LOAD DATA LOCAL INFILE" to IMPORT CSVs into particular tables. There are option available for this LOAD DATA process. It will import your CSV to particular table. No need to execute loop to insert data one by one.

                 $q = 'LOAD DATA LOCAL INFILE "'.$fileName.'"  REPLACE INTO TABLE '.$tableName.' FIELDS TERMINATED BY "' .$fieldSeparator. '" Enclosed BY '.'\'"\''.' LINES TERMINATED BY "'.$lineSeparator.'"';
                 $DB_Connection->query($q);  
         }
      } 
   }
}  

您可以從-MYSQL檢查MySQL的LOAD DATA

您可以在本地計算機上運行cron作業,該作業使用mysqldump導出MySQL數據,然后使用rsync和sshpass將其上傳到服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM