Inhaltsverzeichnis

MariaDB Datenbankserver unter CentOS 7.x

Bild: MariaDB Logo Nachdem Oracle die Firma Sun Microsystems im Jahr 2009 aufkaufte, entschloss sich der Hauptentwickler Ulf Michael Widenius der OpenSource Datenbank mySQL als eigenständigen Fork weiter zu entwickeln. Für das neue relationales Open-Source-Datenbankverwaltungssystem, welcher grundsätzlich zu MySQL kompatibel ist, wählte Widenius den Namen MariaDB1). Im folgenden Artikel findet man tiefergehende Informationen zu den Unterschieden beider Datenbank-Daemon.

MariaDB löste mit CentOS7 die bis dahin verwendete MYSQL-Datenbank ab. Wir werden uns in diesem Kapitel mit der Installation von MariaDB beschäftigen, nicht zuletzt, da wir die Datenbank für die viele unserer Projekte verwenden werden, wie z.B.:

Installation

Die Installation unseres Datenbankservers gestaltet sich recht einfach, das das notwendige Programmpaket als RPM aus dem Base-Repository unserer CentOS-Installation zur Verfügung gestellt wird. Die Installation selbst erfolgt mit dem Paketverwaltungs-Utility yum von CentOS 7.

 # yum install mariadb-server -y

Neben dem Server-Part mysql-server wird auch der Client-Part mysql sowie weitere Perl-Datenbankmodule installiert. Was uns die einzelnen Programmpakete mitbringen, erkunden wir bei Bedarf mit der Option qil beim Programm rpm.

 # rpm -qil mysql-server
Name        : mariadb-server
Epoch       : 1
Version     : 5.5.52
Release     : 1.el7
Architecture: x86_64
Install Date: Mon 20 Feb 2017 06:20:37 PM CET
Group       : Applications/Databases
Size        : 58204272
License     : GPLv2 with exceptions and LGPLv2 and BSD
Signature   : RSA/SHA256, Sun 20 Nov 2016 08:24:51 PM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : mariadb-5.5.52-1.el7.src.rpm
Build Date  : Tue 15 Nov 2016 02:20:59 AM CET
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://mariadb.org
Summary     : The MariaDB server and related files
Description :
MariaDB is a multi-user, multi-threaded SQL database server. It is a
client/server implementation consisting of a server daemon (mysqld)
and many different client programs and libraries. This package contains
the MariaDB server and some accompanying files and directories.
MariaDB is a community developed branch of MySQL.
/etc/logrotate.d/mariadb
/etc/my.cnf.d/server.cnf
/usr/bin/innochecksum
/usr/bin/myisam_ftdump
/usr/bin/myisamchk
/usr/bin/myisamlog
/usr/bin/myisampack
/usr/bin/mysql_convert_table_format
/usr/bin/mysql_fix_extensions
/usr/bin/mysql_install_db
/usr/bin/mysql_plugin
/usr/bin/mysql_secure_installation
/usr/bin/mysql_setpermission
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysql_zap
/usr/bin/mysqlbug
/usr/bin/mysqld_multi
/usr/bin/mysqld_safe
/usr/bin/mysqldumpslow
/usr/bin/mysqlhotcopy
/usr/bin/mysqltest
/usr/bin/perror
/usr/bin/replace
/usr/bin/resolve_stack_dump
/usr/bin/resolveip
/usr/lib/systemd/system/mariadb.service
/usr/lib/tmpfiles.d/mariadb.conf
/usr/lib64/mysql/INFO_BIN
/usr/lib64/mysql/INFO_SRC
/usr/lib64/mysql/mysqlbug
/usr/lib64/mysql/plugin
/usr/lib64/mysql/plugin/adt_null.so
/usr/lib64/mysql/plugin/auth_0x0100.so
/usr/lib64/mysql/plugin/auth_pam.so
/usr/lib64/mysql/plugin/auth_socket.so
/usr/lib64/mysql/plugin/auth_test_plugin.so
/usr/lib64/mysql/plugin/daemon_example.ini
/usr/lib64/mysql/plugin/dialog_examples.so
/usr/lib64/mysql/plugin/ha_innodb.so
/usr/lib64/mysql/plugin/ha_sphinx.so
/usr/lib64/mysql/plugin/handlersocket.so
/usr/lib64/mysql/plugin/libdaemon_example.so
/usr/lib64/mysql/plugin/mypluglib.so
/usr/lib64/mysql/plugin/qa_auth_client.so
/usr/lib64/mysql/plugin/qa_auth_interface.so
/usr/lib64/mysql/plugin/qa_auth_server.so
/usr/lib64/mysql/plugin/query_cache_info.so
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
/usr/lib64/mysql/plugin/server_audit.so
/usr/lib64/mysql/plugin/sphinx.so
/usr/lib64/mysql/plugin/sql_errlog.so
/usr/libexec/mariadb-prepare-db-dir
/usr/libexec/mariadb-wait-ready
/usr/libexec/mysqld
/usr/share/man/man1/innochecksum.1.gz
/usr/share/man/man1/msql2mysql.1.gz
/usr/share/man/man1/myisam_ftdump.1.gz
/usr/share/man/man1/myisamchk.1.gz
/usr/share/man/man1/myisamlog.1.gz
/usr/share/man/man1/myisampack.1.gz
/usr/share/man/man1/mysql.server.1.gz
/usr/share/man/man1/mysql_convert_table_format.1.gz
/usr/share/man/man1/mysql_fix_extensions.1.gz
/usr/share/man/man1/mysql_install_db.1.gz
/usr/share/man/man1/mysql_plugin.1.gz
/usr/share/man/man1/mysql_secure_installation.1.gz
/usr/share/man/man1/mysql_setpermission.1.gz
/usr/share/man/man1/mysql_tzinfo_to_sql.1.gz
/usr/share/man/man1/mysql_upgrade.1.gz
/usr/share/man/man1/mysql_zap.1.gz
/usr/share/man/man1/mysqlbinlog.1.gz
/usr/share/man/man1/mysqlbug.1.gz
/usr/share/man/man1/mysqlcheck.1.gz
/usr/share/man/man1/mysqld_multi.1.gz
/usr/share/man/man1/mysqld_safe.1.gz
/usr/share/man/man1/mysqldumpslow.1.gz
/usr/share/man/man1/mysqlhotcopy.1.gz
/usr/share/man/man1/mysqlimport.1.gz
/usr/share/man/man1/mysqltest.1.gz
/usr/share/man/man1/perror.1.gz
/usr/share/man/man1/replace.1.gz
/usr/share/man/man1/resolve_stack_dump.1.gz
/usr/share/man/man1/resolveip.1.gz
/usr/share/man/man8/mysqld.8.gz
/usr/share/mysql/README.mysql-cnf
/usr/share/mysql/errmsg-utf8.txt
/usr/share/mysql/fill_help_tables.sql
/usr/share/mysql/my-huge.cnf
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-small.cnf
/usr/share/mysql/mysql_performance_tables.sql
/usr/share/mysql/mysql_system_tables.sql
/usr/share/mysql/mysql_system_tables_data.sql
/usr/share/mysql/mysql_test_data_timezone.sql
/var/lib/mysql
/var/log/mariadb
/var/log/mariadb/mariadb.log
/var/run/mariadb

