Opensuse 12.2 – mysql, logrotate error

Vor einigen Tagen habe ich den Mysql-Community-Server über das entsprechende Opensuse “Database”-Repository upgedated. Seitdem erhalte ich beim Systemstart Meldungen der Art

Nov 15 18:30:04 myserver logrotate: ALERT exited abnormally with [1]
Nov 15 18:30:04 myserver logrotate: #007/usr/bin/mysqladmin: refresh failed; error: ‘Unknown error’
Nov 15 18:30:04 myserver logrotate: /logrotate.d/mysql failed, probably because
Nov 15 18:30:04 myserver logrotate: the root acount is protected by password.
Nov 15 18:30:04 myserver logrotate: See comments in /logrotate.d/mysql on how to fix this
Nov 15 18:30:04 myserver logrotate: error: error running non-shared postrotate script for /var/log/mysql/mysqld.log of ‘/var/log/mysql/mysqld.log ‘

Diese Meldung erhalte ich, obwohl es unter dem “/root”-Verzeichnis die notwendige “/root/.my.cnf”-Datei mit den Account-/Passwort-Daten für den MySQL-Admin (MySQL root-Account) gibt. Die Fehlermeldung führt einen daher in die Irre.

Der Fehler liegt wohl eher im Startup-Skript “/etc/init.d/mysql” für den MySQL-Server.

Das habe nicht ich herausgefunden sondern Archie Cobbs, der das bei Novell als Bug eingestellt hat.

Siehe :
http://lists.opensuse.org/opensuse-bugs/2012-11/msg01186.html
und
https://bugzilla.novell.com/show_bug.cgi?id=789263

Dort findet man auch den notwendigen Hinweis, wie man das Startup-Skript abändern muss, damit Logrotate wieder funktioniert:

The bug is in the line “chmod 660 $log_dir”.
That should be “chmod 770 $log_dir”.

Scheint rechtemäßig logisch zu sein und hat bei mir funktioniert.

MySQL – Sortierung in UNION Statements

Heute sind meine Frau und ich über ein kleines My-SQL-Problem gestolpert. Wir hatten ein Statement der Art

( SELECT …. ORDER BY …) UNION (SELECT ….. ORDER BY … )

Wir waren beide der Meinung, dass das zusammengesetzte Ergebnis pro Einzelresultset die jeweils gewünschte Sortierung aufweisen würde. Das war aber leider nicht der Fall !

Dabei hatten wir bereits früher ähnliche Statements verwendet, in denen die Sortierung funktionierte! Wir hatten jedoch eine bedeutsame Kleinigkeit übersehen. Unsere früheren Statements waren nämlich von der Art:

( SELECT …. ORDER BY … LIMIT .. ) UNION (SELECT ….. ORDER BY … LIMIT …. )

Der Unterschied liegt in der Vorgabe von LIMIT, also der Begrenzung der jeweiligen Teil-Resultsets im UNION-Statement. Wir haben dann ein wenig herumprobiert und herausgefunden, dass eine LIMIT-Vorgabe tatsächlich erforderlich ist, wenn beide (oder mehrere) Resultsets separat sortiert und danach zum Union-Resultset zusammengefügt werden sollen.

Offenbar ignoriert der MySQL-Optimizer die ORDER-Statements der Teil-Selects, wenn die einzelnen Resultsets nicht explizit begrenzt werden.

Somit stehen einem wohl zwei Arten zur Verfügung, wei man ein UNION-Resultset ordnen kann:

  • Variante 1 – separate Sortierung der Einzel-Resultsets :

        ( SELECT …. ORDER BY … LIMIT … ) UNION (SELECT ….. ORDER BY … LIMIT … )

  • Variante 2 – Sortierung des Gesamt-Resultsets :

        ( SELECT …. ) UNION (SELECT …. ) ORDER BY ….

Hinweise:
Die Klammerung ist mindestens im zweiten Beispiel von ausschlaggebender Bedeutung.
Klar auch, dass dabei die Felder der Einzel-Selects identisch sein sollten.

Links:
In einigen MySQL-Foren findet man tatsächlich auch entsprechende Hinweise. Man sollte da doch öfter mal reinschauen:

http://www.mysqlfaqs.net/mysql-faqs/Funtions-and-Operators/How-does-union-work-in-MySQL
http://forums.mysql.com/read.php?10,412000,412000

Lokale MySQL-/PhpMyAdmin-Installation

