Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zasilanie an nowo tablicy z równoczesnym archiwizowaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
Shinji
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 =)
maly_swd
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
xdev
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.