Konfiguration

my.cnf

Die Konfiguration unseres Datenbankservers erfolgt über die Konfigurationsdatei /etc/my.cnf, die uns bei der Installation bereits mitgeliefert wurde.

 # less /etc/my.cnf
/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
 
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
 
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

Eine genau Beschreibung aller Server System Variablen ist hier zu finden.

Zusätzliche Beispiele finden sich übrigens auch im Verzeichnis /usr/share/mysql/.

 # ll /usr/share/mysql/*.cnf
-rw-r--r--. 1 root root  4920 Nov 15 00:14 /usr/share/mysql/my-huge.cnf
-rw-r--r--. 1 root root 20438 Nov 15 00:14 /usr/share/mysql/my-innodb-heavy-4G.cnf
-rw-r--r--. 1 root root  4907 Nov 15 00:14 /usr/share/mysql/my-large.cnf
-rw-r--r--. 1 root root  4920 Nov 15 00:14 /usr/share/mysql/my-medium.cnf
-rw-r--r--. 1 root root  2846 Nov 15 00:14 /usr/share/mysql/my-small.cnf

Bei Bedarf, wie z.B. der Angabe eines spezifischen Datenbankverzeichnisses, tragen wir unsere individuelle Konfiguration in der my.cnf nach.

[mysqld]
# Django : 2015-02-07 spezifisches Datenbankverzeichnis angegeben
# default: datadir=/var/lib/mysql
datadir=/var/lib/mysql/data
...

erster Start

Nun ist es an der Zeit unseren Datenbank-Server das erste mal zu starten.

 # systemctl start mariadb.service

Der Start wird im Logfile des Datenbankservers /var/log/mariadb/mariadb.log entsprechend dokumentiert.

 # less /var/log/mariadb/mariadb.log
