Discussion:
MySQL 5.x - Temporäre Tabellen anzeigen lassen ?
(zu alt für eine Antwort)
Jaromir Prinzler
2009-09-01 11:09:59 UTC
Permalink
Hallo !

ich stehe vor folgendem Problem. Ich muss recht umfangreiche Änderungen in
einer
mySQL Datenbank vornehmen (via. eigener Software welche SQL nutzt).

Dabei arbeite ich mit Transaktionen um sicher zu stellen, das ich bei einem
Fehler
einen gültigen Datenbankstatus habe. Bei den Änderungen sollen nun auch
Tabellen
angelegt werden, welche meine bisherigen Änderungen innerhalb einer
Transaktionen
automatich COMMITen.

Nun war meine Idee diese Tabellen vorerst im Speicher (CREATE TEMPORARY
TABLE ...)
anzulegen und diese dann wenn alles andere geklappt hat in die "normale"
Datenbank zu kopieren.
Dieses vorgehen erschien mir sicherer als ganz ohne Transaktionen zu
arbeiten.

Leider kann ich via "SHOW TABLES" oder im "information_schema" keine Liste
der temporären
Tabellen abfragen? Gibt es dazu irgend einen anderen Weg? oder hat jemand
von Euch eine andere
Idee dazu?

Achso die Datenbank sichern und im Fehlerfall zurück spielen mus leider
ausfallen, da
die Datenbank permanet verfügbar sein soll!

Danke für Eure Ideen.

...Jaro
Andreas Kretschmer
2009-09-01 13:06:54 UTC
Permalink
Post by Jaromir Prinzler
Hallo !
ich stehe vor folgendem Problem. Ich muss recht umfangreiche Änderungen in
einer
mySQL Datenbank vornehmen (via. eigener Software welche SQL nutzt).
Dabei arbeite ich mit Transaktionen um sicher zu stellen, das ich bei einem
Fehler
einen gültigen Datenbankstatus habe. Bei den Änderungen sollen nun auch
Tabellen
angelegt werden, welche meine bisherigen Änderungen innerhalb einer
Transaktionen
automatich COMMITen.
Falsches Tool? MySQL kann keine DDL-Befehle in einer Transaktion
ausführen. PostgreSQL kann dies aber.


Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Jaromir Prinzler
2009-09-01 13:30:21 UTC
Permalink
Post by Andreas Kretschmer
Falsches Tool? MySQL kann keine DDL-Befehle in einer Transaktion
ausführen. PostgreSQL kann dies aber.
Richtig - Aber leider will ich beide Platformen transparent unterstützen.
Meine Frage war ja auch ob ich die Liste temporärer Tabellen
auslesen kann? Denn mittels "CREATE TEMPORARY TABLE"
könnte man dann dieses Problem etwas umgehen.

...Jaro
Andreas Kretschmer
2009-09-01 13:39:57 UTC
Permalink
Post by Jaromir Prinzler
Post by Andreas Kretschmer
Falsches Tool? MySQL kann keine DDL-Befehle in einer Transaktion
ausführen. PostgreSQL kann dies aber.
Richtig - Aber leider will ich beide Platformen transparent unterstützen.
Meine Frage war ja auch ob ich die Liste temporärer Tabellen
auslesen kann? Denn mittels "CREATE TEMPORARY TABLE"
könnte man dann dieses Problem etwas umgehen.
Ich weiß nicht, ob das bei MySQL in einer TX ohne COMMIT geht:

test=# select count(1) from information_schema.tables where table_name ~ 'my_temp';
count
-------
0
(1 row)

