MySQL Datenbankserver


In vielen Linux Distributionen sind MySQL Pakete schon in den Quellen enthalten. Es ist jedoch auch möglich, die aktuellen Orginalpakete von mysql.com herunterzuladen und zu installieren. Dabei sollte man sich dann auf jeden Fall um die Updates kümmern.

Die MySQL Datenbank gibt es in einer freien Community und einer kostenpflichtigen Enterprise Variante. Entwickelt wurde das Datenbanksystem von MySQLAB und wurde im Jahr 2008 von Sun übernommen. MySQL gehört seit der Übernahme von Sun 2010 jetzt Oracle.

MySQL Kommandos sollten wegen der besseren Lesbarkeit groß geschrieben werden und enden immer mit einem Semilikon(;).



Installation


Benötigte Pakete der verschiedenen Distributionen.

  • Debian ⇒ mysql-common, mysql-server, mysql-client
  • Red Hat ⇒ mysql-server, mysql
  • SuSE ⇒ mysql-shared, mysql, mysql-client




Möchte man datenbankbasierte Webanwendungen mit MySQL und PHP benutzen, sollte noch folgendes Paket installiert werden.

  • Debian ⇒ php5-mysql




Nach der Installation von MySQL kann sich jeder mit dem Benutzernamen „root“ und einem leeren Passwort am MySQL-Server anmelden. Es wird empfohlen nach der Installation ein „root“ Passwort für MySQL zu setzen! (MySql Benutzerverwaltung). Bei einer Installation aus den Debian Quellen wird mit einem Dialogfeld danach gefragt.





MySQL Dienst starten / stoppen


Der MySQL Daemon muß je nach Distribution, über init oder systemd (manuell) gestartet werden. Bei Debian wird der MySQL Daemon nach der Installation und einem Neustart des Systems standardmäßig mit gestartet.



MySQL via init-V System steuern

Folgende Beispiele zeigen den Start und Stop Befehl des MySQL Servers über die init Prozessverwaltung, wie Sie z.B. von Debian bis zur Version 7 (Wheezy) oder BSD Systemen eingesetzt wird.

root@home:~# /etc/init.d/mysql start
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..



root@home:~# /etc/init.d/mysql stop
Stopping MySQL database server: mysqld.





MySQL via systemd System steuern

Das steuern des MySQL Servers funktioniert mit den Befehlen:

[root@home ~]# service mysqld start
MySQL starten:                                             [  OK  ]



[root@home ~]# service mysqld status
mysqld (PID 2457) wird ausgeführt...



[root@home ~]# service mysqld stop
MySQL beenden:                                             [  OK  ]




Systemd wird z.B. bei RedHat und bei Debian seit Version 8 (Jessie) verwendet.



Konfigurationsdateien


Die Konfigurationsdateien von MySQL befinden sich je nach Distribution oder Installation in den folgenden Dateien:

  • Debian ⇒ /etc/mysql/my.cnf
  • Red Hat ⇒ /etc/my.cnf




Beispiel my.cnf (Debian ):

Anzeigen

Ausblenden

#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
# 
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
language        = /usr/share/mysql/english
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
#
# * Fine Tuning
#
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# Here you can see queries with especially long duration
#log_slow_queries       = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                        = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem



