Zdarza się, że chcielibyśmy obrobić wynik jakiegoś zapytania. Czasami problemem jest to, że w wyniku otrzymaliśmy po prostu dużą ilość rekordów i przydałaby się jakaś paginacja. Czasami chcielibyśmy wyciągnąć z wyniku jakieś konkretne fragmenty – w powłoce można użyć grep’a, w konsoli MySQL teoretycznie jest z tym problem. Tylko czy aby na pewno problem?
Ciekawy jestem ilu z czytelników jest świadomych tego, że wynik zapytań w MySQL można przekierować do dowolnego programu? Służy do tego komenda pager. Załóżmy, że chcemy wyciągnąć informację o tym, kiedy będzie kolejny checkpoint w InnoDB. Sprawdzić to możemy przy pomocy zapytania SHOW ENGINE INNODB STATUS, ale jego wynik jest dosyć spory. Wygrepujmy więc dokładnie to, co chcemy:
PAGER set to 'grep "Checkpoint age"'
mysql> SHOW ENGINE INNODB STATUS;
Checkpoint age target 73361913
Checkpoint age 0
1 row in set (0,00 sec)
Widzimy, że grep zadziałał tak jak powinien.
Wyłączamy pager przy pomocy polecenia:
PAGER set to stdout
Inny przykład wykorzystania – less. Ustawiamy pager na less:
PAGER set to 'less'
Od tej pory wynik każdego zapytania będzie przekierowywany do less – uzyskujemy ładne przewijanie wyniku, wyszukiwanie – całą funkcjonalność tego narzędzia.
Docelowemu programowi możemy oczywiście ustawiać wszelkie dostępne flagi i parametry:
PAGER set to 'grep -A 6 "ROW OPERATIONS"'
mysql> SHOW ENGINE INNODB STATUS;
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 25988, id 1232681296, state: waiting for server activity
Number of rows inserted 0, updated 0, deleted 0, read 0
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
1 row in set (0,00 sec)
mysql> NOPAGER
PAGER set to stdout
Ustawianie pagera bardzo się przydaje w pracy z narzędziami wchodzącymi w skład zestawu Maatkit – większość z nich ma możliwość przyjmowania danych przez pipe, doskonale więc się nadają do zastosowania jako pager. Najbardziej oczywistym przykładem jest mk-visual-explain. Program ten (między innymi, bo możliwości ma dużo) przyjmuje na wejściu wynik zapytania EXPLAIN i wyświetla go w formie graficznej:
PAGER set to 'mk-visual-explain'
mysql> EXPLAIN SELECT * FROM tab1 LEFT JOIN tab2 USING(a);
JOIN
+- Bookmark lookup
| +- Table
| | table tab2
| | possible_keys PRIMARY,idx_a_b
| +- Unique index lookup
| key tab2->PRIMARY
| possible_keys PRIMARY,idx_a_b
| key_len 4
| ref test.tab1.a
| rows 1
+- Table scan
rows 2000000
+- Table
table tab1
2 rows in set (0,00 sec)
mysql> NOPAGER
PAGER set to stdout
Biorąc pod uwagę, że dane do programu ustawionego jako pager lecą przez pipe, tak na prawdę uzyskujemy nieograniczone możliwości modyfikowania tych danych. Wystarczy przecież napisać jakiś skrypt (perl, php, python – zależy w czym mocne jest nasze script-fu), który przyjmie dane z standardowego wejścia. Później z tymi danymi możemy już zrobić praktycznie wszystko, na co tylko pozwalają nasze umiejętności programistyczne. Możliwość ustawienia pagera jest drobiazgiem, ale często bardzo przydatnym w codziennych pracach administracyjnych – w sieci można znaleźć sporo przykładów na to, do czego można tą funkcjonalność wykorzystać.
Komentarze