MySQL Server 8 Upgrade Fehler & Hinweise

August 10, 2022 - Lesezeit: 4 Minuten

Mit dem MySQL Server 8, welcher ab Ubuntu 20 LTS Standard ist und auch bei einem System Upgrade installiert wird, wurden einige Server-Variablen entfernt und hinzugefügt.

https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html

Das kann bei einem Upgrade zu Fehlern führen, sofern man die entfernten Variablen verwendet hat und ggf. lässt sich der Server nicht mehr starten.

In meinem Fall war dies nach einem Upgrade von Ubuntu 18.04 LTS auf Ubuntu 20.04 LTS der Fall.

Die Logdatei unter /var/log/mysql/error.log gab den folgenden Fehler aus:

[Server] unknown variable 'query_cache_limit=1M'.

Also die Variable in /etc/mysql/my.cnf auskommentiert und direkt den nächsten Fehler wegen einer entfernten Variable bekommen:

[Server] unknown variable 'query_cache_size=16M'.

Diese ebenfalls auskommentiert und der MySQL Server ließ sich wieder starten.

Hintergrund: Die beiden Variablen bezogen sich auf den query cache, welcher eine bliebte Methode zum MySQL-Server Performance Tuning war. Seit MySQL 5.7.20 galt dieser aber als veraltet und wurde mit MySQL 8.0 dann komplett entfernt sowie dann auch die Variablen. Wer auf den query cache nicht verzichten kann, findet unter https://proxysql.com/ eine Möglichkeit oder kann diesen auch noch unter MariaDB verwenden. Generell gilt die Entfernung wohl jedoch eher dem Aufruf besseren Code zu schreiben. Ein guter Artikel zu dem Thema findet sich auch hier: https://mysqlquicksand.wordpress.com/2020/05/08/10-reasons-why-mysql-query-cache-should-be-switched-off/


