mySQL Lock Problem

MySQL, PostgreSQL, SQLite
alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

mySQL Lock Problem

Post by alexander newald » 2006-01-15 11:36

Hallo,

ich habe das Problem, dass ich ab und zu Nachts zwei Locks im mySQL Server hängen habe, die sich dann gegenseitig sperren und ich muss zuerst ein eine Anwendung beenden, bevor die zweite weiterarbeitet und man wieder Zugriff auf die Tabelle hat.

Der eine Lock kommt von mysqldump und der zweite von einer normalen Abfrage von einer Webseite. Wieso können die sich gegenseitig sperren? Ich dachte immer, dass das nicht passieren darf.

outofbound
Posts: 470
Joined: 2002-05-14 13:02
Location: Karlsruhe City

Re: mySQL Lock Problem

Post by outofbound » 2006-01-15 18:00

Doch, dass kann passieren, wenn sich z.B. zwei Tabellen locken, und Anwendung A einen Query auf die Tabelle von Anwendung B absetzt und Anwendung B einen Query auf die Tabelle von Anwendung A. Dann wartet die eine Anwendung jeweils dass die andere den Lock loslässt, und schwupps hast du einen Deadlock. ;)

Was ist denn genau der Query, den du auszuführen versuchst, während der
Deadlock auftritt? Ich könnte mir so eine Konstellation vorstellen:

[vermut]
anwendung lockt tabelle a und will query auf b machen
mysqldump lockt alles andere und wartet darauf tabelle a zu locken
anwendung wartet auf den release von b
mysql wartet auf release von a
[/vermut]

Gruss,

Out

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: mySQL Lock Problem

Post by alexander newald » 2006-01-15 18:30

Ja, sowas ist das. Kann man das irgendwie umgehen? Wie macht man ansonsten am Besten das Backup (von mir aus auch ohne mysqldump)?

sycronic
Posts: 24
Joined: 2005-10-26 11:18

Re: mySQL Lock Problem

Post by sycronic » 2006-01-17 11:25

reicht es nicht /var/lib/mysql zu zippen und wegzuspeichern??? is zwar größer als nötig, aber kannst ja die *.bin aussperren....

outofbound
Posts: 470
Joined: 2002-05-14 13:02
Location: Karlsruhe City

Re: mySQL Lock Problem

Post by outofbound » 2006-01-17 13:08

sycronic wrote:reicht es nicht /var/lib/mysql zu zippen und wegzuspeichern??? is zwar größer als nötig, aber kannst ja die *.bin aussperren....
Nicht, wenn du die Datenkonsistenz sicherstellen willst.
Da kommt man um das locken der Tabellen dann allerdings nicht drum rum.

Kannst du dir eine kurze Downtime erlauben? Dann würde ich hingehen und tatsächlich die Anwendung "stoppen" (per lockfile oder so), das Backup ziehen und wieder zugriff erlauben.

Auch möglich wäre das ganze per Replikation zu machen, wenn es denn zu gar keinem Ausfall kommen darf. Hätte auch den Vorteil, dass du im Falle eines "Crashs" einfach die Datenbanken switchen kannst. Ein Backup machst du dann indem du die Replikation anhältst, backup ziehst und Replikation wieder startest.

Alternativ:
mysqldump --help:
-x, --lock-all-tables
Locks all tables across all databases. This is achieved
by taking a global read lock for the duration of the
whole dump. Automatically turns --single-transaction and
--lock-tables off.

-l, --lock-tables Lock all tables for read.

--single-transaction
Creates a consistent snapshot by dumping all tables in a
single transaction. Works ONLY for tables stored in
storage engines which support multiversioning (currently
only InnoDB does); the dump is NOT guaranteed to be
consistent for other storage engines. Option
automatically turns off --lock-tables.

etc


Gruss,

Out