ABSTRACT: ueberblick ueber mysql server und client mit einer kurzen allgemeinen SQL einfuehrung. kureze einfuehruhng in mysql privilegien system. AUDIENCE: junior admin SYSTEM: any unix SECTION: basic unix commands AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt datenbanken sind ein oft benoetigites werkzeug. in einfachen faellen reicht es daten in einem textfile zu speichern. wie wir in der perl einfuehrung gesehen haben ist es sehr leicht diese textfiles zu verarbeiten. probleme entstehen aber dann wenn mehrere user unter umstaenden gleichzeitig daten lesen und schreiben wollen... oder wenn daten von verschiedenen computern aus im zugriff sein sollen... zur loesung dieser probleme setzte man ueblicherweise datenbank server ein. ein einzelner server der die schreib und lese operationen koordiniert und der die abfrage der daten mittels einer abstrakten abfragesprache erlaubt.. es gibt auf linux verschiedenste datenbankserver. komerzielle und freie. die beliebtesten freien sind mysql und postgres. fuer 99% aller anwendungen sind diese sicherlich ausreichend und man muss kein teures komerzielles datenbanksystem kaufen. mysql zeichnet sich dadurch aus dass es * die weltweit groesste verbreitung hat. * sehr schnell bei einfachen queries (abfragen) ist. * unkompliziert in der administration. nachteile von mysql gegenueber anderen systemen: * nicht alle SQL features implementiert. (wobei duch die hohe verbreitung diese features schon in arbeit sind) mysql ist heute standardbestandteil aller distributionen. mysqld ist dabei der datenbankserver. mysqladmin ein commandline administrationstool und "mysql" ein commandline client programm. hat man noch kein passwort fuer den mysql root user gesetzt sollte man das als erstes tun. (der mysql root hat nichts mit dem unix root zu tun ausser das der mysql root eben zugriff auf alle mysql datenbanken hat). mysql -uroot -p mysql loggt mit hifle des mysql commandline clients auf den lokalen mysql server ein und zwar als user "root" und fraegt das passwort ab. es wird auf die datenbank mit dem namen "mysql" verbunden in die tabllen gespeichert sind die mysql intern benoetigt. mit folgenden zeilen setzt man ein neues passwort fuer den root user (am mysql prompt): update user set Password=password('geheim') where user='root' ; (bitte natuerlich nicht 'geheim' als passwort verwenden). es gibt auch noch einen user mit leerem passwort. will man hier ebenfalls das passwort aendern so schreibt man: update user set Password=password('geheim') where user='' ; der mysql client arbeit mit dem readline interface. man kann also wie auf der bash gewohnt editieren. befehle zurueckhohlen. reverse-incremntal search.. der gewohnte komfort. damit die geaenderten passworter aktiv werden verwendet man das mysqladmin programm: mysqladmin reload -uroot -p (wobei hier noch das alte passwort gilt. danach sind die neuen passwoerter aktiv) als naechstes legen wir uns eine kleine datenbank an: mysqladmin create drinks -uroot -p wir verbinden uns mit der neu erzeugten datenbank: mysql -uroot -p drinks daten werden im sql als sogenannte tabllen gespeichert. am anfang gibt es noch keine tabellen in unser neu erzeugten datenbank drinks. wir legen mal create table cocktails (name char(30) not null default '', preis float default 0) ; (man beachte der mysql client will am ende jedes sql statements einen ; laesst man den weg kann man ein statement ueber mehrere zeilen ausdehnen) obiges create legt eine tabelle mit dem namen "cocktails" innerhalb unserer drinks datenbank an. sie enthaelt 2 felder: eines mit dem namen "name" der aus 30 zeichen (characters) bestehen kann und eines das "preis" heisst und eine fliesskommazahl (float) ist. beim feld "name" legen wir noch feld dass es nie den wert >null haben kann. null ist ein spezieller wert eines datenbankfeldes der so etwas wie undefiniert besagt. der wert ist also nicht die zahl 0 oder ein leerstrings sondern eben undefiniert. als default wert fuer das namens feld legen wir den leerstring fest ''. als default wert fuer "preis" haben wir den zahlenwert 0. show tables ; zeigt uns jetzt dass wir schon eine tabelle angelegt haben. desc cocktails ; gibt und eine beschreibung (description) unserere cocktails tabelle. jetzt wollen wir mal werte einfuegen: insert into cocktails values('white russian',6.50); insert into cocktails values('mojito',7.00); die werte muessen dabei mit den feldern in der datenbank korespondieren. das ist insofern unpraktisch als das insert nicht mehr funktionieren wuerde wenn man jetzt ein neues feld hinzufuegt. besser ist es die felder in die man werte einfuegt anzugeben: insert into cocktails (name,preis) values('tequila sunrise',70.00); hier kann man die felder in die man werte einfuegt beliebig angeben. (wir koennte z.b. nur name angeben. dann wuerde preis auf den default wert von 0 gesetzt. um die daten anzusehen koennen machen wir: select * from cocktails; 70 euro ist natuerlich zu teuer fuer einen tequila sunrise. zum aendern von feldern verwendet den sql befehl UPDATE: update cocktails set preis=6.20 where name='tequila sunrise'; wenn wir generell alle preise um 10 prozent anheben wollen koennten wir z.b schreiben: update cocktails set preis=preis*1.1 ; bei grossen datenbanken mit vielen datensaetzten sollte man auf die felder nach denen man oft sucht einen index setzen. in manchen feldern will man auch einheideutige namen haben weil man diese als eindeutigen schluessel zu den daten verwenden will. in unsere cocktail datenbank koennten wir z.b. den namen als eindeutigen schluessel definieren. zum aendern der strucktur einen bestehenden tabelle verwenden wir "alter table" alter table cocktails add unique(name); (mit add index(name) wuerden wir nur einen index hinzufuegen der die abfragen beschleunigt aber trozdem erlaubt dass der name doppelt vorkommt.) ein unique key der einen datensatz eindeutig definiert wird auch "primary key" genannt. select * from cocktails order by preis; gibt die list der cocktails nach preis geordnet aus. select preis,name from cocktails where preis < 7 ; gibt alle cocktails aus deren preis kleiner als 7 euro ist. dabei werden die felder preis und name in der angegebenen reihenfolge zurueckgeliefert. wie wir komplexere abfragen machen die mehrere tabellen verknuepfen lernen wir demnaechst. was wir heute noch behandeln: wir wollen natuerlich nicht immer als root auf unsere tabelle zugreifen. wir wollen neue mysql user anlegen die z.b. nur abfragen duerfen oder die nur rechte auf eine einzige datenbank haben. wir verbinden uns dazu wieder mit der datenbank namens "mysql" mysql -uroot -p mysql und legen einen user maxmeier an der nur select aus unsere drinks datenbank ausfuehren duerfen soll: insert into user (Host,User,Password) values('localhost', 'maxmeier',password('geheim')); (natuerlich suchen wir uns ein besseres passwort als "geheim"). der host localhost bedeutet hier dass der user nur local zugreifen darf und nicht von einem anderen computer aus.) insert into db (Host,Db,User,Select_priv) values('%','drinks','maxmeier','Y'); damit die zugriffsrechte wieder aktuell werden muessen wir wie oben gezeigt wieder "mysqladmin reload" aufrufen. der user darf jetzt auf die datenkban drinks selects ausfuehren sonst noch nichts. weitere privilegien koennten wir ihm erteilen in dem wir entsprechende spalten in der tablle auf 'Y' setzten. (z.b. mit einem update) anstatt die mysql zugriffstabellen direkt zu modifizieren kann man in neueren mysql versionen privilegien auch mittels eines "GRANT" statemens vergeben. z.b. so: grant select,update on drinks.* to maxmeier@localhost identified by 'geheim' ; das wuerde "select" und "update" rechte auf alle tabellen (*) der datenbank "drinks" vergeben fuer einen user "maxmeier" der nur von localhost connecten darf und der mit dem passwort "geheim" angelegt wird. EXERCISES: * setzte dir das mysql passwort fuer den root user * show dir die struktur der datenbank "mysql" an. * lege dir eine datenbank an * lege dir dort eine tabelle mit feldern an. * erzeuge datensaetzte mit insert und schau dir die datensaetze mit select an. * aendere die datensaetze mit verschiedenen update statemens * selektiere datensaetze mit der WHERE clausel und ornde sie mit der ORDER BY * lege dir einen user an der alle rechte auf die neu angelegte datenbank hat aber auf sonst keine datenbank. ueberpruefe ob dem wirklich so ist. * lege dir einen user an der nur select rechte auf diese datenbank hat. ueberpruefe ob dem wirklich so ist in dem du versuchst mit dem user ein "update" abzusetzen. REFERENCES: man mysql /usr/share/doc/mysql-gpl-doc/manual_toc.html (oder an andere stelle je nach distribution) file:///usr/share/doc/mysql-gpl-doc/manual.html http://www.mysql.com/documentation/