MySQL – Stop replication

15. Juni 2009

If you want to mysql slave to stop replicating from your master db server you might want to start removing all the replication entries from my.conf.

After you have done this you might experience that your server still wants to connect to the master.

In order to stop this, you need to remove a file called master.info.

rm /var/lib/mysql/master.info

After a mysql restart replication should be gone.

Treibstofff.de now in English

15. Juni 2009

Since most more visitors speak English than German we decided to publish in English from now on. So it’s about the same content but only a different language.

Rails – collection_select statt select für ein belongs_to Drop-Down

18. Mai 2009

Oft hat man in Rails-Anwendungen 1:n Beziehungen und möchte den belongs_to Partner, hier im Beispiel der BillingContact, aus einer Liste betreffender Kandidaten auswählen.

@contacts = BillingContact.all

Oft zu sehen sind Konstrukte wie:

f.select(:billing_contact_id, @contacts.collect{ |ch| [ch.name, ch.id] })

Das funktioniert. Es geht aber auch etwas leichter:

f.collection_select( :billing_contact_id, @contacts, :id, :name )

Natürlich könnten noch weitere Optionen verwendet werden:

f.collection_select( :billing_contact_id, @contacts, :id, :name, :include_blank => true )

OpenSolaris – ZFS – Legacy mountpoint – Was ist das?

16. Mai 2009

Dateisysteme, die mit dem Legacy-Mountpoint gekennzeichnet sind, müssen mit den Werkzeugen mount und umount verwaltet werden. Diese Dateisysteme werden also nicht automatisch von ZFS gemountet. Sollen diese Dateisysteme beim Systemstart eingehängt werden, so müssen diese in die Datei /etc/vfstab eingetragen werden.

Die ZFS mount und umount-Befehle können für diese Dateisysteme nicht verwendet werden.

Mehr Informationen über Legacy-Mountpoints finden sich im ZFS Administration Guide.

RubyMine – Default Encoding einstellen

13. Mai 2009

RubyMine ist eine neue, vielversprechende, im kommerziellen Einsatz leider auch kostenpflichtige, Entwicklungsumgebung für Ruby on Rails.

Als Mac-User kommt man evtl. in die Verlegenheit den Zeichensatz (Encoding) der Text-Dateien ändern zu wollen. Default bei MacOS X ist hier MacRoman. Um das Encoding dann auf UTF-8 umzustellen geht man auf RubyMine | Preferences | General. Im linken Fenster kann man dann bei IDE Encoding den gewünschten Zeichensatz, z.B. UTF-8 auswählen.

Screenshot der Einstellung:

RubyMine set encoding to utf-8

Ruby on Rails 2.3 Features – ActiveRecord scoped_by

9. Mai 2009

Ein interessantes neues Feature in Rails 2.3 ist die scoped_by Methode von ActiveRecord-Objekten.

Stellen wir uns ein einfaches ActiveRecord-Model Page mit den Attributen title und content vor und betrachten folgende Anweisung:

Page.scoped_by_title("a").count

=> 3

Das resultierende SQL zeigt, dass ein COUNT Statement verwendet wurde, d.h. die Generierung des SQLs erfolgt nicht nach dem Aufruf von scoped_by, sondern nach dem Count.

SELECT count(*) AS count_all FROM `pages` WHERE (`pages`.`title` = 'a')

Ein ähnliches Ergebnis hätte etwa folgende Anweisung geliefert:

Page.count(:conditions => "title = 'a'")

Auf keinen Fall aber sollte man so etwas tun:

Page.find(:all, :conditions => "title = 'a'").size

Es wird zwar ebenso 3 zurückgeliefert, jedoch ist das SQL-Statement ein völlig anderes:

SELECT * FROM `pages` WHERE (title = 'a')

Hier werden also sämtliche  Datensätze der Tabelle abgefragt und weiterverarbeitet. Bei sehr großen Datenmengen hat man sich so einen 1A Speicherfresser erstellt.

Ein kurzer Tipp an Rails-Einsteiger:

Es ist für die Erstellung einer Anwendung unerläßlich den resultierenden SQL-Code anzusehen. Nur so kann evtl. Schwachstellen der Anwendung bereits frühzeitig erkennen und vermeiden. ActiveRecord hilft zwar an vielen Stellen, es ist jedoch sicherlich kein Ersatz für fundierte SQL Kenntnisse.

MySQL – ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/opt/local/var/run/mysql5/mysqld.sock’ (2)

