November 16, 2005

Apache, MySQL and Darwin (2)


Not much sense in running PHP without a database, huh? Here's a short tutorial to install a MySQL-database on Mac OS X 10.3.x.
Beware: Syntax in MySQL changed a little bit throughout the last versions. I'm talking here about MySQL 4.1.x--there are a lot of older tutorials on the internet that can result in some syntax errors. To be on the safe side, it would be recommendable to download the latest documentation from MySQL's website.
Read more...

Was wäre PHP ohne dazugehörige Datenbank? Hier also eine kurze Anleitung zum Installieren von MySQL und dem Anlegen einer Datenbank unter Mac OS X 10.3.x
Achtung: die Syntax von MySQL hat sich im Verlauf der letzten Versionen ein wenig verändert. Ich beziehe mich hier auf MySQL 4.1.x -- im Netz geistern noch deutlich ältere Anleitungen herum, deren Befolgen in der Bash zu einem Syntax Error führen können. Am besten ihr ladet euch direkt mal die neueste Dokumentation von der MySQL-Website herunter, dann seid ihr auf der sicheren Seite.
Mehr davon...


Install
Let's start by downloading the installer package. There should be a copy on your Mac OS X install-CD Rom, but don't ask me what version...
Run the installer, and the "startup-item package"--this installs MySQL to be started when the computer is booted. You'll also find a preference-pane in the installer-image. Drag and drop it into your library's PreferencePanes-folder, to get a MySQL preference pane in your system preferences (under "others").

