Schlagwortarchiv: ubuntu

MySQL Datenbanken auf neuen Server übertragen

Mit diesem Artikel möchte ich euch ein Tutorial bieten, dass erklärt wie Datenbanken von einem MySQL Server auf einen anderen übertragen werden können. Es kann euch damit bei der Konsolidierung oder Migration von MySQL-Servern gute Dienste leisten.

Um Inkonsistenzen zu vermeiden empfehle ich den MySQL-Quell-Server in den Read-Only Modus zu schalten. Dazu ist zuerst eine Anmeldung am MySQL Server erforderlich.

mysql -u root -p

Einschalten des Read-Only Modus:

mysql> set GLOBAL read_only = true;

Möchte man den Read-Only Modus später wieder abschalten, so meldet man sich wieder am Server an und führt den folgenden Befehl aus.

mysql> set GLOBAL read_only = false;

Es gibt im Prinzip mehrere Möglichkeiten die Datenbanken auf den neuen Server zu transferieren. Ich entscheide mich hier für den Weg der in meisten Fällen zum Ziel führen sollte. Wir können die gewünschten Datenbanken nun mit dem folgenden Befehl sichern. Um die Zeit für den Transfer über das Netzwerk zu reduzieren wird der Dump noch mit gzip gepackt.

shell> mysqldump -u root -p --databases db_name1 [db_name2 ...] >my_databases.sql
shell> gzip my_databases.sql
shell> scp my_databases.sql.gz user@zielserver:/zielverzeichnis/

Auf dem Zielsystem können die Datenbanken nun mit gunzip entpackt und in die Datenbank eingespielt werden.

shell> gunzip my_databases.sql.gz
shell> mysql -u root -p < my_databases.sql

Jetzt müssen wir noch dafür sorgen, dass auf dem neuen MySQL-Server die gleichen Benutzer wie auf dem Quellserver hinzugefügt werden und diese die gleichen Berechtigungen auf die Datenbanken erhalten wie sie sie auf dem Quellsystem besaßen. Ich habe mich dafür entschieden die benötigten Benutzer und Berechtigungszuordnungen mit dem folgenden Abfragemuster aus der mysql-Datenbank des Quellservers in eine Textdatei zu schreiben. Dazu muss ich die Tabellen user und db abfragen.

SELECT someColumn FROM `table`
WHERE foo LIKE '%foo%'
INTO OUTFILE '/tmp/dbdump.txt'

Wie genau obige Abfrage aussieht ist von Fall zu Fall unterschiedlich. In meinem Fall habe ich in zwei Abfragen die Dateien mysql_user.txt und mysql_db.txt erstellt. Diese sind nun auf den Zielserver zu übertragen.

Auf dem Zielserver müssen die Inhalte dieser Dateien nun wieder in die Tabellen user und db der Datenbank mysql eingespielt werden. Wer auf Nummer sicher gehen möchte testet den Import mit der Datenbank test, welche auf jedem MySQL Server vorhanden sein sollte. Das Einlesen der Dateien erledigt man mit dem LOAD DATA INFILE Kommando.

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...)]

Bei einigen Ubuntusystemen, auf denen AppArmor läuft kann es zu einem Fehler beim Einlesen der Datei kommen. Wer von diesem Problem betroffen ist, kann hier eine Lösung finden.

Damit ist es geschafft. Unsere Datenbanken sind nun auf dem neuen Server angekommen und wir können den alten im besten Fall abschalten.

Bildbearbeitung in der Kommandozeile

Auf Ausflügen und im Urlaub begleitet mich neben meiner Freundin meist auch meine kleine Canon IXUS, um die schönsten Urlaubsbilder festhalten zu können. Die Fotos mache ich meist mit der höchsten Auflösung. Falls ich später ein Bild in Postergröße drucken lassen möchte habe ich so keine Probleme wegen einer zu geringen Auflösung. Jedoch belegen Bilder in Hoher Auflösung schnell 3-4MB pro Bild was die SSD bei vielen Bildern sehr schnell füllt.

Zu den regelmäßigen Aufgaben nach dem Urlaub gehört daher das Bilder durchsehen und verkleinern. Denn zum Zeigen auf den Notebook oder Tablet reicht meist auch eine wesentlich kleinere Auflösung und man spart jede Menge Speicherplatz ein.

Das Verkleinern der Bilder erledige ich schnell und einfach auf der Kommandozeile. Dazu habe ich mir folgendes Skript erstellt, dem ich beim Aufruf die gewünschte Auflösung mitgebe und schon wandelt es alle Bilder im angegebenen Verzeichnis um. Dabei werden keine neuen Dateien angelegt, sondern die vorhandenen bearbeitet. Daher sollte man sicher sein welche Auflösung man will.