test=*# create temporary table my_temp_table(id int);
CREATE TABLE
test=*# select count(1) from information_schema.tables where table_name ~ 'my_temp';
count
-------
1
(1 row)



Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Christian Kirsch
2009-09-01 14:15:40 UTC
Permalink
Post by Andreas Kretschmer
Post by Jaromir Prinzler
Post by Andreas Kretschmer
Falsches Tool? MySQL kann keine DDL-Befehle in einer Transaktion
ausführen. PostgreSQL kann dies aber.
Richtig - Aber leider will ich beide Platformen transparent unterstützen.
Meine Frage war ja auch ob ich die Liste temporärer Tabellen
auslesen kann? Denn mittels "CREATE TEMPORARY TABLE"
könnte man dann dieses Problem etwas umgehen.
test=# select count(1) from information_schema.tables where table_name ~ 'my_temp';
count
-------
0
(1 row)
Hier (MySQL 5.0.45, also nicht gerade top-aktuell) landet eine Temporary
Tables überhaupt nicht in information_schema :-(

Vielleicht ist das mit 5.1.x ja anders?
Andreas Kretschmer
2009-09-01 14:18:01 UTC
Permalink
Post by Christian Kirsch
Hier (MySQL 5.0.45, also nicht gerade top-aktuell) landet eine Temporary
Tables überhaupt nicht in information_schema :-(
Und, geht das in einer TX ohne COMMIT?


Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Jaromir Prinzler
2009-09-01 14:26:20 UTC
Permalink
Post by Andreas Kretschmer
Und, geht das in einer TX ohne COMMIT?
Ich kann zwar eine temporäre Tabelle (nur als InnoDB) ohne ein COMMIT
erzeugen,
diese aber nicht in der Tabelle "information_schema.tables" wieder finden
auch wenn diese
existiert (SELECT ...).

Es kann doch nicht sein, das ein so wichtiges Feature unter mySQL nicht
existiert/funktioniert?
Dieses sind doch elementare Grundlagen? Es muss doch eine Lösung für dieses
Problem unter
mySQL geben?

...Jaro
Christian Kirsch
2009-09-01 14:39:20 UTC
Permalink
Post by Jaromir Prinzler
Post by Andreas Kretschmer
Und, geht das in einer TX ohne COMMIT?
Ich kann zwar eine temporäre Tabelle (nur als InnoDB) ohne ein COMMIT
erzeugen,
diese aber nicht in der Tabelle "information_schema.tables" wieder finden
auch wenn diese
existiert (SELECT ...).
Es kann doch nicht sein, das ein so wichtiges Feature unter mySQL nicht
existiert/funktioniert?
Dieses sind doch elementare Grundlagen? Es muss doch eine Lösung für dieses
Problem unter
mySQL geben?
Es muss nicht. Es gibt den Quellcode, und möglicherweise gibt es auch
einen Feature-Request oder einen Bug-Report (wenn nicht, solltest Du das
möglichweise nachholen).

MySQL ist nicht perfekt, das dürfte sich inzwischen herumgesprochen
haben :-(
Axel Schwenke
2009-09-01 15:21:11 UTC
Permalink
Post by Jaromir Prinzler
Post by Andreas Kretschmer
Und, geht das in einer TX ohne COMMIT?
Ich kann zwar eine temporäre Tabelle (nur als InnoDB) ohne ein COMMIT
erzeugen,
Ja. DDL in MySQL ist nicht transaktional. D.h. ein CREATE TABLE
Statement macht implizit zwei extra COMMITs:

COMMIT (um die aktuell laufende TX zu beenden)
CREATE TABLE ...
COMMIT (für CREATE TABLE)

Das ist hier dokumentiert:
http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html

Allerdings: CREATE TEMPORARY TABLE macht *kein* implizites COMMIT.
Es ist streng genommen gar kein DDL, sondern eher vergleichbar zur
Definition einer (session-)lokalen Variable.

Siehe: http://dev.mysql.com/doc/refman/5.1/en/create-table.html
Post by Jaromir Prinzler
diese aber nicht in der Tabelle "information_schema.tables" wieder finden
auch wenn diese
existiert (SELECT ...).
Es gibt keine Möglichkeit, temporäre Tabellen anzuzeigen.
Dafür gibts ein feature request:

http://bugs.mysql.com/bug.php?id=39850
Post by Jaromir Prinzler
Es kann doch nicht sein, das ein so wichtiges Feature unter mySQL nicht
existiert/funktioniert?
Dieses sind doch elementare Grundlagen? Es muss doch eine Lösung für dieses
Problem unter
mySQL geben?
Wofür? Temporäre Tabellen anzeigen? Warum? Wenn du sie doch
gerade erst angelegt hast, mußt du doch wissen, wie sie heißen?

Ganz allgemein passen Transaktionen (nach außen unsichtbare
Änderungen an persistenten Tabellen) und temporäre Tabellen
(nach außen unsichtbare Tabellen) nicht so recht zusammen.

Du kannst deine temporären Tabellen sehr gut außerhalb einer
Transaktion erzeugen und befüllen. Erst wenn du die Daten in
die persistenten Tabellen umfüllst, brauchst du dazu u.U. eine
Transaktion.


XL
Andreas Scherbaum
2009-09-01 19:42:44 UTC
Permalink
Post by Axel Schwenke
Wofür? Temporäre Tabellen anzeigen? Warum? Wenn du sie doch
gerade erst angelegt hast, mußt du doch wissen, wie sie heißen?
Wer sagt, dass die gleiche Funktion die Tabelle angelegt hat?
Post by Axel Schwenke
Ganz allgemein passen Transaktionen (nach außen unsichtbare
Änderungen an persistenten Tabellen) und temporäre Tabellen
(nach außen unsichtbare Tabellen) nicht so recht zusammen.
Nach meinem Verständnis sind temporäre Tabellen persistent
innerhalb der aktuellen Session, nicht innerhalb der aktuellen
Transaktion. Was meinst du damit, dass die nicht so recht
zusammenpassen?


Bis dann
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Axel Schwenke
2009-09-02 08:21:49 UTC
Permalink
Post by Andreas Scherbaum
Post by Axel Schwenke
Wofür? Temporäre Tabellen anzeigen? Warum? Wenn du sie doch
gerade erst angelegt hast, mußt du doch wissen, wie sie heißen?
Wer sagt, dass die gleiche Funktion die Tabelle angelegt hat?
Ist doch Jacke wie Hose. Auf jeden Fall sind die temporären
Tabellen in der aktuellen Session angelegt worden. Da würde
ich davon ausgehen, daß man deren Namen kennt.
Post by Andreas Scherbaum
Post by Axel Schwenke
Ganz allgemein passen Transaktionen (nach außen unsichtbare
Änderungen an persistenten Tabellen) und temporäre Tabellen
(nach außen unsichtbare Tabellen) nicht so recht zusammen.
Nach meinem Verständnis sind temporäre Tabellen persistent
innerhalb der aktuellen Session, nicht innerhalb der aktuellen
Transaktion.
Ja. Wobei ich das Wort "persistent" in diesem Zusammenhang
nicht verwenden würde.
Post by Andreas Scherbaum
Was meinst du damit, dass die nicht so recht zusammenpassen?
Vielleicht ist "nicht zusammenpassen" etwas zu hoch gegriffen.
Es sind halt zwei verschiedene Konzepte wie man Daten ändert,
ohne daß das außerhalb der aktuellen Session sichtbar ist.

Nur daß bei Transaktionen das Ziel normalerweise ist, diese
Änderungen zu einem definierten Zeitpunkt sichtbar zu machen.
Während temporäre Tabellen niemals außerhalb der aktuellen
Session sichtbar sind. Aus logischer Sicht ist es egal, ob er
erst alle Änderungen in temporären Tabellen sammelt und dann
auf einmal in die Zieltabelle kippt -oder- ob er eine Trans-
aktion startet, die Daten direkt ändert und dann committed.

Ich habe immer noch nicht verstanden, was der OP eigentlich
genau machen will. Sein dritter Satz schafft es nicht durch
mein Logik-Modul ;) Aber eine Notwendigkeit für die Verwen-
dung temporärer Tabellen ist erstmal nicht erkennbar.

Womöglich wäre es ja am einfachsten, wenn er die neuen Tabellen
"unsichtbar" - also mit Namen die die Applikation ignoriert -
anlegt und am Ende mit einem atomaren RENAME TABLE sichtbar
macht. Aber wie gesagt, nichts genaues weiß man nicht. Wenn er
unverständliche Fragen stellt, bekommt er halt keine Antwort.


XL
Jaromir Prinzler
2009-09-02 08:40:32 UTC
Permalink
Also ich habe mich jetzt für temporäre Tabellen entschieden welche, wenn
die vorhergehende Transaktion erfolgreich abgeschlossen wurde in eine
"normale" Tabelle überführt werden. Bei einem Fehler werden diese
gelöscht. So geht's vorerst...

Danke für die Hinweise und Tipps !

...Jaro
Andreas Scherbaum
2009-09-02 10:05:11 UTC
Permalink
Post by Axel Schwenke
Post by Andreas Scherbaum
Post by Axel Schwenke
Wofür? Temporäre Tabellen anzeigen? Warum? Wenn du sie doch
gerade erst angelegt hast, mußt du doch wissen, wie sie heißen?
Wer sagt, dass die gleiche Funktion die Tabelle angelegt hat?
Ist doch Jacke wie Hose. Auf jeden Fall sind die temporären
Tabellen in der aktuellen Session angelegt worden. Da würde
ich davon ausgehen, daß man deren Namen kennt.
Dafür müsste man die gesamte Liste angelegter temporärer Tabellen
an irgendeiner Stelle protokollieren. Das will er sich sparen
sondern einfach zu einem Zeitpunkt t die gesamte vorhandene
Liste sehen.
Post by Axel Schwenke
Post by Andreas Scherbaum
Post by Axel Schwenke
Ganz allgemein passen Transaktionen (nach außen unsichtbare
Änderungen an persistenten Tabellen) und temporäre Tabellen
(nach außen unsichtbare Tabellen) nicht so recht zusammen.
Nach meinem Verständnis sind temporäre Tabellen persistent
innerhalb der aktuellen Session, nicht innerhalb der aktuellen
Transaktion.
Ja. Wobei ich das Wort "persistent" in diesem Zusammenhang
nicht verwenden würde.
Stimmt auch wieder ;-)
Post by Axel Schwenke
Ich habe immer noch nicht verstanden, was der OP eigentlich
genau machen will. Sein dritter Satz schafft es nicht durch
mein Logik-Modul ;) Aber eine Notwendigkeit für die Verwen-
dung temporärer Tabellen ist erstmal nicht erkennbar.
Was der OP eigentlich haben will, sind DDL-Änderungen innerhalb
von Transaktionen. Leider bietet MySQL diese Option nicht an,
daher sucht er einen Aus-/Umweg.



