Michal Čihař - Blog Archives for phpMyAdmin

Informace o stavu MySQL serveru podruhé - další informace

Před týdnem jsme se podívali na stránku zobrazující stav serveru, ale to zdaleka není jediná možnost jak se podívat co se na serveru děje.

Probíhající SQL dotazy a jejich historie

Pokud je MySQL server hodně zatížen, může být snadné identifikovat viníka ze seznamu běžících dotazů . Pro každý dotaz zde vidíme jak dlouho běží, který uživatel ho spustil a můžeme ho také ukončit.

MySQL server uchovává historii dotazů, které nějak měnily (nebo mohly změnit) data na serveru. Tento log si můžete prohlédnout na stránce s  binárními logy . Prohledávání tohoto seznamu však může být poměrně časově náročné.

Podporovaná úložiště a jejich stav

Další zajímavou stránkou může být seznam podporovaných úložišť . Kromě jejich přehledu se zde po kliknutí na ně dozvíme i informace o jejich stavu a případně o proměnných ovlivňujících jejich chování. Nejvíce informací je v současné době dostupné pro InnoDB.

Znakové sady a porovnání

MySQL server v současné době podporuje mnoho znakových sad a pro většinu z nich i více možností porovnávání. Podrobnější informace na toto téma již přinesl článek o  problémech s češtinou . Seznam znakových sad, které podporuje váš MySQL server, naleznete na samostatné stránce . Zvýrazněná porovnání jsou výchozí pro danou znakovou sadu.

Proměnné a nastavení serveru

Proměnné a nastavení serveru je poslední část kterou si dnes projdeme. Jsou na ní vypsány všechny proměnné MySQL serveru a jejich hodnoty. Pokud se nastavení aktuálního připojení liší od globálního nastavení, je tato proměnná zvýrazněna a jsou vypsány obě hodnoty.

A nyní již můžete pomocí phpMyAdmina zjistit vše co se na vašem MySQL serveru děje a jaké možnosti má zakompilovány.

Informace o stavu MySQL serveru poprvé - stav serveru

Kromě správy MySQL serveru vám phpMyAdmin nabízí i možnosti jak se dozvědět zajímavé informace o jeho stavu. Sledováním těchto informací můžete optimalizovat běh vašeho MySQL serveru.

Než se pustím do rozebírání jednotlivých informací, musím upozornit, že v MySQL u vašeho provozovatele nemusíte mít oprávnění vidět všechny tyto stránky. Veškeré tyto informace jsou obvykle dostupné jen správci serveru.

Stav serveru

Pokud chceme zjistit stav serveru, celkem logicky se podíváme na záložku nazvanou stav serveru a phpMyAdmin nás zahltí informacemi, které získal od MySQL serveru. Jak se v nich ale vyznat?

V následujících několika odstavcích si popíšeme jednotlivé položky, ale nejdříve několik obecných informací. phpMyAdmin se snaží poznat, které hodnoty jsou vyloženě špatné nebo dobré a ty barevně zvýraznit. Červené hodnoty tedy stojí za prozkoumání a ze zelených můžete mít radost, jak dobře máte MySQL server nastavený. Toto hodnocení ale vychází z průměrného používání MySQL serveru a nemusí přesně odpovídat vašemu nastavení, takže není potřeba se děsit červených čísel. Na ukázkovém serveru například najdete mnoho takových položek a to převážně z důvodu minimalizace paměťové náročnosti MySQL serveru, který tak nemůže udržovat v paměti dostatečné množství dat.

V horní části jsou souhrnné informace – celkový přenos dat a počty připojení. Tyto čísla může být zajímavé vidět, ale obvykle se zde nic zásadnějšího nedozvíme.

Hned dále je zobrazena statistika dotazů. Z té již můžeme vysledovat například převážné používání serveru. Na produkčním serveru obvykle převažují dotazy typu select , ale pravděpodobně zde najdete i vysoká čísla pro vkládání nových záznamů ( insert ), protože mnoho publikačních systémů si ukládá nějaké statistiky o přístupu uživatelů. Větší četnost jiných typů dotazů může stát za prozkoumání, jestli některá aplikace není špatně nakonfigurována.

