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:

mysql> PAGER grep "Checkpoint age"
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:

mysql> NOPAGER
PAGER set to stdout

Inny przykład wykorzystania – less. Ustawiamy pager na less:

mysql> PAGER 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:

mysql> PAGER grep -A 6 "ROW OPERATIONS"
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:

mysql> PAGER mk-visual-explain
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ć.