Kleine Anleitung für das Anlegen einer MySQL-Datenbank

Wichtig: Folgende Prozeduren sind nur auf der Theseus auszuführen. Hier läuft die benötigte Software und Theseus ist auch leistungsfähig genug, um ein paar MySQL-Server-Prozesse zu vertragen.

Bei uns ist es üblich, daß für jedes Projekt ein eigener MySQL-Server aufgesetzt wird. Dafür gibt es einige Werkzeuge, die unter /usr/local/mysql-scripts installiert sind:

createdb create a new MySQL database
grant grant full privileges to a given user
reloaddb reload MySQL database
startdb start MySQL server process
stopdb stop MySQL server process

Jede MySQL-Datenbank benötigt ein eigenes Verzeichnis, das vor dem Aufruf von createdb noch nicht existieren sollte. Hierbei ist zu beachten, daß für das Verzeichnis ein absoluter Pfadname (mit einem Schrägstrich beginnend!) anzugeben ist. So wird eine Datenbank unter ~/demodb angelegt:

theseus$ /usr/local/mysql-scripts/createdb ~/demodb
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
030124  1:25:57  InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
030124  1:25:59  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
030124  1:26:00  InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
030124  1:26:02  InnoDB: Started
/usr/local/mysql/bin.orig/mysqld: ready for connections
030124  1:26:03  /usr/local/mysql/bin.orig/mysqld: Normal shutdown

030124  1:26:04  InnoDB: Starting shutdown...
030124  1:26:06  InnoDB: Shutdown completed
030124  1:26:06  /usr/local/mysql/bin.orig/mysqld: Shutdown Complete

theseus$

Danach läuft der Datenbank-Server noch nicht. Bevor er gestartet wird, lohnt es sich, einen Blick in das neue Verzeichnis zu werfen:

theseus$ f
ib_arch_log_0000000000  ib_logfile1  main/   setenv
ib_logfile0             ibdata1      mysql/
theseus$

In dem Unterverzeichnis mysql sind die Metadaten von MySQL. Unterhalb von main werden Ihre Daten untergebracht werden. Wenn Sie Ihre Datenbank nicht main taufen möchten, können Sie einen anderen Namen bei createdb angeben. In setenv steht drin, über welche Ports Ihr MySQL-Server zu erreichen ist:

theseus$ cat setenv
MYSQL_UNIX_PORT=/home/thales/borchert/demodb/socket
MYSQL_TCP_PORT=18680
theseus$

Wenn Sie unser Mysql::Admin-Modul verwenden, dann können Sie recht einfach von Perl aus die Verbindung zu Ihrer Datenbank herstellen:

use DBI;
use Mysql::Admin qw(dbi_connect);

my $dbdir = $ENV{HOME} . "/demodb";

$db = DBI->connect(dbi_connect($dbdir), "", "");

Bevor Sie jedoch mit Perl zugreifen können, muß die Datenbank gestartet werden:

theseus$ /usr/local/mysql-scripts/startdb ~/demodb
030124  1:35:13  InnoDB: Started
/usr/local/mysql/bin.orig/mysqld: ready for connections
theseus$

Im nächsten Schritt ist es sinnvoll, einige Tabellen anzulegen. Dies geschieht am günstigsten mit einem Skript, das für unser Vorlesungsbeispiel wie folgt aussehen könnte:

#!/bin/sh

PATH=/usr/local/mysql/bin:$PATH
export PATH

. $HOME/demodb/setenv
export MYSQL_UNIX_PORT
export MYSQL_TCP_PORT

mysql main <<'END_OF_SQL'

CREATE TABLE Angestellte (
   persid VARCHAR(32) NOT NULL PRIMARY KEY, INDEX (persid),
   name VARCHAR(255) NOT NULL,
   abtid VARCHAR(32) NOT NULL REFERENCES Abteilungen
);

CREATE TABLE Abteilungen (
   abtid VARCHAR(32) NOT NULL PRIMARY KEY, INDEX (abtid),
   name VARCHAR(255) NOT NULL,
   chef VARCHAR(32) REFERENCES Angestellte
);

CREATE TABLE Projekte (
   projektid VARCHAR(32) NOT NULL PRIMARY KEY,
      INDEX (projektid),
   name VARCHAR(255) NOT NULL
);

CREATE TABLE ProjektTeilnehmer (
   projektid VARCHAR(32) NOT NULL REFERENCES Projekte,
      INDEX (projektid),
   persid VARCHAR(32) NOT NULL REFERENCES Angestellte,
      INDEX (persid),
   PRIMARY KEY (projektid, persid)
);
END_OF_SQL

Danach können Sie sofort interaktiv mit diesen Tabellen arbeiten:

theseus$ cat workondb
#!/bin/sh

PATH=/usr/local/mysql/bin:$PATH
export PATH

. $HOME/demodb/setenv
export MYSQL_UNIX_PORT
export MYSQL_TCP_PORT

exec mysql main
theseus$ sh workondb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.0.9-gamma-standard-log

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

mysql> insert into Angestellte values ('1', 'Franz Schweiggert', 'SAI');
Query OK, 1 row affected (0.03 sec)

mysql> select * from Angestellte;
+--------+-------------------+-------+
| persid | name              | abtid |
+--------+-------------------+-------+
| 1      | Franz Schweiggert | SAI   |
+--------+-------------------+-------+
1 row in set (0.05 sec)

mysql> Bye
theseus$

Wenn Sie Ihre Tabellendefinitionen und die Tabelleninhalte vollständig eliminieren möchten, dann geht es, indem Sie mit stopdb Ihren Datenbankserver stoppen und dann den vollständigen Inhalt des main-Unterverzeichnisses löschen. Anschließend können Sie wieder die Datenbank starten, die Tabellen anlegen und füllen.

Zum Schluß: Es wäre nett, wenn Sie den MySQL-Server-Prozeß mit stopdb terminieren könnten, wenn sie ihn nicht mehr benötigen.


Andreas Borchert, 30. Januar 2003