Pagination in mysql-client

Unterwegs auf der Linuxkonsole habe ich oft eine Verbindung zum MySQL-Server offen um SQL-Abfragen abzusetzen und mit den Ergebnissen zu agieren.

Nun ist es jedoch oftmals so, dass das dieses Ergebnis länger als die gegenwärtigen Bildschirmgröße ist und die Konsole zu scrollen beginnt. Dies stört mich aus diversen Gründen und schränkt mich in meiner Arbeit ein. Mittels Pagination im mysql-client kann man das jedoch simpel und zugleich pfiffig lösen:

pager more;

Hiermit kann man nun Zeilen- oder Seitenweise – wie man es von more gewohnt ist – durch das Ergebnis vorwärts scrollen sowie auch mittels STRG+C unterbrechen.

Man kann das Ergebnis auch in andere Programme pipen wie z.B. mit less durch das Ergebnis beliebig vor- und zurücknavigieren oder gar eine übergreifende Volltextsuche tätigen.

pager less;

Um das Paging wieder zu deaktivieren genügt der pager Befehl ohne Argument:

pager;

Die hier aufgeführten Befehle sind nur für die Dauer der gegenwärtigen Sitzung gültig. Will man das Paging dauerhaft einrichten so ist dies in der my.cnf mit den o.g. Befehlen in der client Sektion einzutragen und wird sodann mit jedem Programmstart standardmäßig verfügbar.

[client]
pager=more

Back in time

Hin uns wieder steht man als Entwickler vor der Aufgabe einen Prozess zu verschiedenen Zeitpunkten zu testen. Das löst man meist recht pragmatisch indem man die Systemzeit ändert und sodann seine Tests durchführt. Dies hat jedoch oftmals einen unangenehmen Beigeschmack, der sich unter anderem im folgenden bemerkbar macht:

  1. Andere Programme legen ein ungewolltes Verhalten an den Tag
  2. Andere Benutzer auf dem gleichen System sind ebenfalls von  der Zeitumstellung betroffen
  3. Der Taskplaner startet Jobs die während der gegenwärtigen Uhrzeit das System negativ beeinflussen
  4. Zertifikate werden plötzlich ungültig
  5. Logeinträge des Systems sowie jene diverser Applikationen sind möglicherweise nicht mehr zuordnbar bzw. nur schwer nachvollziehbar

Welche Gründe man nun auch immer für die Zeitumstellung hat und sich mit den damit verbundenen Problemen herumschlagen muss – sofern die Entwicklung auf einem Windowssystem stattfindet ist man mit dem Tool RunAsDate in der Lage einen beliebigen Prozess mit einer eigenen Zeiteinstellung gezielt zu starten. Dafür klinkt dieses Tool sich in die Kernel-API ein und manipuliert die Zeit für den Prozess mit der übergebenen Zeiteinstellung.

Einen PHP-Webserver in anderen Zeiten starten:

RunAsDate.exe /movetime 01\01\2001 18:15:00 C:\php5\php.exe -S localhost:8000 -t D:\var\www\mydomain\

PHP im CLI-Modus starten:

RunAsDate.exe /movetime 01\01\2001 18:15:00 C:\php5\php.exe -r “date(‘Y-m-d H:i:s’);fgets( STDIN );”

Beachte:

  1. Manche Zeiteinstellungen z.B. vor 2000 oder ein Datum vor bestimmten Zeitpunkten zu den das Programm einfach seine Kalkulationen unterlässt lassen das gewünschte Programm nicht starten oder zu ungewünschten Ergebnissen führen
  2. Es ist nicht empfehlenswert Programme zu starten, die einer zeitlichen Beschränkung unterliegen, da diese möglicherweise das intern gegenprüfen und so ihren Dienst künftig gänzlich verweigern

Download:

http://www.heise.de/download/runa04sdate-1169076.html

Suche nach Dateien deren Datum älter als Mitternacht

Manchmal möchte man nach sich unter Linux Dateien anzeigen lassen, die am heutigen Tag seit Mitternacht erzeugt wurden. find unterstüzt einen dahingehend nicht mit einem Parameter bei dem man konkret ein Datum mitgeben kann. Man kann sich damit aushelfen indem man mit einer Referenzdatei agiert die Anhand ihres Erzeugungsdatum verglichen wird.

Dies ist in einem dreischrittigen Prozess möglich. Dazu erzeuge ich eine temporäre Datei, deren Erzeugungdatum ich auf Beginn des gegenwärtigen Tages manipuliere. Anschließend starte ich die Suche in der ich alle Dateien ermittle welche neuer sind als die soeben erzeugte. Abschließend wird diese temporöre Datei wieder gelöscht.

touch -t `date +%m%d0000` /tmp/$$
find -maxdepth 1 -newer /tmp/$$
rm /tmp/$$

Das ganze könnte in einem globalen Shell-Skript gepackt noch etwas eleganter aufrufbar werden, beschränkt dann allerdings die Verwendung von find auf die dortige Implementierung ein.

Oracle SQL-Develper: object MY_TABLE does not exist

