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
Editace výchozích hodnot se nyní provádí přímo v úpravě struktury tabulky. Ovládání to myslím hodně pomohlo, problematické to je jenom kvůli zvýšení už tak velkého počtu políček ve formuláři (hlavně kvůli extenzi Suhosin). Do zobrazovaných informací o tabulce jsem přidal komentáře sloupců, které jsou důležité např. pro Editor.
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.
U ručně zadaných SQL příkazů typu SELECT lze nyní rovnou zobrazit jejich EXPLAIN. V klikacím výpisu tato možnost není, protože EXPLAIN je užitečný hlavně u dotazů spojujících více tabulek, lze se k němu nicméně také dostat.
V Editoru lze nyní do odesílaného e-mailu vložit hodnoty z tabulky pomocí konstrukce {$name}, kde name je identifikátor sloupce.
A jedna kosmetická změna – kliknutí na řádek tabulky ho označí, což samozřejmě vyžaduje zapnutý JavaScript. Událost pro kliknutím jsem navázal na celou tabulku, což šetří paměť prohlížeče i velikost přenášených dat.
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ě.
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é?
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.?
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
"...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.
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?
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.
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.
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é.
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...
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.
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.
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.
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".
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 :).
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.
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.
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í.
Existuje možnosť z dump databázi vybrať pre restore len jednu alebo dve-tri tabuľky? Urobiť restore databýzy a potom použiť len jednu tabuľku sa mi zdá zbytočné a zdĺhavé. Ďakujem