#!/bin/bash
# Bildgroesse reduzieren und Seitenverhaeltnis beibehalten
# Die gewuenschte Aufloesung wird abgefragt
# Author: Joerg Kastning
# Lizenz: GPLv3
# Programmbeginn
read -p "Bitte die gewünschte Auflösung eingeben (z.B. 1600): " aufloesung
ls -1 *.JPG *.jpg | while read file;
do {
mogrify -resize "$aufloesung"x"$aufloesung" "$file"
echo "Bild $file wird verkleinert."
}
done
echo "Die Bearbeitung ist beendet."
exit

Möchte man seine Bilder nun noch ins Web hochladen, um sie mit Freunden zu teilen kann man den Bildern ein Wasserzeichen hinzufügen. Wasserzeichen schützen eure Bilder davor, dass andere sie als ihren eigenen Schnappschuss ausgeben. Denn sind eure Bilder erstmal im Netz kann sie dort so gut wie jeder finden und kopieren. Beim hinzufügen der Wasserzeichen hilft das folgende Skript welches ich im Wiki von Ubuntuusers gefunden habe.

#!/bin/bash
# Wasserzeichentext in alle JPEG Bilder aus diesen Verzeichnis einfuegen
# Der Wasserzeichentext wird unten links ins Bild eingebracht
# Sie koennen folgende Parameter anpassen:
Textabstandvonlinks=10
Textabstandvonunten=10
Schriftgroesse=10
PfadFonts="/usr/share/fonts/truetype/msttcorefonts"
# Pfad ist je nach Distribution unterschiedlich!
Schriftart="Arial.ttf"
Schriftfarbe="white"
# Moegliche Farben koennen aufgelistet werden mit dem Befehl: convert -list color
Wasserzeichentext="Copyright Joerg Kastning"
# Programmbeginn
echo "Textabstand von links: $Textabstandvonlinks"
echo "Textabstand von unten: $Textabstandvonunten"
echo "Schriftgoesse: $Schriftgroesse"
echo "Schriftart: $Schriftart"
echo "Schriftfarbe: $Schriftfarbe"
echo "Wasserzeichentext: $Wasserzeichentext"
echo " "
ls -1 *.JPG *.jpg | while read file;
do {
horizontal=`identify -verbose $file | grep Geometry: | awk {'print $2'} |cut -d"x" -f 1`
vertikal=`identify -verbose $file | grep Geometry: | awk {'print $2'} |cut -d"x" -f 2`
X=$Textabstandvonlinks
Y=$(($vertikal - $Textabstandvonunten))
convert
-font $PfadFonts/$Schriftart -pointsize $Schriftgroesse -fill
$Schriftfarbe -draw "text $X, $Y '$Wasserzeichentext'" "$file"
"`basename Wasserzeichen_"$file"`";
echo "Bearbeite Datei $file"
}
done
echo "Wasserzeichen wurden erfolgreich eingearbeitet"
exit
# Programmende

Diese beiden Skripts machen aus der Skalierung und dem Hinzufügen von Wasserzeichen ein Kinderspiel. So macht Bildbearbeitung in der Kommandozeile Spaß.

Ergänzung vom 15.12.2017

Beim Aufräumen und Sortieren meiner Bilder entstand eine neue Anforderung, die ich mit den beiden bisherigen Skripten nicht abdecken konnte. Datum und Uhrzeit der Aufnahme, sollten aus den EXIF-Informationen extrahiert und in den Dateinamen kodiert werden. Diese Aufgabe werde ich fortan mit folgendem Python-Skript erledigen:

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
#
# Beschreibung:
# Dieses Skript dient der Verarbeitung von JPEG-Dateien. Es wertet das
# Attribut 'EXIF DateTimeOriginal' aus und benennt die verbeiteten Dateien
# um, so dass diese dem Muster '_img.jpg' entsprechen.
#
# Autor:    Tronde (https://ubuntuusers.de/user/Tronde/)
# Lizenz:   GPLv3 (http://www.gnu.de/documents/gpl.de.html)

import os
import exifread
import argparse

def main():
    parser = argparse.ArgumentParser(description="Dieses Skript dient der Verarbeitung von JPEG-Dateien. Es wertet das Attribut 'EXIF DateTimeOriginal' aus und benennt die verbeiteten Dateien um, so dass diese dem Muster  entsprechen.")
    parser.add_argument("-s", "--source-dir", required=False, default='.', dest="src", help="Quell-Verzeichnis mit den zu verarbeitenden JPEG-Dateien.")

    args = parser.parse_args()
    
    src = args.src

    os.chdir(src)
    for file in os.listdir(src):
        if file.endswith(".jpg") or file.endswith(".JPG"):
            f = open(file, 'rb')
            tags = exifread.process_file(f, details=False, stop_tag='EXIF DateTimeOriginal')
            str_DateTime = str(tags['EXIF DateTimeOriginal']).split()
            str_Date = str(str_DateTime[0]).split(':')
            str_Time = str(str_DateTime[1]).split(':')
            Date = str_Date[0] + "-" + str_Date[1] + "-" + str_Date[2]
            Time = str_Time[0] + str_Time[1] + str_Time[2]
            fname = Date + "T" + Time + "_img.jpg"