Další tabulka obsahuje některé souhrnné statistiky SQL dotazů a pokud máme vysokou hodnotu u Slow_queries , pravděpodobně některá aplikace příliš zatěžuje MySQL server neoptimálními dotazy. O jaké dotazy se jednalo můžete zjistit zapnutím logování pomalých dotazů v konfiguraci MySQL ( log_slow_queries ).

V dalších částech najdete vypsaný stav jednotlivých subsystémů MySQL serveru a pokud najdete červená čísla, můžete si ve vedlejším sloupci přečíst doporučení, jak tuto hodnotu vylepšit. Kromě přehledu naleznete na konci některých tabulek i akce, které je možné se souvisejícím subsystémem provést, například vyprázdnit vyrovnávací paměť dotazů nebo zobrazit podřízené servery.

Při zkoumání vlivu jednotlivých aplikací na statistiky může být užitečné tyto statistiky občas vynulovat, k tomu vám pomůže odkaz v horní části stránky nebo případně odkazy pod jednotlivými sekcemi.

phpMyAdmin používá mootools

Ve vývojové verzi phpMyAdmin se stále více využívá JavaScript a proto se už dlouho uvažovalo o použití nějakého frameworku, který by usnadnil psaní rozšířených funkcí a do budoucna i podporu pro AJAX. Jak se můžete v současném SVN přesvědčit, momentálně se zkouší používání frameworku mootools .

Prozatím se JavaScript používá na schovávání některých informací databází a tabulek , ale do budoucna se určitě dočkáte i pokročilých funkcí využívajících AJAX.

Znakové sady v MySQL a phpMyAdminovi

MySQL od verze 4.1 podporuje nativně práci s různými znakovými sadami. Bohužel mnoho aplikací a dat v databázích vzniklo dříve a tuto podporu nevyužívají. Pak se uživatel může potýkat s mnoha problémy. Dnes se podíváme na to, jak ty nejčastější vyřešit.

MySQL a znakové sady

Ve verzi 4.1 přibyla v MySQL podpora pro znakové sady a řazení. Ty se nastavují v několika úrovních – výchozí pro server, databázi a tabulku a nastavení pro jednotlivé sloupce. Pokud máme databáze ze starší verze MySQL, nemají přiřazen žádný způsob řazení a použije se výchozí pro server. Výchozí pro MySQL je latin1_swedish_ci , což je pro české podmínky poněkud nevhodné. Jméno řazení se skládá ze tří částí oddělených podtržítkem – první určuje znakovou sadu, druhá jazyk a třetí variantu porovnáván. Varianty porovnávání jsou tři:

ci
case insensitive – nerozlišuje velikost písmen
cs
case sensitive – rozlišuje velikost písmen
bin
binary – řadí podle hodnoty znaku a ne lexikograficky

Pro češtinu máme k dispozici tyto varianty: ucs2_czech_ci, utf8_czech_ci, cp1250_czech_cs, latin2_czech_cs.

Podpora znakových sad v phpMyAdminovi

Do phpMyAdmina přibyla podpora tyto vlastnosti MySQL ve verzi 2.6.3. Nastavit můžete výchozí porovnání pro databázi , tabulku a stejně tak i pro jednotlivé sloupce, které vidíme na přehledu tabulky .

Na úvodní stránce si také můžeme vybrat porovnávání použité pro zobrazování výsledů, ale použitá znaková sada bude vždy utf-8, protože stránky phpMyAdmina jsou v utf-8.

Co dělat když je něco špatně?

Pokud se nám některé znaky zobrazují v phpMyAdminovi špatně, je chybně nastavená jejich znaková sada. Znakovou sadu není možné měnit v přímo, protože MySQL server pak provede konverzi dat mezi těmito znakovými sadami a data budou nejspíš nenávratně poškozena! Pokud chceme jen změnit znakovou sadu sloupce, musíme ho nejprve převést na binární hodnotu (tedy na pole typu BINARY/VARBINA­RY/BLOB odpovídající CHAR/VARCHAR/TEXT) a pak zpět na původní typ jen s jinou znakovou sadou. Takto zůstanou data v nezměněné podobě a jen se změní znaková sada.

