Adminer 2.1.0

Školení, která pořádám

V nové verzi nástroje pro správu MySQL databáze Adminer jsem se zaměřil hlavně na kompresi. SQL i CSV import a export lze nově používat ve formátech Gzip a Bzip2, pokud jsou k dispozici přes PHP extenze. U exportu lze kompresi zvolit, u importu se automaticky detekuje podle koncovky .gz resp. .bz2.

Podporu pro Zip jsem nedělal, protože extenze Zip potřebuje pro vytvoření archivu dočasný soubor. Obálka archivu Zip je sice jednoduchá a vevnitř může používat algoritmus Gzip, ale navíc by bylo potřeba vyřešit situaci, kdy by v archivu bylo více souborů – mají se importovat všechny nebo se má nahlásit chyba nebo se mají spustit jen soubory s koncovkou .sql případně .csv?

Adminer kromě přímého zadání SQL příkazu nebo nahrání souboru od uživatele nově umožňuje také spustit soubor na disku serveru, který tam uživatel může nahrát třeba pomocí FTP. Dlouho jsem přemýšlel, jaké soubory kvůli bezpečnosti povolit, nakonec jsem povolil jen adminer.sql v aktuálním adresáři (s případnou přidanou koncovkou v případě komprese). Tento soubor je navíc načítán postupně, takže je jeho zpracování paměťově šetrné. Při té příležitosti jsem také upravil parsování SQL dotazu.

Hodně jsem přemýšlel také nad komprimací textů, které Adminer používá, protože třeba každý nově přidaný překlad (v nové verzi tradiční čínština) aplikaci relativně dost zvětšuje. Zatím jsem implementoval LZW kompresi překladů, což výsledný soubor zmenšilo ze 175 na 145 KB, ale nakonec jsem to dal k ledu. V současné době je totiž zkompilovaný soubor odolný proti otevření v běžném textovém editoru v jednobajtovém kódování nebo v UTF-8 a také proti přenosu textovým protokolem FTP. S binárním souborem by oboje vzalo za své.

Další novinky

ALTER export

Adminer vedle běžných voleb exportu nabízí také ojedinělý ALTER export. Ten vytvoří neexistující tabulky, přebytečné smaže a u stávajících tabulek doplní chybějící sloupce a odstraní přebytečné. Nejlépe se hodí k synchronizaci struktury databáze produkčního a vývojového serveru. Dosud se všechny operace rovnou prováděly, ale protože se export obvykle spouští na ostrém serveru, tak jsem se sám bál ho používat bez toho, aniž bych dopředu věděl, jaké operace se přesně provedou. Proto jsem tento export předělal tak, že se automaticky vytvoří jen neexistující tabulky a ostatní DROP a ALTER příkazy se jen vypíšou. Uživatel je po jejich kontrole může spustit ručně.

Pro lepší názornost jsem připravil screencast:

Screencast

Jakub Vrána, Adminer, 14.9.2009, diskuse: 70 (nové: 0)

Diskuse

Marek Hrabě:

Pěkně udělaný screencast. V čem si ho dělal?

btw: Hodně se mi líbí to přidávání proměných z tabulky do mailu - to je perfektní funkce :)

ikona Jakub Vrána OpenID:

Screencast jsem dělal v aplikaci Wink.

Marek Hrabě:

Díky, ten program generuje v pěkné podobě, tak ho určitě vyzkouším...

Prdlořeznictví Krkovička, n. p.:

Díky za novou verzi.

Pár věcí mě ještě tak trochu trápí - u vykonávání SQL příkazů...
* Pokud mám vykonat a zkontrolovat sekvenci mnoha a mnoha (třeba až desetitisíců) příkazů, je po jejich vykonání těžké ručně projíždět status a hledat červené řádky. Velmi by se mi šikla možnost nevypisovat ty, které se provedou bez problémů a naopak vypsat jen ty problematické.
* U jednoho příkazu, který je příliš dlouhý - pokud se v něm (někde ke konci) objeví chyba, Adminer vypíše jen prvních cca 100 znaků z příkazu a já nemám šanci se dozvědět, co je konkrétně špatně. Přemýšlel jsi, že bys v takovém případě vypisoval chybné SQL příkazy celé?

ikona Jakub Vrána OpenID:

Já to řeším tak, že si příkazy nechám při chybě zastavit. Asi by se taky dalo použít vyhledávání prohlížeče.