#            print(fname)
            os.rename(file,fname)

if __name__ == "__main__":
main()

Das obige Skript

  1. liest alle JPG-Dateien eines Verzeichnisses ein,
  2. wertet die EXIF-Informationen aus und
  3. benennt die verbeiteten Dateien um, so dass diese dem Muster ‚_img.jpg‘ entsprechen.

Alles Skripte finden sich auch auf GitHub im Repository: https://github.com/Tronde/Bildbearbeitung

T-Online Mediencenter in Ubuntu einbinden

Mit dem T-Online Mediencenter bietet die Telekom einen Cloudspeicherdienst mit 25GB
Speicherkapazität. Dieser Artikel schreibt wie man das Mediencenter als Datenspeicher in Ubuntu/Linux einhängen kann, um es komfortabel mit dem Dateimanager oder über die Shell nutzen zu können.

Wie viele andere Speicherdienste kann auch das Mediencenter über den Webbrowser
genutzt werden. Die Software zur Synchronisation und zum Zugriff gibt es jedoch nur für Windows. Ein Softwareclient für Linux ist auch nicht in Planung. Es besteht jedoch die Möglichkeit das Mediencenter mittels WebDAV in das lokale Dateisystem einzuhängen. Die folgende Anleitung beschreibt wie dies funktioniert.

Quelle: http://skripta.de/Davfs2.html

T-Online-Cloud (Mediencenter) unter Linux einbinden
===================================================

Anmerkung: Die folgende Kurzanleitung wurde aus verschiedenen 
aehnlich lautenden Online-Anleitungen zusammengestellt und getestet.
z.B.:
http://anderes-en.de/blog.php?mode=view&blog=11
http://blog.philippklaus.de/2010/04/mount-t-online-mediencenter-via-webdav/

Es wurden nur geringfuegige Aenderungen vorgenommen. 

=======================================================

Paket davfs2 installieren:

    * sudo apt-get install davfs2

Berechtigungen fuer den Benutzer (username = lokaler Linux-Anmeldename) setzen:

    * sudo chmod u+s /usr/sbin/mount.davfs
    * sudo usermod -a -G davfs2 username

Im Home-Verzeichnis den spaeteren Mountpoint (Verzeichnis) erstellen:

    * mkdir ~/Mediencenter

Jetzt zur fstab:

     * cd /etc
     * sudo nano fstab

und folgendes am Ende eintragen (username = lokaler Linux-Anmeldename):

     * # T-Online Mediencenter
     * https://webdav.mediencenter.t-online.de/ /home/username/Mediencenter davfs rw,noauto,user 0 0

Datei secrets erstellen und editieren 

     * cd ~
     * mkdir ~/.davfs2
     * touch ~/.davfs2/secrets
     * chmod 600 ~/.davfs2/secrets
     * nano ~/.davfs2/secrets

In die Datei ~/.davfs2/secrets folgendes eintragen (username = lokaler Anmeldename) und 
fuer anmeldung@t-online.de sowie password die T-Online-Zugangsdaten eintragen:

     * /home/username/Mediencenter anmeldung@t-online.de password

Dann die davfs2.conf kopieren und editieren:

     * cp /etc/davfs2/davfs2.conf ~/.davfs2/
     * nano ~/.davfs2/davfs2.conf

Die dort vorhanden Settings auf folgende Werte aendern und das # davor entfernen:

     * if_match_bug 1
     * use_locks 0
     * cache_size 1 # MiByte
     * table_size 4096
     * delay_upload 1
     * gui_optimize 1

Jetzt kann man mit mount ~/Mediencenter das Online-Verzeichnis einhaengen 
ohne Eingabe der Zugangsdaten.

Umlaute im SSH-Terminal (Ubuntu & PuTTY-Client)

Greift man mit dem PuTTY-Client auf ein Ubuntu bzw. Debian System zu, werden
Umlaute wie z.B. “ä, ö, ü” falsch dargestellt. Dies lässt sich mit ein paar Klicks schnell beheben.

  1. Rechtsklick auf die Titelzeile des aktiven PuTTY-Fensters
  2. “Change Settings…” auswählen
  3. Unter Window -> Translation bei “Remote character set” die Encodierung UTF-8 auswählen
  4. Nach einem Klick auf Apply sind die Änderungen übernommen

