![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 50 Pomógł: 1 Dołączył: 28.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
moje pytanie jest raczej nie tyle techniczne co bardziej koncepcyjno-techniczne. Otóż mam tablice która ma zbiór informacji zasiloną z kilku plików XML porozrzucanych po różnych serwerach. Otóż chciałbym np co tydzień archiwizować tabele (do innej tabeli), i na nowo zasilić ją danymi pobranymi z XML'a. Problem w tym, że jeśli zrobię to łopatologicznie: tabela_a -> produkcja tabela_b -> archiwum 1. przenieś dane z tabela_a do tabela_b 2. dropnij tabela_a 3. zasil tabela_b problem w tym, że przez pewien czas na produkcji były by braki w danych. drugą myślą to najpierw zasilenie tabeli_a nowymi danymi, a po tym procesie przeniesienie starych wpisów do tabeli_b tu za to przez pewien czas na produkcji pojawią się z duplikowane dane trzecim i póki co ostatnim pomysłem jest zasilenie tabeli_b,a po tym procesie zmienić nazwy tabel tablica_a<->tablica_b jednak problem w tym, że nie jestem pewien czy mogę naraz zamienić tak nazwy - w pewnym momencie musialy by powstać 2tablice o tej samej nazwie. Wszytskie uwagi i pomysły mile widziane =) |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
w tabela dajesz kolumne "active"
1. select z tabelaa do tabelab 2. wgranie do tabelaa nowych danych ze statusem active=0 3. update tabelaa set active=if(active=0, 1, 0) 4. delete from tabelaa where active=0 a w calym skrypcie aby wyswietlalo Ci dobre dane dajesz where active=1 Ten post edytował maly_swd 16.09.2011, 16:18:38 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 3 Dołączył: 17.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Możesz tak zmieniać nazwy, ale jedynie dla tabel myisam pod linuxem. Jest to równoważne z zrobieniem rename... i jest to operacja atomowa (dlatego, że pod linux rename na plikach jest atomowe)
Pod innoDB działa to trochę inaczej. W standardowej konfiguracji przy rename po prostu kopiowana jest tabela (wiersz po wierszu). Więc nie wiem czy taka "zamiana miejscami" jest w ogóle możliwa. Operacja też jest atomowa (jest wykonywana AFAIR jako transakcja) tylko trwa cholernie długo (zależnie od liczby wierszy). Jak dla mnie - jedynie myisam i rename. Bo ci odpadają od razu odpadają problemy na produkcji z blokowaniem tabel. 1. zasilasz tabelę C 2. robisz rename ARCHIWUM=>OLD, PRODUKCJA=>ARCHIWUM, C=>PRODUKCJA (myisam) 3. DROP OLD być może przy rename będziesz musiał zmienić kolejność Podejście dla innoDB (tak samo dobre) tabela config: db_type (enum, unique index), db_name produkcja, db_2983120 archiwum, db_4329082 tworzysz nową tabelę przez create table o losowej nazwie, dajmy na to db_ee9843 i zasilasz ją danymi odczytujesz wartość tabeli config BEGIN SET @a:= SELECT db_name FROM config WHERE db_type='produkcja'; UPDATE config SET db_name = @a WHERE db_type='archiwum' UPDATE config SET db_name = 'db_ee9843' WHERE db_type='produkcja' COMMIT potem drop poprzedniego archiwum. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.09.2025 - 14:20 |