Zkrácení dlouhých příkazů mě taky trápí a rozbalování chci udělat u všech příkazů (nejen těch chybných), ale bude to potřebovat AJAX.

bukaJ:

Jakube, sice to bude jen Javascriptová nadstavba, ale kdyby se pouze třídami rozlišily chybové řádky od hlášení o úspěchu a poté by bylo možné tyto třídy skrývat v css. A pod výpisem by byl souhrn "1328 operací proběhlo úspěšně (skrýt), bylo zachyceno 28 chyb (skrýt)."

Nevyřešilo by to problém Prdlořeznictví Krkovička, n. p.?

ikona Jakub Vrána OpenID:

Třídou to rozdělené je, ale dělat se mi to nechce. Asi by na to šel udělat bookmarklet.

LuKo:

Jakube, díky za novou verzi, především za explain, takto nějak jsem si to představoval ;-) Měl bych ještě jeden návrh. U tabulky MRG_MYISAM by přišel vhod nějaký helper k označení tabulek, které slučuji. Něco na způsob výběru indexů - v roletce vyberu tabulku a přidá se další roletka pro výběr další tabulky. Abych nemusel psát dotaz ručně.

Na závěr pár drobných bugů. Pokud je tabulka nějakým způsobem nabořená, ve výpisu databáze se označí jako pohled. Generování seznamu tabulek trvá v řádu minut. Pokud nemocnou tabulku v tomto přehledu označím a kliknu na zkontrolovat/opravit/optimalizovat, skončí skript chybou: Fatal error: Call to a member function fetch_assoc() on a non-object in /pma.php on line 646
Ve formuláři "Pozměnit tabulku" se nepředvyplňuje aktuální "Auto Increment" (ve 2.0.0 se, myslím, vyplňoval?) a pokud je tabulka typu MRG_MYISAM, roletka "úložiště" se nepředvyplní. U MyISAM ano.

ikona Jakub Vrána OpenID:

Helper pro MRG_MYISAM dělat nebudu, protože toto úložiště míří k propadlišti dějin. Doporučuji vyzkoušet Partitioning.

Na nabořené tabulky se podívám.

Auto Increment se nově nepředvyplňuje ze dvou důvodů:
1. Aby byl možný rychlý ALTER (bez kopírování dat) třeba při pouhém přejmenování sloupce.
2. Pokud by se v průběhu editace tabulky vložil řádek a zase smazal, tak se jeho ID po uložení formuláře použije znovu, což je nežádoucí.
Nicméně by se to dalo vyřešit i tak, že by se do skrytého formulářového pole uložil i původní auto_increment a nepoužil by se, pokud by se nezměnil. Pokud by byl zájem, tak to takhle můžu udělat.

Roletka pro MRG_MYISAM se mi předvyplňuje, pošli mi prosím její TABLE STATUS a výsledek SHOW ENGINES.

LuKo:

Ad. roletka: http://pastebin.com/f3fa06ff5

Partitioning jsem zkoušel, ale nějak mi to zbořilo rozdělovanou tabulku, až ji musel smazat z disku, tak jsem to zatím nechal být a experimentuji s merge. Týká se to logovací tabulky, takže by to nemělo být na škodu.

ikona Jakub Vrána OpenID:

Jak jsem si myslel, tak je to způsobeno rozdílnou velikostí písmen. Opravil jsem to.

ikona Jakub Vrána OpenID:

Chybu se mi nepodařilo reprodukovat. Bude to znamenat, že je MySQL v dezolátním stavu, protože na daném řádku se pouze volá příkaz OPTIMIZE|CHECK|... TABLE.

ikona kaja47:

Konečně jsem Adminer vyzkoušel a musím říct, že jsem ohromen. Nabízí velice užitečné funkce, o kterých si phpMyaAdmin může jenom nechat zdát. Vizualizace db schématu je parádní a přecházení mezi provázanými tabulkami je zatraceně užitečná. Děkuji.

pojízdná kočka:

