Autor Zpráva
Zechy
Profil
Zdravím,

v práci na MS SQL databázi, máme zavedený určitý styl verzování databáze - Každý SQL skript, který se vytvoří obsahuje vlastně blok, kde se na začátku definuje jakého balíčku se týká, a jaká to je verze, následuje pak, že se vytvoří transakce, dojde na vlastní kod, který tam programátor vloží, a pokud proběhne v pořádku a souhlasí samozřejmě i to, že je to následující verze toho balíčku, tak se transakce zacommituje a v tabulce se pro daný balíček zvedne číslo verze.

Napadlo mě si pro svůj začínající projekt udělat něco podobného, bohužel jsem skončil na tom, že anonymní bloky MySQL databáze neumí spustit. Chtěl jsem se tedy zeptat, jestli nějaké takové verzování na MySQL databázi někdo neřešil, případně jak. Případně pokud v rámci MySQL databáze máte jiné způsoby jak řešit aktualizace databáze?
Medvídek
Profil
Zechy:
Většinou v gitu držíme ALTER TABLE změny a při nasazování změn se vesměs všichni modlíme, jelikož DB má něco přes 3TB a jakýkoliv ALTER nad některými tabulkami je dost o štěstí a často jsme řešili crashe MySQL enginu při vytváření TEMP tabulky. Momentálně raději při updatu vypínáme slave a zastavujeme replikaci, jelikož už několikrát jsme dělali recovery z binary logu. A nepomohlo samozřejmě ani vypnutí autocommitu, často se nám stalo, že při alteru si vytvořil temp tabulku kde prováděl úpravy a při přechodu, kdy chtěl nahradit tu vytvořenou temp tabulku to prostě engine nedal a tvářilo se to tak, že tabulka nebyla vidět, ale ve filesystému existovala. Poté většinou nastupovala opravu tabulky v HEXa editoru.
Kajman
Profil
Pozor na to, že ALTER TABLE nejde zahrnout do transakce, vždy se udělá autocommit.
Zechy
Profil
Tak Git je samozřejmost :).

Doufal jsem, že tomu dokážu dát větší kontrolu než jenom gitovat soubory a případně je pak házet někam bokem, že byly provedený, už se mi pak stalo, že jsem si nebyl jistý, který jsem na provozním prostředí spouštěl a který ne, protože se třeba skript zapomněl přesunout... Jelikož na co se dá zapomenout, na to se zapomene :)

Tak jsem chtěl využít podobný systém, kdy máme právě takhle nadefinovanou šablonu, do té se hodí vlastní kod, ať už creaty, inserty, altery, ... A to je obalené transakcí a v jedné části se spouští procedura, co ověří, zda verze není moc vysoká, že se spouští třeba SQL s verzí 20 a přitom je zaznamenána jako poslední 18, nebo se spouští již aplikovaná verze... Ale i kdybych tohle dal do té šablony, z čehož by pak byl asi trošku zbytečné dlouhý skript, tak koukám, že s ALTER by se pak mohlo narazit.

Asi nezbude než aplikovat Medvídkovo styl a při aplikaci se pak modlit. A nezapomenout označit, že se tenhle soubor už spouštěl :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: