• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]Mysql / MariaDB: verschiedeneWege,denServerZuStarten

utopos

Member
Hallo zusammen,

ich betreibe einen Datenbank-Server unter MariaDB (ursprüngliche Installation der Version 5.5.29, inzwischen angehoben auf 5.5.33).
Verbindungen werden nur vom localhost hergestellt und das auch nur sporadisch; daher starte ich den DB-Server auch nicht per cron-Job o.ä., sondern händisch bei Bedarf.

Ich hatte mit folgenden Befehlen auf den Datenbanken gearbeitet:

Code:
michael@kohlhasenbrueck:~> su
Passwort:
kohlhasenbrueck:/home/michael # mysqld_safe --user=michael --log --local-infile &
...
kohlhasenbrueck:/home/michael # exit
michael@kohlhasenbrueck:~> mysql --local-infile
...
quit
michael@kohlhasenbrueck:~> mysqladmin -u root shutdown

Ja, ich konnte offenbar den Server nur mit (System-)Root-Rechten starten, zu meiner Überraschung aber auch ohne solche (nur mit dem DB-Root) herunterfahren.

----

Nun habe ich die Datenbanken eine Zeitlang nicht gebraucht. Inzwischen ist nichts Wesentliches auf dem Rechner geschehen, dass Maria betreffen könnte - außer eventuell Patches/Updates des Betriebssystems und der installierten Programme (openSUSE 12.3)

Nun bin ich nach obigem Schema erneut vorgegangen. Zunächst stieß ich dabei auf ungewohnte Socket-Probleme:
Code:
michael@kohlhasenbrueck:/home/michael> su
Passwort: 
kohlhasenbrueck:/home/michael # mysqld_safe --user=michael --log &
[1] 6125
kohlhasenbrueck:/home/michael # 140520 23:14:45 mysqld_safe Logging to '/var/log/mysql/mysqld.log'.
140520 23:14:46 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140520 23:14:48 mysqld_safe mysqld from pid file /var/lib/mysql/kohlhasenbrueck.pid ended

[1]+  Fertig                  mysqld_safe --user=michael --log
kohlhasenbrueck:/home/michael # exit
exit
michael@kohlhasenbrueck:~> mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysql/mysql.sock' (2)

... die sich aber auf naheliegende Weise anscheinend beheben ließen:

Code:
michael@kohlhasenbrueck:~> mysql --socket=/home/michael/.local/share/akonadi/socket-kohlhasenbrueck/mysql.socket



Daraufhin startete der DB-Client. Ich war jedoch entsetzt, die von mir angelegten Datenbanken nicht mehr zu finden!


Ich habe dann eine Variante ausprobiert, die ich vorher noch nicht verwendet hatte, und zwar mit Erfolg:


Code:
michael@kohlhasenbrueck:~> mysqladmin -u root --socket=/home/michael/.local/share/akonadi/socket-kohlhasenbrueck/mysql.socket shutdown
...
michael@kohlhasenbrueck:~> su
Passwort:
kohlhasenbrueck:/home/michael # rcmysql start
redirecting to systemctl  start mysql
kohlhasenbrueck:/home/michael # exit
michael@kohlhasenbrueck:~> mysql --local_infile
Welcome to the MariaDB monitor.  Commands end with ; or \g.

MariaDB [(none)]> show databases;


... und da waren sie alle, die Datenbanken, die ich früher bereits angelegt hatte!



Meine Fragen:
Was ist hier passiert?
Was ist der Unterschied zwischen den Startbefehlen für den Server?
Und was hat es mit der Socket-Fehlermeldung auf sich?

Vielen Dank im Voraus für Eure Hinweise!

Gruß

Utopos
 

panamajo

Guru
utopos schrieb:
daher starte ich den DB-Server auch nicht per cron-Job
Kein Mensch startet einen Service per crontab
utopos schrieb:
[...]
... die sich aber auf naheliegende Weise anscheinend beheben ließen:
"naheliegend" und "vermutlich" im selben Satz verwenden: FAIL
utopos schrieb:
Code:
michael@kohlhasenbrueck:~> mysql --socket=/home/michael/.local/share/akonadi/socket-kohlhasenbrueck/mysql.socket
Daraufhin startete der DB-Client. Ich war jedoch entsetzt, die von mir angelegten Datenbanken nicht mehr zu finden!