170220 18:25:10 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
170220 18:25:10 [Note] /usr/libexec/mysqld (mysqld 5.5.52-MariaDB) starting as process 3256 ...
170220 18:25:10 InnoDB: The InnoDB memory heap is disabled
170220 18:25:10 InnoDB: Mutexes and rw_locks use GCC atomic builtins
170220 18:25:10 InnoDB: Compressed tables use zlib 1.2.7
170220 18:25:10 InnoDB: Using Linux native AIO
170220 18:25:10 InnoDB: Initializing buffer pool, size = 128.0M
170220 18:25:10 InnoDB: Completed initialization of buffer pool
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
170220 18:25:10  InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
170220 18:25:10  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
170220 18:25:10  InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: 127 rollback segment(s) active.
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
170220 18:25:11  InnoDB: Waiting for the background threads to start
170220 18:25:12 Percona XtraDB (http://www.percona.com) 5.5.49-MariaDB-38.0 started; log sequence number 0
170220 18:25:12 [Note] Plugin 'FEEDBACK' is disabled.
170220 18:25:12 [Note] Server socket created on IP: '0.0.0.0'.
170220 18:25:12 [Note] Event Scheduler: Loaded 0 events
170220 18:25:12 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.5.52-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server

In unserem Datenbankverzeichnis /var/lib/mysql/data wurden auch die ersten Datenbankdateien angelegt.

 # ll /var/lib/mysql/data
total 28700
-rw-rw----. 1 mysql mysql    16384 Mar  7 22:10 aria_log.00000001
-rw-rw----. 1 mysql mysql       52 Mar  7 22:10 aria_log_control
-rw-rw----. 1 mysql mysql 18874368 Mar  7 22:10 ibdata1
-rw-rw----. 1 mysql mysql  5242880 Mar  7 22:10 ib_logfile0
-rw-rw----. 1 mysql mysql  5242880 Mar  7 22:10 ib_logfile1
drwx------. 2 mysql mysql     4096 Mar  7 22:10 mysql
srwxrwxrwx. 1 mysql mysql        0 Mar  7 22:10 mysql.sock
drwx------. 2 mysql mysql     4096 Mar  7 22:10 performance_schema
drwx------. 2 mysql mysql        6 Mar  7 22:10 test

Möchten wir überprüfen, ob der MariaDB-Server läuft, haben wir mehrere Möglichkeiten.

  1. systemctl
     # systemctl status mariadb -l

    mariadb.service - MariaDB database server
       Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
       Active: active (running) since Mon 2017-02-20 18:25:12 CET; 1min 6s ago
      Process: 3099 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
      Process: 3019 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
     Main PID: 3098 (mysqld_safe)
       CGroup: /system.slice/mariadb.service
               ├─3098 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
               └─3256 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
    
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: To start mysqld at boot time you have to copy
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: support-files/mysql.server to the right place for your system
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: To do so, start the server, then issue the following commands:
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: '/usr/bin/mysqladmin' -u root password 'new-password'
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: '/usr/bin/mysqladmin' -u root -h vml000117.dmz.nausch.org password 'new-password'
    Feb 20 18:25:10 vml000117.dmz.nausch.org mariadb-prepare-db-dir[3019]: Alternatively you can run:
    Feb 20 18:25:10 vml000117.dmz.nausch.org mysqld_safe[3098]: 170220 18:25:10 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
    Feb 20 18:25:10 vml000117.dmz.nausch.org mysqld_safe[3098]: 170220 18:25:10 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
    Feb 20 18:25:12 vml000117.dmz.nausch.org systemd[1]: Started MariaDB database server.
    

  2. ps
     # ps aux | grep mysql
    mysql    27039  0.0  0.1 115344  1620 ?        Ss   22:10   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
    mysql    27198  0.0  8.3 905348 84784 ?        Sl   22:10   0:01 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql/data --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
    root     27302  0.0  0.0 112640   924 pts/0    R+   22:41   0:00 grep --color=auto mysql
  3. netstat
     # netstat -tulpn
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1728/master         
    tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      27198/mysqld        
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1357/sshd           
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1728/master         
    tcp6       0      0 :::80                   :::*                    LISTEN      26249/httpd         
    tcp6       0      0 :::22                   :::*                    LISTEN      1357/sshd           
    udp        0      0 0.0.0.0:40525           0.0.0.0:*                           571/avahi-daemon: r 
    udp        0      0 0.0.0.0:52944           0.0.0.0:*                           588/chronyd         
    udp        0      0 0.0.0.0:5353            0.0.0.0:*                           571/avahi-daemon: r 
    udp        0      0 127.0.0.1:323           0.0.0.0:*                           588/chronyd         

automatisches Starten des Dienste beim Systemstart

Damit nun unser MariaDBL-Server beim Booten automatisch gestartet wird, nehmen wir noch folgenden Konfigurationsschritt vor.

 # systemctl enable mariadb
 ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'

Wollen wir überprüfen, ob der Datenbank-Daemon beim Serverstart automatisch gestartet wird, fragen wir dies mit folgendem Befehl ab.

 # systemctl is-enabled mariadb
 enabled

Startet der Datenbank-Daemon nicht automatisch, wird ein disabled zurück gemeldet.

Paketfilter/Firewall

Damit wir später von den berechtigten Hosts Verbindungen zu unserem MariaDB-Server/-Daemon aufbauen können, müssen wir für diese noch Änderungen am Paketfilter firewalld vornehmen.

Unter CentOS 7 wird als Standard-Firewall die dynamische firewalld verwendet. Ein großer Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbindungen kurz getrennt werden. Sondern unsere Änderungen können on-the-fly aktiviert oder auch wieder deaktiviert werden.

In unserem Konfigurationsbeispiel hat unser MariaDB-Server die IP-Adresse 10.0.0.37 und der Wetterstations-Server die 10.0.0.27. Wir brauchen also eine Firewall-Definition, die ausschließlich Verbindungen von der Source-IP 10.0.0.27 auf die Destination-IP 10.0.0.37 auf Port 3306 gestattet. Mit Hilfe des Programms firewall-cmd legen wir nun eine permanente Regel in der Zone public, dies entspricht in unserem Beispiel das Netzwerk-Interface eth0 mit der IP 10.0.0.37 an. Als Source-IP geben wir die IP-Adresse unseres Wetterstations-Servers also die 10.0.0.27 an. Genug der Vorrede, mit nachfolgendem Befehl wird diese restriktive Regel angelegt.

 # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.27/32" port protocol="tcp" port="3306" destination address="10.0.0.37/32" accept"

Zum Aktivieren brauchen wir nun nur einen reload des Firewall-Daemon vornehmen.

 # firewall-cmd --reload

Fragen wir nun den Regelsatz unserer iptables-basieten Firewall ab, finden wir in der Chain IN_public_allow unsere aktive Regel.

 # iptables -nvL IN_public_allow
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination         
  10K   25K ACCEPT     tcp  --  *      *       10.0.0.27            10.0.0.37            tcp dpt:3306 ctstate NEW
 2656  159K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW

Natürlich können wir auch mit dem Befehl firewall-cmd abfragen, welche Dienste in der Zone public geöffnet sind.

 # firewall-cmd --zone=public --list-services
 mysql ssh

Installation absichern

Wie bei der doch großen Ausgabe beim erstmaligen Start des Datenbank-Daemons angeraten, werden wir nun die sicherheitsrelevanten Konfigurationsänderungen vornehmen.

Hierzu benutzen wir einfach das mitgelieferte Script /usr/bin/mysql_secure_installation, welches folgende Änderungen vornimmt:

  1. Datenbankpasswort des MySQL-Datenbankuser root setzen
  2. Anonyme Benutzerkonten löschen
  3. Deaktivieren der Remote-Zugriffsmöglichkeit für den MySQL-Datenbankuser root
  4. Löschen der nicht benötigten Testdatenbank test

Die Fehlermeldung

/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

kann ignoriert werden, da aktuell2) in dem Script das Unterprogramm find_mysql_client nicht definiert wurde.

 # mysql_secure_installation
