ubuntuusers.de

MySQL startet nicht

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

So, habe jetzt alles kopiert und Berechtigungen angepasst. Bekomme aber folgenden Fehler:

sudo mysqld --datadir=/mnt/sda1/mysql --user mysql
2020-01-22 17:53:31 0 [Note] mysqld (mysqld 10.3.21-MariaDB-1:10.3.21+maria~bionic-log) starting as process 30656 ...
mysqld: Can't create file '/mnt/sda1/log/mysql_error.log' (errno: 13 "Permission denied")
2020-01-22 17:53:31 0 [ERROR] mysqld: File '/mnt/sda1/log/mariadb-bin.index' not found (Errcode: 13 "Permission denied")2020-01-22 17:53:31 0 [ERROR] Aborting#

Berechtigungen:

ls -la /mnt/sda1/log
total 16
drw-r----- 2 mysql adm  4096 Jan 22 17:36 .
drwxrwx--- 6 root  root 4096 Jan 22 17:08 ..
-rw-r--r-- 1 root  root    0 Jan 22 17:36 mariadb-bin.index
-rw-r----- 1 mysql adm    11 Jan 22 17:11 mariadb-bin.state
-rw-r----- 1 mysql adm     0 Jan 22 17:11 mariadb-slow.log
-rw-r----- 1 mysql adm   728 Jan 22 17:10 mysql_error.log

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Wie hast du den MySQL-Server denn sonst gestartet?

CountOmega schrieb:

ls -la /mnt/sda1/log
drwxrwx--- 6 root  root 4096 Jan 22 17:08 ..
-rw-r--r-- 1 root  root    0 Jan 22 17:36 mariadb-bin.index
-rw-r----- 1 mysql adm    11 Jan 22 17:11 mariadb-bin.state
-rw-r----- 1 mysql adm     0 Jan 22 17:11 mariadb-slow.log
-rw-r----- 1 mysql adm   728 Jan 22 17:10 mysql_error.log

Das Verzeichnis sda1 hat Besitzer und Gruppe root. Das wird es dem Benutzer mysql bei den Berechtigungen schwer machen, hierauf zuzugreifen.

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

Mit service mysql start. Problem ist dass das Verzeichnis die nextcloud Daten beinhaltet. Soll ich dann eine separate Partition erstellen?

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Ich weiß nicht, wie komplex der Umzug von Nextcloud bzw. den Nextcloud-Daten ist.

Sollte das ein simples Kopieren/Verschieben von Dateien mit einer Anpassung in einer Konfigurationsdatei sein, bietet es sich meiner Meinung nach an, beides (MySQL und Nextcloud) eine Verzeichnisebene nach unten zu schieben (weg von /). Somit kannst du bis zum jeweiligen Einstiegspunkt entsprechende Berechtigungen für beide Dienstkonten einstreuen. Wenn es nicht so einfach ist, könnte das Verlagern in eine eigene Partition schon die bessere Wahl sein.

Sollte der Datenspeicher eine einzelne rotierende Platte sein, tendiere ich zum ersten Lösungsansatz. Das reduziert die Reisezeit für die Verlagerung der Schreib-/Leseköpfe. Je nach Nutzungsintensität könnte sich bei rotierenden Datenträgern dann sogar eine Aufteilung auf getrennte Datenträger anbieten.

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

So, habe jetzt alle Berechtigungen angepasst sowie Verzeichnisse erstellt. Nun bekomme ich beim Starten von mysql den Fehler

 mariadb.service - MariaDB 10.3.21 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: failed (Result: exit-code) since Sun 2020-01-26 15:22:57 CET; 5s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 5758 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
  Process: 5756 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 25898 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
  Process: 25714 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
  Process: 25712 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 25711 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
 Main PID: 25898 (code=exited, status=1/FAILURE)
   Status: "MariaDB server is down"

Jan 26 15:22:56 rock64 systemd[1]: Starting MariaDB 10.3.21 database server...
Jan 26 15:22:57 rock64 mysqld[25898]: 2020-01-26 15:22:57 0 [Note] /usr/sbin/mysqld (mysqld 10.3.21-MariaDB-1:10.3.21+maria~bionic-log) starting as process 25898 ...
Jan 26 15:22:57 rock64 mysqld[25898]: 2020-01-26 15:22:57 0 [Warning] Can't create test file /mnt/sda1/db/mysql/mysql/rock64.lower-test
Jan 26 15:22:57 rock64 mysqld[25898]: [100B blob data]
Jan 26 15:22:57 rock64 mysqld[25898]: 2020-01-26 15:22:57 0 [ERROR] Aborting
Jan 26 15:22:57 rock64 systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE
Jan 26 15:22:57 rock64 systemd[1]: mariadb.service: Failed with result 'exit-code'.
Jan 26 15:22:57 rock64 systemd[1]: Failed to start MariaDB 10.3.21 database server.

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

