Datensicherung eines sehr großen Verzeichnisses auf mehrere Datenträger

Wie sichert man ein sehr großes Verzeichnis auf mehrere DVDs? Mit der guten alten Shell. :)

Unter Windows besorgt man sich zuerst die GNU Tools. Das wbin Verzeichnis sollte man zu der PATH Umgebungsvariable hinzufügen. Unter Linux stehen die notwendigen Tools bereits zur Verfügung.

Folgender Befehl sichert das Verzeichnis C:\foo\bar als gzip komprimiert (tarball), aufgeteilt in 100 MB große Dateien:

tar c C:\foo\bar | gzip | split -b100m - backup.tgz.split.

Die Dateien haben eine Bezeichnung nach dem Schema backup.tgz.split.aa, backup.tgz.split.ab, …

Die Wiederherstellung ist genauso einfach:

cat backup.tgz.split.* | gzip -d | tar -x

Das Packen und Entpacken geht erstaunlich schnell und stabil (getestet mit 30 GB). Die Programme sind kostenlos. Was will man mehr?

PHP – Schnell oder wartbar?

Den richtigen Weg zwischen “Schnell” und “Wartbar” zu finden ist nicht einfach. Wie wichtig Code-Optimierung ist, sieht man an vielen Beispielen. Während „High End“-Root Server oft schon mit einem einzelnem Forum ausgelastet sind, pflegen wir wesentlich schwächere/ältere Systeme, die eine deutlich höhere Anzahl Anfragen verarbeiten.

Hierzu wieder zwei interessante Links:

Gerade die Datenbank ist ein beliebter Engpass. Deshalb sollte man, wann immer möglich, af den unnötigen Overhead verzichten.

  • Viele Anforderungen lassen sich mit einfachen Dateien lösen. Der direkte Zugriff ist schneller, als die Abfrage einer Datenbank. (Die muss schliesslich auch Dateien öffnen …)
  • Eine RAM Disk beschleunigt den Zugriff auf Dateien enorm.
  • Auch Datenbanken lassen sich komplett in den RAM legen. In mySQL nennt sich das MEMORY Storage Engine.
  • mySQL Tabellen lassen sich Partitionieren. Das beschleunigt den Zugriff auf die Daten mitunter enorm. (Date Tutorial, Range Tutorial)

Gerade die Leistung eines Datenbankservers lässt erheblich nach, sobald die abzufragende Tabelle nicht mehr in den Arbeitsspeicher passt. Da zeigt sich dann auch sehr schnell der Unterschied zwischen einem Join und einem WHERE foo.id=bar.id.

Nützliche Firefox Extensions für Web Entwickler

Trigger in mySQL

Folgendes (mySQL 5) Skript legt eine Tabelle an. Alle Daten die im Feld passwd gespeichert werden, wandelt mySQL in einen md5 String um. Ein bereits gewandelter String wird nicht neu gewandelt.

