Nedávno jsme pro našeho zákazníka připojovali k CzechIdM systém, jehož data se ukládají do databáze Firebird. Pro účely vývoje a testování jsme potřebovali vytvořit lokální kopii databáze. Tento článek popisuje, jak jednoduše nainstalovat a zprovoznit Firebird databázi a na co si při tom dát pozor.
Oracle: paralelní zpracování
Dnešní databáze běžně obsahují miliony záznamů. Kdyby je měl databázový stroj při každé změně či každém dotazu procházet postupně jeden po druhém, trvalo by to několik hodin. Řešením, které vytěží maximum z dostupného hardware a zvládne úkol v mnohem kratším čase, může být paralelizace. Databáze Oracle verze 11 tuto možnost poskytuje. V článku se podíváme, jak si z pozice administrátora paralelní zpracování na některých databázových objektech vynutit, anebo naopak zakázat, a ukážeme si některé zajímavé parametry, které s paralelizací souvisejí.
Vizualizace dat z userstats patche do MySQL
Přibližně před rokem jsem sem napsal zápisek o nástroji kterým sledujeme stav MySQL databáze – „Bič na uživatele sdílené MySQL“. Dnes jsem prováděl úklid na disku pracovního notebooku a narazil jsem na archiv s kódy toho udělátka na sbírání a tvorbu statistik nad MySQL patchovanou userstats patchem. Protože by se to mohlo hodit i někomu jinému, tak je dávám k dispozici.
Bič na uživatele sdílené MySQL
MySQL databázi používáme jako hlavní (a posledních pár měsíců jedinou*). S konfigurací MySQL pro naše prostředí jsme se za těch několik let co běží už docela poprali, takže nemáme výrazné problémy s výkonem, dostupností nebo zálohama. Co nám dlouho scházelo jsou informace o čerpání prostředků jednotlivými uživateli.Před nějakou dobou jsme v rámci upgrade MySQL přešli na upravenou verzi s patchem userstats.
Aktualizace 10/2011: skripty je možné stáhnout
Timestamp v MSSQL
MSSQL sice obsahuje datový typ “timestamp”, který je aktualizován při každé změně záznamu. Problém je ale v tom, že nemá žádný vztah k datumu a času. Jde o číslo v binárním formátu.
Pokud tedy chceme zjistit čas, kdy došlo ke změně záznamu, musíme použít trigger, který bude nastavovat hodnotu do pole typu “datetime”.
Spustíme MS SQL Server Manager Studio.
Předpokládáme, že máme v databázi tabulku “users” a v ni sloupec “mtime” typu “datetime”.
Pole “mtime” bude obsahovat timestamp.
Jako defaultni hodnotu nastavime “getDate()”. Tím zajistíme, že nově vložený záznam bude mít v poli “mtime” aktuální čas.
Teď už zbývá pouze zajistit, aby se aktuální čas nastavil i v případě, že budeme záznam modifikovat.
K tomu nám poslouží trigger na událost update.
Ten vytvoříte tak, že v kontextovém menu vybereme možnost “New Trigger…”. Viz obrázek.
Otevře se okno, kam napíšeme samotný kód.
Ten by mohl vypadat nějak takto:
CREATE TRIGGER tr_UserTimestamp
ON users
FOR UPDATE
AS
BEGIN
DECLARE changedRecords Cursor
FOR
SELECT d.id FROM Deleted d, Inserted i
WHERE d.id = i.idz
AND (d.firstName <> i.firstName OR d.lastName <> i.lastName)
DECLARE @recordId CHAR(12)
OPEN changedRecords
FETCH NEXT FROM changedRecords INTO @recordId
WHILE (@@FETCH_STATUS = 0)
BEGIN
UPDATE users
SET mtime=getDate()
WHERE id=@recordId
FETCH NEXT FROM changedRecords INTO @recordId
END
CLOSE changedRecords
DEALLOCATE changedRecords
END
Tím se říká, aby se vytvořil trigger s názvem “tr_UserTimestamp” spoustěný při updatu tabulky “users”. V logických tabulkách “Inserted” a “Deleted” jsou záznamy, na kterých byl proveden update. V tabulce “Deleted” jsou staré hodnoty, kdežto v “Inserted” jsou hodnoty po provedeni update. Zrada je ale v tom, že pokud provedeme update na záznam, během něhož nastavite atributu hodnotu stejnou, jako měl před tím, tak se i tento záznam v tabulkách objeví. Proto jsou v uvedeném kódu porovnávány hodnoty odpovídajicích atributů a záznam je vybrán, pouze pokud se liší. Jen taková malá odbočka – existuje funkce Update() s názvem atributu jako parametr, která vrátí true, pokud byl atribut updetován. Což znamená, že vrátí true vždy, když se vyskytne atribut v UPDATE příkazu bez ohledu na to, jestli se hodnota změní, nebo ne.
Vybrané záznamy jsou po té procházeny pomocí kurzoru, přičemž je nastavován jejich atribut mtime na aktuální čas.
Až máme kód napsány, můžeme kliknout na “Execute” a tím vytvoříme samotný trigger.