![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 113 Pomógł: 1 Dołączył: 13.05.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Witam, chcę wybrać z bazy MS SQL-a rekordy i wrzucić je do MySQL-a na którym stoi cały sklep internetowy. Problem w tym ze w jednej tabeli jest ponad 5 mln rekordów i tak się zastanawiam jak to najlepiej zrobić. Aktualizacja tej tabeli będzie następować raz na dzień w nocy wiec z czasem nie ma tu problemu.
Zrobiłem select z ms sql i od razu insert do mysql ale po chwili wyskoczył błąd ze php nie jest w stanie zadeklarować tak dużej ilości danych.
czy ktoś kiedyś dokonywał takich duzych operacji i może się podzielić widzą jak to najlepiej zrobić? Ten post edytował termin 11.07.2010, 10:49:31 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 420 Pomógł: 44 Dołączył: 22.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Najlepiej etapami na przykład pięć razy po milionie
-------------------- Sztuką jest widzieć to czego nie widać.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 2 Dołączył: 2.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Na pewno nie rób tego przez apache tylko z basha. Ja bym ograniczył zapytanie np do 10 000 i wywoływał w niewielkich odstępach czasu ( po prostu sleep i kolejna partia), nawet w nocy warto dać odsapnąć bazie na kilka chwil gdyby jakiś zabłąkany user chciał coś kupić.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 113 Pomógł: 1 Dołączył: 13.05.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
hmm, problem w tym ze MS SQL nie ma czegoś takiego jak LIMIT i nie wiem jak wybrać dane w partiach po 10.000 rekordów
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 2 Dołączył: 2.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Sorry, nie wiedziałem.
Znalazłem to tu: http://www.codeproject.com/kb/aspnet/PagingLarge.aspx |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 113 Pomógł: 1 Dołączył: 13.05.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
dzięki za te wskazówki. A tak przy okazji, zauważyłem że jeśli w pętli puści się zapytanie do MySQL-a INSERT INTO to on najpierw wykona petlę np. 100 INSERTÓW trzymając to w pamięci, a dopiero potem faktycznie dodaje to do MySQL. Co trzeba by zrobić aby np. dodawał to faktycznie do bazy po każdym przejściu pętli? robiłem COMMIT ale nic to nie daje.
Ten post edytował termin 11.07.2010, 11:43:10 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
najszybciej to zrobisz tak:
generujesz plik TXT za pomocą BCP bcp z lini poleceń BCP z poziomu TSQL-a następnie transportujesz taki plik FTP-em, to można np. zrobić za pomocą FTP.exe, lub czegokolwiek innego FTP z commandline następnie robisz z poziomu MySQL-a LOAD INFILE to jakiejś tabeli LOAD INFILE jak już coś takiego zrobisz to masz dane w MySQL-u i idzie już szybko dla przykładu: ładowanie pliku o wielkości 400 MB ~12 mln rekordów to około 30 s jeżeli zrobisz z tego ładny pliczek CMD i na końcu tego pliku odpalisz kod SQL odpowiedzialny za ładowanie danych to można to zupełnie zautomatyzować Ten post edytował prachwal 11.07.2010, 22:11:20 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 113 Pomógł: 1 Dołączył: 13.05.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
dzięki prachwal właśnie o to mi chodziło. Jestem w szoku szybkością działania tego BCP, 7mln rekordów zapisał do pliku w 35 sekund, plik miał 190MB a po spakowaniu 10MB wiec przez FTP-a poszło bardzo szybko.
Jedna rzecz mnie tylko zastanawia, jak zmienić kodowanie znaków, MS ma CP1250 a MySQL UTF-8. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
iconv -f CP1250 -t UTF-8 in.txt > out.txt
http://www.filewatcher.com/m/iconv-1.9.2.w...320616.0.0.html |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 09:02 |