Berton-ton log estafet pada master

9

Saya memiliki master yang memiliki 298 file relai baru-baru ini seperti hari ini, kembali dengan baik 298 hari.

Tidak ada definisi log relai di .cnf

dan

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              |
+---------------------------------+----------------+

Reset budak menghapusnya, tetapi kemudian mereka baru saja mulai dibuat ulang.

Adakah yang menyebabkan ini? Bagaimana cara menghentikannya?

EDIT UNTUK PERMINTAAN

Selamat datang kritik umum dari CNN tetapi mari kita mengingat topik OP.

---- 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
sumber
Silakan kirim entri versi MySQL dan my.cnf jika memungkinkan.
dabest1
1
RESET SLAVEpada master dengan banyak log relay melakukannya untuk saya.
Stein Hammer

Jawaban:

7

Jika Master memiliki relay log, maka Master juga harus menjadi Budak di tengah-tengah beberapa topologi Replikasi (yaitu, Master / Master, Replikasi Dirantai Daisy)

Apa yang dapat menyebabkan log relai tumbuh seperti ini?

REPLIKASI YANG RUSAK

Replikasi MySQL rusak ketika IO Thread atau SQL thread mati di bawah SKENARIO ini:

  • SKENARIO # 1 : Ketika utas IO dan utas SQL dimatikan, salah satu dari dua hal terjadi
  • SKENARIO # 2 : Ketika utas IO mati
    • tidak ada yang bisa menumpuk log relai
    • Thread SQL memproses semua perintah SQL di log relai atau hingga terjadi kesalahan SQL
  • SKENARIO # 3 : Ketika utas SQL mati
    • Kesalahan SQL terjadi saat memproses perintah SQL
    • Menjalankan SHOW SLAVE STATUS\Gmenunjukkan Anda Last_ErrnodanLast Error
    • IO Thread terus mengumpulkan perintah SQL dari Master, membuat log relai tumbuh

Hal ini SITUASI # 3 itulah masalahnya. Ketika utas SQL mati karena kesalahan SQL, tidak ada mekanisme bawaan dalam Replikasi MySQL yang memicu utas untuk memutuskan sambungan .

REKOMENDASI

Satu-satunya cara yang layak untuk mengendalikan pertumbuhan log relai adalah dengan menetapkan batasnya

[mysqld]
relay_log_space_limit=4G

Mengatur relay_log_space_limit menempatkan batas 4G.

Ketika log relay sepenuhnya diproses

  • diputar keluar
  • utas SQL mulai bekerja pada log relai berikutnya
  • utas I / O mulai memuat SQL dari Master dari tempat terakhir yang tersisa, selama ada cukup ruang kosong pada disk

EPILOG

Jika Master dulu adalah Slave dan tidak perlu lagi, nonaktifkan saja.

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

Jika Master adalah seorang budak, perbaiki kesalahan SQL.

Saya akan menyarankan ini jika kesalahan SQL di jalan:

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

kemudian jalankan SHOW SLAVE STATUS\Gsetiap menit untuk melihat apakah log relai diproses dan diputar.

RolandoMySQLDBA
sumber
2

Tanpa melihat my.cnf Anda, tidak mungkin untuk menjawab pertanyaan ini, tetapi saya juga menyarankan untuk memposting keluaran SHOW SLAVE STATUS \ G Anda - apakah mungkin budak Anda sebenarnya sangat jauh tertinggal? Itu akan membuat log relai tetap ada. Apakah thread SQL Slave berjalan?

Aaron Brown
sumber
0

Mungkinkah file my.cnf salah dikonfigurasi dan master binary log dinamai relay log?

Atau mungkin master Anda memiliki pengaturan replikasi kode keras dalam file my.cnf, yang diambil pada saat restart MySQL.

EDIT: Apakah Anda menutupi nama file binlog yang sebenarnya di show master statusoutput? Saya bertanya karena pengaturan di my.cnf tidak cocok dengan nama binlog. Jika demikian, dapatkah Anda memberikan nama file yang sebenarnya, dan output show slave statusseperti yang disebutkan Harun? Sejauh ini selain nama mismatch untuk bin-log, tidak ada yang menonjol dalam file my.cnf Anda.

dabest1
sumber
0

Jalankan perintah RESET SLAVE. Ini akan membersihkan log relai dan membuat ulang yang baru. Tapi, itu tidak akan menggunakan yang baru. Anda dapat memeriksa dengan menjalankan perintah FLUSH LOGS nanti, server tidak akan membuat log relai kedua.

Juan Pablo Arruti
sumber
2
Bisakah Anda memperluas jawaban Anda? Tidak jelas apa yang Anda maksud.
Max Vernon