CountOmega schrieb:

Jan 26 15:22:57 rock64 mysqld[25898]: 2020-01-26 15:22:57 0 [Warning] Can't create test file /mnt/sda1/db/mysql/mysql/rock64.lower-test

Der Meldung zufolge hast du noch nicht alle Verzeichnisse erwischt.

Du hast in deiner MySQL/MariaDB-Konfiguration auch irgendwo Log-Dateien definiert (general_log_file und log_error). Leere die mal bzw. sichere die woanders hin, falls du die später nochmal anschauen willst, und schau da nach einem erneuten Startversuch rein. Gerade im log_error könntest du so vielleicht mehr als einen Fehler pro Dienstneustart korrigieren.

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

Ich habe diese geleert, jedoch schreibt mysql hier nichts hinein. Kann es sein dass ich einen symlink vom alten Datenverzeichnis aufs neue benötige?

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

So,habe jetzt gezwungenermaßen alles neu aufgesetzt. Das Seltsame ist, dass /var/log/ schon wieder zu 100% voll ist. Es liegt aber nicht an den mysql logs. Auch sind die anderen Logs nicht so groß. Was kann ich hier machen um Abhilfe zu schaffen?

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Was hast du im Rahmen der Neuinstallation im Vergleich zur uns bereits bekannten Konfiguration geändert? Mit Blick auf die mariadb-Konfiguration kannst du die Menge an nützlichen Informationen gut mit dem Befehl

mysqld --print-defaults 

steuern. 😉

Mit einem