Du startest mit obigen Kommando einen mysql Client für die embedded laufende akonadi DB. In dieser DB befindet sich die akonadi DB und sonst nichts, dass du deine DBs dort nicht findest ist also vollkommen normal.

utopos schrieb:
Code:
kohlhasenbrueck:/home/michael # rcmysql start
redirecting to systemctl  start mysql

... und da waren sie alle, die Datenbanken, die ich früher bereits angelegt hatte!

Meine Fragen:
Was ist hier passiert?
Was ist der Unterschied zwischen den Startbefehlen für den Server?
Und was hat es mit der Socket-Fehlermeldung auf sich?

Wenn du mysql/mariadb nicht automatisch starten lassen willst (wozu es eigentlich keinen Grund gibt, solange sie nicht genutzt werden ist der Ressourcenverbrauch minimal) dann verwende bitte:
Code:
sudo systemctl start mysql

Die anderen Varianten starten entweder nicht das was du starten willst oder dies nicht mit den Rechten die benötigt werden (was früher oder später zu ganz hässlichen Problemen führt).
 
OP
U

utopos

Member
panamajo schrieb:
utopos schrieb:
Code:
michael@kohlhasenbrueck:~> mysql --socket=/home/michael/.local/share/akonadi/socket-kohlhasenbrueck/mysql.socket

Du startest mit obigen Kommando einen mysql Client für die embedded laufende akonadi DB. In dieser DB befindet sich die akonadi DB und sonst nichts, dass du deine DBs dort nicht findest ist also vollkommen normal.

Autsch. Ja, das war blöde.
Vielleicht sollte ich ergänzen, wie es dazu kam:
Da mysqld meckert, dass es kein Socket findet, habe ich einfach einmal überall nach Dateien mit einem ähnlichen Namen gesucht - und ausschließlich obiges Socket gefunden. So erklärt sich übrigens auch meine Formulierung, an der Du Anstoß genommen hast: Meine Reaktion war in meinen Augen "naheliegend" (Server schreit nach Socket, ich gebe ihm das einzige, das ich finde) - und das Problem löste es aber nur "vermutlich" (bzw. nicht, wie ich inzwischen weiß).


panamajo schrieb:
Wenn du mysql/mariadb nicht automatisch starten lassen willst (wozu es eigentlich keinen Grund gibt, solange sie nicht genutzt werden ist der Ressourcenverbrauch minimal) dann verwende bitte:
Code:
sudo systemctl start mysql

Die anderen Varianten starten entweder nicht das was du starten willst oder dies nicht mit den Rechten die benötigt werden (was früher oder später zu ganz hässlichen Problemen führt).

Was ist denn genau der Unterschied zwischen den Befehlen?
Und wie kann es sein, dass ein Befehl, der einmal funktioniert, jetzt etwas anderes tut?

Mein großes Problem zu verstehen, was hier eigentlich passiert ist, besteht anscheinend darin, dass ich bezüglich Datenbanken bzw. speziell MySQL nicht verstehe, was genau die Sockets bedeuten bzw. welche es gibt oder geben muss ...
 

spoensche

Moderator
Teammitglied
utopos schrieb:
Was ist denn genau der Unterschied zwischen den Befehlen?
Und wie kann es sein, dass ein Befehl, der einmal funktioniert, jetzt etwas anderes tut?

Du meinst den Unterschied zwischen
Code:
rcmysqld
und
Code:
sudo systemctl start mysql
oder?

/usr/sbin/rcmysqld ist ein symbolischer Link der auf das eigentliche Initscript /etc/init.d/mysqld verweist und stammt noch aus der Zeit des SystemV Initsystems. Der zweite Befehl verwendet das neue Initsytem Systemctl, dass als Parameter den Namen des Jobs bzw. Tasks erwartet, den es starten soll.

utopos schrieb:
Mein großes Problem zu verstehen, was hier eigentlich passiert ist, besteht anscheinend darin, dass ich bezüglich Datenbanken bzw. speziell MySQL nicht verstehe, was genau die Sockets bedeuten bzw. welche es gibt oder geben muss ...

Ist vom Prinzip her eigentlich recht simpel. Du willst gerne mit der hübschen Nachbarin von gegenüber sprechen, aber da keine Strasse, sondern nur ein sehr tiefer Graben vorhanden ist kannst du ihr deinen Gesprächsstoff nicht übermitteln. Da du ja pfiffig bist, legst du einfach einen Socket über den Graben und kannst so dann zur Nachbarin und ihr deinen Gesprächsstoff übermitteln.

