MySQL複製出錯 Last_SQL_Errno:1146的解決方案_Mysql

來源:互聯網
上載者:User

背景:我們在做資料移轉或者拆分的時候,使用Tablespace transcation 這種解決方案時,很有可能就會遇到 從庫複製出錯,報: Last_SQL_Errno: 1146

那麼具體錯誤內容可能會有如下:

Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank discard tablespace'
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank import tablespace'

那麼我們遇到這樣的問題的時候該如何恰當的處理呢?考慮如下幾點:

1. 我們整個庫的容量有多大?
2. 業務容忍的最大延遲時間多久?
3. 我們恢複需要多久?恢複的難易程度如何?

通過考慮到以上幾點, 我們就可以根據實際情況做出抉擇,採用什麼樣的辦法儘快的恢複從庫;對於這樣的問題,簡單粗暴的方案就是重建從庫,當然還有別的辦法, 且聽我慢慢道來:

首先我們先看看我們是如何通過Transport tablespace 遷移資料的,大概步驟如下:

1.庫A執行: show create table xxx1; 拿到簡表語句;
2.庫B執行: create table xxx1; 在從庫上建立基本的表結構;
3.庫B執行: alter table xxx1 discard tablespace; 讓mysql自己刪掉ibd檔案;
4.庫A執行: flush tables xxxx1,xxxx2 for export;把記憶體的髒資料刷到磁碟,使得ibd檔案資料一致;
5.庫A執行: scp xxxx1.ibd xxx2.ibd xxxx1.cfg xxx2.cfg slave_host:/data/ 把ibd檔案拷貝到從庫;
6.庫B執行: alter table xxx1 import tablespace 匯入資料檔案。

好了我們知道了整個遷移的具體步驟,那麼我們就可以輕鬆的應對在遷移過程中複製出錯的問題了。

那麼我們首先來看一下:

Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank discard tablespace'

其大概的意思就是我們在從庫上沒有找到 這個表的完整定義資訊,觀察一下磁碟上的檔案我們就明白了:

[root@GZ_NF_DB_RP_002 spider]# ls -lhrt |grep tb_city_population_rank
-rw-r----- 1 mysql mysql 8.3G Mar 31 20:03 tb_city_population_rank.ibd

果然沒有 這個表的 frm 檔案, 那麼怎麼辦呢?由於是 slave 的sql_thread 線程報錯, 那麼我們可採取取巧的辦法:

用超級使用者登入從庫,先備份一下 這個ibd 檔案:[root@GZ_NF_DB_RP_002 spider]# mv tb_city_population_rank.ibd tb_city_population_rank.ibd.bak

然後拿到這個檔案的表結構, 在從庫上執行建表語句,這樣一樣來, 我們從庫就有了 ibd frm 檔案, 那麼 此時我們開啟slave sql_thread,這時就會執行時主庫傳過來的 語句:

alter table tb_city_population_rank discard tablespace ; 那麼當我們再一次的觀看此盤資料檔案的時候,ibd 檔案又不見了,此時slave 也就已經出錯了,其錯誤資訊如下:

Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank import tablespace'

那麼我們此時需要做的就是: 把剛才mv 的檔案 再 mv 回去, 也就是說:[root@GZ_NF_DB_RP_002 spider]# mv tb_city_population_rank.ibd.bak tb_city_population_rank.ibd ; 完成這個命令後我們再執行 start slave sql_thread ; 此時這個表就正常了, 我們可以執行select * from tb_city_population_rank limit 100; 來驗證一下是否可讀。

那麼此時,我們算完整的解決了因一個表導致的複製出錯的問題, 那麼如果遷移了多張表(經常是) , 那麼我們就可以按照這個解決方案,一步一步的來解決複製出錯。其大概的思路就是, 缺什麼我們補什麼,多了什麼我們去掉什麼。

下面是其它網友的補充,根據返回的錯誤資訊進行調整即可。

mysql 主主複製(雙主複製)報錯Last_SQL_Errno: 1146

錯誤資訊:

複製代碼 代碼如下:

Last_Errno: 1146
                  Last_Error: Error 'Table 'test.user' doesn't exist' on query. Default database: 'test'. Query: 'insert into user values(20,'在庫')'

解決方案:

mysql> set global sql_slave_skip_counter=20;mysql> STOP SLAVE;mysql> START SLAVE;

問題解決

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.