Po této změně je ale možné, že používané starší aplikace budou mít problém zobrazit správně data. Aplikace totiž bez explicitního určení znakové sady dostávají data ve výchozí znakové sadě serveru (což je latin1). Pokud k aplikaci máme zdrojové kódy, stačí hned za připojení k MySQL přidat SQL příkaz SET NAMES 'znaková sada' . Ten zajistí, že MySQL server bude posílat data ve znakové sadě, kterou aplikace používá. Pro češtinu máme opět čtyři možnosti: utf8 , latin2 , cp1250 a ucs2 .

Oblíbené dotazy

Pokud často používáte nějaký komplikovanější dotaz, tak vás asi nebaví ho pokaždé zadávat znovu. Proto byla do phpMyAdmina přidána funkce pro ukládání a používání oblíbených dotazů. Pro její použití ovšem potřebujete mít zapnutou podporu pro rozšířené funkce .

Vytváření oblíbeného dotazu

Dotaz můžete vytvořit jakýmkoliv způsobem, třeba ho zadat jako SQL, nebo pomocí vyhledávací stránky. Po jeho provedení uvidíte pod výsledky rámeček pro přidání SQL dotazu do oblíbených, kde stačí zadat jméno a phpMyAdmin so ho bude pamatovat. Pokud dotaz nechcete spouštět, můžete oblíbený dotaz rovnou vytvořit na SQL stránce . Tato možnost je obzvláště vhodná pro dotazy, které nevrací žádný výsledek (například úprava tabulek nebo vkládání nových záznamů).

Oblíbený dotaz není omezen na jediný SQL příkaz, ale jsou zobrazeny jen výsledky toho posledního, takže není moc užitečné do něj vkládat víc dotazů vybírající nějaké řádky.

Při vytváření můžeme dotaz pojmenovat libovolně. Pokud ho ovšem pojmenujeme stejně jako se jmenuje některá tabulka v databázi, phpMyAdmin tento dotaz použije při procházení této tabulky. Tímto můžeme například omezit počet zobrazených sloupců při prohlížení tabulky.

Práce s oblíbenými dotazy

Již vytvořený dotaz se objeví na SQL stránce , odkud ho jeho vybráním můžeme spustit.

Oblíbený dotaz upravíme podobným postupem jako ho spouštíme. Jen je zapotřebí na SQL stránce zvolit „Zobrazit“ místo výchozího „Provést“. Tím bude dotaz zobrazen v editačním poli pro SQL a máme možnost ho po úpravách znovu uložit. Pokud chceme přepsat starý dotaz, nesmíme zapomenout zaškrtnout „Přepsat existující oblíbený dotaz stejného jména“.

Pokud již oblíbený dotaz nepotřebujeme, můžeme ho opět na SQL stránce vymazat zvolením možnosti „Odstranit“.

Přístup k dotazům

Standardně má k dotazu přístup pouze uživatel, který ho vytvořil, protože většinou nechceme aby k našim datům měli přístup ostatní. Pokud však chceme dotaz sdílet, nabízí nám phpMyAdmin tuto možnost, stačí při vytváření (nebo úpravách) zaškrtnout „Umožnit všem uživatelům používat tuto položku“ a pak všichni uživatelé budou moci používat tento dotaz. Toto také znamená, že ostatní uživatelé budou moci dotaz upravit a smazat.

Parametry oblíbených dotazů

Zatím jsme oblíbené dotazy vytvářeli jen pevně dané. phpMyAdmin ale umožňuje do dotazu začlenit i volitelnou část, která se přidá při zadání parametru. Hodnota parametru bude vložena namísto [VARIABLE] a zakomentovaná část dotazu bude odkomentována. Takový dotaz pak může vypadat třeba takto (používá se databáze sakila ):

 
  SELECT * FROM `city`
/* WHERE `city`.`country_id` = [VARIABLE] */
 

Pokud tedy parametr nezadáme, vybere dotaz všechny města, pokud ho zadáme, vybere jen města v dané zemi.

Že se ještě vůbec snažím někomu radit

