Kesalahan 1236 - “Tidak dapat menemukan nama file log pertama dalam file indeks log biner”

10

Pengaturan kami:

  • Master: MariaDB 10.0.21
  • Budak: MariaDB 10.0.17

Replikasi bekerja dengan baik sampai saat ini pada titik mana DB budak harus dipulihkan dari dump. Saya melakukan semua langkah yang diperlukan: Dump DB master, transfer dump ke slave, drop DB lama, jalankan dump untuk mengembalikan DB, jalankan CHANGE MASTERperintah yang sesuai , dan akhirnya START SLAVE.

Saya menerima kesalahan: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

File log pertama yang dibutuhkan budak dari master adalah mysql-bin.000289. Saya dapat melihat bahwa ini ada pada master: masukkan deskripsi gambar di sini

Saya juga dapat melihat bahwa indeks log biner pada master tampaknya memiliki entri untuk file log ini: masukkan deskripsi gambar di sini

Replikasi masih tidak berfungsi - saya terus mendapatkan kesalahan yang sama. Saya kehabisan ide - apa yang harus saya periksa selanjutnya?


Diperbarui: Output SHOW SLAVE STATUS\Gseperti yang diminta:

MariaDB [(none)]> SHOW SLAVE STATUS\G
--------------
SHOW SLAVE STATUS
--------------

*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 127.0.0.1
                  Master_User: replication
                  Master_Port: 1234
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000289
          Read_Master_Log_Pos: 342
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000289
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
              Replicate_Do_DB: xxx_yyy,xxx_zzz
          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: 342
              Relay_Log_Space: 248
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
1 row in set (0.00 sec)

Informasi tambahan yang diminta:

root@master [818 18:54:22 /var/lib/mysql]# ls -l /var/lib/mysql/mysql-bin.000289
-rw-rw---- 1 mysql mysql 1074010194 May 19 03:28 /var/lib/mysql/mysql-bin.000289
root@master [819 18:54:29 /var/lib/mysql]# ls mysql-bin.00029*
mysql-bin.000290  mysql-bin.000291  mysql-bin.000292 #(Yes, it was created)
root@master [821 18:56:52 /var/lib/mysql]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6345382
Server version: 10.0.21-MariaDB-log MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW BINARY LOGS;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000279 | 1074114047 |
| mysql-bin.000280 | 1074004090 |
| mysql-bin.000281 | 1074035416 |
| mysql-bin.000282 | 1073895128 |
| mysql-bin.000283 | 1073742000 |
| mysql-bin.000284 | 1074219591 |
| mysql-bin.000285 | 1074184547 |
| mysql-bin.000286 | 1074217812 |
| mysql-bin.000287 | 1022733058 |
| mysql-bin.000288 |     265069 |
| mysql-bin.000289 | 1074010194 |
| mysql-bin.000290 | 1074200346 |
| mysql-bin.000291 |  617421886 |
| mysql-bin.000292 |     265028 |
+------------------+------------+
14 rows in set (0.00 sec)

MariaDB [(none)]> exit
Bye
root@master [821 18:57:24 /var/lib/mysql]# mysqlbinlog mysql-bin.000289 > /tmp/somefile.txt
root@master [822 18:58:13 /var/lib/mysql]# tail /tmp/somefile.txt 
# at 1074010124
#160519  3:28:59 server id 5  end_log_pos 1074010151    Xid = 417608063
COMMIT/*!*/;
# at 1074010151
#160519  3:28:59 server id 5  end_log_pos 1074010194    Rotate to mysql-bin.000290  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
root@master [823 18:58:31 /var/lib/mysql]# 

/etc/my.cnf.d/server.cnf (kutipan):

# BINARY LOGGING #
log-bin                        = /var/lib/mysql/mysql-bin
expire-logs-days               = 14
sync-binlog                    = 1

Sunting: Postion 342 tampaknya ada:

root@master [826 12:15:33 /var/lib/mysql]# grep "end_log_pos 342 " /tmp/somefile.txt
#160517 14:43:13 server id 5  end_log_pos 342   Binlog checkpoint mysql-bin.000288
rinogo
sumber
Waspadalah juga karena versi master Anda sedikit lebih baru daripada versi slave Anda. Sementara versi slave bisa lebih tinggi (karena tidak diragukan lagi akan memahami semua perintah / fungsi / fitur), jika Master lebih baru, itu bisa meminta sesuatu yang belum pernah didengar oleh Slave. Saya curiga itu tidak akan terjadi dalam perbedaan revisi sekecil itu, tetapi tidak dapat dikesampingkan dan tidak diragukan lagi akan menjadi Arcane yang ekstrem dan sulit ditemukan. Juga: baris resminya adalah bahwa master terbaru tidak didukung.
TheSatinKnight

Jawaban:

6

Anda tampaknya tidak terhubung ke master seperti yang Anda pikirkan. Per log biner Anda pada master yang tampaknya Anda miliki:

# 160519 3:28:59 id server 5

Tetapi per MENUNJUKKAN STATUS BUDAK kita melihat:

         Master_Server_Id: 3

Dan selanjutnya Anda tampaknya terhubung di localhost, tetapi Anda tersirat master / slave Anda ada di host yang berbeda:

              Master_Host: 127.0.0.1
Andrew
sumber
1
Kami menggunakan penerowongan SSH (dengan autossh ) untuk mengekspos master jarak jauh secara lokal di 127.0.0.1:3305. Saya memperhatikan Master_Server_Id juga, tapi saya pikir itu hanya sisa dari dulu ketika kami menggunakan master yang berbeda. Saya mengharapkan nilai SHOW SLAVE STATUSuntuk memperbarui setelah kami sepenuhnya membangun kembali replikasi. Bagaimanapun, ini adalah saran yang luar biasa; Saya akan memeriksa tiga kali bahwa kita memang terhubung ke master yang tepat!
rinogo
1
Terima kasih banyak telah menunjukkan saya ke arah yang benar! Kami memang terhubung dengan tuan yang salah. Saya mengkonfirmasi dengan melakukan telnet 127.0.0.1:3305- Saya bisa melihat bahwa versi MySQL yang dilaporkan cocok dengan versi dari master lama . Saya pikir akar masalahnya kemungkinan karena beberapa kebiasaan DNS di jaringan kami - sepertinya koneksi autossh dibuat secara keliru untuk domain.com, meskipun sudah dikonfigurasi untuk terhubung ke db.domain.com. Sekali lagi terima kasih banyak.
rinogo
8

Jika semuanya gagal, Anda mungkin perlu mengatur ulang budak dan memulai kembali replikasi. Dari https://www.redips.net/mysql/replication-slave-relay-log-corrupted/ :

# First note current settings
mysql> show slave status\G
# then stop slave
mysql> stop slave;
# make slave forget its replication position in the master's binary log
mysql> reset slave;
# change slave to start reading from stopped position
mysql> change master to master_log_file='mysql-bin.XXX', master_log_pos=XXX;
# start slave
mysql> start slave;
Andy Beverley
sumber
1
OP telah berkomentar bahwa jawaban lain itu benar (dan mereka terhubung ke contoh yang salah).
ypercubeᵀᴹ
3
@ yper-trollᵀᴹ - ya, tapi setengah dari titik Stackexchange adalah untuk arsip pertanyaan, yang pasti mendarat di bagian atas pencarian Google untuk orang lain dengan masalah yang sama. Saya sendiri memiliki masalah yang sama persis, dan ini adalah solusi bagi saya (terutama karena saya benar-benar menghabiskan waktu berjam-jam untuk menyelesaikannya, karena sebagian besar halaman lain hanya menunjukkan jawaban yang sama). Fakta bahwa jawaban "salah" lainnya mendapat 2 suara adalah bukti untuk ini.
Andy Beverley
Ya, titik adil. Selama ini (saran) dimaksudkan untuk digunakan ketika semuanya gagal (dan ditandai dengan jelas seperti itu), tidak apa-apa. Itu sebabnya saya hanya berkomentar dan tidak diturunkan.
ypercubeᵀᴹ
1
Jawaban ini bekerja untuk saya ketika tidak ada saran lain yang berlaku. (Saya sedang mengerjakan binlog yang ada, saat ini, memiliki master yang dikonfigurasi dengan benar, dll.) Ini adalah jawaban yang bagus dan terus terang RESET SLAVE; opsi harus disebutkan lebih jelas di atas.
JD Baldwin
3