Setzt man im SQL-Developer folgendes Desribe-Statement ab:

describe MY_TABLE ;

erhält man nur folgende Fehlermeldung:

ERROR: 
------------------------------------------- 
ERROR: object MY_TABLE  does not exist

Wer jetzt genau hinschaut sieht, dass zwischen dem Tabellennamen und dem Semikolon ein Leerzeichen sich befindet. Sobald man das entfernt läuft auch das Statement sauber durch.

Betrifft Oracle SQL-Developer in Version 4.0.2.15

Adam-Klasse

Neben den bestehenden Anti-Patterns denen man in der großen Welt der Softwareentwicklung begegnet habe ich nun eine neues Antipattern kennengelernt.

Die Adam-Klasse

Die Adamklasse ist wie ein Wunderwaffe gegen unsere alltäglichen Probleme: So wie wir Menschen (geht es nach der biblischen Version) alle von Adam und Eva abstammen, gilt dies auch für diese Art der Programmierung. Die Adamklasse stellt Grundfunktionalitäten für alle übrigen Klassen bereit und jede Klasse des Systems leitet sich von dieser Klasse direkt oder indirekt ab.

ORA-00907: Rechte Klammer fehlt

ORACLE offeriert uns folgende Fehlermeldung:

ORA-00907: Rechte Klammer fehlt
 00907. 00000 - "missing right parenthesis"
 *Cause:
 *Action:
 Error at Line: 4 Column: 15

Es geht hierbei um das nachstehend geannte SQL, deren Sinnhaftigkeit irrelevant ist da das ursprünge SQL deutlich komplexer war, jedoch auf den ersten Blick technich korrekt erscheint – vor allem in Bezug auf die von ORACLE markierte Position:

SELECT *
  FROM users
 WHERE user_id != 100
   AND ( role_id IN (SELECT role_id
                      FROM userroles as r 
                     WHERE role_id NOT IN( 100 ) ) );

Die Analyse ergibt keine Fehler

  • Alle Klammern sind vollständig
  • Das SQL sieht fehlerfrei aus
  • Das Entfernen oder Ersetzen der äußeren IN-Bedingung löst die Fehlermeldung, lässt den Fehler jedoch nicht erkennen

Ursache

In der hier aufgeführten Query wurde ein Alias in der Subquery gesetzt welcher mit einem AS eingeleitet wurde, die von ORACLE jedoch als Tabellenalias nicht unterstützt werden. Die oben genannte Fehlermeldung führt einen nicht zu dem Problem an dieser Stelle.

Lösung

Die Aliaseinleitung AS entfernen und das SQL erneut ausführen.

Weitere mögliche Ursachen

Sollte die von mir geschilderte Problemlösung bei Dir nicht zutreffen kannst Du Deine Query auf folgende Punkte hin überprüfen:

  • Verwendung eines nicht erlaubten ORDER BY einer Subquerys oder innerhalb eines Joins:
SELECT *
  FROM users
 WHERE user_id != 100
   AND ( role_id IN (SELECT role_id
                       FROM userroles
                      WHERE role_id NOT IN( 100 ) 
                      ORDER BY role_id) );
  • Verwendung eines Joins mit Verweis einer Subquery:
...
LEFT JOIN userroles 
  ON userroles.role_id = ( SELECT max(role_id) 
                             FROM userroles )
...

Literatur zu diesem Thema:

Screen auf der Linux-Konsole benutzen

Mittels screen ist man unter Linux in der Lage – verbunden über Putty und eine lange Serverlaufzeit ohne Neustart vorausgesetzt – ein schier endloses Linuxleben in ein und der selben Konsole zu führen.

Dies hat den Vorteil, dass längere Befehlsausführungen in einer eigenen Sitzung laufen können ohne diese Verbindung dauerhaft aufrecht erhalten zu müssen. Auch führt eine gescheiterte Netzwerkverbindung nicht dazu, dass die gesamte Sitzung abgebrochen wird sondern lediglich die Verbindung zu der Screen-Sitzung. Screen auf der Linux-Konsole benutzen weiterlesen

Umstellung mysql auf mysqli

Mit PHP 5.5.0 werden die alten mysql-Funktionen als deprecated markiert und in einer künftigeren – mit dem heutigen Stand jedoch nicht näher spezifizierten Version – gänzlich entfernt. Daher sollte eine Umstellung dessen in den eigenen Projekten mittelfristig eingeplant werden. Dafür habe ich an dieser Stelle eine Umfängliche Schritt-für-Schritt Anleitung zusammengestellt.

MySQL: Das umfassende HandbuchDie Umstellung der mysql_*-Funktionen auf mysqli_*-Funktionen geht relativ reibungslos vonstatten, sofern man eine zentrale Verarbeitung der Datenbankabfragen implementiert hat. Ist dies nicht der Fall so wird sich der hier aufgeführte Aufwand um die Anzahl der zu behandelnden Stellen zuzüglich der notwendigen Tests in ungefähr multiplizieren. Umstellung mysql auf mysqli weiterlesen