Die Umlaute sollten nun korrekt angezeigt werden.

Easy Servermigration mit RSYNC

Soll ein Linux-Server auf eine neue Hardware umziehen, stehen uns hier mehrere Wege offen. Ich selbst habe die letzte Migration dieser Art mit RSYNC durchgeführt. Dies hat so gut geklappt, dass ich euch hier beschreiben möchte, wie dabei vorzugehen ist.

Ich habe mich für die folgende Vorgehensweise entschieden.

  1. Installation der Linuxdistribution des Quellsystems auf der neuen Hardware. Z.B. Quelle = Ubuntu Server 11.10 und Ziel = Ubuntu Server 11.10.
  2. Das Netzwerkinterface wird auf eine freie IP Adresse aus dem Netz konfiguriert, in dem sich auch das Quellsystem befindet.
  3. Für die Migration aktivieren wir auf dem Zielsystem den root-Account, in dem wir ihm ein Passwort geben -> sudo passwd root
  4. Um vom Quellsystem auf den neuen Server zugreifen  zu können installieren wir einen SSH-Server und richten uns den Zugriff über Public-Keys ein. Wie dies funktioniert wird sehr gut im Artikel SSH im Ubuntuusers Wiki erklärt.
  5. Auf dem neuen Server sollen nach der Migration die gleichen Pakete installiert sein wie auf dem Quellsystem. Dazu erstellt man auf dem Quellsystem mit dpkg –get-selections | awk ‚!/deinstall|purge|hold/ {print $1}‘ > ~/packages.listeine Liste aller installierten Pakete. Damit bei der Installation dieser Pakete die gleichen Paketquellen wie auf dem Quellsystem verwendet werden sichern wir diese ebenfalls mit find
    find /etc/apt/sources.list* -type f -name '*.list' -exec bash -c 'echo -e "\n## $1 ";grep "^[[:space:]]*[^#[:space:]]" ${1}' _ {} \; > sources.list.save

    in eine Datei. Diese beiden Dateien übertragen wir nun via SCP auf das Zielsystem.

  6. Nun kopiert man die sources.list.sav nach /etc/apt/sources.list und führt anschließend mit apt-get updateein Update der Quellen durch. Mit dem folgenden Befehl werden die Pakete aus der zuvor erstellten Liste installiert. ->
    xargs -a „packages.list“ sudo apt-get install
  7. Jetzt ist die Migration schon fast geschafft. Als nächsten kopieren wir uns die /etc/fstab und /etc/network/interfaces um später noch auf Infos aus diesen Dateien arbeiten zu können. Im letzten Schritt kopieren wir mit rsync -avz Quelle root@Zielhost:/ die benötigten Verzeichnisse und Dateien auf unser Zielsystem. Wird RSYNC als root ausgeführt werden dabei automatisch alle Zugriffsrechte beibehalten.
  8. Nachdem RSYNC durchgelaufen ist müssen nur noch die Dateien /etc/fstab und /etc/network/interfaces kontrolliert werden, damit der Server nach einem Reboot seine Festplatten findet und mit der IP-Konfiguration des Quellsystem startet. Das Quellsystem sollte nun vom Netzwerk getrennt werden.

Jetzt fehlt nur noch ein Neustart des neuen Servers und schon ist die Migration abgeschlossen. Das es so einfach geht hätte ich vorher selbst nicht gedacht. Aber nach der ersten Erfahrung werde ich bei der nächsten Migration wieder zu diesem Mittel greifen.

MySQL Server manuell starten und stoppen

Auf meinem Notbook (Thinkpad R61 mit Ubuntu 11.10) läuft ein MySQL Server. Diesen nutze ich für gelegentliche Spielereien und wenn ich verschiedene Aufgaben für mein Studium bearbeite.

Da ich diesen Server nicht jedes Mal benötige wenn ich mein Laptop starte möchte ich nicht, dass er automatisch mit Ubuntu mitgestartet wird. Um das Start-/Stop-Verhalten von MySQL zu verändern öffnet man die Datei /etc/init/mysql.conf mit dem Editor seiner Wahl. Im folgenden Abschnitt wird definiert in welchen Runleveln der MySQL Daemon automatisch gestartet wird.

start on (net-device-up
and local-filesystems
and runlevel [2345])
stop on runlevel [016]

Hier löscht man nun einfach die Zahlen aus der [ ]-Klamme heraus, dass der Codeblock wie folgt aussieht:

start on (net-device-up
and local-filesystems
and runlevel [])
stop on runlevel [016]

Und schon wird MySQL nicht mehr automatisch mit Ubuntu gestartet und man kann den Dienst manuell durch eingabe von

sudo service mysql start/stop

starten und beenden.

Kommt gut in die neue Woche.