Mě by se zase u formuláře změny struktury tabulky líbila možnost přepínat se tabulátorem ne po řádcích ale i po sloupcích. Jednou jsem tuhle funkcionalitu v JavaScriptu dělala a je poměrně jednoduchá - stačilo spustit funkci, která projela celou tabulku a všem vstupním prvkům (v závislosti na zaškrtávacím políčku, které chování tabulátoru určovalo) jim změnit atribut indexTab buďto na řádek*prvků_na_řádek+sloupec (pro přesun po řádcích), a nebo na sloupec*(32767/sloupců_na_řádek)+řádek (pro přesun po sloupcích), kde: sloupec a řádek se počítají od nuly, prvků_na_řádek by v případě Admineru bylo 9 (bez tlačítek) nebo 13 (s obrázkovými tlačítky) a 32767 je maximální hodnota, která atributu indexTab může být přiřazena (jedná se o 16bitové celé číslo se znaménkem). Tato funkce by se zavolala při změně zaškrtávátka měnící způsob průchodu polí tabulátorem plus po přidání/odebrání/změně pořadí databázového sloupce.

ikona Jakub Vrána OpenID:

Občas by se mi to taky hodilo (třeba při hromadném vyplňování komentářů), ale dělat se mi to nechce. Ono by asi stačilo ten tabindex nastavit na číslo 1 až 9 nebo naopak odstranit.

phpMyAdmin pro přesun nahoru a dolů myslím používá nějakou klávesovou zkratku, ale to mě štvalo, protože jsem ji používal pro něco jiného.

Michal Raška:

Chtěl bych se zeptat, zda by se při ALTER exportu u vložených procedur mohl odstranit DEFINER. Když totiž exportuji databazi na hosting, tak tam je DEFINER jiný a při větším počtu procedur jej občas přehlédnu a zapomenu odmazat.

ikona Jakub Vrána OpenID:

Pro export procedur se používá prosté SHOW CREATE, nijak to měnit nebudu.

Michal Raška:

Děkuji za odpověď. Bohužel, tím se ovšem využitelnost tohoto exportu výrazně snižuje, protože pokud mám v DB vložené procedury, tak import neproběhne, neboť jej zastavuji při chybě. No a protože SP se ukládají do exportu jako první tak se zastaví hned na začátku. Zkoušel jsem dát jen Tabulky -> CREATE+ALTER a Databáze ->  a v tomto případě to změněnou tabulku neupraví (přesněji řečeno chybí SQL s úpravami).

ikona Jakub Vrána OpenID:

A co je vlastně příčina těch chyb?

Michal Raška:

Při exportu databaze se exportuji i SP a v nich je DEFINER. Jenže tento vlastník je na ostré databázi jiný (hosting) a způsobí to chybu při importu. Když je těch SP víc, tak ruční mazání je náročné. Mám v SP definovanou funkcionalitu DB, takže je jich hodně. Stejný problém bude asi i v triggerech, ale ty mi hosting nepovolil, takže je nepoužívám.

ikona Jakub Vrána OpenID:

Rozumím. Sám bych to řešil tak, že bych na vývojovém stroji pracoval pod stejným uživatelem jako na ostrém (pokud to je tedy možné).

Michal Raška:

to jsem zvažoval, ale ony jsou ty DB 3. Jedna je na lokalu, druha na veřejném beta testovacím webu a poslední na ostrém. Ve všech 3 případech je to nejen na různých vlastnících, ale i serverech. Ty veřejné nijak neovlivním.

cvičební úbor:

Pomohlo by nějak, kdyby do exportu přibyly zaškrtávátka na možnost přidat export procedur, pohledů atp.?

ikona Jakub Vrána OpenID:

Pohledy se označit dají. Procedury, funkce a události doplním.

ikona Jakub Vrána OpenID:

Přidal jsem to v SVN.

cvičební úbor:

"...Při změně struktury tabulky se nyní provádí jen potřebné změny, což vede v některých případech (kdy dojde např. jen k přejmenování sloupce, přidání výchozí hodnoty nebo změně komentáře) k zásadnímu zrychlení změny struktury velkých tabulek..."
Mám takový pocit, že to za nezměněné (a tedy ignorované) chybně bere i případ, kdy se u sloupce změní defaultní hodnota z '' (prázdného řetězce) na NULL. Zkus si to.

ikona Jakub Vrána OpenID:

Díky za upozornění, opravil jsem to v SVN.

ra.ri.ta:

CHtělo by to ještě doplnit úpravy pro PHP6.

ikona Jakub Vrána OpenID:

Přišel jsem zatím na absenci funkce set_magic_quotes_runtime() a to, že addcslashes() vyžaduje binary string (to se mi zdá spíše jako chyba PHP). Ještě něco?