In der selben Lage befindet sich der MySQL-Client, weil er dem Server ja unbedingt was mitteilen möchte und der sich sonst zu Tode langweilende Server hat quasi mitgedacht und mit dem Socket einen Weg bereitgestellt damit der Client ihm was erzählen kann.
Der MySQL Server Prozess muss für den Client erreichbar sein, damit der Client seine Anfragen absetzen kann.

Wie es in der Welt halt so ist, gibt es ja viele Nachbarinnen, mit der sich der ein oder andere sehr gerne mal unterhalten möchte und der Socket dies ermöglicht..
Daher gibts auf einem System auch mehrere Sockets, die aber unterschiedliche Eigentümer haben und Zugriffsrechte haben, damit eben nicht jeder darauf zugreifen kann.
 
OP
U

utopos

Member
spoensche schrieb:
/usr/sbin/rcmysqld ist ein symbolischer Link der auf das eigentliche Initscript /etc/init.d/mysqld verweist und stammt noch aus der Zeit des SystemV Initsystems. Der zweite Befehl verwendet das neue Initsytem Systemctl, dass als Parameter den Namen des Jobs bzw. Tasks erwartet, den es starten soll.

Aha, das bringt schon etwas Licht ins Dunkel.
Gehören die Aufrufe mysqld und mysqld_safe dann also auch in die alte (veraltete) Welt?
Bisher hatte ich nur den letzteren verwendet; rcmysqld funktioniert auf meinem Rechner gar nicht (Befehl nicht gefunden), und rcmysql start verweist ja, wie oben dargestellt, auf das vorgeschlagene systemctl start mysql.

Und ist mysqladmin von dieser Frage nicht betroffen, also immer noch zur Anwendung empfohlen?


spoensche schrieb:
Ist vom Prinzip her eigentlich recht simpel. Du willst gerne mit der hübschen Nachbarin von gegenüber sprechen [...]

Ja, danke - ich denke, abstrakt verstehe ich schon in etwa, was ein Socket sein soll.
Konkret aber habe ich nicht nur gar kein Auto, sondern verstehe vor allem nicht, wie die obigen Fehlermeldung zu Stande kam.

Um mich heranzutasten, habe ich den Server, wie vorgeschlagen, mit systemctl gestartet, und über mysqladmin variables den Pfad des Sockets nachgesehen.
Dort trug sich dann Folgendes zu:
Code:
kohlhasenbrueck:~ # l /var/run/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0  3. Jun 23:39 /var/run/mysql/mysql.sock=
kohlhasenbrueck:~ # mysqladmin shutdown
kohlhasenbrueck:~ # l /var/run/mysql/mysql.sock
ls: Zugriff auf /var/run/mysql/mysql.sock nicht möglich: Datei oder Verzeichnis nicht gefunden
Den gleichen Befund erziele ich mit dem Aufruf von mysqld_safe.
Wie also kann das die Fehlermeldung verursachen?



panamajo schrieb:
Wenn du mysql/mariadb nicht automatisch starten lassen willst (wozu es eigentlich keinen Grund gibt, solange sie nicht genutzt werden ist der Ressourcenverbrauch minimal)

Damit meinst Du wahrscheinlich

Code:
kohlhasenbrueck:~ # chkconfig --add mysql

oder?
 

panamajo

Guru
utopos schrieb:
Gehören die Aufrufe mysqld und mysqld_safe dann also auch in die alte (veraltete) Welt?
Bisher hatte ich nur den letzteren verwendet; rcmysqld funktioniert auf meinem Rechner gar nicht (Befehl nicht gefunden), und rcmysql start verweist ja, wie oben dargestellt, auf das vorgeschlagene systemctl start mysql.
rcmysqld liegt in /usr/sbin, vmtl. hat der normale User das Verzeichnis nicht im PATH, deshalb "nicht gefunden". Deshalb der Befehl "sudo"

utopos schrieb:
Wie also kann das die Fehlermeldung verursachen?
Welche Fehlermeldung genau? spoensche hatte eine Vermutung, ist aber bisher unbestätigt.