sudo du -hsc /var/log/* 

erhalten wir einen Überblick über /var/log.

Je nach Umfang der Änderungen an der Standardkonfiguration wirst du die Datenbank voraussichtlich wieder auf dem langsamen root-Device liegen haben und dein Binlog (per default aus, aber in deiner letzten Konfiguration eingeschaltet) in /var/log. Und das braucht seinen Platz. Zusätzlich hattest du auch das general_log aktiviert und in /var/log schreiben lassen. Abgesehen davon, dass die Entwickler in der aktuellen Standard-Konfigurationsdatei von der Verwendung dieses Logs als solches abraten, könntest du hier auch den Pfad anpassen.

Ich habe hier mal eine "einfache" Neuinstallation von MariaDB in ein Datenverzeichnis /mnt/sda1/mysql umgezogen - und das Binary Logging so aktiviert, dass desse Logs auch dort landen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
vagrant@bionic:~$ sudo apt install mariadb-server
# Ausgabe von der Paketinstallation entfernt
vagrant@bionic:~$ sudo mysql_secure_installation
# Fragen beantworten
# Annahme der Änderungen überprüfen mit sudo mysql -u root -p
vagrant@bionic:~$ mysqld --help --verbose | less
mysqld  Ver 10.1.44-MariaDB-0ubuntu0.18.04.1 for debian-linux-gnu on x86_64 (Ubuntu 18.04)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Starts the MariaDB database server.

Usage: mysqld [OPTIONS]

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf # <-- Gut zu wissen
# snip
vagrant@bionic:~$ find /etc/mysql/
/etc/mysql/
/etc/mysql/my.cnf.fallback
/etc/mysql/mariadb.conf.d
/etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
/etc/mysql/mariadb.conf.d/50-mysqld_safe.cnf
/etc/mysql/mariadb.conf.d/50-server.cnf         # <-- (2) Relevante Konfigurationsdatei
/etc/mysql/mariadb.conf.d/50-client.cnf
/etc/mysql/debian-start
/etc/mysql/debian.cnf
/etc/mysql/conf.d
/etc/mysql/conf.d/mysql.cnf
/etc/mysql/conf.d/mysqldump.cnf
/etc/mysql/my.cnf                               # <-- (1) Einstiegspunkt
/etc/mysql/mariadb.cnf
vagrant@bionic:~$ cat /etc/mysql/my.cnf
# Ausgabe auf das Wesentliche reduziert
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/
vagrant@bionic:~$ grep -E '/var/log|/var/lib' /etc/mysql/mariadb.conf.d/50-server.cnf | grep -v '#'
log_error = /var/log/mysql/error.log       # <-- Da können wir was gegen unternehmen
datadir		= /var/lib/mysql               # <-- Da wollen wir was gegen unternehmen
vagrant@bionic:~$ systemctl cat mariadb
# Ausgabe auf Benutzer und Gruppe reduziert
User=mysql
Group=mysql
vagrant@bionic:~$ ls -ld /var/lib/mysql /var/log/mysql
drwxr-xr-x 4 mysql mysql 4096 Feb 10 21:24 /var/lib/mysql
drwxr-s--- 2 mysql adm   4096 Feb 10 20:56 /var/log/mysql
vagrant@bionic:~$ ls -ld /mnt/ /mnt/sda1/ /mnt/sda1/mysql/
drwxr-xr-x 3 root root 4096 Feb 10 21:22 /mnt/
drwxr-xr-x 3 root root 4096 Feb 10 21:23 /mnt/sda1/
drwxr-xr-x 2 root root 4096 Feb 10 21:23 /mnt/sda1/mysql/
vagrant@bionic:~$ sudo chown mysql:mysql /mnt/sda1/mysql
vagrant@bionic:~$ sudo systemctl stop mariadb
vagrant@bionic:~$ mysqld --print-defaults
# Ausgabe umformatiert: Eine Zeile pro Option
mysqld would have been started with the following arguments:
--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
--lc-messages-dir=/usr/share/mysql
--skip-external-locking
--bind-address=127.0.0.1
--key_buffer_size=16M
--max_allowed_packet=16M
--thread_stack=192K
--thread_cache_size=8
--myisam_recover_options=BACKUP
--query_cache_limit=1M
--query_cache_size=16M
--log_error=/var/log/mysql/error.log
--expire_logs_days=10
--max_binlog_size=100M
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
vagrant@bionic:~$ EDITOR=vim sudoedit /etc/mysql/mariadb.conf.d/50-server.cnf 
# EDITOR=<program> ist nur eine Marotte und kann weggelassen werden; default ist nano
# Optionen datadir und log_bin angepasst
vagrant@bionic:~$ grep -E 'datadir|log_bin' /etc/mysql/mariadb.conf.d/50-server.cnf 
datadir		= /mnt/sda1/mysql
log_bin	#		= /var/log/mysql/mysql-bin.log
vagrant@bionic:~$ mysqld --print-defaults
# Ausgabe auf das Wesentliche reduziert
--datadir=/mnt/sda1/mysql
--log_bin
vagrant@bionic:~$ sudo cp -av /var/lib/mysql/* /mnt/sda1/mysql/
vagrant@bionic:~$ sudo systemctl start mariadb
vagrant@bionic:~$ sudo systemctl status mariadb
● mariadb.service - MariaDB 10.1.44 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-02-10 21:50:00 CET; 5min ago
vagrant@bionic:~$ sudo lsof | grep mnt/sda1/mysql | wc -l
1701
vagrant@bionic:~$ sudo lsof | grep var/lib/mysql | wc -l
0
vagrant@bionic:~$ sudo mysql -u root -p
# Nächster Test, ob die Datenbank erreichbar ist
vagrant@bionic:~$ sudo rm -rf /var/lib/mysql

Vielleicht findest du da bereits einen Schnipsel, der dir vor Ort weiterhilft. Ansonsten helfen mit Sicherheit deine Angaben.

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
find /etc/mysql/
/etc/mysql/
/etc/mysql/conf.d
/etc/mysql/conf.d/mysqld_safe_syslog.cnf
/etc/mysql/my.cnf
/etc/mysql/debian-start
/etc/mysql/my.cnf.bak
/etc/mysql/mariadb.cnf
/etc/mysql/mariadb.conf.d
/etc/mysql/debian.cnf

Die Änderung des Datadirectory in my.cnf in /mnt/sda1/mysql hat zur Folge, dass der Server immer noch von /var/lib/mysql aus startet. Wenn ich diese nach ~/mysql_old verschiebe startet der Server nicht mehr.Hier der syslog:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
mariadb.service - MariaDB 10.3.22 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: failed (Result: exit-code) since Tue 2020-02-11 18:46:57 CET; 6s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 16361 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
  Process: 16178 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
  Process: 16176 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 16175 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
 Main PID: 16361 (code=exited, status=1/FAILURE)
   Status: "MariaDB server is down"

Feb 11 18:46:56 rock64 systemd[1]: Starting MariaDB 10.3.22 database server...
Feb 11 18:46:57 rock64 mysqld[16361]: 2020-02-11 18:46:57 0 [Note] /usr/sbin/mysqld (mysqld 10.3.22-MariaDB-1:10.3.22+maria~bionic-log) starting as process 16361 ...
Feb 11 18:46:57 rock64 mysqld[16361]: 2020-02-11 18:46:57 0 [Warning] Can't create test file /mnt/sda1/mysql/rock64.lower-test
Feb 11 18:46:57 rock64 mysqld[16361]: [91B blob data]
Feb 11 18:46:57 rock64 mysqld[16361]: 2020-02-11 18:46:57 0 [ERROR] Aborting
Feb 11 18:46:57 rock64 systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE
Feb 11 18:46:57 rock64 systemd[1]: mariadb.service: Failed with result 'exit-code'.
Feb 11 18:46:57 rock64 systemd[1]: Failed to start MariaDB 10.3.22 database server.

Und wie schiebe ich den binlog genau auf die externe?

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Was mich nach wie vor brennend interessiert:

mysqld --print-defaults 

Die my.cnf referenziert im Normalfall (also frische Installation) mit !includedir die Unterverzeichnisse, aus denen dann wiederum alle cnf-Dateien geladen werden. Wenn du dort nicht selbst eine Sektion namens [mysqld] angelegt und dort dein datadir definiert hast, gehe ich davon aus, dass mysqld dieses datadir gar nicht wahrnimmt.

Nachdem die my.cnf geladen wurde, zieht sich mysqld die ganzen mittels !includedir definierten Verzeichnisse rein, lädt die cnf-Dateien und von denen die Sektionen mysqld server mysqld-10.1 mariadb mariadb-10.1 client-server galera (lt. mysqld --help --verbose). Da mysqld keine Vorgabe bei der Reihenfolge macht und die letzte Zuweisung gewinnt, kann es sein, dass deine neue datadir-Definition zuerst geladen und danach durch eine andere überschrieben wird.

Kurz: Ich gehe davon aus, dass du deine Änderung an der falschen Stelle gemacht hast.

Ich habe es nicht explizit getestet, gehe beim Verschieben des binlogs allerdings davon aus, dass es reichen sollte, nach dem Setzen des korrekten datadirs die Inhalte des binlog-Verzeichnisses in das neue datadir zu schieben und dann die Pfadangabe hinter log_bin zu entfernen/auszukommentieren.

CountOmega

(Themenstarter)

Anmeldungsdatum:
26. Mai 2019

Beiträge: 53

Ah entschuldige, hier die Ausgabe

1
2
3
mysqld --print-defaults
mysqld would have been started with the following arguments:
--basedir=/usr --bind-address=127.0.0.1 --binlog_format=ROW --bulk_insert_buffer_size=16M --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --concurrent_insert=2 --connect_timeout=5 --datadir=/var/lib/mysql --default_storage_engine=InnoDB --expire_logs_days=1 --general_log_file=/var/log/mysql/mysql.log --general_log=0 --innodb_buffer_pool_size=1024M --innodb_buffer_pool_instances=1 --innodb_flush_log_at_trx_commit=2 --innodb_log_buffer_size=32M --innodb_max_dirty_pages_pct=90 --innodb_file_per_table=1 --innodb_open_files=400 --innodb_io_capacity=4000 --innodb_flush_method=O_DIRECT --key_buffer_size=128M --lc_messages_dir=/usr/share/mysql --lc_messages=en_US --log_bin=/var/log/mysql/mariadb-bin --log_bin_index=/var/log/mysql/mariadb-bin.index --log_error=/var/log/mysql/mysql_error.log --log_slow_verbosity=query_plan --log_warnings=2 --long_query_time=1 --max_allowed_packet=16M --max_binlog_size=1M --max_connections=200 --max_heap_table_size=64M --myisam_recover_options=BACKUP --myisam_sort_buffer_size=512M --port=3306 --pid-file=/var/run/mysqld/mysqld.pid --query_cache_limit=2M --query_cache_size=64M --query_cache_type=1 --query_cache_min_res_unit=2k --read_buffer_size=2M --read_rnd_buffer_size=1M --skip-external-locking --skip-name-resolve --slow_query_log_file=/var/log/mysql/mariadb-slow.log --slow-query-log=1 --socket=/var/run/mysqld/mysqld.sock --sort_buffer_size=4M --table_open_cache=400 --thread_cache_size=128 --tmp_table_size=64M --tmpdir=/tmp --transaction_isolation=READ-COMMITTED --user=mysql --wait_timeout=600

Ich werde nun auch eine separerate Partition mit ca 1-2 gb erstellen, da sonst das ebenfalls dort befindliche Nextcloud Daten Verzeichnis nicht erkannt wird.

Antworten |