Ich möchte in diesem Guide zeigen wie einfach eine MySQL Datenbank von einem Server auf einen den anderen Server übertragen werden kann oder dupliziert wird. Es gibt natürlich mehrere Wege bzw. Programme von Drittanbietern, die einen Transfer (Sicherung) vereinfachen oder auch grafisch darstellen. Ich erkläre hier aber bewusst den Weg auf der Linux Konsole.
MySQL Datenbank sichern
Die MySQL Datenbank, mit dem Namen datenbank1, wird mit dem Befehl “mysqldump” gesichert. Es wird dabei ein Abbild (dump) von datenbank1 nach /usr/src/datenbank1.sql geschrieben. Das MySQL Root Passwort wird nach der Eingabe abgefragt.
Dieser Schritt kann übersprungen werden, wenn die Datenbank auf dem gleichen Datenbankserver kopiert werden soll.
Da die Datenbank nun in eine .sql Datei exportiert wurde kann sie auf den neuen Server (am Beispiel IP: 192.168.1.155) übertragen werden. Eine einfache Möglichkeit bietet der Befehl “scp”. Das Programm ist auf allen gängigen Linux Distributionen vorinstalliert und sehr einfach zu bedienen. (Ihr könnt die Datei auch manuell oder mit rsync transferieren)
Nach der Passworteingabe wird die Datei datenbank1.sql auf den neuen Server übertragen.
Datenbank am neuen Server erstellen
Auf dem Zielserver müssen wir nun eine neue MySQL Datenbank erstellen, in die der MySQL Dump vom alten Server eingespielt wird. Es können natürlich spezielle Berechtigungen gesetzt werden, das würde aber diesen Beitrag sprengen. Daher wird der Datenbankuser mit grant all privileges auf datenbank1 angelegt und dabei auf den localhost begrenzt.
mysql -u root -p
Neue MySQL Datenbank (datenbank1) erstellen:
create database datenbank1;
MySQL Datenbankbenutzer (dein-user) mit dem Passwort (dein_passwort) anlegen
grant all privileges on datenbank1.* to 'dein_user'@'localhost' identified by 'dein_passwort' with grant option;
MySQL Datenbank wiederherstellen
Der MySQL Datenbank dump (datenbank1.sql) wird nun am neuen Server in die zuvor erstelle neue Datenbank (datenbank1) wiederhergestellt. Das MySQL root Passwort wird nach der Eingabe abgefragt.
mysql -u root -p datenbank1 < /usr/src/datenbank1.sql
Gesamten MySQL Datenbankserver mit mehreren Datenbanken transferieren
Wer einen größeren MySQL Datenbankserver mit vielen Datenbanken transferieren möchte, der sollte sich am alten Server die Datenbank “mysql” mit dumpen, da dort die User Informationen, Rechte und Passwörter gespeichert sind. So ist es nicht notwendig, neben den Datenbanken auch noch die User und Passwörter anzulegen.
Kurze Zusammenfassung:
mysqldump -u root -p mysql > /usr/src/mysql.sql
scp /usr/src/mysql.sql root@192.168.1.155:/usr/src/
mysql -u root -p mysql < /usr/src/mysql.sql
Nach dem Einspielen sollte unbedingt noch ein flush privileges auf der Datenbank durchgeführt werden:
Wem ist es noch nie passiert ein Passwort zu vergessen oder zu verlegen? Kommt einfach gelegentlich in den besten Firmen vor. So setzt man das MySQL Server Root Passwort zurück.
Ich möchte natürlich anmerken dass es mehrere Wege gibt um das Passwort wiederherzustellen, mit folgender Methode habe ich allerdings die besten Erfahrungen gemacht.
1) MySQL Datenbank Server stoppen
/etc/init.d/mysql stop
2) MySQL Server im Safe Mode ohne Passworteingabe und ohne Netzwerk starten
MySQL wird nun im Safe Mode ohne Passwortabfrage gestartet. Da nun ohne Passwort auf die Datenbank zugegriffen werden kann wird zusätzlich mit –skip-networking der Netzwerkzugriff unterbunden (kein muss aber zu empfehlen).
Sequel Pro ist ein kostenloses MySQL Datenbank Management Tool für Mac OS X, welches ich schon viele Jahre im Einsatz habe. Wer wie ich viel mit verschiedenen MySQL Datenbankservern arbeitet, der wird Sequel Pro aufgrund der tollen Verbindungsverwaltung lieben. In diesem Sinne: Happy Birthday Sequel Pro zur Version 1.0!
MySQL Datenbank Zugriff via SSH
Eine der tollsten Funktionen von Sequel Pro ist der Zugriff auf MySQL Datenbanken über SSH. Es muss also keine MySQL Server Verbindung von extern erlaubt werden sondern das Tool verbindet sich über die SSH Zugangsdaten oder private Keys auf den Remote Server und arbeitet dann direkt über den Localhost (127.0.0.1) auf der Datenbank. Das war damals der Grund warum ich mich für Sequel Pro als MySQL Verwaltungstool entschieden habe.
Ein weiterer Grund ist natürlich dass Sequel Pro kostenlos ist
“A Day in the Life of Facebook Operations” bezeichnete Tom Cook, System Engineer von Facebook seinen Vortrag auf der “Velocity 2010″ Er liefert dabei interessante Einblicke in den Aufbau der Server und Services, auf Open-Source Basis.
Da Facebook mittlerweile mehrere 10.000 Server hinter einem gigantischen Load Balancer System im Einsatz hat, ist es eine große Herausforderung diese alle zu Verwalten und auf den aktuellen Stand (Patches, Security Fixes, …) zu halten. Tom Cook erläutert in seinem ca. 40 minütigen Vortrag den grundlegenden Aufbau von Facebook. Hier einige wichtige Fakten und Komponenten aus der Sicht eines Systemadministrators.
Betriebsystem:
Facebook setzt ausschließlich auf Linux. Verwendet wird eine CentOS 5 Version mit einem modifizierten 2.6er Kernel
HipHop for Php ist ein SourceCode Transformer, welcher PHP in einen performanceoptimierten und kompilierten C++ Code verwandelt. Enwickelt wird das System von 3 Facebook Engineers auf Open-Source Basis. Durch die Einführung von HipHop wurde die WebServerlast von Facebook um beachtliche 50% Reduziert.
Memcached
Ist ein Open Source Cache-Server der häufig verwendete Abfragen (insbesondere SELECT Statements) vom Datenbankserver im Arbeitsspeicher abspeichert und dadurch Festplattenzugriffe bzw. Datenkbankzugriffe stark reduziert. Memcached hält für Facebook derzeit über 300+ TB live Daten im RAM.
Configuration Management:
CFengine 2.x.x
ist eine zentrale Configurations Management Software um viele (mehrere 10.000) Systeme auf den gleichen Softwarestand zu bringen und zu aktualisieren. Dieser Vorgang wird alle 15 Minuten für ALLE Server ausgeführt. So können zentral über 100 Policies welche einige 1000 Regeln beinhalten innerhalb von 30 Sekunden bei allen Servern auf den neuesten Stand gebracht werden.
Monitoring:
Hierbei setzt man ebenfalls auf bekanntere System wie Ganglia, Nagios und ODS (Operational Data Store),
WebPush:
Das Verteilen von neuen Inhalten, Features und Patches für Facebook.com wird über einen internen BitTorrent Server realisiert. Es dauert so ungefähr eine Minute bis der neue Code für Facebook.com auf mehreren 10.000 Servern verfügbar ist. Folgende Zyklen werden dabei verwendet
1x pro Woche für neue Features
1x pro Tag für Code Änderungen an der Hauptseite
mehrere male am Tag für Bugfixes und Patches
Das Passwort eines MySQL Users oder von Root in der Kommandozeile zu ändern ist eigentlich ein ziemlich simpler Vorgang. Da ich mir den Befehl aber selber nie merken kann schreibe ich ihn hier auf:
MySQL User Passwort ändern
Variante 1: via mysqladmin
Folgender Befehl wird im Linux Terminal abgesetzt um das Passwort eines Users zu ändern (dein-neues-passwort und dein-user durch ein entsprechendes Passwort bzw. Usernamen ersetzten)
Mit folgenden Befehl auf der MySQL Serverkonsole anmelden
mysql -u root -p
Die Datenbank mysql auswählen
use mysql;
Passwort mit folgendem Befehl ändern (dein-neues-passwort und dein-user durch ein entsprechendes Passwort bzw. Usernamen ersetzten)
update user set password=PASSWORD('dein-neues-passwort') where User='dein-user';
Anschließend ein Flush Privileges durchführen und die MySQL Konsole beenden
flush privileges;
quit
MySQL Root Passwort ändern
Initiales MySQL Root Passwort festlegen (erstmaliges definieren vom Passwort)
Wenn noch kein MySQL root Passwort vergeben ist, kann es mit folgendem Befehl vergeben werden:
mysqladmin -u root password 'dein-neues-passwort'
MySQL Root Passwort ändern – Variante 1: via mysqladmin
Folgender Befehl wird im Linux Terminal abgesetzt um das Passwort des Root Users zu ändern (dein-neues-passwort durch ein entsprechendes Passwort ersetzten)
Sequel Pro ist ein OpenSource MySQL Management Tool für den MAC, welches einige nützliche Extras, wie das SSH-Tunneling besitzt.
Sequel Pro ist ein sehr hilfreiches Tool für jeden Webentwickler und (Datenbank)Administratoren, die viel mit MySQL Datenbanken zu tun haben. Im Bereich von MAC OS X gibt es leider sehr wenig Tools, welche diese Funktionen bieten und noch dazu OpenSource sind. Aufgebaut ist Sequel Pro auf das bekannte Tool CacoaMySQL, welches sein einiger Zeit nicht mehr weiterentwickelt wurde. Die Funktionen wurden jedoch um einiges erweitert und die Oberfläche grundlegend überarbeitet.
MySQL Datenbank Zugriff via SSH Tunnel
Das Besondere an Sequel Pro ist die Möglichkeit auf MySQL Datenbanken via SSH Tunnel zuzugreifen. Es muss somit von extern keine Verbindung mehr zugelassen werden, sondern man kann bequem per SSH auf die lokale Datenbank eines Servers zugreifen. Die Verbindungen können natürlich auch als Favoriten abgespeichert werden, damit beim nächsten mal der Zugriff schneller stattfindet.
Ein weiteres MySQL Problem, welches mir schon des öfteren über den Weg gelaufen ist: “ERROR 1045: Access denied for user ‘debian-sys-maint’@'localhost’” Ich will Euch hier kurz das Problem + Lösung erläutern
Das Problem
Debian hat einen eigenen Account (debian-sys-maint) für das Starten/Stoppen und Status checken von MySQL. Diese Userinformationen + Passwort werden in der Datei /etc/mysql/debian.cnf abgelegt. Nach einer Neuinstallation von MySQL, oder der Migrierung von einer Datenbank inklusive Usertabellen auf ein neues System stimmt das Passwort für den User nicht mehr überein:
/etc/init.d/mysql start
Starting MySQL database server: mysqld ..
Checking for corrupt, not cleanly closed and upgrade needing tables..
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
nvieking1:/# ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)
Die Lösung
Die Datei /etc/mysql/debian.cnf öffnen und das Passwort für den User debian-sys-maint auslesen und kopieren.
Mit dem root User auf die Datenbank verbinden:
mysql -u root -p
Das Passwort des Users debian-sys-maint mit folgendem Befehl ändern (<<passwort>> ist mit dem ausgelesenen Passwort zu ersetzen):
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘debian-sys-maint’@'localhost’ IDENTIFIED BY ‘<<passwort>>’ WITH GRANT OPTION;
Nun könnt ihr eure MySQL Datenbank wieder starten.
/etc/init.d/mysql start
Starting MySQL database server: mysqld ..
Checking for corrupt, not cleanly closed and upgrade needing tables..