konto usunięte

Temat: Synchronizacja MsSQL z MySQL

Witam serdecznie,
chce napisać program do synchronizacji bazy danych MSSQL 2005 Express z MySQL poprzez aplikację napisaną w C#. Jak zrobić coś takiego najoptymalniej? Zrobić SELECT * z MSSQL i INSERTY do MySQL? Myślicie że sprawdzi się takie rozwiązanie?


Łukasz
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Synchronizacja MsSQL z MySQL

Myślę, że jeśli będziesz miał naprawdę dużo wierszy w tabeli to możesz mieć problemy z zasobami (RAM). Lepiej chyba wyeksportować tabelę do pliku tekstowego (delimited albo fixed fields), po tym pliku ewentualnie przejechać programikiem, żeby przerobić go na postać importowalną do drugiej bazy, i zaimportować.

Temat: Synchronizacja MsSQL z MySQL

Wydaje mi się, że najszybszym rozwiązaniem będzie tzw. "bulk insert" z pliku.

Jeśli MySQL oferuje coś takiego, to poczytaj o tym, a dodatkowo zainteresuj się narzędziem BCP dla SQL Servera. BCP zrzucisz dane do pliku o ustalonym formacie (CSV), a bulk insertem wrzucisz go szybko do MySQL.

W Google znajdziesz mnóstwo artykułów dotyczących tego zagadnienia, przykładowo:
About Bulk Import and Bulk Export Operations
Exporting Data Programatically with bcp and xp_cmdshell

Oczywiście wiele zależy od tego, czy to jest jedna tabela, czy wiele tabel, czy są powiązane kluczami (kolejność wstawiania, wartości kluczy).

EDIT: Piotr mnie ubiegł :)

EDIT: Okazuje się, że W MySQL jest opcja szybkiego importu z plików CSV: LOAD DATA INFILE SyntaxAdrian Olszewski edytował(a) ten post dnia 31.01.11 o godzinie 21:41
Dariusz Żukowski

Dariusz Żukowski [keczerad]
Programista z
zamiłowania.

Temat: Synchronizacja MsSQL z MySQL

Najlepszym rozwiazaniem jest program c# ktory pobiera sobie dane z MSSQL a eksprotuje do skryptów PHP (webservice/SOAP/wlasne sktypty) skrypty robią co trzeba w PHP zapisuja dane zwracaja informacje do c# za pomoca (webservice/SOAP) program interpretuje i coś robi w MSSQL. Inne opcje wymienione przez kolegów nie sprawdzą się bo przecież jeżeli chcemy wymienić dane nie zawsze możemy insertować trzeba updajtować dodatkowo przeważnie struktura danych jest nieco bardziej skomplikowana po dwoch stronach niż "INSERT BULK". Bezposrednie korzystanie z bilbioteki MySQL pod C# powoduje wiecje klopotów niż pożytku (było tak kiedyś, moze teraz się zmieniło), w dodatku ta bilioteka była kiedyś bardzo wolna.

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

z poziomu MSSQL-a linked serwer + triggery na tabele które mają być synchronizowane

ale to się sprawdza dla małych porcji danych np. kilka rekordów

duże zbiory danych

eksport za pomocą BCP to pliku txt, eksport np. FTP.exe (można oskryptować) na serwer na którym pracuje MySQL, a później odpalenie LOAD INFILE z poziomu MySQL np. EXEC ('LOAD INFILE ...... ') at MySQL - linked serwer musi mieć włączone RPC

kolejny krok to jakaś synchronizacja danych np. za pomocą INSERT INTO ..... ON DUPLICATE KEY UPDATE również z poziomu MySQL

ps. pętelki są mało wydajne, zaś C# jest średnio potrzebny do tego zadania
Dariusz Żukowski

Dariusz Żukowski [keczerad]
Programista z
zamiłowania.

Temat: Synchronizacja MsSQL z MySQL

Przemysław R.:
z poziomu MSSQL-a linked serwer + triggery na tabele które mają być synchronizowane

ale to się sprawdza dla małych porcji danych np. kilka rekordów

duże zbiory danych

eksport za pomocą BCP to pliku txt, eksport np. FTP.exe (można oskryptować) na serwer na którym pracuje MySQL, a później odpalenie LOAD INFILE z poziomu MySQL np. EXEC ('LOAD INFILE ...... ') at MySQL - linked serwer musi mieć włączone RPC

kolejny krok to jakaś synchronizacja danych np. za pomocą INSERT INTO ..... ON DUPLICATE KEY UPDATE również z poziomu MySQL

ps. pętelki są mało wydajne, zaś C# jest średnio potrzebny do tego zadania

Takie coś oczywiście się sprawdza jak baza MSSQL i baza MySQL jest naszego autorstwa jak obie bazy sa innych producentów to w/w założenia można wrzucić do kosza.

Temat: Synchronizacja MsSQL z MySQL

Panowie, na razie mamy zagadnienie bez uwzględnienia kontekstu. W ten sposób wszystkie rozwiązania mogą być poprawne bądź do bani.

Może autor powie dokładniej, czego oczekuje, czy to jest synchronizacja kilku prostych tabel i tylko inserty, czy pełny DML na złożonej strukturze, jakie to są ilości danych, jak często, czy to chodzi po sieci lokalnej, czy przez internet.

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

Adrian Olszewski:
Panowie, na razie mamy zagadnienie bez uwzględnienia kontekstu. W ten sposób wszystkie rozwiązania mogą być poprawne bądź do bani.