ra.ri.ta:

Jinak vše OK.

Jarek:

Díky za novou verzi a v nové verzi díky hlavně za zobrazení komentářů ve výpisu sloupců jednotlivé tabulky.

Michal:

Po kompilaci této verze mi nejde ve schématu hýbat s jednotlivými tabulkami. V nekompilovaných souborech to jde.

ikona Jakub Vrána OpenID:

V jakém prohlížeči? Hlásí to nějakou chybu? V IE se někdy text označí a pak je potřeba boxík chytnout za rámeček.

Michal:

Nefunguje mi to v žádném prohlížeči (Mozilla, Chrome, IE vše posl. verze). Žádná chyba se nehlásí.

ikona Jakub Vrána OpenID:

Pošli mi prosím screencast, jak se to projevuje. Nebo to co nejpřesněji popiš (jaký se zobrazí kurzor, co se stane po zmáčknutí tlačítka myši na kterých částech boxíku, co po jeho puštění, zda se označuje text nebo co se děje). Zkus také smazat cookie, do které se ukládá pozice boxíku.

Michal:

Po kliknutí a následném tažení se kurzor změní na kurzor výběru a dochází k označování textu, nikoli k pohybu.

ikona Jakub Vrána OpenID:

Zkus si smazat to cookie. Když to nepomůže, tak to prosím zkus opravit.

Michal:

Smazat cookie už jsem zkoušel a to nepomáhá, takže se do toho kouknu více. Nemá někdo náhodou stejný problém ?

Michal:

Tak jsem to zkusil znovu zkompilovat a vyskočilo mi pár chyb. Předtím jsem si jich bud nevšiml nebo jsem myslel na něco jinýho. Asi to bude souviset:

Warning: include(C:\win-www\adminer/externals/jsmin-php/jsmin.php) [function.include]: failed to open stream: No such file or directory in C:\win-www\adminer\compile.php on line 4

Warning: include() [function.include]: Failed opening 'C:\win-www\adminer/externals/jsmin-php/jsmin.php' for inclusion (include_path='.;C:\php5\pear') in C:\win-www\adminer\compile.php on line 4

Warning: call_user_func() expects parameter 1 to be a valid callback, class 'JSMin' not found in C:\win-www\adminer\compile.php on line 159

Warning: call_user_func() expects parameter 1 to be a valid callback, class 'JSMin' not found in C:\win-www\adminer\compile.php on line 159
adminer.php created.

ikona Jakub Vrána OpenID:

Tím se to vysvětluje. Ale JSmin součástí zdrojových kódů je a v SVN je také jako externí napojen.

kahi:

Import většího .gz mi skončí překročením memory_limitu. Nešlo by ho přeprat nebo ignorovat?

ikona Jakub Vrána OpenID:

Soubor nahrávaný formulářem se načítá do paměti celý najednou. Zkus na server soubor zkopírovat pomocí FTP jako adminer.sql.gz, ten se zpracovává postupně.

Nastavení memory_limitu zvážím, i když většinou to bude asi zakázané.

kahi:

Super, děkuji.

ikona Jakub Vrána OpenID:

Zkusil jsem to v SVN a jen doufám, že s tím nebude moc problémů. Paměťově šetrnější je nahrání adminer.sql.gz přes FTP.

Zlaty hrebik :

Ahoj, mám dotaz k Editoru. Zobrazit pouze nekteré sloupce ve vypisu umim. Je možné nastavit, aby se pak při editaci zobrazovaly všechny sloupce?

ikona Jakub Vrána OpenID:

Ano, je to ukázané v příkladu ve zdrojových kódech: http://adminer.svn.sourceforge.net/viewvc/…?view=markup

Metoda fieldName() dostává v druhém parametru pořadí sloupce ve výpisu, v editaci se tato hodnota nepředává.

Zlaty hrebik:

Diky, necekal jsem, ze parametr $order bude mit takove sikovne vyuziti. ;)

Tomáš:

Zdravím Jakube, jen dotaz, v jakém programu se dělají ty screencasty? Děkuji.

ikona Jakub Vrána OpenID:

Dělal jsem to v programu jménem Wink.

W:

Je nekde v admineru udaj o poctu tabulek v databazi?

ikona Jakub Vrána OpenID:

