Online Suche im Handbuch |
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....
Online Suche im Handbuch |