[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer              = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/





Beispiel my.cnf (Red Hat ):

Anzeigen

Ausblenden

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid




Die Konfigurationsdatei ist dabei in Abschnitte gegliedert, z.B.:

  • [client] ⇒ Konfiguration für alle MySQL Clients.
  • [mysqld] ⇒ Konfiguration des MySQL-Servers.




port:
Der Port, auf dem der MySQL-Server lauscht. Standardmäßig ist das der Port 3306.


old_passwords:
Die Einstellung old_passwords=1 speichert interne Passwörter wie in MySQL Version < 4 und dient der abwärts Kompatibilität für ältere MySQL Anwendungen, stellt jedoch ein erhebliches Sicherheitsrisiko dar. Nach Möglichkeit sollte diese Zeile auf old_passwords=0 gesetzt oder ganz auskommentiert werden.


bind-address:
Zeigt von welchen Netzwerkverbindungen ein Zugriff zum MySQL-Server möglich ist. Wird der MySQL-Server nur von lokalen Programmen wie z.B. PHP genutzt, sollte bind-address = 127.0.0.1 eingestellt werden, dadurch kann der MySQL-Server nur Verbindungen zum lokalen Rechner aufnehmen.


skip-networking:
Diese Einstellung verhindert jeden Netzwerkzugang zum MySQL-Server, selbst Verbindungen durch den lokalen Rechner. Eine Verbindung ist nur noch für lokale Programme möglich, die über eine Socket Datei mit dem MySQL-Server kommunizieren (PHP oder C Programme). Programme die über TCP/IP (z.B. Java Programme) können den MySQL-Server nicht nutzen.


datadir:
Das Verzeichnis indem MySQL die Datenbanken speichert. Standardmäßig im Verzeichnis „/var/lib/mysql“. Dies kann man auch ändern, es sollte dabei beachtet werden, dass der MySQL-Server im neuen Verzeichnis auch schreiben darf (700, Besitzer und Gruppe mysql).


Sollte sich der MySQL-Server danach nicht starten lassen, liegt dies manchmal an den Profil-Einstellungen von AppArmor(Debian/Ubuntu). In der Datei „/etc/apparmor.d/usr.sbin.mysqld“ sollte dann das neue Verzeichnis eingetragen werden.



..
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
..





MySql Benutzerverwaltung


Die Verwaltung von Nutzernamen und Passwörter von MySQL und Linux sind vollkommen voneinander getrennt. Auch in MySQL existiert der Benutzer root und sollte abgesichert werden.

Da für Nutzer des lokalen Rechners zwei Kommunikationswege, über eine Socket Datei oder das TCP/IP Protokoll, zur Verfügung stehen kann ein „root“ Passwort einmal für „localhost(Socket Datei)“ und „rechnername.domain(TCP/IP)“ vergeben werden.


Passwort setzen für localhost(Socket Datei):

[root@home ~]# mysqladmin -u root password '****'




Passwort setzen für rechnername(TCP/IP):

[root@home ~]# mysqladmin -u root -h rechnername password '****'




Tritt hier eine Fehlermeldung auf, könnten die Netzwerkverbindungen in der Datei „my.cnf“ deaktiviert sein oder Linux und MySQL sind sich über den Rechnernamen nicht einig.




Sollte in der „my.cnf“ Datei der Netzwerkzugriff deaktiviert sein (bind-address=127.0.0.1 oder skip-networking), ist es nicht mehr möglich, mit „mysqladmin“ das Passwort zu verändern.


Wird dabei die Fehlermeldung „Host xxx is not allowed to connect to this MySQL server“ angezeigt, gibt es einen Konflikt zwischen der in der MySQL internen Zugriffsdatenbank(Rechnername wird ohne Domain gespeichert) und der Zugriffsprüfung, da hier der Rechnername mit Domain verwendet wird. Dies hängt auch von der Netzwerkkonfiguration des Nameservers oder der „/etc/hosts“ Datei ab.


Um dieses zu lösen muß der „rechnername“ in „rechnername.domain“ geändert werden.


[root@home ~]# mysql -u root -p
Enter password: ***
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
...



mysql> SELECT user, host, password FROM mysql.user;
+------+-----------------+------------------+
| user | host            | password         |
+------+-----------------+------------------+
| root | localhost       | 5d64f420187b1bb1 | 
| root | rechnername     |                  | 
+------+-----------------+------------------+



mysql> UPDATE mysql.user SET host="rechnername.domain" WHERE host="rechnername";
Query OK, 1 rows affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0



mysql> SELECT user, host, password FROM mysql.user;
+------+------------------------+------------------+
| user | host                   | password         |
+------+------------------------+------------------+
| root | localhost              | 5d64f420187b1bb1 | 
| root | rechnername.domain     |                  | 
+------+------------------------+------------------+



mysql> FLUSH PRIVILEGES;
mysql> exit

Anschließend das Kommando wiederholen.

[root@home ~]# mysqladmin -u root -h rechnername.domain password '****'





Anonyme MySql Benutzer


Es kann je nach Distribution auch vorkommen, dass es anonyme MySQL Nutzer gibt. Dies bedeutet, jeder kann sich mit einem beliebigen Nutzernamen am MySQL-Server anmelden, hat jedoch sehr wenig Rechte.


Zu erkennen sind anonyme Nutzer, indem die Spalte user leer ist.

mysql> SELECT user, host, password FROM mysql.user;
+------+--------------------+------------------+
| user | host               | password         |
+------+--------------------+------------------+
| root | localhost          | 5d64f420187b1bb1 | 
| root | rechnername.domain | 5d64f420187b1bb1 | 
|      | localhost          |                  | 
|      | rechnername.domain |                  | 
+------+--------------------+------------------+

Diese anonymen Nutzer stellen ein Sicherheitsrisiko dar und sollten gelöscht werden.


mysql> DELETE FROM mysql.user WHERE user='';
Query OK, 2 rows affected (0.00 sec)



mysql> FLUSH PRIVILEGES;



mysql> SELECT user, host, password FROM mysql.user;
+------+--------------------+------------------+
| user | host               | password         |
+------+--------------------+------------------+
| root | localhost          | 5d64f420187b1bb1 | 
| root | rechnername.domain | 5d64f420187b1bb1 | 
+------+--------------------+------------------+




Bei Debian gibt es keine anonymen Nutzer, sondern den Nutzer debian-sys-maint, der wie root uneingeschränkte Rechte besitzt. Dieser Nutzer ist durch ein Passwort gesichert, das in der Datei „/etc/mysql/debian.cnf“ enthalten ist.



FIXME



Cloud