/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]
 y
 New password: 
 Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

logrotate

Bei einem unter Last stehendem MariaDB-Sserver kann unter Umständen das zugehörige Logfile /var/log/mariadb/mariadb.log recht schnell anwachsen. In der Datei mariadb aus dem Verzeichis /etc finden wir dazu alle nötigen Informationen.

 # less /etc/logrotate.d/mariadb
# This logname can be set in /etc/my.cnf
# by setting the variable "log-error"
# in the [mysqld_safe] section as follows:
#
# [mysqld_safe]
# log-error=/var/log/mariadb/mariadb.log
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret> 
# user= root
#
# where "<secret>" is the password. 
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !

# Then, un-comment the following lines to enable rotation of mysql's log file:

#/var/log/mariadb/mariadb.log {
#        create 640 mysql mysql
#        notifempty
#       daily
#        rotate 3
#        missingok
#        compress
#    postrotate
#       # just if mysqld is really running
#       if test -x /usr/bin/mysqladmin && \
#          /usr/bin/mysqladmin ping &>/dev/null
#       then
#          /usr/bin/mysqladmin flush-logs
#       fi
#    endscript
#}

In der MariaDB-Konfigurationsdatei /etc/my.cnf aus dem RPM ist in der Sektion [mysqld_safe] das Error-Log gesetzt:

 log-error=/var/log/mariadb/mariadb.log

Da wir dem im Kapitel installation_absichern für den User root ein Passwort vergeben haben, werden wir nun die Authentifizierungsdaten im Verzeichnis des Users root ablegen. Hierzu legen wir erst einmal diese Datei an.

 # touch /root/.my.cnf

Anschließend stellen wir sicher dass auch wirklich nur root diese Datei lesen kann.

 # chmod 600 /root/.my.cnf

