Menghapus log bin di lingkungan replikasi

13

Saya punya pertanyaan tentang menghapus log biner di lingkungan replikasi:

Kami memiliki lingkungan dengan 1 master dan 2 budak (menjalankan mysql 5.5). Terkadang, kami mengalami masalah ruang selama waktu pemrosesan yang berat, di mana direktori log bin menjadi penuh. Log kedaluwarsa setiap 3 hari. Saya bertanya-tanya, apakah ada alasan mengapa log harus disimpan selama 3 hari di semua kotak - master dan kedua budak? Apakah masuk akal untuk, misalnya, menyimpan log selama 3 hari pada master, tetapi untuk 1 hari pada slave? Apa cara terbaik untuk melakukannya?

Terima kasih!

anna
sumber
Selamat datang di DBA.SE. Pertanyaan ini layak diberi +1 karena pertumbuhan log biner dan relai sering dianggap biasa, dan dapat menjadi sumber banyak masalah jika dibiarkan tidak dicentang.
RolandoMySQLDBA

Jawaban:

12

BUDAK

Jika Budak Anda bukan Master, maka Budak tidak perlu log biner sama sekali. Anda dapat membatasi jumlah ruang log relai yang diakumulasikan oleh seorang Budak. Untuk relay_log_space_limitmembatasi log relai pada 4G, tambahkan ke /etc/my/.cnf di setiap Slave

[mysqld]
relay_log_space_limit=4G

dan mulai kembali mysql

Jika Anda tidak dapat mengatur ini, setidaknya Anda harus memiliki semacam peringatan yang melakukan SHOW SLAVE STATUS\Gdan memeriksa nilai Relay_Log_Space(total byte yang dikonsumsi oleh log relay).

MENGUASAI

Adapun Master, Anda bisa mengatur expire_logs_dayske 1, tetapi ada peringatan keras yang saya miliki untuk Anda ...

Jika replikasi rusak, Anda punya waktu 1 hari untuk memperbaikinya. Jika tidak, log biner pada Master dapat berputar dan Anda tidak dapat menjalankan perintah PERUBAHAN MASTER KE untuk meluruskan replikasi. Saya akan berangkat expire_logs_daysjam 3 di Master.

SARAN # 1

Jika Anda memiliki pemrosesan massal semalam untuk dilakukan, mungkin harus menjalankan proses massal pada pada Master dengan SET SQL_LOG_BIN=0;di Awal Sesi. Ini, tentu saja, tidak akan mereplikasi ke Budak. Anda dapat melakukan Beban Massal yang Sama secara Paralel dengan kedua Budak.

SARAN # 2

Hal lain yang dapat Anda lakukan untuk mengelola akumulasi log biner Master adalah ini.

Jalankan SHOW SLAVE STATUS\Gdi kedua Budak. Lihatlah Relay_Master_Log_File. Itu mewakili log biner pada Master yang perintah terakhirnya dijalankan pada Slave.

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.4.92.250
                Master_User: replicant
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.009677
        Read_Master_Log_Pos: 855227755
             Relay_Log_File: relay-bin.000674
              Relay_Log_Pos: 757296783
      Relay_Master_Log_File: mysql-bin.009590
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 757296646
            Relay_Log_Space: 94274010765
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 80561
1 row in set (0.00 sec)

Dalam contoh ini, Relay_Master_Log_File adalah mysql-bin.009590. Semua log biner sebelum ini dapat dihapus dari Master. Anda bisa menjalankan ini pada Master:

PURGE BINARY LOGS TO 'mysql-bin.009590';

Ini akan menghapus log lama dan tetap membiarkan replikasi tetap berlaku.

CAVEAT

Binary Logs adalah file yang secara serial mengkompilasi (seperti antrian FIFO) semua menyelesaikan transaksi SQL baik sebagai pernyataan SQL atau perubahan baris. Log relai adalah file yang mengumpulkan entri log biner dari server jarak jauh (alias Master).

Dalam Replikasi MySQL

  1. Master harus mengaktifkan log binernya
  2. Slave mengkompilasi log relai
  3. Ketika semua SQL dalam log relay diproses, itu dihapus
  4. Pada Slave, ketika ada lebih dari satu log relai pada DB Server, itu mungkin mengindikasikan replikasi tertinggal karena thread IO mengumpulkan SQL dari Master lebih cepat sehingga thread SQL dapat memproses log relai.
  5. Menggunakan relay_log_space_limit mencegah replikasi menumpuk dan berpotensi mengisi disk. Log relay putar keluar berdasarkan aturan # 3
  6. Dimungkinkan untuk DB Server menjadi Master dan Slave. Itulah satu-satunya keadaan di mana seorang budak harus memiliki log biner diaktifkan. Dalam skenario itu, DB Server akan memiliki Log Biner dan Log Relay.

Jika Anda gagal menjadi Budak, dan Anda ingin menjadikannya seorang Master

  • layanan berhenti mysql
  • Tambahkan log-bin=mysql-binke /etc/my.cnf di Slave
  • layanan mysql mulai

Anda harus menyiapkan replikasi dari Budak lain ke Master yang baru dipromosikan dan pastikan data pada Budak cocok dengan Master yang baru dipromosikan

UPDATE 2012-08-13 17:47 EDT

Menurut opsi Dokumentasi MySQL padarelay-log , Anda harus mendefinisikannya. Inilah alasannya:

Karena cara MySQL mem-parsing opsi server, jika Anda menentukan opsi ini, Anda harus memberikan nilai; nama dasar default hanya digunakan jika opsi tidak benar-benar ditentukan. Jika Anda menggunakan opsi --relay-log tanpa menentukan nilai, perilaku yang tidak terduga kemungkinan akan terjadi; perilaku ini tergantung pada opsi lain yang digunakan, urutan yang ditentukan, dan apakah mereka ditentukan pada baris perintah atau dalam file opsi. Untuk informasi lebih lanjut tentang bagaimana MySQL menangani opsi server, lihat Bagian 4.2.3, “Menentukan Opsi Program”.

RolandoMySQLDBA
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Paul White 9