5. Mai 2009

Eine Fehlermeldung wie diese:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/local/var/run/mysql5/mysqld.sock' (2)

hat wohl jeder schonmal gesehen. In diesem Fall sind auf dem Rechner mehrere MySQL Versionen installiert und natürlich wird die versucht die falsche Version anzusprechen. Nach der Installation des MySQL OS X DMGs geht nun also die Suche los, wo das PID-File des MySQL Dienstes liegt.

Die Lösung ist einfach. Um das PID-File des MySQL Servers zu finden geht man wie folgt vor:

$ mysql

mysql> status
--------------
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.1.34
Connection id:        415
Current database:
Current user:        dbuser@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.1.34 MySQL Community Server (GPL)
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:        /tmp/mysql.sock
Uptime:            21 min 1 sec

--------------

MySQL – Lost connection to MySQL server at ‘reading initial communication packet – system error 61

24. April 2009

Beim Versuch sich von außen auf einen MySQL-Server zu verbinden begnet man zu weilen folgender Fehlermeldung:

#2013 - Lost connection to MySQL server at 'reading initial communication packet', system error: 61

Nach der Aktivierung des Großhirns und einem Studium der Konfigurationsdatei ergibt die Lösung des Problems durch folgende Änderung in

/etc/mysql/my.cnf

Im Abschnitt [mysqld] darf die bind-adress Einstellung nicht localhost bzw. 127.0.0.1.

bind-address = 0.0.0.0

Mit 0.0.0.0 bindet sich der MySQL-Server an jede verfügbare IP des Systems. Um dies restriktiver zu halten, kann auch die IP des jeweiligen Interface verwendet werden.

ldd – Auf der Suche nach verlorenen Bibliotheken (.so Dateien)

18. April 2009

Der Fehler könnte wie folgt aussehen:

postfix: fatal: libcrypto.so.0.9.7: open failed: No such file or directory

Nun, die Datei ist da aber wo sucht nun die Anwendung danach?

Der Befehl ldd hilft die Antwort auf diese Frage zu finden:

root@myserver:/opt# ldd /usr/sbin/postfix
libssl.so.0.9.7 =>       (file not found)
libcrypto.so.0.9.7 =>    (file not found)
libldap.so.5 =>  /usr/lib/libldap.so.5
libresolv.so.2 =>        /usr/lib/libresolv.so.2
libsocket.so.1 =>        /usr/lib/libsocket.so.1
libnsl.so.1 =>   /usr/lib/libnsl.so.1
libc.so.1 =>     /usr/lib/libc.so.1
libsasl.so.1 =>  /usr/lib/libsasl.so.1
libmd.so.1 =>    /lib/libmd.so.1
libnspr4.so =>   /usr/lib/mps/libnspr4.so
libplc4.so =>    /usr/lib/mps/libplc4.so
libnss3.so =>    /usr/lib/mps/libnss3.so
libssl3.so =>    /usr/lib/mps/libssl3.so
libmp.so.2 =>    /lib/libmp.so.2
libscf.so.1 =>   /lib/libscf.so.1
libpthread.so.1 =>       /lib/libpthread.so.1
libthread.so.1 =>        /lib/libthread.so.1
librt.so.1 =>    /lib/librt.so.1
libdl.so.1 =>    /lib/libdl.so.1
libsoftokn3.so =>        /usr/lib/mps/libsoftokn3.so
libplds4.so =>   /usr/lib/mps/libplds4.so
libuutil.so.1 =>         /lib/libuutil.so.1
libgen.so.1 =>   /lib/libgen.so.1
libbsm.so.1 =>   /lib/libbsm.so.1
libsecdb.so.1 =>         /lib/libsecdb.so.1
libtsol.so.2 =>  /lib/libtsol.so.2
libinetutil.so.1 =>      /lib/libinetutil.so.1
libm.so.2 =>     /lib/libm.so.2

So oder so ähnlich könnte die Ausgabe von ldd aussehen. Nun kann man prüfen, ob die entsprechenden Dateien vorhanden sind und ggf. passende Symlinks anlegen.

OpenSolaris – MySQL gem installieren

16. April 2009

Eine erfolgreiche Installation des MySQL-Gems unter OpenSolaris erfolgt über das folgende Kommando:

gem install mysql -- --with-mysql-dir=/usr/mysql/5.0/

So können auch Ruby on Rails Anwendungen neuerer Generation erfolgreich unter OpenSolaris betrieben werden.