PHP PDO - porównanie pliku sql i bazy -> import


(pawciak) #1

Cześć,

Mam pytanie - kilka razy w ciągu dnia muszę wykonać aktualizację bazy na serwerze online. Dzieje się to w następujący sposób:

baza offline -> wykonanie 4 plików SQL (każda tabela osobno; tak niestety to musi działać) -> wysyłka na FTP -> import do bazy online

drogę do ftp mam załatwioną. Walczę obecnie z importem. Obecny skrypt wygląda tak:

<?php
 
$mysql_host = 'localhost';
$mysql_username = '';
$mysql_password = '';
$mysql_database = '';
 
try
   {
     $db = new PDO('mysql:dbname='.$mysql_database.';host='.$mysql_host,$mysql_username,$mysql_password);
     $sql = implode(array_map(function ($v) {
        return file_get_contents($v);
        }, glob( __DIR__. "/*.sql")));
 
     $qr = $db->exec($sql); 
     echo "Import action - 100% successfull";
   }
   catch (PDOException $e) 
   {
     echo 'Connection failed: ' . $e->getMessage();
}
?>

Skrypt ładuje wszystkie pliki do bazy. Minus tego rozwiązania jest taki, że ile razy odświeżę ten skrypt, tyle razy wyniki zostaną załadowane z kolejnymi numerami ID (w pliku zapisane są wszystkie wiersze jako INSERT bez pola ID; pole ID jest wstawione w bazie online z ustawionym AI). Wszystko to generuje masę duplikatów. Wymyśliłem dwa rozwiązania, ale nie bardzo wiem, które jest bardziej optymalne?

  1. Nim wykonam powyższy skrypt, wykonam TRUNCATE wszystkich tabel do których ładuję dane. Czy to mocno obciąża serwer/bazę? odświeżenei danych odbywałoby się 5 razy w ciągu dnia (liczba łączna wierszy to na ten moment 3000)

  2. Przed wykonaniem ww skryptu, inny skrypt sprawdzi jaka jest najwyższa (ostatnia) wartość pola visit_id dla tabeli_a, pola customer_id dla tabeli_b, product_id dla tabeli_c oraz size_id dla tabeli_d. Nie wiem też jak to obciąża serwer/bazę.

Niestety z powodu ograniczonej wiedzy php'owej, nie mam pojęcia jak się do tego zabrać. Gotowego kodu nie oczekuję, ale miłoby było dostać chociaż wskazówkę w formie manula/docsa.


(Fizyda) #2

A nie prościej zrobić konfigurację master slave? i mieć replikację automatycznie?

 

EDIT:

Tutaj masz informacje jak zresetować licznik auto inkrementacji

http://stackoverflow.com/questions/8923114/how-to-reset-auto-increment-in-mysql


(pawciak) #3

dzieki:)