After the installation process, we enter the Terminal again. Type in the follow command-line to start-up MySQL:
shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
Enter your OS X-admin-password, if necessary. Then press Ctrl-D (not Apple-D!) to leave the shell. Hopefully MySQL should now be initialised -- which actually was not happening in my case. To find out if you were succesfull, just type
top
into your Terminal-bash. With this you request a listing of all running processes. The server is not yet active, if you can't find any MySQL-entry in this list. Another issue could be: the server started, but you get errors like "can't connect to tmp/mysql.sock". Now, this temporary item should be generated automatically when MySQL is booted.
If you experience problems like this, shut down the server with this bash-command:
mysql.server stop
Then try the following procedure (again in the bash):
shell> cd /usr/local/mysql shell> sudo ./bin/mysqld_safe
(Enter your password, if necessary)
(Press Control-Z)
shell> bg
(Press Control-D or enter "exit" to exit the shell)
Now MySQL should be up and running. You should get the following message:
"Starting mysqld daemon with databases from /usr/local/mysql/data". Try to just type:
mysql
and see what happens. You should see the following lines:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.15-max

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Tryout database
With an empty server, we can now proceed to create a new database. At this step you can also enter a new MySQL-admin-password (please don't confuse this with your OS X-admin-password). After entering your MySQL-Monitor in your Terminal (lines start with a "mysql>"), enter the following command:
create database your_name;
MySQL should now respond with "Query OK, 1 row affected (0.00 sec)".
Now we are going to grant ourself some generous rights, with the following lines:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'
(press return)
IDENTIFIED BY 'chosen_password' WITH GRANT OPTION;
This should be accepted with the same message as above. BTW: you can leave the MySQL-Monitor by just typing "quit".
Done. Now you can enter tables into your new database as you see fit. But here it's really recommended to use a tool with a graphic interface. I'm using the freeware-tool Aqua Data Studio. But this can react a little bit moody when it comes to MySQL-queries. Another one would be CocoaMySQL (thanks, Yves, I tried out this one too, very nice and intuitive).

Done? Well, nearly done...
Happily you start your first PHP-database request and end up with such error-message(s):

"Client does not support authentication protocol requested by server; consider upgrading MySQL client"

or

"Error w/ php: mysql_connect(): Client does not support authentication protocol"

At least this happened to me, and it did cost me some hours of troubleshooting. Obviously this is some bug in PHP's MySQL-module. To solve this problem, you need to "reformat" your MySQL-password with the following bash-command
SET PASSWORD FOR user@localhost = OLD_PASSWORD('your_password');
Now everything should be smooth...

Related stuff:
MySQL website
MySQL documentation
MySQL password-bug
CocoaMySQL tool



Installieren
Wir fangen an, indem wir uns das Installationspaket von der MySQL-Seite herunterladen. Es gibt sicherlich auch eine Kopie auf der Mac Installations-CD, aber fragt mich bitte nicht, welche Version.
Dann das Installer-package laufen lassen, danach am besten auch "Startup-item package" -- das sorgt dafür, dass MySQL automatisch beim Hochfahren des Rechners auch gestartet wird. In dem Installationspaket findet sich auch ein MySQL-PreferencePane. Wenn man dieses in den PreferencePanes Ordner in der Library zieht, erhält man ein entsprechendes Kontrollfeld in den Systemeinstellungen (ganz unten unter Sonstige).

Wenn ihr das Startup-item installiert habt, geht es mal wieder an den Terminal. Hier nun folgende Kommandozeile eintippen, um MySQL zu initialisieren:
shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
u.U. müsst ihr nun euer OS X-Admin-Password eingeben. Danach Ctrl-D (nicht Apfel-D!) drücken, um die Shell zu verlassen. Mit ein bischen Glück fährt MySQL nun hoch -- war bei mir leider nicht so. Falls im Terminal keine weiteren Hinweise über MySQL erscheinen, könnt ihr einfach mal
top
im Terminal-bash eintippen. Dann erhaltet ihr eine Liste aller laufenden Prozesse. Wenn hier der MySQL-Prozess nicht aufgeführt wird, läuft der Server noch nicht.
Es kann auch sein, dass der Server zwar hochfährt, aber ihr Fehlermeldungen erhaltet, wie "can't connect to tmp/mysql.sock". Diese temporäre Datei sollte normalerweise beim Starten des Servers automatisch angelegt werden. In beiden obigen Fällen empfehle ich euch folgendes. Fahrt den Server herunter, indem ihr im Bash folgende Zeile eingebt:
mysql.server stop
Danach probiert es mal mit folgender Prozedur, wiederum im Bash:
shell> cd /usr/local/mysql shell> sudo ./bin/mysqld_safe
(OS X-Admin-Password eingeben)
(Ctrl-Z drücken)
shell> bg
(Ctrl-D drücken, um die Shell zu verlassen)
Nun sollte MySQL aber auf jeden Fall laufen. Quittiert bekommt ihr das mit folgender Zeile: "Starting mysqld daemon with databases from /usr/local/mysql/data". Nun einfach mal
mysql
eintippen, und schauen was passiert. Wenn alles geklappt hat, solltet ihr folgende Meldung erhalten:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.15-max

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Datenbank ausprobieren
Nun haben wir einen leeren Server, wir fahren also damit fort, mal probehalber eine Datenbank anzulegen. Das ist auch deshalb wichtig, weil ihr auf dem frisch eingerichteten Server noch kein MySQL-Admin-Passwort angegeben habt (bitte nicht verwechseln mit dem OS X-Admin-Passwort).
Innerhalb des MySQL-Monitors (es steht ein "mysql>" am Anfang der Zeile) folgendes Kommando eingeben:
create database datenbank_name;
MySQL meldet sich dann zurück mit so etwas wie "Query OK, 1 row affected (0.00 sec)". Nun richten wir einen Admin-Benutzer für diese Datenbank ein, und zwar mit dem folgenden Kommando:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'
(Return drücken)
IDENTIFIED BY 'das_neue_passwort' WITH GRANT OPTION;
Auch das wird euch wie oben quittiert. Verlassen kann man den MySQL-Monitor übrigens mit einem einfachen "quit".
Fertig -- nun kann man Tabellen in diese Datenbank schreiben. Aber dafür würde ich wirklich das Arbeiten mit einem grafischen Tool empfehlen. Ich benutze das Freeware-Programm Aqua Data Studio. Das kann sich allerdings beim Eingeben von MySQL-Queries ein bischen zickig anstellen. Eine andere Alternative wäre z.B. CocoaMySQL (danke für den Tip, Yves, ich habe mir das mal installiert -- sieht sehr nett und übersichtlich aus).

Fertig? Fast...
Voller Vorfreude lasst ihr nun euer erstes PHP-Datenbank-Script laufen, und erhaltet fassungslos folgende Fehlermeldung(en):

"Client does not support authentication protocol requested by server; consider upgrading MySQL client"

oder aber

"Error w/ php: mysql_connect(): Client does not support authentication protocol"

Bei mir war das jedenfalls so, und hat mich ein paar Stunden Fummelei gekostet. Das ist offensichtlich ein Bug im PHP MySQL-Modul. Lösen lässt sich das, indem ihr das MySQL-Admin-Passwort "umformatiert". Dazu wieder im Terminal-bash in den MySQL-Monitor gehen und folgendes Kommando eingeben:
SET PASSWORD FOR user@localhost = OLD_PASSWORD('mein_passwort');
Dann sollte es klappen...

Mehr Links zum Thema:
MySQL website
MySQL documentation
MySQL password-bug
CocoaMySQL tool

:) <- Lutz

2 comments:

Yves said...

Wer nicht permanent auf seinem Mac entwickelt, sollte vielleicht nicht MySQL im Hintergrund im Dauerbetrieb laufen lassen. Wenn die MySQL-PreferencePane installiert ist, kann der MySQL-Server immer bei Bedarf an- oder ausgeschaltet werden. Wir müssen doch alle sparen, auch bei den Ressourcen;-)

Lutz_W said...

Hoho, das machen uns die "Grossen" aber anders vor... LOL...
Aber Du hast natürlich recht...

;)) <- L