Chápu, že občas na jabber konferenci pro phpMyAdmina vleze někdo kdo má problémy s MySQL. Ale když už někdo neví co dělá a chce provozovat redakční systém v PHP, tak by aspoň mohl mít trochu slušnosti. Pojmenovat se aaa na důvěryhodnosti moc nepřidá (a koneckonců anonymitu taky ne, stejně IP adresu vím ;-)) a po prvním dotazu "hele kde mám zjistit udaje MySQL?" už se člověk nemůže ubránit pocitu co že to za blbce sem zase dorazilo. Nicméně to mě neodradilo od toho se mu pokusit poradit, ale dobře míněná snaha stejně přišla vniveč. Ostatně posuďte sami . No nic je na čase jít spát.

Vlastní exportní formát

Před týdnem jsme se dozvěděli, jak exportovat data do podporovaných formátů. Co ale dělat, když potřebujeme data ve vlastním formátu? Napsat si vlastní exportní modul není nic těžkého, jak na to se dozvíte v dnešním článku.

Začátek

Nejdříve si rozmyslete, co všechno od exportu budete potřebovat a jaké možnosti nastavení bude export mít. Vždy je lepší si nejprve ujasnit požadavky, než se vrhneme na programování. Pro ukázku v tomto článku budeme vytvářet export do textového souboru, který půjde dále zpracovat pomocí Texy! . Nastavení použijeme stejná jako mají ostatní podobné exporty, tedy možnost vypnutí dat nebo struktury, zobrazení jmen sloupců a text, kterým nahradíme NULL hodnoty.

Hlavička

Každý plugin obsahuje hlavičku, která se provádí při načítání pluginů. Ta definuje jednak informace o pluginu a také parametry, které bude možné nastavit na stránce s exporty. Pro náš export tedy bude základní hlavička vypadat takto:

 
  <?php

/*Texy! export for phpMyAdmin */

if (isset($plugin_list)) {
    /* Jméno zaregistrovaného pluginu musí být stejné jako jméno souboru */
    $plugin_list['texytext'] = array(
        'text' => 'Texy! text',         /* Jméno pluginu které se zobrazí uživateli */
        'extension' => 'txt',           /* Přípona vygenerovaného souboru */
        'mime_type' => 'text/plain',    /* MIME typ vygenerovaného souboru */
        /* Definice parametrů: */
        'options' => array(
            array('type' => 'bool',
                'name' => 'structure',
                'text' => 'strStructure',
                'force' => 'data'),
            array('type' => 'bgroup',
                'name' => 'data',
                'text' => 'strData',
                'force' => 'structure'),
            array('type' => 'text',
                'name' => 'null',
                'text' => 'strReplaceNULLBy'),
            array('type' => 'bool',
                'name' => 'columns',
                'text' => 'strPutColNames'),
            array('type' => 'egroup'),
            ),
        'options_text' => 'strOptions',
        );
} else {

/* Sem přijde kód pro export */

}
?>
 

Pokud nyní soubor s tímto PHP kódem uložíme jako libraries/export/texytext.php , měl by phpMyAdmin už tento plugin zobrazit na stránce pro export.

Implementace exportu

Pro vlastní export je potřeba implementovat několik funkcí, které mají za úkol získat data z MySQL a poslat je na výstup pomocí funkce PMA_exportOutputHandler . Tato funkce zajišťuje zpravování výstupního bufferu, kompresi a posílání dat uživateli nebo ukládání na server. Vrací false, pokud operace selhala.

Funkce, které musíme implementovat jsou tyto:

  • PMA_exportComment
  • PMA_exportFooter
  • PMA_exportHeader
  • PMA_exportDBHeader
  • PMA_exportDBFooter
  • PMA_exportDBCreate
  • PMA_exportData
  • PMA_exportStructure

Všechny by opět měly vrátit false, pokud se něco nepodařilo. Funkcí je sice hodně, ale to je jen z důvodu usnadnění psaní exportů do rozličných formátů. Jejich názvy jsou snad celkem výstižné, takže ani nebudu popisovat k čemu která slouží. Pro náš případ potřebujeme jen funkce PMA_exportDBHeader , PMA_exportData a PMA_exportStructure , ostatní mohou jen vracet true a nic nedělat.

PMA_exportDBHeader

