Weiter Zurück [Inhalt] Online Suche im Handbuch

6.4 Die Standardinstallation unter LINUX

Wir haben nun die MySQL Datenbank gestartet, wissen aber noch nichts über Datenbanken, Tabellen, Rechte u.s.w. Es könnte z.B. sein, daß bereits Datenbanken angelegt sind, oder jeder über das Netzwerk beliebig Daten löschen darf. Daher werden wir nun im Folgenden mit den zuvor vorgestellen Werkzeugen den MySQL Datenbankserver erkunden:

user01@tunix:~ > mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.21.33b

Type 'help' for help.

mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.00 sec)

mysql> 
Wie wir sehen, sind bereits zwei Datenbanken angelegt worden. Dieselbe Ausgabe liefert übrigens das Shell Werkzeug mysqlshow. Nebenbei bemerkt: Man kann Befehle wiederholen, indem man einfach die Taste <Cursor Up> verwendet, das spart viel Tipparbeit.
mysql> help

MySQL commands:
help    (\h)    Display this text
?       (\h)    Synonym for Help
clear   (\c)    Clear command
connect (\r)    Reconnect to the server. Optional arguments are db and host
edit    (\e)    Edit command with $EDITOR
exit    (\)     Exit mysql. Same as quit
go      (\g)    Send command to mysql server
ego     (\G)    Send command to mysql server; Display result verically
print   (\p)    print current command
quit    (\q)    Quit mysql
rehash  (\#)    Rebuild completion hash
status  (\s)    Get status information from the server
use     (\u)    Use another database. Takes database name as argument

Connection id: 4  (Can be used with mysqladmin kill)

mysql> 
Probieren wir nun einmal einige Befehle aus:
mysql> status
--------------
mysql  Ver 9.29 Distrib 3.22.16a-gamma, for pc-linux-gnu (i586)

Connection id:          4
Server version          3.21.33b
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /tmp/mysql.sock
--------------

mysql> 
Wie man sehen kann, haben wir uns mit dem Aufruf von mysql schon an die Datenbank angebunden. Es wurde nach keinem Paßwort gefragt.
mysql> show databases; use mysql;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.01 sec)

ERROR 1044: Access denied for user: '@localhost' to database 'mysql'
mysql> 
Wie man sehen kann, haben wir nun zwei Befehle an den MySQL Server gesendet. Der Zweite konnte nicht ausgeführt werden. use gibt an, auf welche Datenbank sich die DML Kommandos (Data Manipulation Language) sich beziehen sollen. Probieren wir also einen Zugriff auf die zweite Datenbank, test:
mysql> use test
Database changed
mysql> 
Das ist fein ! Auf diese Datenbank haben wir also nun Zugriff. Wir lassen uns alle Tabellen anzeigen:
mysql> show tables;
Empty set (0.01 sec)

mysql> 
Es sind keine Tabellen enthalten. Was stört, ist daß wir offensichtlich keine Administrator Rechte an dem Datenbankserver besitzen, da wir auf die Datenbank mysql offensichtlich keinen Zugriff haben. Schauen Sie hierzu im Kapitel Zugriffsberechtigungen (Privilege-System) oder im Kapitel Checkliste bei Zugriffsproblemen nach. Da dieses Phänomen hier sicher kein Einzelfall ist, schauen wir also im MySQL Handbuch nach, und finden die Lösung. Wir loggen uns mit exit aus und mit dem Shellbefehl: mysql -u root mysql wieder ein. Dann schauen wir uns den Status erneut an:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 3.21.33b

Type 'help' for help.

mysql> status
--------------
mysql  Ver 9.29 Distrib 3.22.16a-gamma, for pc-linux-gnu (i586)

Connection id:          8
Current database:       mysql
Current user:           root
Server version          3.21.33b
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /tmp/mysql.sock
Uptime:                 2 hours 32 min 33 sec

Running threads: 1  Questions: 37  Opened_tables: 4  Flush tables: 1  Open
tables: 4
--------------

mysql> 
Das ist schon besser. Wir erhalten nun zusätzliche Informationen über das System, die Datenbank mysql, u.s.w. Wir sind nun als root in der Datenbank mysql eingeloggt, und haben alle Rechte. Der Befehl SHOW sollte uns nun weiterhelfen, die Datenbank mysql zu ergründen. Probieren wir einmal einige SHOW-Befehle aus:
mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.01 sec)

mysql> show tables;
+-----------------+
| Tables in mysql |
+-----------------+
| db              |
| func            |
| host            |
| user            |
+-----------------+
4 rows in set (0.01 sec)

