mojaSymfonia FORUM
https://forum.mix-soft.pl/

[MSSQL] Synchronizacja SQL z MYSQL w czasie rzeczywistym
https://forum.mix-soft.pl/viewtopic.php?f=15&t=10660
Strona 1 z 1

Autor:  Zenek N [ 2025-03-10, 11:33 ]
Tytuł:  [MSSQL] Synchronizacja SQL z MYSQL w czasie rzeczywistym

Witam wykonywał ktoś synchronizację w czasie rzeczywistym między lokalnym serwerem sql a zdalnym mysql ? Która metoda najlepiej sprawdza się w przypadku symfoni ?
Będę próbował przez Linked Server tak podpowiada chatgpt

Autor:  rafal [ 2025-03-10, 11:39 ]
Tytuł:  Re: [MSSQL] Synchronizacja SQL z MYSQL w czasie rzeczywistym

My to robimy za pomocą Api po stronie MySQL i rApi po stronie MSSQL.
Śledzimy zmiany i wysyłamy do API żeby updatowały się w MySQL

Autor:  Zenek N [ 2025-04-17, 12:41 ]
Tytuł:  Re: [MSSQL] Synchronizacja SQL z MYSQL w czasie rzeczywistym

ok ogarnięte

dodałem change_tracking w sql potem prosty skrypt php który wykonuje zrzut do bazy zdalnej z strukturą 1:1 (create, update, delete)

Kod:
public function executeXt(): Response
    {
        // Połączenie do MSSQL (default)
        $mssql = \Cake\Datasource\ConnectionManager::get('symfonia');
       
        // Połączenie do MySQL (baza240)
        $mysql = \Cake\Datasource\ConnectionManager::get('zdalna');
       
        // Sprawdzamy wersję zmian w MSSQL dla tabeli Xt
        try {
            $result = $mssql->execute("SELECT CHANGE_TRACKING_CURRENT_VERSION() AS version")->fetch('assoc');
            $currentVersion = (int)($result['version'] ?? 0);
        } catch (\Exception $e) {
            return $this->response->withType('json')->withStringBody(json_encode([
                'status' => 'error',
                'message' => "Błąd podczas wykonywania zapytania: " . $e->getMessage()
            ]));
        }
       
        // Pobieramy zmienione rekordy z MSSQL (tabela Xt)
        try {
            $changedXt = $mssql->execute("
                SELECT CT.id
                FROM CHANGETABLE(CHANGES [HM].[Xt], ?) AS CT
            ", [0])->fetchAll('assoc');
        } catch (\Exception $e) {
            return $this->response->withType('json')->withStringBody(json_encode([
                'status' => 'error',
                'message' => "Błąd podczas pobierania zmienionych rekordów: " . $e->getMessage()
            ]));
        }
       
        if (empty($changedXt)) {
            return $this->response->withType('json')->withStringBody(json_encode([
                'status' => 'info',
                'message' => 'Brak zmian w tabeli Xt od ostatniej synchronizacji.'
            ]));
        }
       
        // Rozpoczynamy transakcję w MySQL
        $mysql->begin();
       
        try {
            // Synchronizacja zmienionych rekordów z MSSQL do MySQL
            foreach ($changedXt as $change) {
                $row = $mssql->execute("SELECT * FROM [HM].[Xt] WHERE id = ?", [$change['id']])->fetch('assoc');
               
                if ($row) {
                    // Używamy backticków dla kolumn, które mogą być zarezerwowanymi słowami
                    $columns = array_keys($row);
                    $placeholders = implode(', ', array_map(fn($col) => ":$col", $columns));
                    $columnList = implode(', ', array_map(fn($col) => "`$col`", $columns));  // Dodajemy backticky
   
                    $sql = "REPLACE INTO Xt ($columnList) VALUES ($placeholders)";
                    $mysql->execute($sql, $row);
                }
            }
   
            // Zatwierdzamy transakcję w MySQL
            $mysql->commit();
        } catch (\Exception $e) {
            // W razie błędu, wycofujemy transakcję
            $mysql->rollback();
           
            return $this->response->withType('json')->withStringBody(json_encode([
                'status' => 'error',
                'message' => "Błąd podczas synchronizacji: " . $e->getMessage()
            ]));
        }
       
        // Zapisujemy wersję synchronizacji
        try {
            file_put_contents(LOGS . 'xt_sync_version.txt', $currentVersion);
        } catch (\Exception $e) {
            return $this->response->withType('json')->withStringBody(json_encode([
                'status' => 'error',
                'message' => "Błąd podczas zapisywania wersji synchronizacji: " . $e->getMessage()
            ]));
        }
   
        return $this->response->withType('json')->withStringBody(json_encode([
            'status' => 'success',
            'message' => 'Synchronizacja tabeli Xt zakończona.',
            'currentVersion' => $currentVersion
        ]));
    }


Obrazek


i wszystko puszczone w CRON co 5 minut

Strona 1 z 1 Strefa czasowa UTC+1godz. [letni]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/