Autor | Zpráva | ||
---|---|---|---|
matak Profil |
#1 · Zasláno: 5. 1. 2009, 21:00:20
umí s něčím takovým pracovat mysql? jak nejlépe zjistit zda záznam byl změněn? timestamp nastavený na on update je nespolehlivý! raději bych něco jiného?? díky
|
||
TomášK Profil |
#2 · Zasláno: 5. 1. 2009, 23:17:07
Tu by šlo něco vybrat:
http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html Jaké máš problémy s timestamp? Zdá se mi, že na toto by měl fungovat... |
||
matak Profil |
#3 · Zasláno: 6. 1. 2009, 03:24:33
musel bych sledovat timestamp i u mssql což je prakticky pro mne nemožné, a také jde o to, že často dochází k updatu řádku a tím se změní datum úpravy, přesto, že záznam se nijak nezměnil stačí dotaz typu
INSERT ... ON DUPLICATE UPDATE jinak ten odkaz ... kryptovací funkce ... dobrá, ale pokud to nepoužívá mysql nativně tak jak mi to pomůže k porovnání změn? představte si situaci kdy synchronizuji mssql databázi a mysql databázi, nemůžu přece projít např. 100 000 řádků a najednou u nich počítat md5 např. ani vytvořit proceduru, která při updatu vezme jeden sloupeček po druhém a spočítá md5 a uloží do sloupce, to tu databázi snad musí úplně zasekat |
||
Aesir Profil |
#4 · Zasláno: 6. 1. 2009, 09:18:28
matak:
Jde vám o synchronizaci mssql s mysql? Pokud ano, tak se používá fičura Linking Servers |
||
matak Profil |
#5 · Zasláno: 6. 1. 2009, 10:05:11
Ano, ale jde mi o to synchronizovat rozdilne datove struktury, prostě dva systémy
|
||
Aesir Profil |
#6 · Zasláno: 6. 1. 2009, 10:37:16
matak:
Tak to už pak není moc o synchronizaci, ale o přenosu dat. :) V případě odlišných struktur je vám přece na nic i checksum nebo jiné hashování záznamů. Jak moc online to potřebujete? Jestli by nebylo lepší to udělat aplikačně - ve zdrojové databázi udělat přenosovou tabulku, do které budete dávat nové věci k přenosu např. triggerem, následně to přečtete skriptem z nějakého scheduleru, zpracujete dle libosti a smažete z přenosové tabulky, nebo něco podobného. |
||
matak Profil |
#7 · Zasláno: 6. 1. 2009, 10:41:49
interval 5 minut, nevím jestli je to o přenosu dat, podle mne jde o synchronizaci jelikož se data mohou měnit na obou stranách a na jedné straně nemám možnost jakéhokoli zásahu, tedy tam něco jako zásobník změn neprovedu
checksumy slouží k tomu, aby jednou za tu synchronizaci za těch 5 min nebyl generován balík např. 100 000 řádků, ale jen např. těch 100 000 checksumu, které se porovnají a protistrana si pak vyžádá jen ty změny, jestli rozumíte samozřejmě checksum má být jen jako spolehlivá metoda, ve chvíli, kdy použiji na 100 000 záznamů něco jako INSERT ... ON DUPLICATE UPDATE tak se mi změní timestamp i přesto, že 90% řádků se nijak nezměnilo, proto vidím timestamp jako nespolehlivý |
||
Aesir Profil |
#8 · Zasláno: 7. 1. 2009, 21:57:37
matak:
Tak po menší odmlce mě už napadá jedině binární log (na straně mysql), pokud to nechcete řešit například přes triggery. |
||
matak Profil |
#9 · Zasláno: 7. 1. 2009, 21:58:34
můžeš to prosím trochu rozvést? díky
|
||
Aesir Profil |
#10 · Zasláno: 7. 1. 2009, 22:18:40
matak:
Teď nevím kteou z možnosí máte na mysli. Binární log používá mysql pro replikaci, jsou v něm zaznamenané uložené operace, ale pracovat s tím je docela...no...nic moc prostě :) Trigger si myslím byl pro vás dobrá volba, dá se navázat na zápisové operace, takže si ty změněné záznamy můžete někam odkládat bokem a pak jednou za čas přenést. Ona myslq checksum má, ale jen na úrovni celých tabulek, takže dokážete zjistit, zda se změnil počet záznamů v tabulce nebo jestli se změnily data celkově (zjistíte přes show table status), ale tuším, že nad innodb je to nepoužitelné. |
||
matak Profil |
#11 · Zasláno: 7. 1. 2009, 22:22:42
tak nevím jestli někdo používá myisam, ale to je sebevražda ne? pokud taková tabulka neslouží k nějakému logování
Trigger fajn jen se trochu bojím, že to bude mít podstatný dopad na výkon??? názor? Pravda trigger používám pro zapsání timestampu pri změně řádku, ale ukládat do jiné databáze? navíc stejný problém při operaci INSERT ... ON DUPLICATE UPDATE vyvolám trigger u všech řádků ne? přesto že 90% se jich nezmění což je ten důvod proč je pro mne timestamp získaný triggerem nepoužitelný a proč hledám ty checksumy |
||
Aesir Profil |
#12 · Zasláno: 7. 1. 2009, 22:32:53
matak:
„tak nevím jestli někdo používá myisam, ale to je sebevražda ne?“ innodb neumí fulltext „Trigger fajn jen se trochu bojím, že to bude mít podstatný dopad na výkon??? názor? “ nebál bych se toho, pokud není už teď db server přetěžován a nehrajete o každý takt „při operaci INSERT ... ON DUPLICATE UPDATE vyvolám trigger u všech řádků ne?“ manuál říká toto: A potentially confusing example of this is the INSERT INTO ... ON DUPLICATE KEY UPDATE ... syntax: a BEFORE INSERT trigger will activate for every row, followed by either an AFTER INSERT trigger or both the BEFORE UPDATE and AFTER UPDATE triggers, depending on whether there was a duplicate key for the row. |
||
matak Profil |
#13 · Zasláno: 7. 1. 2009, 23:40:52
innodb a fulltext ano vím, ale nedokážu si představit správu databáze bez referenčních klíčů, fulltext jsem zatím vždy oželel
přetěžování serveru no to je taky otázka, prostě se tím zdvojnásobí zátěž na každý zápis což není zrovna moc žádoucí INSERT DUPLICATE UPDATE jestli mne angličtina neklame, měl jsem pravdu? |
||
Kajman_ Profil * |
#14 · Zasláno: 8. 1. 2009, 08:58:06
A můžete si v tom before update triggeru zkontrolovat, zda všechny new hodnoty jsou stejné jako old hodnoty a dle toho si nastavit nebo nenastavit timestamp se změnou?
|
||
matak Profil |
#15 · Zasláno: 8. 1. 2009, 09:25:39
to by určitě šlo a napadlo mne to, jen se bojím jak se to celé díky tomu zpomalí?? co když pomocí INSERT ON DUPLICATE UPDATE měním např. v selectu 100 000 řádků? to by asi bylo podstatné zpomalení?
|
||
Kajman_ Profil * |
#16 · Zasláno: 8. 1. 2009, 09:29:29
Vyzkoušejte, uvidíte.
|
||
matak Profil |
#17 · Zasláno: 8. 1. 2009, 09:35:42
no tady si tak trochu rikam ze je to mozna podobne narocne jako vytvaret si vlastni checksum, tedy pri kazdem updatu vzit vsechny sloupce a ulozit jejich md5
hlavně nejsem zas až tak zběhlý v triggerech, ale lze nějak procházet všechny NEW hodnoty? tedy nepřistupovat k vkládaným hodnotám jednotlivé? NEW.id, NEW.name apod. tedy prostě nějakým foreach NEW as ident=>value ? tabulka s 30 sloupci se bude v triggeru špatně udržovat, když se nějaký sloupec změní, zmizí, přibyde atd. |
||
matak Profil |
#18 · Zasláno: 8. 1. 2009, 10:09:50
jeste si tak rikam kdyz interval synchronizace omezim na cca 20minut, tak by nemusel byt asi az takovy problem vytvorit checksumy tech 100000 radku cca, proste by se vytvareli jednou za cas
je to zhruba pro mysql 100000x spojit hodnoty sloupcu v kazdem radku a vygenerovat md5 to následně uložit do jiné tabulky, to by myslím nebyl takový problém ovsem stejne je zde problem ze by bylo nutne rozpoznat master a slave coz by slo opet automaticky rozpoznat jedine na zaklade novejsiho timestamp. takze jsem zase skoro na zacatku |
||
Aesir Profil |
#19 · Zasláno: 8. 1. 2009, 10:19:41
matak:
„innodb a fulltext ano vím, ale nedokážu si představit správu databáze bez referenčních klíčů, fulltext jsem zatím vždy oželel “ až budete potřebovat rychle čísti opravu velké mraky záznamů bez potřeby složitých záznamů, budete za rychlý myisam engine hodně vděčný :) „přetěžování serveru no to je taky otázka, prostě se tím zdvojnásobí zátěž na každý zápis což není zrovna moc žádoucí “ triggery mají minimání vnitřní režii, takže to bude pouze o těch dotazech, které se budou vykonávat a tam už je ta zátěž docela měřitelná „INSERT DUPLICATE UPDATE jestli mne angličtina neklame, měl jsem pravdu?“ ten kousek z manuálu, co jsem zkopíroval, říká, že pokud použijete trigger AFTER UPDATE|INSERT, tak vám ovlivní jen řádky, které byly opravdu změněny, kdežto trigger BEFORE UPDATE|INSERT se bude trpět stejným nešvarem jako timestamp |
||
matak Profil |
#20 · Zasláno: 8. 1. 2009, 12:01:29
1. innodb a myisam, to je asi na jinou diskusi, ale jednoduše si databázi bez cizích klíčů nedokážů představit, pokud nejde o nějaké to logování prokliků apod. miliony záznamů, každopádně můžeš uvést příklad
2. triggery minimální režie, no je to o tom, že u 100000 řádků proběhne 100 000x foreach pro každý řádek a projede všechny sloupce a porovná hodnoty, zda se nezměnili, tak nevím, ale to se musí celkem podstatně projevit, to je můj názor 3. after a before update asi u mne horší angličtina, a BEFORE INSERT trigger will activate for every row, followed by either an AFTER INSERT trigger or both the BEFORE UPDATE and AFTER UPDATE triggers, depending on whether there was a duplicate key for the row. jaký by byl přesný překlad? followed by either an AFTER INSERT trigger or both the BEFORE UPDATE and AFTER UPDATE triggers |
||
Časová prodleva: 15 let
|
0