Pesan kesalahan adalah jawabannya.

Lihatlah output dari SHOW BINARY LOGSquery:

+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000279 | 1074114047 |
| mysql-bin.000280 | 1074004090 |
| mysql-bin.000281 | 1074035416 |
| mysql-bin.000282 | 1073895128 |

Tidak ada mysql-bin.000278 di layar.

Kecuali jika log biner diputar, isi mysql-bin.index salah.

Silakan bandingkan konten mysql-bin.indexdengan file-file binlog yang sekarang ada dan pastikan semuanya cocok. Anda dapat memperbaikinya dengan Master

mysql> PURGE BINARY LOGS TO 'mysql-bin.000279';

kemudian pergi ke Budak dan jalankan

mysql> STOP SLAVE; START SLAVE;

Cobalah !!!

RolandoMySQLDBA
sumber
Hai, Rolando! Terima kasih banyak atas bantuan Anda! Sayangnya, saya masih bingung. Apakah maksud Anda mysql-bin.000288alih-alih mysql-bin.000278? Jika demikian, mysql-bin.000288tampaknya memang ada. Apakah ini masih memperbaiki masalah?
rinogo
PURGE BINARY LOGS TO 'mysql-bin.000279';memberi saya kesalahan (seperti yang diharapkan), karena log "279" tidak ada lagi (telah diputar). PURGE BINARY LOGS TO 'mysql-bin.000288';dieksekusi dengan sukses, dan menghapus semua log biner hingga "288". Sayangnya, saya masih mendapatkan kesalahan.
rinogo
Terima kasih banyak atas saran detail Anda, Rolando! Masalahnya akhirnya adalah bahwa kami terhubung ke master yang salah ( dba.stackexchange.com/a/140259/55530 ).
rinogo
2

Pembaruan: Jawaban ini mencakup klasifikasi kesalahan umum. Untuk jawaban yang lebih spesifik tentang cara terbaik menangani permintaan persis OP, silakan lihat jawaban lain untuk pertanyaan ini

Salah satu kesalahan replikasi paling kritis Punya kesalahan fatal 1236 Dapat dipicu oleh beberapa alasan, salah satunya adalah judul dari pertanyaan ini.

Mendapat kesalahan fatal 1236 dari master saat membaca data dari log biner: 'Tidak dapat menemukan nama file log pertama dalam file indeks log biner'

Kesalahan ini terjadi ketika server slave diperlukan log biner untuk replikasi tidak lagi ada di server database master.

Begitu banyak skenario yang dapat menyebabkan ini:

  • Server master kadaluarsa log biner melalui variabel sistem expire_logs_days(my.cnf jika Anda mengatur expire_logs_daysbinlog lama berakhir secara otomatis dan dihapus; Ketika MySQL membuka file binlog baru, ia memeriksa binlog lama, dan membersihkan apa pun yang lebih tua dari nilai expire_logs_days)
  • Seseorang secara manual menghapus log biner dari master melalui PURGE BINARY LOGSperintah atau melalui rm -fperintah
  • Anda memiliki beberapa cronjobyang mengarsipkan log biner lama untuk mengklaim ruang disk

Untuk mengatasi masalah ini, satu-satunya solusi bersih yang dapat saya pikirkan adalah membuat kembali server slave dari cadangan server master atau dari slave lain dalam topologi replikasi.

Referensi: replikasi mysql mendapat kesalahan fatal

AnouarZ
sumber