2010-01-27 3 views
5

Ich habe ein Problem auf einem Master-MySQL (5.0, Linux) -Server: Ich habe versucht, einen Kommentar zu einer Tabellenzeile hinzuzufügen, die in einen ALTER TABLE-Befehl übersetzt. Jetzt ist der Prozess auf "Kopieren in TMP-Tabelle" fest und kopiert die 100'000'000 + Zeilen. Die Verwendung von Disk IO ist unangenehm hoch.Ist es sicher, einen replizierenden MySQL-Prozess zu beenden, der 'in tmp-Tabelle kopiert' ist?

Da der Master Replikation verwendet, bin ich unsicher, ob ich diesen Prozess beenden kann. Die Slaves haben den Befehl ALTER TABLE noch nicht gesehen.

(Um dies deutlich zu machen: Ich spreche über den Prozess von der MySQL-PROCESS zu töten, nicht dem MySQL-Daemon-Prozess selbst.)

Antwort

1

Ja, Sie können es töten - der ALTER wird es nicht in die Binlogs schaffen, bis die Transaktion festgeschrieben ist, dh bis der ALTER beendet ist. Die Slaves sehen und führen sie nicht aus, und der Master wird auf die alte Tabellenstruktur zurückgesetzt.

Mit show binlog events oder dem mysqlbinlog-Dienstprogramm können Sie problemlos überprüfen, ob der ALTER noch in den Binlogs enthalten ist.

0

Nein, ist es nicht sicher ist. Nur wenn Sie (vor kurzem) eine vollständige Sicherung der Datenbank haben, um im Falle eines Problems wiederherzustellen. Es könnte einige Schlösser geben und Sie landen danach mit gesperrten Tischen, mögliche Schäden an den Schlüsseln.

Als Hinweis, wenn Sie neue Spalten für eine so große Datenbank hinzufügen. Es ist einfacher,

  • ein Nachahmer des Tabellenschema
  • laufen die ändern an diesem Tisch zu schaffen, während es leer ist,
  • bevöl aus dem Original mit einem Einsatz in ...() select Felder aus .. ..

Dies ist viel schneller. Dann benennen Sie die Tabelle natürlich in Original um.

+0

Ich sprach über den internen Prozess, nicht über den mysqld-Prozess selbst. –

0

können Sie den Vorgang töten, aber zwei Dinge passieren können:

  1. das Slave-Schema mit dem Master inkonsistent ist (und damit :)
  2. die Replikation auf dem Slaves stoppen kann.

Wenn die Replikation stoppt, können Sie versuchen, manuell den Slave (s) zu beheben, indem Sie durch Eingabe auf dem Slave-Server über die 'alter table' Anweisung Überspringen:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;