CREATE TABLE `foo` (
   `id` int(11) NOT NULL,
   `passwd` varchar(255) collate latin1_general_ci NOT NULL,
   `name` varchar(255) collate latin1_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

DELIMITER $$

CREATE TRIGGER md5ize_on_insert
BEFORE INSERT ON foo
FOR EACH ROW
      BEGIN
         SET NEW.passwd = md5( NEW.passwd ) ;
      END$$

CREATE TRIGGER md5ize_on_update
   BEFORE UPDATE ON foo FOR EACH ROW
      BEGIN
         IF NEW.passwd NOT REGEXP '^[0-9A-Za-z]{32}$' THEN
            SET NEW.passwd = md5(NEW.passwd);
         END IF;
      END $$

DELIMITER ;

Selbsterklärend und erhebt keinen Anspruch auf Vollständigkeit.

30° im Büro, 38° vor der Tür

Zumindest war es gestern so – und die zwei Wochen davor. Im Auto hatte ich die Klimaanlage auf 30° stehen. :( Völlig verrückt!

Gestern kam dann endlich der Regen. Innerhalb weniger Minuten kühlte es auf „nur“ 26 Grad ab. Jetzt sind es im Büro immernoch 25 Grad.

In hr1 hörte ich ein Interview mit einer „Expertin“. Demnach nimmt ab 22° die Leistungsfähigkeit eines Menschen pro Grad Erwärmung um 5% ab.

Ich glaube bei mir sind es ein paar Prozent mehr :|

Eine Partition formatiert = 4 Partitionen weg

Ich wollte noch schnell abends einen Versuch mit tar und split unter Windows machen. Eine Partition war noch unformatiert. Schliesslich wollte ich dort das Kubuntu von der Froscon ausprobieren. Die Formatierung quitierte Windows XP mit einem “Fehler bei der Formatierung.”. Danach waren vier Partitionen weg. :(

In so einem Fall hofft man, daß man seine Datensicherung nicht ausprobieren muss :D

Durch google fand ich Testdisk. Ein sehr geniales Programm. Testdisk erkannt sofort alle verlorene Partitionen und konnte die wichtigsten wiederherstellen. Für die leere Partition und die Windows Vista Partition kam jedoch jede Hilfe zu spät. Die 8GB (Vista) und 7GB (leer) Partition wurden als eine 15GB Partition wiederhergestellt. Diese Partition ist komplett mit Datenmüll gefüllt. (Erinnert mich ein bisschen an StarTrek …)

Bambalam PHP 2 EXE Compiler/Embedder

Bambalam ist ein kostenloser PHP2EXE Kompiler/Embedder. Das Programm packt PHP Code inklusive dem PHP Interpreter und verschiedene PHP Module in eine EXE Datei. Das erste kleine Tool für meine Arbeit war schnell ausgedacht und fast genauso schnell programmiert :).

Bambalam lässt sich natürlich wunderbar mit Winbinder o.ä. kombinieren. Einziger Nachteil: Bambalam kann bisher „nur“ mit PHP4 umgehen.

SELECT FOUND_ROWS();

Als mir jemand von SQL_CALC_FOUND_ROWS erzählte – ich glaube es war Darren -, dachte ich, ein SELECT COUNT(*) wäre kein Unterschied. Heute habe ich einen Verwendungszweck gefunden.

Ich arbeite zur Zeit an einer möglichst generischen Grundlage – ich möchte es nicht Framework nennen – für weitere Entwicklungen. In den ORM Objekten, die den Zugriff auf Tabellen ermöglichen, erzeuge ich dynamisch einen Join, um verschachtelte Objekte mit möglichst wenig “Kosten” zu erzeugen. Für die Spaltenbezeichnung benötige ich Aliase.

Die Funktion, die eine ganze Liste dieser Objekte erzeugt, kann natürlich gefiltert werden. Sobald ich nach einem Alias filtere, kann ich WHERE nicht verwenden und muss das kostenintensivere HAVING verwenden.

Mit SQL_CALC_FOUND_ROWS veranlasse ich mySQL dazu, die Gesamtanzahl der Treffer – ohne LIMIT – zu ermitteln. Die Anzahl der Treffer kann im Anschluss mit SELECT FOUND_ROWS(); ausgelesen werden.

mysql> SELECT SQL_CALC_FOUND_ROWS col1, col2, col3 AS foo FROM table HAVING foo = 'bar';
+------+------+-----+
| col1 | col2 | foo |
+------+------+-----+
| ...  | ...  | ... |

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|        28123 |
+--------------+
1 row in set (0.00 sec)

Wesentlich einfacher, als dynamisch Queries mit Aliasen und Joins umzuschreiben.

Danke für den Tipp :)

Froscon 2006 Review

Die Froscon war wirklich einen Besuch wert. Vielen Dank an die Organisatoren.

Die Konferenz war wirklich gut organisiert. Überall auf dem Gelände hatte man einen sehr schnellen W-Lan Zugang (Eclipse mit 130Mb in 3 Minuten), die Uni ist wirklich vorbildlich und sogar das Spiel am Samstag wurde im großen Hörsaal übertragen.

Ich war konsequent in sovielen Vorträgen wie möglich. Hier ein kurzer Auszug der Vorträge, die mir besonders in Erinnerung bleiben:

  • Webservices Toolkit für PHP5
    Ein sehr interessantes Projekt, das mit Hilfe der PHP 5 Reflection API z.B. einen WSDL Generator ermöglicht. Infos finden sich bei der PHPUGDO.
  • MySQL Cluster (Geert Vanderkelen)
    Sehr insteressanter Vortrag über die neuen Möglichkeiten eines mySQL Clusters.
  • Pivot Tables in mySQL 5 (Guiseppe Maxia)
    Der Vortrag war unterhaltsam und sehr gut nachvollziehbar. Guiseppe Maxia zeigt eine Möglichkeit, wie man mit mySQL Procedures und Functions automatisiert den SQL Query für eine Pivot Tabelle erzeugt. Wie oft hätte ich dieses Skript schon gebrauchen können! Danke :)
  • PHP best practice (Tobias Schlitt und Kore Nordmann)
    Alle Infos aus diesem Vortrag habe ich schon mindestens 100 mal gehört/gelesen. Für mich war leider nichts Neues dabei. Die Reaktionen und Fragen aus dem Publikum zeigen aber, wie wichtig solche Vorträge sind. :)

Leider habe ich es nicht geschafft, mir die PostgreSQL Vorträge anzusehen.  Aber vielleicht kann ich die PostgreSQL Usergroup zu einem Vortrag in unserer PHPUGFFM einladen?