Bevor wir die Daten in der gerade angelegten Datei hinterlegen, überprüfen wir noch, ob auch wirklich die Berechtigungen passen.

 # ll /root/.my.cnf 
-rw-------. 1 root root 0 Mar  8 00:15 /root/.my.cnf

Da alles passt, befüllen wir nun die Datei /root/.my.cnf.

 # vim /root/.my.cnf 
/root/.my.cnf
[mysqladmin]
password = dxiFHdig10JXyRAec74j7bcPdyVGX9I1BxcYcoFs
user= root

Nun aktivieren wir noch in der Datei /etc/logrotate.d/mariadb die Zeilen in der unteren Hälfte, damit der logrotate-Mechanismus auch scharf geschalten ist.

 # vim /etc/logrotate.d/mariadb
/etc/logotate.d/mariadb
# This logname can be set in /etc/my.cnf
# by setting the variable "log-error"
# in the [mysqld_safe] section as follows:
#
# [mysqld_safe]
# log-error=/var/log/mariadb/mariadb.log
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret> 
# user= root
#
# where "<secret>" is the password. 
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
 
# Then, un-comment the following lines to enable rotation of mysql's log file:
 
# Django : 2015-03-08
# logrotate aktiviert
/var/log/mariadb/mariadb.log {
        create 640 mysql mysql
        notifempty
        daily
        rotate 3
        missingok
        compress
    postrotate
        # just if mysqld is really running
        if test -x /usr/bin/mysqladmin && \
           /usr/bin/mysqladmin ping &>/dev/null
        then
           /usr/bin/mysqladmin flush-logs
        fi
    endscript
}

Datenbankhandling

mysqladmin

Mit Hilfe des Hilfsprogrammes mysqladmin aus dem Clientpaket mysql können umfangreiche Abfrage gegen unsere Datenbank gefahren werden. Startet man das Programm ohne weitere Angaben von Optionen, werden die möglichen Optionen am Bildschirm ausgegeben.

 # mysqladmin