Als IT-Mensch ist man oft unterwegs und möchte gerne die Zeit mit seinem Laptop für Entwicklungsarbeiten benutzen – in meinem Fall für LAMP-Applikationen. Für derartige Web-Applikationen benötigt man auf einem solchen lokalen Test- und Entwicklungssystem neben einem Apache-Web-Server i.d.R. auch einen lokalen Datenbankserver, den man dann eventuell mit PhpMyAdmin verwalten will. Ich gebe hier ein paar kurze Hinweise zur Installation von MySQL unter Opensuse 11.3. Wir besprechen hier nur die einfachst mögliche Installation. Sind keine speziellen Anforderungen gegeben, reicht das für Entwicklertests vieler einfacher Anwendungen schon aus.

PhpMyAdmin und vermutlich auch die zu testenden PHP-Applikationen erfordern einen bereits vorhandenen Web-Server mit PHP-Modul. Wie man sich den verschafft, habe ich in einem früheren Beitrag dargestellt.

https://linux-blog.anracom.com/2010/07/25/lokaler-apache-test-server-fur-php5/

MySQL-Installation

Die MySQL-Installation unter Opensuse 11 ist mit Yast recht einfach. Für den Server und einige nützliche Tools habe ich folgende Pakete aus dem Standard-SuSE-Repository installiert. (Für aktuellere Versionen und Varianten von MySQl werfe man bei Bedarf einen Blick in folgendes Repository: http://download.opensuse.org/repositories/server:/database/openSUSE_11.3/ )

  • mysql-community-server
  • mysql-community-server-client (!)
  • libmysqlclient16
  • libmysqlclient_r16
  • libmysqld0
  • libqt4-sql-mysql
  • php5-mysql
  • mysql-administrator
  • mysql-gui-tools
  • mysql-query-browser
  • mysql-workbench
  • mytop
  • qt3-mysql
  • perl-DBD-mysql

Nachtrag 20.04.2011:
Die Funktionalität des Pakets “mysql-administrator” ist mittlerweile im Paket “mysql-workbench” aufgegangen. Unter Opensuse 11.4 existiert das Paket “mysql-administrator” deswegen nicht mehr.

(Nebenbei: Man achte auf die feine Unterscheidung in der Paketbezeichnung, die mit der Übernahme von Sun durch Oracle Einzug gehalten hat. Es heißt jetzt an zwei Stellen : community. Ein Synonym für künftig eingeschränkte Funktionalität? Ich ahne schon, dass ich mich bald wieder intensiv mit Postgres auseinandersetzen werde. Überhaupt tauchen Oracle-Embleme inzwischen an jeder Ecke im Linux-System auf. Da merkt man erst, was wir möglicherweise mit Sun verloren haben. Aber das ist ein Thema für sich …. ).

Die genannten Pakete ziehen unter Yast ggf. die Installation weiterer benötigter Pakete nach sich.

Nachtrag – 10.06.2012:
Inzwischen hat ja unter Opensuse 12.3 die Maria DB den MySQL Community Server von Oracle ersetzt. Die Paketliste ändert sich dann in etwa wie folgt. Ich gebe auch einige Pakete an, die vielleicht nicht jeder unbedingt braucht; das hängt davon ab, welche andere SW auf die MySQL-DB zugreifen soll.

  • mariadb
  • mariadb-client
  • mariadb-errormessages
  • mariadb-tools
  • libmysqld18
  • libmysqlclient18
  • libqt4-sql-mysql
  • qt3-mysql
  • mysql-workbench
  • mysql-community-server-errormessages
  • libmysqlcppconn6
  • libgda-3_0-mysql
  • php5-mysql
  • php5-pear-DB
  • perl-DBD-mysql
  • python-mysql
  • libreoffice-base-drivers-mysql
  • mytop

MySQL-Root-Account

Nach der Installation startet man den Datenbankserver unter Opensuse mit ”
rcmysql start”. Der Administrator-Account für die MySQL-Datenbank muss nun gesichert werden, damit nicht jeder Zugriff auf die Verwaltung des Datenbanksystems hat. Das erforderliche MySQL-Root-Passwort setzt man auf der Kommandozeile mit

# mysqladmin   -u   root    password    ‘ein_passendes_Passwort’

(Die Anführungszeichen sind ernst zu nehmen. Der ‘root’-User für MySQL ist übrigens nicht mit dem Linux-System-Verwalter-Account zu verwechseln!).

Nachtrag – 20.04.2011:
Ist der eigene PC/Server benannt und einer Domaine zugeordnet – etwa als “mytux.mydomain.de” -, sollte man zusätzlich

mysqladmin   -u    root    -h    mytux.mydomain.de    password    ‘ein_passendes_Passwort’    -p

ausführen. Man wird dabei nach dem zuvor angegebenen MySQL-Root-Passwort gefragt.

Nachtrag – 10.06.2013:
Unter Opensuse kommt es dabei oft zu einem Fehler der Art “Host ‘mytux.mydomain.de’ is not allowed to connect to this MySQL server”. Ursache ist, dass der Servername nicht in voll qualifizierter Form in die zentrale Tabelle ‘user’ der MySQL-DB eingetragen wurde. Man korrigiert das wie folgt:

# mysql -u root -p
Enter Password :

mysql> use mysql;

mysql> update user set host=”mytux.mydomain.de” where host=”mytux”;
mysql> flush privileges;
mysql> exit;
# mysqladmin   -u    root    -h    mytux.mydomain.de    password    ‘ein_passendes_Passwort’    -p

Alle nachfolgenden Verwaltungsaufgaben – wie die Anlage neuer User und deren Zugriffsrechte von verschiedenen Arbeitsstationen aus – kann man danach mit dem Kommandozeilentool “mysqladmin” oder mit dem grafischen Tool “MySQL Administrator”
/usr/bin/mysql-administrator
durchführen.

Nachtrag – 10.06.2013:
“mysql-administrator” ist als separates Tool seit Opensuse 11.4 verschwunden. Unter aktuellen SuSE-Versionen benutzt muss man dann die Admin-Tools der grafischen “mysql-workbench”, die man per

# mysql-workbench &

aufruft.

Letzteres Tool bietet sich für umfassendere Konfigurationsarbeiten bzgl. der Datenbank als (System-) root an, da die Hauptkonfigurationsdateien

“/etc/my.cnf”
“/etc/mysqlaccess.conf”

aus Sicherheitsgründen nur für root schreibbar angelegt werden.

Hinweis: Will man sich den “MySQL Administrator” graphisch auf die eigene KDE-Useroberfläche oder in den “Arbeitsflächen-Ordner” legen, so gibt man in der Konfiguration des Plasma-Icons als Programmaufruf

“/usr/bin/xdg-su   -c   /usr/bin/mysql-administrator”

an – um den grafischen sudo-Berechtigungsdialog für die Eingabe des root-passwords auf den Schirm zu bekommen. Ähnliches gilt für die Workbench.

Das Kommandozeilentool “mysql” ruft man über

mysql   -u   root    -p

auf und gibt dann danach das oben gesetzte MySQL-root-Passwort ein.

Für einen lokalen Testserver ist das oben Beschriebene als Ausgangsbasis für weitere Arbeiten (Anlegen und Konfiguration der benötigten Datenbanken und Tabellen) hinreichend. Für eine Produktiv-Umgebung sollte man besser eine “secure installation” durchführen. Genaueres dazu findet man unter den Links am Ende des Artikels.

Minimale PhpMyAdmin-Installation

Für unseren
lokalen Testserver wollen wir nun PhpMyAdmin installieren. Auch hier besprechen wir nur die einfachst mögliche Implementierung. Voraussetzung ist, dass auf dem Apache-Server PHP5 installiert ist.

Zunächst prüfen wir, dass zusätzlich folgende Pakete installiert sind:

  • php5-mysql
  • php5-zip
  • php5-bz2
  • php5-mcrypt
  • mcrypt

und bei Bedarf ggf.

  • php5-pear
  • php5-pear-Crypt_Blowfish

Dann laden wir uns von der Seite

http://www.phpmyadmin.net/home_page/downloads.php

phpMyAdmin-3.3.5-all-languages.tar.gz

herunter und entpacken die Dateien in einem lokalen Verzeichnis. Wir gehen davon aus, dass unser lokaler Webserver ein DocumentRoot-Verzeichnis

/srv/www/htdocs

und eine zugehörige Default-Domaine aufweist. Wir legen nun ein Verzeichnis

/srv/www/htdocs/phpmyad

an und kopieren dorthin den Inhalt (!) des vorher aus dem tar-Archiv erzeugten Verzeichnisses “phpMyAdmin-3.3.4-all-languages”.

Danach legen wir ein Verzeichnis

/srv/www/htdocs/phpmyad/config

an und machen es temporär für die Welt schreibbar

chmod 757 /srv/www/htdocs/phpmyad/config

Nun öffnen wir einen lokalen Browser und geben als Adresse an

http://localhost/phpmyad/setup

Auf der neuen Seite drüken wir den Button “Neuer Server”. Im folgenden Dialog “Grundeinstellungen” lassen wir alles unverändert (u.a. den Hostnamen auf “localhost” ) und wählen als Auth-Typ “cookie”. Wir wechseln nun zum Reiter “Serverkonfiguration” und erlauben dort den “root”-Login, damit wir danach Datenbanken anlegen können. Wir speichern dann die Einstellungen. Auf der folgenden Seite wählen wir ggf. “Deutsch” als voreingestellte Sprache und speichern erneut. Wir drücken nun abschließend den Knopf “Laden”.

Im nachfolgenden Schritt kopieren wir die frisch erzeugte config-Datei in das phpmyad-Verzeichnis:

  cp         /srv/www/htdocs/phpmyad/config/config.inc.php          /srv/www/htdocs/phpmyad/

Danach geben wir im Browser ein

http://localhost/phpmyad/

Im nachfolgenden Dialog authentifizieren wir uns als “root” (dies ist der mySQL-root-user) mit dem Passwort, das wir oben am Ende der MySQL-Installation vergeben hatten. Danach sollte die PhpMyAdmin-Oberfläche auftauchen. Nun können wir auf einfache Weise evtl. vorhande Datenbanken importieren, User dazu anlegen und die benötigten Rechte vergeben !

Hinweis:
Die Warnungen und Informationen zur sicheren Verbindung und zur Deaktivierung bestimmter Möglichkeiten sollten uns nachdenklich machen und zu weiteren Arbeiten anregen. Für einen lokalen Testserver ist das ggf. nicht wichtig – wohl aber in Produktivumgebungen! In diesem Beitrag sparen wir uns aber eine Vertiefung.

Abschließender Schritt: Die Schreibrechte auf dem Verzeichnis “config” entfernen wir aus Sicherheitsgründen wieder.

Nachtrag 10.06.2012:
Für aktuelle Versionen von phpMyAdmin geht die Installation in praktisch identischer Weise vor sich. Allerdings will man nach kurzer Zeit sicher die Einstellungen zur aktuellen GUI individualisieren – u.a. weil die zusätzlichen Textangaben zu den Icons viel zuviel Platz wegnehmen. Das nervt total.

Um das in den neuesten Versionen zu erreichen, muss man zusätzliche “config”-Verwaltungstabellen und einen “control user” anlegen. Letzterer muss dann passende Berechtigungen bekommen. Ferner
sind Einträge in der Datei “config.inc.php” zu ergänzen. Zum Anlegen der Verwaltungstabellen kann man die entsprechenden SQL-Statements über ein File “examples/create_tables.sql” importieren. Das File liegt unter dem Wurzelverzeichnis der phpmyadmin-Installation – im oben beschriebenen Fall also unter

/srv/www/htdocs/phpmyad/examples/create_tables.sql

Beschrieben ist das Vorgehen u.a. in folgenden Beiträgen:
http://docs.phpmyadmin.net/en/latest/setup.html#phpmyadmin-configuration-storage
und hier:
http://docs.phpmyadmin.net/en/latest/setup.html#using-authentication-modes
sowie hier:
http://stackoverflow.com/questions/11506224/connection-for-controluser-as-defined-in-your-configuration-failed-phpmyadmin-xa

Der letzte Beitrag fasst netterweise die erforderlichen Schritte zusammen.

Bei der Änderung der “config.inc.php” sind sowohl der “control user” und sein Passwort als auch diverse Tabellennamen der Datenbank “phpmyadmin” für den jeweiligen Server einzutragen. Diese Datenbank wurde beim Import der Datei “examples/create_tables.sq” angelegt.

Bitte beachtet bei den Ausführungen zur “config.inc.php” im letzten Link, dass die Tabellennamen inzwischen einen doppelten Unterstrich nach dem “pma” aufweisen! Also jeweils “pma__” und nicht “pma_” !
Wie die Tabellennamen unter der Datenbank “phpmyadmin” >> “pma_db” in der jeweiligen phpMyAdmin-Installation tatsächlich genau aussehen, prüft man am besten mit phpMyAdmin selbst.

Das ganze Theater bzgl. der GUI-Verwaltung ist aus meiner Sicht zu komplex gemacht. Vielleicht beschreibe ich das mal im Detail in einem eigenen Artikel.

Links

http://de.opensuse.org/MySQL
http://de.opensuse.org/Apache/SSL,_MySQL_und_PHP
http://www.susegeek.com/internet-browser/install-configure-lamp-apachemysqlphp-in-opensuse-110/
http://dev.mysql.com/doc/refman/5.1/de/installing.html
http://dev.mysql.com/doc/refman/5.1/de/default-privileges.html
http://www.howtoforge.com/perfect-server-opensuse11-p4
http://www.unixmen.com/linux-tutorials/237-install-lamp-in-openuse-110-and-111