mysqldump with INSERT… ON DUPLICATE

21

Chcę scalić dane z jednej bazy danych do drugiej. Więc tworzę zrzut za pomocą, mysqldumpa następnie importuję go do innej bazy danych (o tej samej strukturze tabel). W tym przypadku nie mam żadnych problemów (takich jak zduplikowane wpisy lub coś innego).

Ale wykonuję kilka fuzji w celach testowych, a później dokonam ostatecznego scalenia. Chcę więc wykonać scalenie (dane mogą ulec zmianie) kilka razy. Zauważ, że moje wiersze w moich tabelach nigdy nie są usuwane, można je tylko wstawiać lub aktualizować.

Czy mogę utworzyć mysqldump z opcją ON DUPLICATE? A może mogę scalić zrzut, który wstawia nowe dane i aktualizuje zmodyfikowane dane?

Jasne, mogę wstawić ON DUPLICATEzrzut ręcznie, ale chcę zautomatyzować proces scalania.

Xupypr MV
źródło

Odpowiedzi:

34

Istnieją opcje, które mogą Ci w tym pomóc:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

Pamiętaj o tym paradygmacie

  • mysqldump wszystko od DB1 do DUMP1
  • załaduj DUMP1 do DB3
  • mysqldump wszystko z DB2 za pomocą --replace (lub --insert-ignore) i --no-create-info do DUMP2
  • załaduj DUMP2 do DB3
RolandoMySQLDBA
źródło
1
Poczekaj chwilę: użycie --replace oznacza, że ​​dane DB2 zastąpią dane DB1, a użycie --insert-ignore oznacza, że ​​dane DB1 mają pierwszeństwo. Pytanie wydaje się zadawać pytanie, jak wykonać AKTUALIZACJĘ w przypadku duplikatów kluczy. W każdym razie chciałbym wiedzieć.
Edward Newell,
@EdwardNewell Należy pamiętać, że --replacejest to równoważne z wykonywaniem ON DUPLICATE UPDATEkażdej kolumny. Niestety, mysqldump nie jest zaprojektowany do aktualizacji określonych kolumn z powodu masowego ładowania i zrzutu natury mysqldump. Moja odpowiedź po prostu pokazuje, co potrafi mysqldump. Musisz zrobić niestandardowy kod, oprócz mysqldump, aby to zrobić ON DUPLICATE UPDATE.
RolandoMySQLDBA
Dopóki DB1 i 2 mają dokładnie ten sam schemat, masz rację. Załóżmy jednak, że DB1 ma dodatkowe pola. Następnie --replace spowoduje, że dodatkowe pola powrócą do wartości domyślnych (lub błąd, jeśli nie ma wartości domyślnych) zamiast tylko aktualizować pola współdzielone. Zdaję sobie sprawę, sytuacja PO jest dla dwóch baz danych z tych samych schematów, ale po prostu wskazując, że jest różnica, i dobrze byłoby mieć prawdziwą zmiana typu wysypisko w niektórych przypadkach (mam skierowaną je teraz!)
Edward Newell,
1
Należy zauważyć, że jeśli istnieją obce klucze wskazujące na aktualizację rekordu, użycie REPLACE INTOmoże się nie powieść, ponieważ rekordu nie można usunąć za pomocą zerwania tych relacji. Jeśli tak ON DELETE CASCADE, opróżnisz te tabele, które zależą od aktualizowanej. REPLACE INTOjest dość niebezpieczną operacją.
Christopher Schultz
1
@RolandoMySQLDBA Zgoda. Chciałem tylko skomentować, aby każdy, kto przeczytał tę odpowiedź, zrozumiał, że te opcje (szczególnie REPLACE INTO) mogą być niebezpieczne i mieć „zaskakujące” efekty. Dobra odpowiedź - chciałem tylko dodać zastrzeżenie.
Christopher Schultz