mysqladmin  Ver 9.0 Distrib 5.5.41-MariaDB, for Linux on x86_64
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command....

Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf 
The following groups are read: mysqladmin client client-server client-mariadb
The following options may be given as the first argument:
--print-defaults        Print the program argument list and exit.
--no-defaults           Don't read default options from any option file.
--defaults-file=#       Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.

  -c, --count=#       Number of iterations to make. This works with -i
                      (--sleep) only.
  --debug-check       Check memory and open file usage at exit.
  --debug-info        Print some debug info at exit.
  -f, --force         Don't ask for confirmation on drop database; with
                      multiple commands, continue even if an error occurs.
  -C, --compress      Use compression in server/client protocol.
  --character-sets-dir=name 
                      Directory for character set files.
  --default-character-set=name 
                      Set the default character set.
  -?, --help          Display this help and exit.
  -h, --host=name     Connect to host.
  -b, --no-beep       Turn off beep on error.
  -p, --password[=name] 
                      Password to use when connecting to server. If password is
                      not given it's asked from the tty.
  -P, --port=#        Port number to use for connection or 0 for default to, in
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
                      /etc/services, built-in default (3306).
  --protocol=name     The protocol to use for connection (tcp, socket, pipe,
                      memory).
  -r, --relative      Show difference between current and previous values when
                      used with -i. Currently only works with extended-status.
  -s, --silent        Silently exit if one can't connect to server.
  -S, --socket=name   The socket file to use for connection.
  -i, --sleep=#       Execute commands repeatedly with a sleep between.
  --ssl               Enable SSL for connection (automatically enabled with
                      other flags).
  --ssl-ca=name       CA file in PEM format (check OpenSSL docs, implies
                      --ssl).
  --ssl-capath=name   CA directory (check OpenSSL docs, implies --ssl).
  --ssl-cert=name     X509 cert in PEM format (implies --ssl).
  --ssl-cipher=name   SSL cipher to use (implies --ssl).
  --ssl-key=name      X509 key in PEM format (implies --ssl).
  --ssl-verify-server-cert 
                      Verify server's "Common Name" in its cert against
                      hostname used when connecting. This option is disabled by
                      default.
  -u, --user=name     User for login if not current user.
  -v, --verbose       Write more information.
  -V, --version       Output version information and exit.
  -E, --vertical      Print output vertically. Is similar to --relative, but
                      prints output vertically.
  -w, --wait[=#]      Wait and retry if connection is down.
  --connect-timeout=# 
  --shutdown-timeout=# 
  --plugin-dir=name   Directory for client-side plugins.
  --default-auth=name Default authentication client-side plugin to use.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
count                             0
debug-check                       FALSE
debug-info                        FALSE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              root
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

Where command is a one or more of: (Commands may be shortened)
  create databasename     Create a new database
  debug                   Instruct server to write debug information to log
  drop databasename       Delete a database and all its tables
  extended-status         Gives an extended status message from the server
  flush-all-statistics    Flush all statistics tables
  flush-all-status        Flush status and statistics
  flush-client-statistics Flush client statistics
  flush-hosts             Flush all cached hosts
  flush-index-statistics  Flush index statistics
  flush-logs              Flush all logs
  flush-privileges        Reload grant tables (same as reload)
  flush-slow-log          Flush slow query log
  flush-status            Clear status variables
  flush-table-statistics  Clear table statistics
  flush-tables            Flush all tables
  flush-threads           Flush the thread cache
  flush-user-statistics   Flush user statistics
  kill id,id,...        Kill mysql threads
  password [new-password] Change old password to new-password in current format
  old-password [new-password] Change old password to new-password in old format
  ping                  Check if mysqld is alive
  processlist           Show list of active threads in server
  reload                Reload grant tables
  refresh               Flush all tables and close and open logfiles
  shutdown              Take server down
  status                Gives a short status message from the server
  start-slave           Start slave
  stop-slave            Stop slave
  variables             Prints variables available
  version               Get version info from server

So können wir z.B. die verwendete Version von MariaDB abfragen.

 # mysqladmin version
mysqladmin  Ver 9.0 Distrib 5.5.41-MariaDB, for Linux on x86_64
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Server version          5.5.41-MariaDB
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 2 hours 33 min 19 sec

Threads: 1  Questions: 27  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.002

mysql

Der Zugriff auf unseren MariaDB-Server nehmen wir in der Regel mit dem Werkzeug mysql vor. So können wir z.B. sehr leicht und einfach den Status unseres Datenbankservers abfragen.

 # mysql -h localhost -u root -p
 Enter password: dxiFHdig10JXyRAec74j7bcPdyVGX9I1BxcYcoFs
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 5.5.41-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Auch hier können wir uns nun den Status des Daemon anzeigen lassen. Hierzu verwenden wir den SQL-Befehl status, den wir mit einem Strichpunkt ; abschließen.

MariaDB [(none)]> status;
--------------
mysql  Ver 15.1 Distrib 5.5.41-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:          12
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         5.5.41-MariaDB MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 2 hours 38 min 10 sec

Threads: 1  Questions: 31  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.003
--------------

MariaDB [(none)]>

Die Verbindung zum Datenbank-Daemon beenden wir mit dem Befehl quit.

 MariaDB [(none)]> quit;
 Bye

Datenbank-Dump

Zur Sicherung unserer MariaDB-Tabellen legen wir uns ein kleines Script an, mit dessen Hilfe wir täglich eine Sicherung der kompletten Datenbank vornehmen können.

 # touch /root/bin/mariadb_fulldump

Damit das Script später auch nur vom User root gelesen udn ausgeführt werden kann, setzen wir noch kurz die Dateirechte entsprechend.

 # chmod 700 /root/bin/mariadb_fulldump

Nun efüllen wir noch unser Script.

 # vim /root/bin/mariadb_fulldump
/root/bin/mariadb_fulldump
#!/bin/bash
 
##################################################################################
# Script-Name : mysqldump.sh                                                     # 
# Description : Datenbank-Dump der kompletten (alle Tabellen) unserer            #
#               MariaDB nach /root/mysql/dumps                                   #
#               Drei Datensicherungen werden aufgehoben, ältere werden gelöscht. # 
#                                                                                # 
#                                                                                # 
#                                                                                # 
# Last update : 13.05.2013                                                       # 
# Version     : 0.01                                                             # 
##################################################################################
 
##################################################################################
#                                  H I S T O R Y                                 # 
##################################################################################
# Version     : 0.01                                                             # 
# Description : initial release                                                  #
# ------------------------------------------------------------------------------ # 
# Version     : x.xx                                                             # 
# Description : <Description>                                                    #
##################################################################################
 
# Source function library.
. /etc/init.d/functions
 
# Definition der systemindividuellen Variablen
 
# Script-Name.
SCRIPT_NAME='mariadb_fulldump'
 
# Backup-Verzeichnis.
DIR_TARGET='/root/mysql/dump'
DUMP_FILES="$DIR_TARGET/*.sql"
 
# Mail-Empfänger
MAIL_RECIPIENT='django@nausch.org'
 
# Status-Mail versenden? [J|N].
MAIL_STATUS='J'
 
# Datenbankdefinitionen
DB_HOST="127.0.0.1"
DB_USER="root"
DB_SECRET="immNI+32$cHU551n5Kn13gn1uS4W6HYu0SAJwH8W"
 
# Variablen
MYSQLDUMP_COMMAND=`command -v mysqldump`
TOUCH_COMMAND=`command -v touch`
RM_COMMAND=`command -v rm`
PROG_SENDMAIL=`command -v sendmail`
CAT_COMMAND=`command -v cat`
DATE_COMMAND=`command -v date`
MKDIR_COMMAND=`command -v mkdir`
FILE_NAME='/'$SCRIPT_NAME'.'`$DATE_COMMAND '+%Y-%m-%d-%H%M%S'`'.sql'
FILE_LOCK='/tmp/'$SCRIPT_NAME'.lock'
FILE_LOG='/var/log/'$SCRIPT_NAME'.log'
FILE_LAST_LOG='/tmp/'$SCRIPT_NAME'.log'
FILE_MAIL='/tmp/'$SCRIPT_NAME'.mail'
VAR_HOSTNAME=`uname -n`
VAR_SENDER='root@'$VAR_HOSTNAME
VAR_EMAILDATE=`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'`
 
# Functionen
function log() {
        echo $1
        echo `$DATE_COMMAND '+%Y/%m/%d %H:%M:%S'` " INFO:" $1 >>${FILE_LAST_LOG}
}
 
function movelog() {
        $CAT_COMMAND $FILE_LAST_LOG >> $FILE_LOG
        $RM_COMMAND -f $FILE_LAST_LOG
        $RM_COMMAND -f $FILE_LOCK
}
 
function sendmail() {
        case "$1" in
        'STATUS')
                MAIL_SUBJECT='Status execution '$SCRIPT_NAME' script.'
        ;;
        *)
                MAIL_SUBJECT='ERROR while execution '$SCRIPT_NAME' script !!!'
        ;;
        esac
 
