Autowert Ersetzen durch GUIDs
am 13.07.2007 08:24:01 von Werner Bauer
Ich verwende üblicherweise Ids in jeder Tabelle, die als "autowert"=20
fortlaufend generiert werden. Funkt auch gut, und auch mit Replikation.=20
Wenn ich die Nutzer im Replikat lesen lasse, würde das natürlich auch=
=20
anstandslos gehen, aber die Einträge in Log- und Login-Dateien, die=20
durch Programme initiiert werden, verursachen Autowert-einträge und die=
=20
Replikation wird abbrechen, sobald im Master Einträge gleicher Werte=20
vorkommen.
Natürlich könnt' ich die zwei, drei Tabellen von der Replikatiuon=20
ausnehmen oder sonstwie 'rumprogrammieren, oder Log-Dateien hier und=20
dort unabhängig führen.
Lieber wär' mir aber ein Ersatz für Autowert, etwa so wie im=20
MS-SQL-Server, der, soweit ich mich erinnere, so etwas wie GUID's=20
vergibt, die üblicherweise nie kollidieren. Finde aber dazu keine=20
Möglichkeit im 5.1 Mysql ... vielleicht mit Trigger?
Werner
Re: Autowert Ersetzen durch GUIDs
am 13.07.2007 10:56:06 von Axel Schwenke
werner bauer wrote:
> Ich verwende üblicherweise Ids in jeder Tabelle, die als "autowert"
> fortlaufend generiert werden. Funkt auch gut, und auch mit Replikation.
> Wenn ich die Nutzer im Replikat lesen lasse, würde das natürlich auch
> anstandslos gehen, aber die Einträge in Log- und Login-Dateien, die
> durch Programme initiiert werden, verursachen Autowert-einträge und die
> Replikation wird abbrechen, sobald im Master Einträge gleicher Werte
> vorkommen.
Kannst du den letzten Halbsatz mal erklären? Warum sollte die
Replikation kaputt gehen? Schreibst du auf dem Slave?
> Natürlich könnt' ich die zwei, drei Tabellen von der Replikatiuon
> ausnehmen oder sonstwie 'rumprogrammieren, oder Log-Dateien hier und
> dort unabhängig führen.
Klingt wirklich so, als würdest du auf dem Master *und* auf dem
Slave in irgendwelche Log-Tabellen schreiben. Nur warum willst du
diese Tabellen dann überhaupt replizieren? Läßt du deine Syslogs
sich auch alle gegenseitig füttern?
Aber Abhilfen gibts in Menge:
- verwende verschieden benannte Log-Tabellen auf Master und Slave.
* pack sie in verschiedene Schemata oder
* leg verschiedene Basistabellen an und mach jeweils eine View
auf die "richtige" Basistabelle, dann schreib in die View
(oops, das wird erst mit RBR funktionieren)
- mach eine zusätzliche Spalte server_id in die Tabellen und leg
das AUTO_INCREMENT auf (server_id, running_id)
- repliziere die Log-Tabellen gar nicht erst. Wozu auch? Leg sie
am besten in eine eigene Datenbank und laß für diese Datenbank
gar kein Binlog schreiben.
- schreibe Logs in Files. So wird das seit der Computer-Steinzeit
gemacht und es ist angemessen. Ich habe noch nie ein schlüssiges
Argument gehört, warum Log-Tabellen *besser* sind als Log-Files.
Insbesondere wenn man die Nachteile von Tabellen berücksichtigt.
> Lieber wär' mir aber ein Ersatz für Autowert, etwa so wie im
> MS-SQL-Server, der, soweit ich mich erinnere, so etwas wie GUID's
> vergibt, die üblicherweise nie kollidieren.
Wenn dir 'üblicherweise' ausreicht:
nimm einen Zufallszahlengenerator.
XL