如何使用php将mysql数据库从localhost复制到服务器?

fjnneemd  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(299)

我有一个php项目在我的本地机器(angular,php,mysql)上运行。同样的项目副本在网上运行。我的目标是每一个小时通过运行任何php脚本,使用Angular “set interval”函数同步(将本地db复制到服务器db)。我应该使用这个功能背后的想法是什么?或者我将如何做到这一点?任何建议都会对我有很大的帮助,提前谢谢。

42fyovps

42fyovps1#

您必须编写一个服务和一些代码来转储您的数据库(如果您希望每次都同步完整的数据库),请遵循以下答案
卸载sql之后,接下来您必须通过服务将文件上载到服务器。收到后,您可以再次加载数据 mysql -u username -p database_name < file.sql 但是我不建议这样做,尝试探索主从数据库的数据库方法,本地服务器的数据库是主服务器,远程服务器是从服务器。您的数据将自动同步。请参阅本教程

pn9klfpd

pn9klfpd2#

如果您的数据库表不会更改,那么您可以创建一个函数,从本地数据库中选择所有数据,并将该数据传递给联机函数,以使用新的或更新的记录更新联机数据库。
例如:
如果有一个名为users的表。从ajax中,您将选择所有本地数据并创建json对象,将数据传递给脚本函数。从这个json对象,您将把数据传递到在线php文件,并从中更新您的在线数据库。
注意:您必须小心地给出许多条件来检查数据是否丢失或重写。

mnemlml8

mnemlml83#

您可以实现接口来选择要在live中导入的表。使用下面的代码生成选定表的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;
}

现在实现一个表单在live服务器上上传这个zip文件。在这个表单的post操作中,添加代码以获取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的加载数据

fjaof16o

fjaof16o4#

您可以在本地计算机上运行cron作业,该作业使用mysqldump导出mysql数据,然后使用rsync和sshpass将其上载到服务器。

相关问题