來自 MySQL 的相互矛盾的報告,即存在 binlog 文件
我們的複制最近停止工作。我送出了一個問題,但未能成功解決問題(錯誤 1236 - “在二進制日誌索引文件中找不到第一個日誌文件名”)。自從問題中描述的事件發生以來,我已經
RESET MASTER
在主伺服器上執行了 aRESET SLAVE
,在從伺服器上執行了 a ,並創建了一個新的完整轉儲,但仍然得到相同的結果。我想我會退後一步,嘗試採用不同的方法,攻擊錯誤消息本身的細節。
當我
SHOW SLAVE STATUS
在從機上執行時,它報告主機無法“找到第一個日誌文件名”:Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
“第一個日誌文件名”是
/var/lib/mysql/mysql-bin.000001
:root@master [905 13:30:56 /var/lib/mysql]# cat mysql-bin.index /var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.000002 /var/lib/mysql/mysql-bin.000003 /var/lib/mysql/mysql-bin.000004 /var/lib/mysql/mysql-bin.000005 /var/lib/mysql/mysql-bin.000006
MySQL 本身似乎知道這
mysql-bin.000001
是第一個二進制日誌:MariaDB [(none)]> SHOW BINARY LOGS; +------------------+------------+ | Log_name | File_size | +------------------+------------+ | mysql-bin.000001 | 10421 | | mysql-bin.000002 | 1073919628 | | mysql-bin.000003 | 1074488806 | | mysql-bin.000004 | 1073744707 | | mysql-bin.000005 | 1074366770 | | mysql-bin.000006 | 1069984818 | +------------------+------------+ 6 rows in set (0.00 sec)
mysqlbinlog
表明該文件似乎是可訪問且有效的:root@master [911 13:48:04 /var/lib/mysql]# mysqlbinlog /var/lib/mysql/mysql-bin.000001 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #160526 12:24:14 server id 5 end_log_pos 248 Start: binlog v 4, server v 10.0.21-MariaDB-log created 160526 12:24:14 at startup
MySQL 本身似乎也可以訪問第一個日誌文件:
MariaDB [(none)]> SHOW BINLOG EVENTS in 'mysql-bin.000001' from 0 limit 4; +------------------+-----+-------------------+-----------+-------------+------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------------+-----------+-------------+------------------------------------------------+ | mysql-bin.000001 | 4 | Format_desc | 5 | 248 | Server ver: 10.0.21-MariaDB-log, Binlog ver: 4 | | mysql-bin.000001 | 248 | Gtid_list | 5 | 273 | [] | | mysql-bin.000001 | 273 | Binlog_checkpoint | 5 | 312 | mysql-bin.000001 | | mysql-bin.000001 | 312 | Gtid | 5 | 350 | BEGIN GTID 0-5-1 | +------------------+-----+-------------------+-----------+-------------+------------------------------------------------+ 4 rows in set (0.00 sec)
題
回顧一下,MySQL 抱怨它“在二進制日誌索引文件中找不到第一個日誌文件名”。但是,如上所示,MySQL 似乎確實知道“第一個日誌文件名”是什麼,並且確實可以訪問它。
我還應該檢查什麼以確保 MySQL 可以真正“找到$$ the $$第一個日誌文件名”?
事實證明,問題在於我們正在連接到一個舊的(錯誤的)master。以前的主人是
domain.com
,但幾個月前,我們遷移到了db.domain.com
。似乎我們錯誤地連接到domain.com
.我們
autossh
用來為我們的複制設置 SSH 隧道。為了確認我們正在連接到舊的(錯誤的)主機,我telnet 127.0.0.1:3305
在從機上執行。從這裡,我可以看到報告的 MySQL 版本與舊 master 的版本匹配。我完全重新啟動了從站,這似乎已經解決了這個問題。我認為問題的根源可能是由於我們網路上的一些 DNS 怪癖 - 似乎當建立 autossh 連接時,db.domain.com
解析為domain.com
,因此出現連接到錯誤主機的症狀。(當然,我們網路上的這些 DNS 問題值得研究)注意:非常感謝@Andrew 對原始問題的回答:https ://dba.stackexchange.com/a/140259/55530