Ein weiteres Problem hatte ich dann mit einem Script, welches einen MSSQL Export als CSV Datei durchführt und diese wieder nach MySQL importiert (siehe auch https://www.le-brice.de/mssql-export-unter-ubuntu-linux). Dazu verwende ich einen MySQL Befehl der auf LOAD DATA LOCAL INFILE zurückgreift:

LOAD DATA LOCAL INFILE 'import.csv' INTO TABLE tablename FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'

Bei der Verwendung des LOAD DATA LOCAL Statement gibt es seitens der MySQL Entwickler Sicherheitsbedenken, weshalb dieses in MySQL 8 nicht mehr standardmäßig verwendet werden kann. Siehe:

https://dev.mysql.com/doc/refman/8.0/en/load-data-local-security.html

Um das Statement wieder verwenden zu können muss sowohl der MySQL-Server, als auch der verwendete MySQL-Client (in meinem Fall der Standard CLI-Client auf den das Script zurückgreift) die local_infile Variable auf 1 gesetzt haben. Dies kann in der my.cnf unter /etc/mysql/my.cnf geschehen. Der [mysql] Bereich wird sehr wahrscheinlich bereits vorhanden sein, der [client] Bereich ggf. noch nicht und kann am Ende der Konfiguration hinzugefügt werden. Kommentare zur Erinnerung sind empfohlen.

[mysql]
#allow LOAD DATA LOCAL statement on server side
local_infile    = 1
#allow LOAD DATA LOCAL statement on client side
[client]
local_infile    = 1 

Danach den MySQL Server neustarten und das LOAD DATA LOCAL INFILE Statement kann wieder verwendet werden. Übrigens kann man auch die Variable per SQL-Client prüfen:

mysql> show global variables LIKE '%INFILE%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+
1 row in set (0,00 sec)

mysql>

Da es sich hier, abhängig von der Serververwendung und Umgebung, um eine durchaus zu beachtene Sicherheitswarnung handelt empfehle ich den Abschnitt aus der oben genannten Referenz "Restricting Files Permitted for Local Data Loading" zu beherzigen oder ggf. auch das Script umzubauen um nicht mehr auf die Funktion zurückgreifen zu müssen.


MSSQL Export unter Ubuntu Linux

Juni 19, 2019 - Lesezeit: 5 Minuten

1. Installation der MSSQL Tools

Man benötigt dazu die MSSQL-Tools, welche nicht Teil der offiziellen Ubuntu Repositories sind, aber von Microsoft bereitgestellt werden. Folglich muss APT eine neue Quelle hinzugefügt werden.

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list

Update August 2022: Dieses Beispiel ist für einen Ubuntu Server 16, wer z.B. die 18.04/20.04/22 Version benutzt kann dies in der URL anpassen und 16.04 durch 18/20.04 ersetzten. MS supportert hier die aktuellen LTS Versionen.

Danach mit dem üblichen apt-get update die Quellen aktualisieren und die Tools sowie nötige ODBC Biblotheken installieren.

sudo apt-get update 
sudo apt-get install mssql-tools unixodbc-dev

Die nötigen Programme finden sich danach unter

/opt/mssql-tools/bin

Dieser Pfad ist üblicherweise nicht in den Umgebungsvariablen der Shell enthalten, man muss die Tools also direkt ansprechen. Wer es bequemer mag fügt einfach den Pfad zu seinen Shell Umgebungsvariablen hinzu. Dazu kann man die .profile im Homeverzeichnis verwenden oder auch die .bashrc, sofern man die Bash Shell benutzt.

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

Der erste Befehl ergänzt die zwei Programme unter /opt/mssql-tools/bin in der PATH Varibale ohne die bereits bestehenden Einträge zu überschreiben. Der source Befehl führt die aktualisierte Umgebung direkt aus.

Checken ob alles geklappt hat kann man einfach indem man sql in die Shell tippt, gefolgt von der Tab Taste, es sollte dann direkt sqlcmd vervollständigt werden, bzw. zur Auswahl stehen. Nachfolgende kann man eine einfache Abfrage an den MSSQL Server schicken, z.B.

sqlcmd -S localhost -d <datenbankname> -U sa -P <passwort> -Q "SELECT user_id FROM users"

Localhost wird vermutlich in den meisten Fällen durch die IP Adresse des MSSQL Servers ersetzt. Nachdem -d Argument lässt sich der Name der Datenbank angeben, natürlich ohne die Tag Klammern. Nachdem -Q Argument kommt einfach das gewünschte SQL Query in Anführungszeichen.

Ein Nachteil lässt sich direkt erkennen. Im Gegensatz zu z.B. MySQL/Maria DB muss nachdem Argument -P das Passwort im Klartext folgen und kann nicht einfach vor der Ausführung der Abfrage eingegeben werden. Aus Sicherheitsgründen sollte man daher am besten die entsprechenden sqlcmd Befehle aus der Bash History wieder entfernen und/oder die History für die Dauer der sqlcmd Befehle deaktiveren. Eine weitere Alternative wäre einen Benutzer auf dem MSSQL Server einzurichten der nur entsprechende Leserechte auf die benötigten Tabellen hat.

Die Bash History findet sich unter ~/.bash_history und lässt sich mit einem Editor (vi /nano) bearbeiten. Deaktivieren kann man die History mit set +o history und wieder aktivieren mit set -o history. Vollständig leeren kann man die History übrigens auch mit history -c. Aber Achtung, bevor man die komplette History löscht, sollte man sich sicher sein das man darin keine Befehle hat, die man vielleicht noch wiederverwenden will und nicht auswendig kennt.

2. Export mit bcp

Neben sqlcmd wurde bcp (Bulk Copy Program) mit den MSSQL Tools installiert und damit lässt sich nun ein Export eines Datenbank Queries durchführen.

Folgender Befehl würde alle Inhalte der Tabelle Users aus der Datenbank Test_DB in die Datei user_export.txt exportieren.

bcp Users out user_export.txt -S localhost -U sa -P <passwort> -d Test_DB -c -t ','

Interessanter ist in meinen Augen aber nicht der Export einer ganzen Tabelle, sondern eines Querys. Dies geht wie folgt:

bcp "SELECT user_id, username FROM users" queryout users.txt -S localhost-U sa -P <-passwort> -d TEST_DB -c -t ','

Es werden zwei Felder aus der Tabelle users in die Datei users.txt exportiert und die Werte mit Komma getrennt.

Quellen:

https://docs.microsoft.com/de-de/sql/linux/sql-server-linux-setup-tools?view=sql-server-2017 https://docs.microsoft.com/de-de/sql/linux/sql-server-linux-migrate-bcp?view=sql-server-2017 https://docs.microsoft.com/de-de/sql/tools/bcp-utility?view=sql-server-2017


Eine NFS Freigabe in Windows Server 2016 einbinden

Dezember 6, 2018 - Lesezeit: 2 Minuten

Eine NFS Freigabe, die z.B. auf einem Linux Server liegt, kann man auch problemlos auf einem Windows Server einbinden und nutzen. Dazu muss der NFS Client installiert sein, dies kann man über den Server Manager machen, aber auch über die Power Shell, was wesentlich flotter geht.

  1. Powershell als Administrator starten (z.B. per Rechtsklick auf das Powershell Symbol und dann "Als Administrator ausführen" wählen).
  2. Per Get-WindowsFeature -Name NFS* prüfen ob das Feature vorhanden ist und dann ...
  3. ... mit Install-WindowsFeature -Name NFS-Client installieren.

Das dauert dann ein paar Sekunden und am Ende sollte folgende Ausgabe zu sehen sein:

Bildbeschreibung

Das war es dann schon fast, jetzt gibt es mehrere Möglichkeiten die NFS Freigabe einzubinden, die einfachste ist nach wie vor: über Computer und dann Netzlaufwerk verbinden.

Bildbeschreibung

Bildbeschreibung

Falls es mit der Freigabe nicht so ganz klappt sollte man kontrollieren ob auf dem NFS Server der neue Server auch eingetragen ist, denn das wird gerne vergessen. Unter Linux sollte man dafür in der Datei /etc/exports nachschauen, die man dann nach einer Änderung auch neu einlesen sollte, z.B. mit (sudo) exportfs -ra


Linux Grundbefehle - Cheat Sheet

Oktober 3, 2018 - Lesezeit: ~1 Minute

Ein von mir erstelltes Cheat Sheet für ein Linux Grundlagen Seminar, findet sich unter folgendem Link:

https://www.cheatography.com/brice/cheat-sheets/linux-grundbefehle/


Kein Zugriff auf Samba (smb) nach Windows 10 v1709 Update

November 28, 2017 - Lesezeit: ~1 Minute

Wer auf einen Samba Server nach dem Windows 10 v1709 Update nicht mehr zugreifen kann, sollte mal einen Blick in die Registry werfen und nach diesem Schlüssel suchen:

AllowInsecureGuestAuth

Setzt man den Wert auf 1, klappt es wieder.

Fehlermeldung die man zu Gesicht bekam:

Sie können nicht auf diesen freigegebenen Ordner zugreifen, weil der Zugriff nicht authentifizierter Gäste durch die Sicherheitsrichtlinien Ihrer Organisation blockiert werden. Diese Richtlinien helfen, Ihren PC vor unsicheren oder bösartigen Geräten im Netzwerk zu schützen

Link zum Group Policy Administrative Templates Catalog


LVM

November 28, 2017 - Lesezeit: 4 Minuten

Hat man einen Linux Server mit LVM (Logical Volume Manager) und möchte z.B. eine weitere Partition oder eine neue Festplatte in den LVM aufnehmen, kann man dies wie folgt erledigen.
Achtung! Wie immer gilt, eine Sicherung kann nicht schaden, die Arbeit am Dateisysstem oder den Festplatten kann immer auch nach hinten losgehen. In meinem Szenario ging es vor allem darum eine neue Platte im LVM zu nutzen.

Um zu sehen was man überhaupt für Platten und Partitionen hat empfiehlt sich ein:

(sudo) fdisk -l

sowie ein Überblick über die bereits für den LVM verfügbaren Physical Volumes mit:

(sudo) pvs

und

(sudo) pvdisplay

Wenn das System die Platte noch nicht erkannt hat, muss man ggf. zuerst einen Neustart durchführen und danach eine leere Partition anlegen. Dies geht sehr gut mit

(sudo) cfdisk /dev/sdb

Zuerst die gewünschte Platte oder Partition als PV (Physical Volume) initalisieren, in meinem Fall für /dev/sdb1 :

(sudo) pvcreate /dev/sdb1

Danach kann man mit pvs erneut nachsehen ob es auch geklappt hat. Jetzt hat man die Möglichkeit entweder eine vorhandene Volume Group (VG) zu erweitern (z.B. / oder /home) oder eine neue Volume Group anzulegen. Ähnlich wie oben gibt es auch hier wieder die Befehle vgs und vgdisplay.

Ich lege eine neue VG an mit (samba ist der Name der VG und kann beliebig sinnvoll benannt werden) und füge das gewünschte PV hinzu. Vorteil eine Volume Group kann aus mehreren Physischen Volumes bestehen und so in der Größe variieren:

(sudo) vgcreate samba /dev/sdb1

Jetzt muss in der VG ein Logical Volume erstellt werden, dies können wir dann später mit einem Dateisystem bestücken und damit arbeiten. Auch das LV kann später wieder erweitert werden und somit mehr Platz geschaffen werden.

(sudo) lvcreate -L 500G -n files samba

files ist der Name der LV und Samba der VG.

Möchte man den ganzen Platz der neuen Partition für das Logical Volume verwenden, geht dass über das Flag mit dem kleinen "L":

(sudo) lvcreate -l 100%FREE -n files samba

Dateisystem erstellen:

(sudo) mkfs.ext4 /dev/samba/files

Und mounten, dazu den LV Path benutzen (ggf. über lvdisplay rauszufinden)

(sudo) mount /dev/samba/files /samba

Damit der Mount dauerhaft zur Verfügung steht muss er in die /etc/fstab eingetragen werden.

Vergrößern und erweitern kann man bei Bedarf. Dazu immer erst die VG erweitern mit vgextend, dann die LV erwietern mit lvextend, außer in der VG wäre noch Platz, dann reicht natürlich ein lvextend, z.B.

lvextend ‐L +10G files

Erweitert das LV um 10 GB. Lässt man das + weg kann man die gewünschte Gesamtgröße angeben oder auch +100%FREE für die maximale Größe verwenden.Jetzt sollte man auf jeden Fall mit resizefs -p /dev/name das Dateisystem auch erweitern um den neuen Platz nutzen zu können. Verkleinern geht auch, habe ich aber noch nie benutzt, dazu gibt es den Befehl lvreduce

Schön ist auch die Möglichkeit Snapshots zu erstellen, dazu ein ander Mal mehr.