utopos schrieb:
Damit meinst Du wahrscheinlich
Code:
kohlhasenbrueck:~ # chkconfig --add mysql

Ja, gleichbedeutend mit
Code:
# insserv -d mysql
oder
Code:
# systemctl enable mysql
 
OP
U

utopos

Member
Damit wir nicht den Überblick verlieren, sortiere ich einmal nach Fragen:

I. Automatischer Start:

Vielen Dank, panamajo!
Aber wie gibt man dem Startskript Optionen mit wie --local_infile?


II. Richtiger händischer Start:

Alt:
Code:
/usr/sbin/rcmysqld
/etc/init.d/mysqld
Hierzu gehören dann wohl auch mysqld_safe, mysql.server (Varianten von mysqld).

Neu:
Code:
rcmysql start
systemctl start mysql


Auch hier wieder die Frage: Wie gebe ich einem Befehl wie
systemctl start mysql
eine Option wie --local_infile mit?

(Übrigens hatte ich die letzten Versuche komplett als root gestartet, wir können also Kleinigkeiten um bin und sbin ignorieren.)



III. Fehlermeldung:

Wie kann es zu der Fehlermeldung wegen fehlendem Socket und so im ersten Beitrag kommen?
Über mysqld_save habt Ihr ja noch nichts konkret Negatives gesagt; auch wenn der Befehl veraltet sein sollte, erschließt sich mir nicht, dass er die Datenbanken nicht mehr findet, die ich zuvor damit angelegt hatte.


Hättet Ihr da noch Hinweise für mich?
 

panamajo

Guru
utopos schrieb:
Aber wie gibt man dem Startskript Optionen mit wie --local_infile?
Globale Konfigurationseinstellungen gehören nach /etc/my.cnf
IIRC ist --local-infile nicht nötig da per default zugelassen.
utopos schrieb:
Alt:
Code:
/usr/sbin/rcmysqld
/etc/init.d/mysqld

Neu:
Code:
rcmysql start
systemctl start mysql
Nope. Was hier im Forum zwischen alt und neu unterschieden wird hängt mit dem Startmechanismus von Services/deamons bei openSUSE zusammen. Alt ist in diesem Kontext SYSV, neu systemd. Ab 13.1 gilt systemd ohne Alternative.

In Kürze:
Alt: rc$service (start|stop|restart|reload|status)
Neu: systemctl (start|stop|restart|reload|status) $service

utopos schrieb:
Über mysqld_save habt Ihr ja noch nichts konkret Negatives gesagt; auch wenn der Befehl veraltet sein sollte, erschließt sich mir nicht, dass er die Datenbanken nicht mehr findet, die ich zuvor damit angelegt hatte.
Du solltest dich mit Client/Server Architektur beschäftigen, denn damit hast du es zu tun.
 
OP
U

utopos

Member
panamajo schrieb:
Globale Konfigurationseinstellungen gehören nach /etc/my.cnf
IIRC ist --local-infile nicht nötig da per default zugelassen.

OK. Für meine Zwecke ist das angenehm.

panamajo schrieb:
In Kürze:
Alt: rc$service (start|stop|restart|reload|status)
Neu: systemctl (start|stop|restart|reload|status) $service

OK, rcmysql gehört genauso nach oben.
Wie steht es dann mit mysqld bzw. mit mysqld_safe?

panamajo schrieb:
Du solltest dich mit Client/Server Architektur beschäftigen, denn damit hast du es zu tun.

Der Server muss laufen, damit der Client mit ihm sprechen kann.
Das tun sie über ein Socket.
Aber warum ändert sich der Ort, an dem der Socket liegt?
Was fehlt hier?

Auch für einen Hinweis auf eine gute Beschreibung der Infrastruktur speziell bei Mysql/MariaDB wäre ich dankbar.
 

panamajo

Guru
utopos schrieb:
Wie steht es dann mit mysqld bzw. mit mysqld_safe?
Das sind die Befehle die vom jwlg. init System verwendet werden um den Service MySQL bzw. MariaDB zu starten. Genauer gesagt startet mysqld_safe per Default mysqld als mysql User.
Wenn man nicht irgendwas ganz spezielles machen will (Beispiel akonadi: embedded DB die nur per Socket angesprochen wird) sollte man die gar nicht benötigen, systemctl start mysql liest die Konfiguration in /etc/my.cnf ein und startet dann entsprechend.
 
Oben