Może autor powie dokładniej, czego oczekuje, czy to jest synchronizacja kilku prostych tabel i tylko inserty, czy pełny DML na złożonej strukturze, jakie to są ilości danych, jak często, czy to chodzi po sieci lokalnej, czy przez internet.

Dokładnie tak, w zasadzie nic nie wiemy o tym co konkretnie chcesz zrobić.
Być może wystarczy po prostu SELECT na MSSQL i INSERT na MySQL - zależy co chcesz osiągnąć

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

Generalnie projekt ma wyglądać tak:
- mamy serwer dedykowany z PostgreSQL/MySQL (do wyboru) - sama baza
- mamy 14 aplikacji klienckich z bazami MSSQL wysyłających co 5 minut paczki danych do dedyka (ok 400 MB miesięcznie na 1 klienta).

Chciałbym właśnie zrobić programik który będzie co 5 minut zczytywał dane z klientów i wgrywał je na serwer....
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Synchronizacja MsSQL z MySQL

To tylko przez pliki.

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

zapomnialem wspomnieć, aktualizujemy tylko najnowsze dane za każdą wysyłką - nie wysyłamy całości...
Grzegorz L.

Grzegorz L. Bujam w Chmurach.
Obliczeniowych.

Temat: Synchronizacja MsSQL z MySQL

A po co wywazac otwarte drzwi?

w MS SQL masz gotowe rozwiazanie: transactional replication

Przygotowujesz artykuly i wysylasz na jaka baze chcesz: oracle, mysql, pgsql

http://msdn.microsoft.com/en-us/library/ms165720(SQL.9...

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

Grzegorz L.:
A po co wywazac otwarte drzwi?

w MS SQL masz gotowe rozwiazanie: transactional replication

Przygotowujesz artykuly i wysylasz na jaka baze chcesz: oracle, mysql, pgsql

http://msdn.microsoft.com/en-us/library/ms165720(SQL.9...

MSSQL 2005 Express

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

tylko w tym przypadku gdy lokalny MSDE/MSSQl 2005 Exp będzie mógł się automatycznie łączyć z MySQL i wgrywać tam dane?
Grzegorz L.

Grzegorz L. Bujam w Chmurach.
Obliczeniowych.

Temat: Synchronizacja MsSQL z MySQL

Przemysław R.:
Grzegorz L.:
A po co wywazac otwarte drzwi?

w MS SQL masz gotowe rozwiazanie: transactional replication

Przygotowujesz artykuly i wysylasz na jaka baze chcesz: oracle, mysql, pgsql

http://msdn.microsoft.com/en-us/library/ms165720(SQL.9...

MSSQL 2005 Express

no tak, mea culpa, nie doczytalem, a zalozylem ze taki projekt to jest przygotowany na pelnej wersji...

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

transactional replication - to nie przejdzie na Expressie ani na msde :( czyli połączenie i kopiowanie "online" - insertami nie przejdzie? te pliki pośredniczące będą lepszym rozwiązaniem?

Temat: Synchronizacja MsSQL z MySQL

Jak słusznie zauważył Dariusz, jeśli trzeba będzie updejtować dane, to nie.

Ale można spróbować zastosować pośrednie rozwiązanie, które jednak będzie trudniejsze w realizacji:

1. dla danych przeznaczonych wyłącznie do zaimportowania (INSERT) w MySQL obowiązuje "domyślna ścieżka" - rozwiązanie z plikami.

2. dla danych, które mają być zupdejtowane (bądź usunięte), obowiązuje osobna ścieżka - wygenerowanie odpowiednich komend SQL DML (UPDATE/DELETE ... WHERE ID=xx) i wykonanie ich po stronie MySQL.

Czy to rozwiązanie ma sens? No cóż, to znów zależy od tego, jaki jest procent update'ów do insertów (bo może się okazać, ze DMLa będzie znacznie więcej, BULK INSERTU) i jak złożona jest to struktura.

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

Adrian Olszewski:
Jak słusznie zauważył Dariusz, jeśli trzeba będzie updejtować dane, to nie.

Ale można spróbować zastosować pośrednie rozwiązanie, które jednak będzie trudniejsze w realizacji:

1. dla danych przeznaczonych wyłącznie do zaimportowania (INSERT) w MySQL obowiązuje "domyślna ścieżka" - rozwiązanie z plikami.

2. dla danych, które mają być zupdejtowane (bądź usunięte), obowiązuje osobna ścieżka - wygenerowanie odpowiednich komend SQL DML (UPDATE/DELETE ... WHERE ID=xx) i wykonanie ich po stronie MySQL.

Czy to rozwiązanie ma sens? No cóż, to znów zależy od tego, jaki jest procent update'ów do insertów (bo może się okazać, ze DMLa będzie znacznie więcej, BULK INSERTU) i jak złożona jest to struktura.

z doświadczenia wiem że lepiej zaimportować LOAD INFILE plik z danymi do tabeli tymczasowej i dalej rzeźbić SQL-em niż bawić się z generowaniem SQL-i - powodem jest tylko i wyłącznie szybkość operacji

Temat: Synchronizacja MsSQL z MySQL

Nie no, jasne, że szybsze, ale musisz wiedzieć, czy Kowalski to new(Kowalski) czy update(Nowak, Kowalski)... Stąd propozycja dwóch ścieżek - jedna tylko to importu danych (zawsze inserty), a druga dla wykonania zmian w istniejących danych.

konto usunięte

Temat: Synchronizacja MsSQL z MySQL

hmm wystarczy jedna operacja insert
MySQL ma taki fajny ficzer jakim jest on duplicate key
http://dev.mysql.com/doc/refman/5.0/en/insert-on-dupli...



Wyślij zaproszenie do