Tonnen und Tonnen von Relaisprotokollen auf einem Master

9

Ich habe einen Master, der 298 Relay-Bin-Dateien hat, die noch heute aktuell sind und 298 Tage zurückreichen.

In der .cnf gibt es keine Relay-Log-Definitionen

und

mysql> show variables like '%relay%';
+---------------------------------+----------------+
| Variable_name                   | Value          |
+---------------------------------+----------------+
| innodb_overwrite_relay_log_info | OFF            |
| max_relay_log_size              | 0              |
| relay_log                       |                |
| relay_log_index                 |                |
| relay_log_info_file             | relay-log.info |
| relay_log_purge                 | ON             |
| relay_log_space_limit           | 0              |
+---------------------------------+----------------+

Der Reset-Slave löscht sie, aber dann werden sie gerade wieder regeneriert.

Irgendeine Idee, was das verursacht? Wie kann ich damit aufhören?

BEARBEITET AN ANFRAGEN

Allgemeine Kritik am CNF ist willkommen, aber lassen Sie uns das OP-Thema im Auge behalten.

---- cnf request

[mysqld]
character_set_server = utf8

max_connections=200
max_user_connections=160
max_connect_errors=10000

userstat_running = 1

log_warnings
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2


innodb_file_per_table

innodb_open_files=2048

innodb_additional_mem_pool_size=1M

innodb_buffer_pool_size=512M

innodb_log_buffer_size=1M

innodb_log_file_size=128M

innodb_autoextend_increment=16


innodb_flush_method=O_DIRECT


datadir=/var/lib/mysql/


tmpdir=/var/lib/mysql_ramdisk


server-id=2

log-bin = /var/log/mysql/mysql-bin
log-bin-index = /var/log/mysql/mysql.index

key_buffer_size = 800M

preload_buffer_size = 256K

max_allowed_packet = 8M
table_cache = 512
sort_buffer_size = 8M
join_buffer_size = 8M

read_buffer_size = 2M
read_rnd_buffer_size = 2M
thread_cache_size = 32
query_cache_size = 32M
query_cache_limit = 16M


myisam_sort_buffer_size = 2000M


tmp_table_size = 64M
max_heap_table_size = 64M

---- now for the cli requests

mysql> show slave status\G
Empty set (0.00 sec)

mysql> show master status;
+---------------------+----------+--------------+------------------+
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| awesome-bin.xxxxxxx | yyyyyyyy |              |                  |
+---------------------+----------+--------------+------------------+
1 row in set (0.00 sec)



---- version


mysql> select version();
+--------------------+
| version()          |
+--------------------+
| 5.1.47-rel11.1-log |
+--------------------+
1 row in set (0.00 sec)
atxdba
quelle
Bitte posten Sie nach Möglichkeit die MySQL-Version und my.cnf-Einträge.
dabest1
1
RESET SLAVEauf Master mit vielen Relais-Protokollen hat es für mich getan.
Stein Hammer

Antworten:

7

Wenn ein Master über Relay-Protokolle verfügt, muss der Master auch ein Slave inmitten einer Replikationstopologie sein (dh Master / Master, Daisy-Chained-Replikation).

Was könnte dazu führen, dass Relay-Protokolle so wachsen?

ZERBROCHENE REPLIKATION

Die MySQL-Replikation ist unterbrochen, wenn der E / A-Thread oder der SQL-Thread unter diesen SZENARIEN stirbt:

  • SZENARIO 1 : Wenn der E / A- Thread und der SQL-Thread deaktiviert sind, ist eines von zwei Dingen passiert
  • SZENARIO 2 : Wenn der E / A- Thread stirbt
    • Nichts kann die Relaisprotokolle stapeln
    • Der SQL-Thread verarbeitet alle SQL-Befehle in den Relay-Protokollen oder bis ein SQL-Fehler auftritt
  • SZENARIO 3 : Wenn der SQL-Thread stirbt
    • Bei der Verarbeitung eines SQL-Befehls ist ein SQL-Fehler aufgetreten
    • Laufen SHOW SLAVE STATUS\Gzeigt dir das Last_ErrnoundLast Error
    • IO Thread sammelte weiterhin SQL-Befehle vom Master, wodurch die Relay-Protokolle zunahmen

Es ist die Situation Nr. 3 , die das Problem darstellt. Wenn der SQL-Thread aufgrund eines SQL-Fehlers stirbt, gibt es in MySQL Replication keinen integrierten Mechanismus, der die Trennung des E / A-Threads auslöst .

EMPFEHLUNG

Die einzige vernünftige Möglichkeit, das Wachstum von Relay-Protokollen zu steuern, besteht darin, das Limit festzulegen

[mysqld]
relay_log_space_limit=4G

Durch Festlegen von relay_log_space_limit wird eine Obergrenze von 4G festgelegt.

Wenn ein Relaisprotokoll vollständig verarbeitet wird

  • es wird herausgedreht
  • Der SQL-Thread beginnt mit der Arbeit am nächsten Relay-Protokoll
  • Der E / A-Thread beginnt mit dem Laden von SQL vom Master an der letzten Stelle, von der er übrig geblieben ist, solange auf der Festplatte genügend freier Speicherplatz vorhanden ist

EPILOG

Wenn der Master früher ein Slave war und es nicht mehr sein muss, deaktivieren Sie ihn einfach.

mysql -e"STOP SLAVE; CHANGE MASTER TO MASTER_HOST='';"
rm -f /var/lib/mysql/master.info

Wenn der Master ein Slave ist, korrigieren Sie den SQL-Fehler.

Ich würde dies vorschlagen, wenn der SQL-Fehler im Weg ist:

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE SQL_THREAD;

Führen Sie dann SHOW SLAVE STATUS\Gjede Minute aus, um festzustellen, ob die Relaisprotokolle verarbeitet und gedreht werden.

RolandoMySQLDBA
quelle
2

Ohne Ihre my.cnf zu sehen, ist es unmöglich, diese Frage zu beantworten, aber ich würde auch vorschlagen, Ihre SHOW SLAVE STATUS \ G-Ausgabe zu veröffentlichen - ist es möglich, dass Ihr Slave tatsächlich unglaublich weit zurückliegt? Das würde die Relaisprotokolle behalten. Läuft der SQL Slave-Thread?

Aaron Brown
quelle
0

Könnte es sein, dass die Datei my.cnf falsch konfiguriert ist und Master-Binärprotokolle als Relay-Protokolle bezeichnet werden?

Oder Ihr Master verfügt über fest codierte Replikationseinstellungen in der Datei my.cnf, die beim Neustart der MySQL-Instanz übernommen werden.

EDIT: Haben Sie den tatsächlichen binlog-Dateinamen in der show master statusAusgabe maskiert ? Ich frage, weil die Einstellung in my.cnf nicht mit dem binlog-Namen übereinstimmt. Wenn ja, können Sie den tatsächlichen Dateinamen und die Ausgabe von show slave statusAaron angeben? Bisher fällt in Ihrer my.cnf-Datei nichts auf, außer dass der Name für bin-log nicht übereinstimmt.

dabest1
quelle
0

Führen Sie den Befehl RESET SLAVE aus. Es werden die Relaisprotokolle bereinigt und ein neues neu generiert. Aber es wird nicht das neue verwenden. Sie können überprüfen, indem Sie später den Befehl FLUSH LOGS ausführen. Der Server erstellt kein zweites Relay-Protokoll.

Juan Pablo Arruti
quelle
2
Können Sie Ihre Antwort erweitern? Es ist nicht klar, was du meinst.
Max Vernon