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.