mysql> 
Aha ! Hier sieht die Welt nun so aus, wie in dem Kapitel GRANT oder im Kapitel Privilegien beschrieben. Diese beiden Kapitel sollte Sie sich nun zuerst einmal durchlesen, bevor es weitergehen kann.
mysql> show status;
+--------+-----------------+-----------+---------------+---------+-------------+
| Uptime | Running_threads | Questions | Opened_tables | Reloads | Open_tables |
+--------+-----------------+-----------+---------------+---------+-------------+
|  10000 |               1 |        47 |             4 |       1 |           4 |
+--------+-----------------+-----------+---------------+---------+-------------+
1 row in set (0.00 sec)

mysql> 
Show Status zeigt mehr als nur status. Hier werden weitere Angaben zu den Tabellen der Datenbank mysql gemacht. Hier erfahren Sie auch, wie oft die Datenbank abgefragt wird, und wieviele simultane User auf diese Datenbank zugreifen. Was uns natürlich interessiert, sind die Zugriffsrechte, die in der Hosts-, User- und DB Tabelle abgelegt sind. Ja, MySQL hat das Rechtesystem einfach auch in Tabellen abgelegt. Sie sollten also die datenbank mysql nicht als irgendeine Datenbank betrachten, sondern als die Datenbank, die für die Rechte aller anderen Datenbanken zuständig ist, in unserem Fall also der leeren Datenbank test. Wie lassen wir uns nun die Inhalte des Rechtesystems ausgeben ? Die Antwort ist naheliegend - nämlich mit dem DML Befehl SELECT. Wir erinnern uns also an die Ausgabe von show tables;...und lassen uns die Inhalte aller Tabellen ausgeben: select * from db,host,user; wäre etwas unübersichtlich, also der Reihe nach:
mysql> select * from db;           
+------+---------+------+-------------+-------------+-------------+------------>
| Host | Db      | User | Select_priv | Insert_priv | Update_priv | Delete_priv 
+------+---------+------+-------------+-------------+-------------+------------>
| %    | test    |      | Y           | Y           | Y           | Y
| %    | test\_% |      | Y           | Y           | Y           | Y           
+------+---------+------+-------------+-------------+-------------+------------>
2 rows in set (0.01 sec)

mysql> select * from host;
+-----------+----+-------------+-------------+-------------+-------------+----->
| Host      | Db | Select_priv | Insert_priv | Update_priv | Delete_priv | Crea
+-----------+----+-------------+-------------+-------------+-------------+----->
| localhost | %  | Y           | Y           | Y           | Y           | Y    
| tunix     | %  | Y           | Y           | Y           | Y           | Y   
+-----------+----+-------------+-------------+-------------+-------------+----->
2 rows in set (0.01 sec)

mysql> select * from func;
Empty set (0.00 sec)

mysql> 
Die Tabelle user können wir leider nicht darstellen, da sie einfach zu breit ist. Um sie als Ganzes sehen zu können, sollten Sie unter LINUX mit der KDE Oberfläche, 1024x768 Punkte Auflösung den Font Ihrer Shell verkleiner, indem Sie die STRG Taste festhalten und gleichzeitig mit der rechten Maustaste den Font tiny auswählen. Nun können Sie das Fenster vergrößern, und sich die Inhalte der Tabelle user nochmals ausgeben lassen:
mysql> select * from user;
+-----------+------+----------+-------------+-------------+-------------+-->
| Host      | User | Password | Select_priv | Insert_priv | Update_priv |
+-----------+------+----------+-------------+-------------+-------------+-->
| localhost | root |          | Y           | Y           | Y           | Y
| localhost |      |          | N           | N           | N           | N
| tunix     | root |          | Y           | Y           | Y           | Y
| tunix     |      |          | N           | N           | N           | N
+-----------+------+----------+-------------+-------------+-------------+--->
4 rows in set (0.00 sec)

mysql> select * from user;
Wir haben die Tabelle etwas abgeschnitten dargestellt. Es dürfte aber klar sein, was diese Tabelle enthält. Eine Liste der Einträge ist ja im Kapitel GRANT genau beschrieben. Die einzelnen Rechte werden in Spalten dargestellt. Können wir uns nun die Spalten einfach mal ausgeben lassen ?

Selbstverständlich ! Wir hätten gerne eine Beschreibung der Tabelle host. Das heißt auf englisch beschreiben ? Richtig, describe ! Also lautet der Befehl wie folgt:

mysql> describe host;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| Host        | char(60)      |      | PRI |         |       |
| Db          | char(64)      |      | PRI |         |       |
| Select_priv | enum('N','Y') |      |     | N       |       |
| Insert_priv | enum('N','Y') |      |     | N       |       |
| Update_priv | enum('N','Y') |      |     | N       |       |
| Delete_priv | enum('N','Y') |      |     | N       |       |
| Create_priv | enum('N','Y') |      |     | N       |       |
| Drop_priv   | enum('N','Y') |      |     | N       |       |
+-------------+---------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

mysql> describe db;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| Host        | char(60)      |      | PRI |         |       |
| Db          | char(64)      |      | PRI |         |       |
| User        | char(16)      |      | PRI |         |       |
| Select_priv | enum('N','Y') |      |     | N       |       |
| Insert_priv | enum('N','Y') |      |     | N       |       |
| Update_priv | enum('N','Y') |      |     | N       |       |
| Delete_priv | enum('N','Y') |      |     | N       |       |
| Create_priv | enum('N','Y') |      |     | N       |       |
| Drop_priv   | enum('N','Y') |      |     | N       |       |
+-------------+---------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

mysql> describe user;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| Host          | char(60)      |      | PRI |         |       |
| User          | char(16)      |      | PRI |         |       |
| Password      | char(16)      |      |     |         |       |
| Select_priv   | enum('N','Y') |      |     | N       |       |
| Insert_priv   | enum('N','Y') |      |     | N       |       |
| Update_priv   | enum('N','Y') |      |     | N       |       |
| Delete_priv   | enum('N','Y') |      |     | N       |       |
| Create_priv   | enum('N','Y') |      |     | N       |       |
| Drop_priv     | enum('N','Y') |      |     | N       |       |
| Reload_priv   | enum('N','Y') |      |     | N       |       |
| Shutdown_priv | enum('N','Y') |      |     | N       |       |
| Process_priv  | enum('N','Y') |      |     | N       |       |
| File_priv     | enum('N','Y') |      |     | N       |       |
+---------------+---------------+------+-----+---------+-------+
13 rows in set (0.00 sec)

mysql> describe func;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | char(64)   |      | PRI |         |       |
| ret   | tinyint(1) |      |     | 0       |       |
| dl    | char(128)  |      |     |         |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql>
Wir haben nun Informationen über die Tabellen erhalten, die etwas darüber hinausgehen, was wir im Moment benötigen. Wenn man sich die Tabellendefinitionen anschaut, so wird man feststellen, daß es Parallelen gibt. Es gibt offensichtlich Spalten, die die Tabellen miteinander verknüpfen. Diese haben in der Spalte Key den Ausdruck PRI, die Abkürzung für Primary Key stehen. Wie sich die Rechte für SQL Clients genau aus den drei Tabellen zusammensetzen, können Sie ja in den Kapiteln Privilegien und GRANT entnehmen. Von Interesse sollte auch der Default Wert in der 5 Spalte sein. Wann immer eine Tabelle oder eine Datenbank angelegt wird, dann werden die Rechte auf die Default Rechte gesetzt.

Nun wissen Sie also um das Geheimnis des schier endlosen Statements:

INSERT INTO user VALUES ('%', 'userxy', 'passwort', 'Y', 'Y', 'Y' ........);

Hierzu müssen Sie sich nur an die genaue Reihenfolge der Felder halten, die in describe user; ausgegeben wurden. Eine einfache Sache, insbesondere dann, wenn man bedenkt, daß man in der Kombination von MySQL und PHP3 oder PERL einfach mit Hilfe eines einfachen INSERT Statements Rechte an Inhalten der SQL Datenbank bestimmen kann. Einfacher geht´s nicht mehr ! Datenbanken renomierter Hersteller tun sich hierbei mitunter recht schwer.

So, nun kommen wir noch einmal zurück auf die Rechte an den Datenbanken test und mysql. Hierzu schauen wir uns noch einmal die Inhalte der Tabellen db, user und host (Alle Singular) an. Wir sehen, daß auf der Datenbank test keine Beschränkungen liegen, da hier fast alle Felder frei sind, oder ein %-Zeichen enthalten, was unter SQL gleichbedeutend mit einem Joker (*) ist. jeder darf auf die Datenbank test des MySQL Datenbankservers zugreifen. Kritisch ist allerdings der Zugriff auf die Datenbank mysql, da hiermit die komplette Rechtevergabe aller Datenbanken des MySQL Serverdämons verwaltet wird. Wir müssen also das Administratorpaßwort ändern....


Weiter Zurück [Inhalt] Online Suche im Handbuch