Bis dann
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Axel Schwenke
2009-09-02 12:08:14 UTC
Permalink
Post by Andreas Scherbaum
Post by Axel Schwenke
Post by Andreas Scherbaum
Post by Axel Schwenke
Wofür? Temporäre Tabellen anzeigen? Warum? Wenn du sie doch
gerade erst angelegt hast, mußt du doch wissen, wie sie heißen?
Wer sagt, dass die gleiche Funktion die Tabelle angelegt hat?
Ist doch Jacke wie Hose. Auf jeden Fall sind die temporären
Tabellen in der aktuellen Session angelegt worden. Da würde
ich davon ausgehen, daß man deren Namen kennt.
Dafür müsste man die gesamte Liste angelegter temporärer Tabellen
an irgendeiner Stelle protokollieren.
Ja. Du mußt den Namen deiner temporären Tabelle kennen, wenn
du sie anlegst, wenn du sie benutzt und wenn du sie löschst.
Und wenn es mehrere sind, dann mußt du sie alle kennen.

Ich verstehe das Problem nicht. Du hast ein Stück Applikations-
code, das eine Verbindung zur Datenbank aufbaut, temporäre
Tabellen mit weitgehend beliebigen Namen verwendet und die
Verbindung wieder beendet. So oder so muß der Code die Namen
der zu verwendenden Tabellen kennen.
Post by Andreas Scherbaum
Das will er sich sparen
sondern einfach zu einem Zeitpunkt t die gesamte vorhandene
Liste sehen.
Das verstehe ich. Und ich halte "zeig mir eine Liste temporärer
Tabellen" für einen sinnvollen Feature-Request. Ich sehe nur
nicht, was dieses Feature für die gegebene Anwendung bringen
würde. Nehmen wir an, wir hätten es. Wir bekommen also eine
Liste mehr oder weniger nichtssagender Tabellennamen.
Was bringt uns das?


XL

Loading...