Tato funkce má za úkol vypsat hlavičku exportu a bude tedy poměrně triviální:

 
  function PMA_exportDBHeader($db) {
    return PMA_exportOutputHandler('===' .
        $GLOBALS['strDatabase'] . ' ' . $db . "\n\n");
}
 

PMA_exportData

Teď se již dostáváme ke komplikovanějšímu úkolu – exportu dat. Začneme opět nadpisem, aby uživatel věděl, o jakou tabulku se jedná:

 
  if (!PMA_exportOutputHandler('== ' . $GLOBALS['strDumpingData'] . ' ' . $table . "\n\n")) {
    return FALSE;
}
 

Jako další krok potřebujeme načíst data z MySQL. Pro to použijeme DBI vrstvu phpMyAdmina:

 
  $result      = PMA_DBI_query($sql_query, null, PMA_DBI_QUERY_UNBUFFERED);
$fields_cnt  = PMA_DBI_num_fields($result);
 

Uživatel měl možnost si vybrat, zda chce zobrazit v hlavičce jména sloupců. Zde poprvé použijeme přístup k parametrům a podle jeho hodnoty případně zobrazíme hlavičku:

 
  global $what;

if (isset($GLOBALS[$what . '_columns'])) {
    $text_output = "|------\n";
    for ($i = 0; $i < $fields_cnt; $i++) {
        $text_output .= '|' . htmlspecialchars(stripslashes(PMA_DBI_field_name($result, $i)));
    } // end for
    $text_output .= "\n|------\n";
    if (!PMA_exportOutputHandler($text_output)) {
        return FALSE;
    }
} // end if
 

Nyní nám už jen chybí vypsat data z databáze uživateli:

 
  while ($row = PMA_DBI_fetch_row($result)) {
    $text_output = '';
    for ($j = 0; $j < $fields_cnt; $j++) {
        if (!isset($row[$j]) || is_null($row[$j])) {
            $value = $GLOBALS[$what . '_null'];
        } elseif ($row[$j] == '0' || $row[$j] != '') {
            $value = $row[$j];
        } else {
            $value = ' ';
        }
        $text_output .= '|' . htmlspecialchars($value);
    } // end for
    $text_output .= "\n";
    if (!PMA_exportOutputHandler($text_output)) {
        return FALSE;
    }
} // end while
 

A uvolnit výsledky dotazu a vrátit návratovou hodnotu:

 
  PMA_DBI_free_result($result);
return TRUE;
 

PMA_exportStructure

Export struktury je asi nejnáročnější a určitě nejrozsáhlejší, nicméně neobjevují se zde již žádné nové věci týkající se exportu, proto se na její celý kód podívejte sami v přiloženém souboru. V úvodu se načtou z MySQL parametry tabulky, poté pomocí funkcí phpMyAdmina načteme informace o relacích a MIME typech sloupců a tyto informace zformátujeme do Texy!.

Hotovo

A tím by mělo být vše hotovo. Plugin vyzkoušíme a pokud to uznáme za vhodné, pošleme do patch trackeru , aby mohl být náš plugin začleněn v další verzi phpMyAdmina.

Celý hotový exportní plugin naleznete v příloze článku.

Přílohy:

Exportování databází a tabulek

phpMyAdmin už od dávné historie podporuje export do SQL. Když se však nyní podíváte na stránku umožňující export , uvidíte velké množství formátů. Tento nárůst byl do velké části umožněn zavedením možnosti snadno vytvářet pluginy pro export dat. Díky tomu začali uživatelé přispívat kód pro nové a nové formáty. Ale tomu, jak napsat exportní plugin pro vlastní formát, se budeme věnovat až někdy jindy, dnes nás čeká prohlídka stávajících možností jak exportovat.

Nastavení

To jak stránka vypadá, je do velké míry ovlivněno nastaveními – pole $cfg['Export'] určuje výchozí hodnoty pro všechny parametry exportu. Takže například výchozí formát můžeme nastavit takto:

 
  $cfg['Export']['format'] = 'sql';
 

Podrobnější popis možností nastavení najdete v  dokumentaci .

