Tag Archive for 'mysql'

Mysql on Leopard: Startupitem, Prefpane, LaunchDemon

Es hat sich doch komplizierter als erwartet rausgestellt, MySQL auf Mac OS X Leopard beim booten aktiviert zu bekommen. Deshalb hier kurz der Bericht.

StartUpItems ist von Apple als “nicht empfohlen” eingestuft worden und hat bei mir auch nie funktioniert. Der PrefPane hatte nie funktioniert, es sei denn ich setze die Rechte für /usr/local/mysql auf mich selbst. Das hat wieder dazu geführt, dass launchd (also der “empfohlene” autostart von Leopard” nicht mehr klappte!

Fehlermeldung der Konsole:

1
2
3
4
5
6
7
8
9
10
com.mysql.mysqld[4994] 080212 16:02:35 [Warning] Can't create test file /usr/local/mysql-5.0.45-osx10.4-powerpc/data/future.lower-test 
com.mysql.mysqld[4994] 080212 16:02:35 [Warning] Can't create test file /usr/local/mysql-5.0.45-osx10.4-powerpc/data/future.lower-test 
com.mysql.mysqld[4994] 080212 16:02:35  InnoDB: Operating system error number 13 in a file operation. 
com.mysql.mysqld[4994] InnoDB: The error means mysqld does not have the access rights to 
com.mysql.mysqld[4994] InnoDB: the directory. 
com.mysql.mysqld[4994] InnoDB: File name ./ibdata1 
com.mysql.mysqld[4994] InnoDB: File operation call: 'open'. 
com.mysql.mysqld[4994] InnoDB: Cannot continue operation. 
com.apple.launchd[1] (com.mysql.mysqld[4994]) Exited with exit code: 1 
com.apple.launchd[1] (com.mysql.mysqld) Throttling respawn: Will start in 10 seconds

UPDATE Mit diesem Tool kann man sehr einfach und sehr schnell alle Autostart Einträge sehen, bearbeiten und eigene erstellen.

Also, erstmal die Rechte wieder korrigieren. Dabei darauf achten, dass man nicht die Rechte vom Alias “mysql” in /usr/local korrigiert, sondern die von dem “echten” mysql verzeichnis. Also z. B. “mysql-5.0.45-osx10.4-powerpc” wäre in dem Fall VERZEICHNIS_BEI_DIR.

1
2
3
cd /urs/local
ls -la
sudo chown -R mysql:mysql VERZEICHNIS_BEI_DIR

Jetzt kann wie gewohnt der Launchd eingerichtet werden:

Eine Datei namens com.mysql.mysqld.plist in /Library/LaunchDaemons erstellen mit dem Inhalt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false />
    <key>GroupName</key>
    <string>_mysql</string>
    <key>KeepAlive</key>
    <true />
    <key>Label</key>
    <string>com.mysql.mysqld</string>
    <key>Program</key>
    <string>/usr/local/mysql/bin/mysqld</string>
    <key>ProgramArguments</key>
    <array>
        <string>--user=_mysql</string>
    </array>
    <key>RunAtLoad</key>
    <true />
    <key>Umask</key>
    <integer>7</integer>
    <key>UserName</key>
    <string>_mysql</string>
    <key>WorkingDirectory</key>
    <string>/usr/local/mysql</string>
</dict>
</plist>

Dann folgende Befehle im Terminal eingeben:

1
2
3
4
5
cd /Library/LaunchDaemons
sudo chown root com.mysql.mysqld.plist
sudo chgrp wheel com.mysql.mysqld.plist
sudo chmod 644 com.mysql.mysqld.plist
sudo launchctl load com.mysql.mysqld.plist

gem1.8 install mysql (MySql Ruby C bindings) in debian

Hier habe ich endlich gefunden, wieso genau die C Bindings für mysql nicht geklappt haben. Es fehlte noch ein apt Paket vorher (bzw. ich benutze aptitude).

Hier lag des Rätsels Lösung:

aptitude install libmysqlclient15-dev

Und erst dann hat man die mysql_config wie folgt zur Hand:

gem1.8 install mysql — –with-mysql-config=/usr/bin/mysql_config

Wie gesagt, “aptitude” muss für den ein oder anderen “apt get” sein und wenn man nicht als root eingeloggt ist, kommt noch ein “sudo” vor jeden Befehl.

Hinweis: Welches Paket man sich mit apt installieren muss (dieser Post muss ja nicht der aktuellste sein ;), kann man mit diesem Befehl herausfinden. Dann nimmt man einfach die neuste Version von dem oben genannten.

aptitude show libmysql

Ruby on Rails with Leopard (localhost, sites, mysql, rmagick)

Ich habe soeben 2 Minuten gebraucht, um intuitiv Rails in Leopard zum Laufen zu kriegen…

Das möchte ich euch natürlich nicht vorenthalten.

Du wechselst in das Verzeichnis deines Projektes.

bild-5.png

Und gibst den Befehl ruby script/server ein.

bild-6.png

Ergebnis:

bild-7.png

Fertig!

“Mongrel available at 0.0.0.0:3000″ verrät dir, wo du deine Webseite findest. Da “0.0.0.0″ das gleiche ist wie “localhost”, findest du sie z. B. hier:

bild-8.png

Mist war das einfach :/

MySQL

HIER könnt ihr mysql runterladen. Kleiner Tip: Intel-Rechner brauchen “x86″. Mein PowerBook G4 hat Mac OS X 10.4 (PowerPC, 32-bit) gebraucht.

Package installieren, fertig. Vorsicht, momentan funktioniert das prefpane von mysql in den Systemeinstellungen für Leopard nicht. Das kann man beheben, indem man dem Verzeichnis /usr/local/mysql/data UND UNTERVERZEICHNISSEN Lese- und Schreibrechte für Administratoren (oder halt direkt dir selbst) hinzufügt. Wie geht das? Einen invisibility toggler runterladen und alle Dateien im Finder sichtbar machen. Auf das Verzeichnis ein “Apfel + i” machen und ganz unten die Reche entsprechend hinzufügen.

Nachdem ich jetzt zwei Tage versucht habe einen “sudo gem install mysql” durchzuführen, kam ich endlich auf die Lösung. (Danke an rubyonrails.org die schnell genug waren. Hier auch nochmal ausführlich.

Kurzum, folgenden langen Befehl im Terminal eingeben:

sudo env ARCHFLAGS="-arch ppc" gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config

Dort wo “ppc” steht muss nicht ppc sondern i386 heißen, wenn ihr einen Intel-Prozessor habt (MacBook usw.)

mysqlok.png

Wenn ihr nur sudo gem install mysql oder sudo gem install mysql — –with-mysql-dir=/usr/local/mysql macht, dann kommt ein “can’t find ruby header” Fehler. Danach habe ich gegoogled ohne Ende und nichts gefunden.

Übrigens kann nun ein sudo gem update rails nicht schaden, das updated ein paar gem versionen.

Wie man mit MacPort RMagick installiert, ist hier schön beschrieben.

Fertig!

HowTo: MySQL 5, Mongrel, Capistrano + Subversion

Update: Bis her war ein Fehler in diesem HowTo. MySQL muss natürlich als Server Version installiert werden ($ sudo port install mysql5 +server). Das Update betrifft nur den MySQL5 Bereich.

Damit wir Ruby on Rails auch wirklich nutzen können, sollten wir noch ein paar Programme, Tools und Gems installieren.

Als erstes wäre da MySQL, denn wie wollen wir Datenbankgestütze Webentwicklung betreiben, wenn wir nicht mal einen Datenbank-Server und damit eine Datenbank haben…

MySQL5
Da wir ja MacPorts installiert haben ist das ganze recht einfach. Um auf Nummer Sicher zu gehen, machen wir jedoch erst mal ein selfupdate für MacPorts und installieren erst dann MySQL5

$ sudo port selfupdate
$ sudo port install mysql5 +server
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
$ sudo chown -R mysql:mysql /usr/local/macports/var/db/mysql5
$ sudo -u mysql mysql_install_db5

Jetzt am besten den Mac neu starten, dann kann man gleich sehen ob das LauchItem funktioniert.

MySQL Native Bindings Gem
Jetzt kommt der Teil, der mich die meiste Zeit gekostet hat (dabei sollte er doch die Geschwindigkeit der MySQL Abfragen beschleunigen) und der Grund war, warum ich bis her ohne die Nativen Bindings auskommen musste.
Das MySQL Gem ist irgendwie sehr unflexible, was die Pfade angeht und dazu kommt, dass MacPorts die MySQL Installation im MacPorts Verzeichnis nicht gebündelt ablegt sondern etwas zerfledert… anstelle eines einfachen gem install mysql war hier etwas mehr Finetuning nötig. Mittels der build-flags gelang mir dann aber auch das. Hier das Ergebnis:

sudo gem install mysql -- \
--with-mysql-dir=/usr/local/macports/lib/mysql5 \
--with-mysql-lib=/usr/local/macports/lib/mysql5/mysql \
--with-mysql-include=/usr/local/macports/include/mysql5/mysql

NACHTRAG, ab November 2008 so:

sudo env ARCHFLAGS="-arch ppc" gem install mysql -- --with-mysql-lib=/opt/local/lib/mysql5/mysql --with-mysql-include=/opt/local/include/mysql5/mysql

jetzt wird man gefragt, welche Version man für die Installation wählen will. Nehmen wir also die neuste, zum jetzigen Zeitpunkt mysql 2.7 (ruby), also drücken wir die 3 (da wir uns ja auf einem Mac befinden fallen die mswin32 Versionen für uns raus)

Select which gem to install for your platform (i686-darwin8.10.3)
1. mysql 2.7.3 (mswin32)
2. mysql 2.7.1 (mswin32)
3. mysql 2.7 (ruby)
4. mysql 2.6 (ruby)
5. Skip this gem
6. Cancel installation

Wenn man die build-flags nicht richtig setzt bekommt man solche Fehler:

ERROR: Failed to build gem native extension.
ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no

und kann damit nicht so wirklich was anfangen… wie gesagt hat mich einiges an Zeit gekostet, weil auch Google dazu nicht richtig was sagt.

So nun sind auch die Bindings fertig und wir können uns anderen Dingen zuwenden.

Mongrel
Mongrel ist der Webserver. Rails liefert zwar schon einen Webserver mit (Webrick) aber Mongrel hat für mich bis her einen sehr sehr großen Vorteil, man sieht im Development Mode alle Requests. Damit fällt das Debugging viel leichter, da man sogar die MySQL Requests mit allen Werten sieht. Also installieren wir das Mongrel Gem einfach.

sudo gem install mongrel --include-dependencies

es kommen wieder die von oben bekannten Abfragen zur Version und weil es Abhängigkeiten gibt, die erfüllt werden müssen, wird gleich noch fastthread installiert. Meine Versionen sind mongrel 1.0.1 (2 drücken) und fastthread 1.0 (1 drücken).

Select which gem to install for your platform (i686-darwin8.10.3)
1. mongrel 1.0.1 (mswin32)
2. mongrel 1.0.1 (ruby)
3. mongrel 1.0 (mswin32)
4. mongrel 1.0 (ruby)
5. Skip this gem
6. Cancel installation
> 2
Select which gem to install for your platform (i686-darwin8.10.3)
1. fastthread 1.0 (ruby)
2. fastthread 1.0 (mswin32)
3. fastthread 0.6.4.1 (mswin32)
4. fastthread 0.6.4.1 (ruby)
5. Skip this gem
6. Cancel installation
> 1

Gut damit haben wir neben dem MySQL-Server nun auch unseren Webserver. Was jetzt kommt ist erst mal nicht so wichtig aber wir installieren es mal, damit wir uns später keine Gedanken mehr drum machen müssen.

Capistrano
Capistrano ist ein Deployment Tool, was einem die Arbeit des live gehens erheblich erleichtern soll. Ich hab es noch nicht benutzt und genau deshalb installiere ich es jetzt mit um es in den nächsten Tagen zu testen. Darüber wird es dann auch einen Post geben.
Neben dem hoch laden der Dateien mittels SSH, kann man noch eigene Rake Tasks in Ruby schreiben, die dann z.B. einen Dump der alten Datenbank erstellen, bevor die neue eingespielt wird. Naja wie gesagt, bei mehr Erfahrungen gibt es auch dazu einen Post, jetzt erst mal die Installation:

sudo gem install capistrano --include-dependencies

Jetzt noch Termios, dass dafür sorgen soll, dass die Passwörter, die man in Capistrano eintippt, nicht von allen gelesen werden können. Ich weiß nicht, ob das notwendig ist aber weh tun tut es ja auch nicht also:

sudo gem install termios --include-dependencies

Subversion
Subversion ist auch so nen Ding, worüber alle reden, was ich aber bis zum jetzigen Zeitpunkt, außer für Plugin Installationen, nicht genutzt habe. Capistrano nutzt es auch, also installieren wir auch noch dieses Tool. Eigentlich ist es einfach eine Versionskontrolle und wird meistens eingesetzt, wenn man in einem Team programmiert (es zeigt einem Konflikte an, d.h. zwei Leute haben zur gleichen Zeit an einer Datei, den selben Teil verändert, jeder natürlich anders und die Änderungen würden verlohren gehen. Hier springt dann eben SVN ein und man kann den Konflikt auflösen.)

sudo port install subversion

So damit haben wir eigentlich erst mal alles, was wir für die Entwicklung mit Ruby on Rails brauchen. Wenn es noch irgendwelche Sachen gibt, die man unbedingt braucht ab in die Kommentare damit.

ÜÄÖß Umlaute kaputt in Ruby on Rails und MySQL [broken umlauts]

Hier die Lösung, wenn nur “??” für sämtliche Sonderzeichen ausgegeben wird in Ruby on Rails (wenn man Standardeinstellungen verwendet):

Update: Klaus hat in den Kommentaren eine bessere Lösung vorgeschlagen:
Einfach den Entwicklungsstadien (development, test, production) encoding: utf8 zufügen. Sieht dann so aus:
projekt/config/database.yml

development:
  adapter: mysql
  database: projekt_development
  username: root
  password:
  socket: /tmp/mysql.sock
  encoding: utf8
test:
  adapter: mysql
  database: projekt_test
  username: root
  password:
  socket: /tmp/mysql.sock
  encoding: utf8
production:
  adapter: mysql
  database: projekt_production
  username: root
  password:
  socket: /tmp/mysql.sock
  encoding: utf8

Hier die veraltete Lösung:

class ApplicationController < ActionController::Base
  before_filter :configure_charsets
  private
  def configure_charsets
    @response.headers["Content-Type"] = "text/html; charset=utf-8"
    # Nur ab MySQL 4.1
    suppress(ActiveRecord::StatementInvalid) do
    ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
  end
end