$CAT_COMMAND <<MAIL >$FILE_MAIL
Subject: $MAIL_SUBJECT
Date: $VAR_EMAILDATE
From: $VAR_SENDER
To: $MAIL_RECIPIENT
 
MAIL
 
$CAT_COMMAND $FILE_LAST_LOG >> $FILE_MAIL
 
$PROG_SENDMAIL -f $VAR_SENDER -t $MAIL_RECIPIENT < $FILE_MAIL
 
$RM_COMMAND -f $FILE_MAIL
 
}
 
# Main.
log ""
log "+-------------------------------------------------------------------------------+"
log "| ........................ Start des MariaDB-Dumps ............................ |"
log "+-------------------------------------------------------------------------------+"
log ""
log "Das Datenbank-Backupscript wurde mit folgenden Parametern aufgerufen:"
log ""
log "SCRIPT_NAME     : $SCRIPT_NAME"
log "ZIEL-VERZEICHNIS: $DIR_TARGET"
log "MAIL_EMPFÄNGER  : $MAIL_RECIPIENT"
log "MAIL_STATUS     : $MAIL_STATUS"
log ""
 
# Prüfung ob alle benötigten Programme und Befehle vorhanden sind.
if [ ! -s "$MYSQLDUMP_COMMAND" ]; then
        log "Prüfen, ob das Programm '$MYSQLDUMP_COMMAND' vorhanden ist.................[FEHLER]"
        sendmail ERROR
        movelog
        exit 10
else
        log "Prüfen, ob das Programm '$MYSQLDUMP_COMMAND' vorhanden ist.................[  OK  ]"
fi
 
if [ ! -s "$TOUCH_COMMAND" ]; then
        log "Prüfen, ob das Programm '$TOUCH_COMMAND' vorhanden ist.........................[FEHLER]"
        sendmail ERROR
        movelog
        exit 11
else
        log "Prüfen, ob das Programm '$TOUCH_COMMAND' vorhanden ist.........................[  OK  ]"
fi
 
if [ ! -s "$RM_COMMAND" ]; then
        log "Prüfen, ob das Programm '$RM_COMMAND' vorhanden ist............................[FEHLER]"
        sendmail ERROR
        movelog
        exit 12
else
        log "Prüfen, ob das Programm '$RM_COMMAND' vorhanden ist............................[  OK  ]"
fi
 
if [ ! -s "$CAT_COMMAND" ]; then
        log "Prüfen, ob das Programm '$CAT_COMMAND' vorhanden ist..........................[FEHLER]"
        sendmail ERROR
        movelog
        exit 13
else
        log "Prüfen, ob das Programm '$CAT_COMMAND' vorhanden ist...........................[  OK  ]"
fi
 
if [ ! -s "$DATE_COMMAND" ]; then
        log "Prüfen, ob das Programm '$DATE_COMMAND' vorhanden ist...........................[FEHLER]"
        sendmail ERROR
        movelog
        exit 14
else
        log "Prüfen, ob das Programm '$DATE_COMMAND' vorhanden ist..........................[  OK  ]"
fi
 