Stahování velkých exportů někdy může trvat dlouho a proto phpMyAdmin také umožňuje ukládat data přímo na server. Abychom této možnosti mohli využít, musíme vytvořit adresář, do kterého bude mít PHP právo zapisovat a cestu k němu pak nastavíme v konfiguračním souboru:

 
  $cfg['SaveDir'] = './save';
 

Všeobecné možnosti

V dolní části stránky umožňující export , nalezneme možnosti používané pro všechny formáty. Ve výchozím nastavení je možné jen nastavit, jestli chceme soubor zobrazit v prohlížeči, nebo aby ho prohlížeč umožnil uložit na disk, jméno takto posílaného souboru a formát komprese. Ve jméně souboru je možné používat i formátovací znaky pro datum, takže například __DB__-%Y%m%d vygeneruje jméno souboru obsahující jméno databáze a aktuální datum.

Po povolení možnosti zapisovat na server (viz přechozí kapitola) zde ještě přibude tato volba a dále po povolení změn kódování i možnost nastavit kódování výstupu.

Formáty

Ja jistě vidíte sami , podporovaných formátů je velké množství.

Codegen

Nový exportní modul v phpMyAdminovi 3.0, umožňující generování kódu pro různé implementace ukládání trvalých objektů. V současné době jsou podporovány jen formáty NHibernate. Více informací viz http://www.hibernate.org/ .

CSV

Textový soubor s daty, ve kterém jsou sloupce oddělené definovanými znaky. Volba CSV pro MS Excel jen přednastaví oddělovače na optimální znaky pro zvolenou verzi Microsoft Excelu.

Microsoft Excel 2000

Exportuje data do formátu Microsoft Excel 2000. Exportováno je do XML formátu, takže starší verze tohoto produktu nejsou schopné tento soubor otevřít.

Microsoft Excel 2000

Exportuje popis struktury a data do formátu Microsoft Word 2000. Exportováno je do XML formátu, takže starší verze tohoto produktu nejsou schopné tento soubor otevřít.

LaTeX

Vygeneruje tabulku s popisem struktury a daty pro LaTeX, která je vhodná pro začlenění do dalšího dokumentu. Pro začlenění potřebujete použít několik balíčků pro LaTeX, jak ostatně můžete vidět na následující ukázce:

 
  \documentclass{article}
\title{phpMyAdmin SQL output}
\author{}
\usepackage{longtable,lscape}
\date{}
\setlength{\parindent}{0pt}
\usepackage[left=2cm,top=2cm,right=2cm,nohead,nofoot]{geometry}
\pdfpagewidth 210mm
\pdfpageheight 297mm
\begin{document}
\maketitle

% sem vložte výstup z phpMyAdmina

\end{document}
 

Sešit OpenDocument

Exportuje data do formátu OpenDocument Spreadsheet.

Text OpenDocument

Exportuje popis struktury a data do formátu OpenDocument Text.

PDF

Vygeneruje PDF s daty tabulky. Může být vhodné pro prezentace nebo tisk dat.

SQL

Podrobnějšímu popisu nastavení SQL bude věnován některý další článek. Pokud však znáte jiné nástroje pro zálohování MySQL, nejsou pro vás dostupné možnosti cizí. Pro základní používání obvykle jen stačí vybrat, zda chceme exportovat data, strukturu nebo obojí.

XML

Vygeneruje XML dokument s daty. Názvy elementů jsou vlastní, ale pro další počítačové zpracování se může jednat o ideální a snadno parsovatelný formát.

YAML

Vygeneruje YAML kód, který se používá pro serializaci dat. Jedná se o výstup, který je jak čitelný člověku, tak strojově zpracovatelný, více informací viz http://www.yaml.org .

Nativní formát MS Excelu

Na závěr jsem si nechal tento formát, který není ve výchozím nastavení přístupný, protože vyžaduje další nastavení. Pomocí něj můžete vytvářet dokumenty ve formátu Microsoft Excel 97, takže pokud používáte tuto starší verzi, může to pro vás být jedna z možností.

Pro použití potřebujete nainstalovat PEAR modul Spreadsheet_Ex­cel_Writer a vytvořit adresář, kam tento modul bude moci vytvářet dočasné soubory (o něm pak dáte phpMyAdminovi vědět pomocí $cfg['TempDir'] ).