Ne. Přidal bych ho do výpisu databází, ale ten zatím není. Teď se to dá v SVN verzi zjistit tak, že se ve výpisu tabulek v databázi označí všechny a klikne se na Odstranit. Potvrzující dialog počet označených tabulek zobrazí, ale chce to pevné nervy a zapnutý JavaScriptu...

ikona Štěpán Kocourek:

Co ten údaj doplnit v roletce s výběrem DB do závorky vedle názvu databáze?

ikona Jakub Vrána OpenID:

Taky mě to napadlo, ale myslím, že by to tam zbytečně zavazelo. Až udělám tu stránku s výpisem databází, tak to dám tam. Já občas potřebuji hromadně mazat databáze, takže se mi to bude hodit.

Šimoník:

Mně se nezobrazuje při návrhu hodnoty možnost vkládat Default hodnoty.
Díky

ikona Jakub Vrána OpenID:

Asi myslíš při návrhu tabulky. Zaškrtávací políčko pro zobrazení výchozích hodnot se zobrazuje při zapnutém JavaScriptu. Při vypnutém JavaScriptu se výchozí hodnoty zobrazují přímo.

Michal:

Zdravím. Nešlo by udělat, aby se při zobrazení schématu databáze zobrazovali jen zvolené tabulky. Vím, že jsou řazeny pod sebou, ale tam kde nelze aplikovat 1 projekt = 1 DB se v tom i tak někdy nevyznám.

ikona Jakub Vrána OpenID:

Jistě by to šlo, ale dělat to nebudu.

Michal:

Nevím, jestli to je chyba na straně prohlížeče nebo Admineru, ale když jsem po delší době otevřel Chrome a přejel v otevřených záložkách na Adminer tak na submitu pro přihlášení je napsáno "Vypsat" místo "Přihlásit se".

ikona Jakub Vrána OpenID:

Pro to nemám žádné vysvětlení.

Michal:

Zde je důkaz:  http://www.2shared.com/file/8564318/5d6e852e/vypsat.html

ikona Jakub Vrána OpenID:

Já ti věřím, pouze pro to nemám žádné vysvětlení. V kódu se vypisuje prostě lang('Login'). Zkus ještě jednojazykovou verzi, jestli to bude stejné.

Michal:

Asi nevysvětlitelný problém, protože už se mi tam vypsali i jiné překlady...

Enlil:

Jaká funkce pro práci se soubory je takto paměťově šetrná?

ikona Jakub Vrána OpenID:

Běžné fopen() + fread().

luki:

Dobry den
Je mozne pouzit adminer len ako backend pre sqlite db, takym sposobom aby som priamo v scripte zadal subor k sqlite suboru (napr /var/www/private/sqlite.db), pricom tento subor nieje viditelny z webu?

V dokumentacii som to nikde nenasiel, ale je mozne ze som zle hladal :).

ikona Jakub Vrána OpenID:

Ano, po přihlášení k SQLite se zadává cesta k souboru s databází.

luki:

Ok, takto to funguje, ja chcem ale proces prihlasenia a vyberu db obist.
Ide o situaciu ked mam viac db a kazdy prihlaseny uzivatel sa ma dostat k svojej db.

jirka d.:

Zdravím :-) poměrně dost mě zaujala možnost exportu, se kterou se poměrně často potýkám. Šlo by to nějak zautomatizovat? Tzn. bylo by možné zavolání Admineru přímo z PHP kódu tak, aby jeho výstup byl výsledek ALTER exportu, který si uložím do verzovacího systému, a který při pushi z repozitáře proběhne, zobrazí výstup - seznam příkazů, které by měly proběhnout a v případě, že nebyly v průběhy žádné errory, tak příkaz provede. Tu poslední část - provedení + obsluha errorů zvládám naprogramovat, ale tu část, kdy bych programově potřeboval, aby z Admineru vypadl seznam příkazů v provedení na produkčním serveru nějak nemohu dát dohromady...děkuji.

V. Matoušek:

nedávno se mi objevil problém v google chromu, kdy jakýkoliv přímo zadaný SQL dotaz se vykoná, ale výsledek je vždy přepsán novým prázdným oknem pro SQL dotaz (ikdyž zaškrtnu zastavit při chybě). Zkusil jsme novou verzi admineru, ale dělá to pořád. Ve firefoxu ten problém není.

ikona Jakub Vrána OpenID:

Ano, vím o tom. Stáhněte si prosím vývojovou verzi z http://www.adminer.org/.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.