if [ ! -s "$MKDIR_COMMAND" ]; then
        log "Prüfen, ob das Programm '$MKDIR_COMMAND' vorhanden ist..........................[FEHLER]"
        sendmail ERROR
        movelog
        exit 15
else
        log "Prüfen, ob das Programm '$MKDIR_COMMAND' vorhanden ist.........................[  OK  ]"
fi
 
if [ ! -s "$PROG_SENDMAIL" ]; then
        log "Prüfen, ob das Programm '$PROG_SENDMAIL' vorhanden ist.................[FEHLER]"
        sendmail ERROR
        movelog
        exit 16
else
        log "Prüfen, ob das Programm '$PROG_SENDMAIL' vorhanden ist.................[  OK  ]"
fi
 
if [ ! -e "$FILE_LOCK" ]; then
        log "Prüfen, ob das Programm nicht bereits oder noch läuft......................[  OK  ]"
 
        $TOUCH_COMMAND $FILE_LOCK
else
        log "Prüfen, ob das Programm nicht bereits oder noch läuft......................[FEHLER]"
        log ""
        log "FEHLER: Das Script läuft bereits bzw. immer noch, oder die LOCK-Datei"
        log "existiert noch von einem früheren Programmaufruf!"
        log ""
        sendmail ERROR
        movelog
        exit 20
fi
 
if [ ! -d "$DIR_TARGET" ]; then
        log "Prüfen, ob Zielverzeichnis existiert.......................................[FEHLER]"
        log ""
        log " INFO: Erstelle Zielverzeichnis!"
        log " INFO: --> "$DIR_TARGET
        log ""
 
        $MKDIR_COMMAND -p $DIR_TARGET
else
        log "Prüfen, ob Zielverzeichnis existiert.......................................[  OK  ]"
fi
 
if [ "$UID" -ne 0 ]; then
        log "Prüfen, ob das Script mit root-Rechten gestartet wurde.......................[FEHLER]"
        log ""
        sendmail ERROR
        movelog
        exit 21
else
        log "Prüfen, ob das Script mit root-Rechten gestartet wurde.....................[  OK  ]"
fi
 
# Start dumping.
log ""
log "+-------------------------------------------------------------------------------+"
log "| .................... Start des Datenbank-Dumps .............................. |"
log "+-------------------------------------------------------------------------------+"
log ""
 
log "$MYSQLDUMP_COMMAND -h "$DB_HOST" -u "$DB_USER" --all-databases --events > $DIR_TARGET$FILE_NAME"
 
$MYSQLDUMP_COMMAND -h $DB_HOST -u $DB_USER --password=$DB_SECRET --all-databases --events > $DIR_TARGET$FILE_NAME
 
if [ "$?" != 0 ]; then
        log ""
        $RM_COMMAND -f $FILE_LOCK
        sendmail ERROR
        movelog
        exit 99
else
        log ""
        log "+-------------------------------------------------------------------------------+"
        log "| ........................ Datenbank-Dump beendet ............................. |"
        log "+-------------------------------------------------------------------------------+"
        log ""
fi
 
# Bis auf die letzten drei Datenbankbackups alle anderen Dateien löschen.
cd $DIR_TARGET/
(ls $DUMP_FILES -t|head -n 3;ls $DUMP_FILES )|sort|uniq -u|xargs rm
if [ "$?" != "0" ]; then
        log "alte Datenbanksicherungen aus Zielverzeichnis $DIR_TARGET gelöscht....[FEHLER]"
        log ""
        sendmail ERROR
        movelog
        exit 69
else
        log "alte Datenbanksicherungen aus Zielverzeichnis $DIR_TARGET gelöscht....[  OK  ]"
        log ""
fi
 
# Finish syncing.
log "+-------------------------------------------------------------------------------+"
log "| .......................... Ende des MariaDB-Dumps ........................... |"
log "+-------------------------------------------------------------------------------+"
log ""
 
# Status eMail versenden
if [ $MAIL_STATUS = 'J' ]; then
        sendmail STATUS
fi
 
# Temporäres Logfile permanent sichern
movelog
 
exit 0

Anschließend tragen wir noch in der Datei /etc/crontab ein, daß das Script täglich um 3:20 Uhr laufen soll.

 # vim /etc/crontab
/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
 
# Django: 2013-05-13 täglicher MariaDB-Datenbankdump
20  3  *  *  root /root/bin/mariadb_fulldump 1>/dev/null 2>&1

phpMyAdmin

Zur komfortablen Administration unserer MariaDB unter CentOS 7.x greifen wir auf das PHP-Projekt phpMyAdmin zurück. Im Kapitel phpMyAdmin unter CentOS 7.x installieren und einrichten ist die Installation und Konfiguration des PHP Projektes unter CentOS 7.x beschrieben.

Links

1)
in Anlehnung an den Vornamen seiner Tochter
2)
Stand: März 2015