[ maroon984 @ 09.10.2011. 22:34 ] @
Pozdrav,

kako najbezbolnije da obrišem odredjeni broj redova iz ogromne tabele, u koju će se (za vrijeme brisanja) upisivati i iz nje čitati?
Odsjecanje se vrši po opsegu datuma. Tabela je particionisana po datumu. Količina koja treba da se obriše je oko 25G.

Da li da radim sa procedurom? Ako da, da li da u query-ju naznačim cijeli vremenski interval, ili da radim postepeno?
[ bogdan.kecman @ 10.10.2011. 12:07 ] @
najbolje je ako je particionisana kako valja da samo "alter table truncate partition" ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html )
[ maroon984 @ 10.10.2011. 22:38 ] @
Particionisanje je uradjeno da valja, i "alter table truncate partition" fercera.
Kako da prebacim podatke iz te tabele u neku drugu (koju cu bekapovati i izbrisati)?
Nesto mi lose zvuci da puknem upit tipa

Code:
INSERT INTO tabela_bckp SELECT * FROM origin_tabela WHERE kolonaDatum BETWEEN neki-veliki-interval


neki-veliki-interval = nekoliko particija (particionisano je po mjesec dana).

Kontam da se kveri neće skoro izvršiti zbog količine podataka....
[ bogdan.kecman @ 10.10.2011. 22:49 ] @
imas par resenja ali generalno to uopste nije tako lose resenje, jedino sto bi ti ja savetovao je da odradis particiju po particiju dakle da ti WHERE bude identicno kao definicija particije (proveri sa EXPLAIN PARTITIONS da li ti upit ide samo kroz jednu particiju) i da ti tabela_bckp bude myiusam i da nema nikakve indexe u sebi (posto ces da je koristis za bekap samo) .. onda i bekap mozes super brzo da uradis (sa mysqlhotbackup pokupis raw myisam fajl bez opterecivanja mysql servera) ... odradis particiju po particiju i bude super brzo bez velikih opterecenja ... ako imas mesta na ram disku (/dev/shm obicno) jos jace da kreiras mysam tabelu sa DATA DIRECTORY = '/put/do/ramdiska/' bez indexa (koji ce ti), onda odradis insert select u nju i bekapujes je sa hotbackup-om.

E sad, tako JA radim. Ono sto ljudi mnogo cesce praktikuju je da odrade SELECT INTO OUTFILE ... i to sacuvaju kao bekap ali ja nekako vise volim da imam raw fajl .. drugi opet vise vole human readable .. ovo sa SELECT INTO OUTFILE je lakse za skriptovanje i manje smara server no .. odluka je na tebi i na tome kako zelis da imas finalne podatke, posto ja bekap obicno pravim sa slave-a bas me briga za opterecenje
[ maroon984 @ 12.10.2011. 10:43 ] @
...i sve bi bilo dobro da MySQL 5.1 (na produkciji, uskoro prelazimo na 5.5) podržava "alter table truncate partition".
Koliko bi bilo opterećenje da pustim DELETE sa intervalom u jednoj particiji, sa oko 9miliona zapisa, na serveru u koji se upisuje i čita? Innodb je u pitanju....
[ bogdan.kecman @ 12.10.2011. 11:01 ] @
to je ogromna transakcija, opteretice server znacajno (redo log posebno). Posto ti to svejedno radis iz neke skripte, uzmes i napravis u petlji BEGIN; DELETE ... LIMIT 1000; COMMIT; i tako dok ih sve ne pobrises. Malo ce duze da traje nego jedan delete ali ce da znacajno manje smori server ..
[ maroon984 @ 18.10.2011. 06:49 ] @
Da li bi nešto ovako valjalo u tijelu procedure :

Code:


BEGIN

DECLARE broj_poziva INT;
DECLARE i INT;
SET broj_poziva=ukupan broj redova / 1000 + 1;
SET i=1;

WHILE i<broj_poziva DO
     START TRANSACTION;
          DELETE FROM tabela WHERE vrijeme>='2010-07-01' AND vrijeme<'2010-08-01' ORDER BY vrijeme ASC LIMIT 1000;
     COMMIT;
     SET i=i+1;
END WHILE;

END

[ bogdan.kecman @ 18.10.2011. 13:20 ] @
deluje ok