最近用Mysql悲催的遇到不少問題,誰讓老東家有一堆DBA呢,原來不關心,自己用就gepi了。各種求指教啊。
1. 坑爹的repair
線上機器,配置應該是半年前的主流配置。CentOS 5。有個表老大了(其實也才250G,MyISAM,索引檔案8G),而且前面的資料都刪過。插入速度賊慢,比虛機裡的Mysql都慢(插入內容和方式完全相同的情況下)。
於是覺得,做optimize吧。興沖沖就上了,結果3個小時後,狀態一直為repair by sort,其產生的tmp file才6G,而且修改時間在1個半小時前。
當時就覺得不對了,再慢你得有動作把?1個半小時跑什麼呢?於是kill optimize table,結果大家都知道,表被標記為crash了。於是還得老老實實的repair table。我心裡想著,咋這麼慢捏,一搜,說repair by keycache很慢,repair by sort比by keycache來說還是快了不少的。我一看,我是repair by sort啊。在後續一些事情以後,乾脆等了。等了1天半,30多個小時,repair好了。檔案從250G變成了91G。話說repair by sort有這麼慢嗎??我知道你是單線程的,但是跑300G的檔案也不用30個小時吧。。。
2. 坑爹的scp/rsync,求指教,求罵
還是上面的事情,repair期間我當然不想閑著(CPU Idle 95%以上,IO也很輕),於是當然想把檔案拷到其他機器上去試試。結果scp的速度只有10MB/s,中途上到了60MB/s,不到40%時跌到了1MB/s,我哭啊!於是本機本地cp。結果算下來cp的平均速度是68MB/s。線上RAID機器,用cp就這速度嗎?真心求指教,連結地址也行啊。
3. 坑爹的參數配置
噢,還是上面的事情。本機cp以後,終於scp到了另一台空線上機器上。速度搭mysql,版本5.1.49-log Source distribution。
上去直接repair table。結果。。。它repair by keycache了。我的娘啊!
搜尋原因。大部分文章說,1. myisam_max_sort_file_size要足夠大。2. tmpdir可用空間要夠大。
我瞧了瞧,tmpdir的確指向了mysql/tmp,可用空間900G。把myisam_max_sort_file_size改為1600G,重啟Mysqld。仍然是repair by keycache。我無語了。
停mysqld,網上說有個工具叫myisamchk,於是拿來使。
myisamchk -r -p -n -q ./data/test/big -t=/home/work/local/mysql/tmp/
提示我myisam_max_sort_file_size不夠大。還提示說也可以使用repair by keycache的方式。NND,氣我嘛,於是加參數--myisam_max_sort_file_size=4096000000000
結果怎麼著?unknown variable ’myisam_max_sort_file_size=4096000000000‘
我滿頭黑線:不是你告訴我這參數不夠大來著??
試了max_sort_file_size,sort_file_size,均不認。
最後試試sort_buffer_size,它居然歡快的跑起來了!!
不是要用myisam_max_sort_file_size嗎?sort_buffer_size不是per session的嗎?我可是設了4T啊!遠遠超出記憶體啊!
不過跑了幾個小時,發現和原來在Mysql中跑repair一樣的速度,裡面的-p參數一點用也沒有,16個邏輯核心就一個用到底了,其他的基本上沒有使用。。。。
於是直接停了。
突發奇想,把my.cnf裡的myisam_max_sort_file_size注釋掉,把sort_buffer_size改為4096G,重啟mysqld,repair,果然repair by sort了。各位不信,隨時可以複現。
4. 坑爹的主從複製
恩。其實主從複製沒什麼坑爹的,很快就弄好了(當然那個大庫不在replicate-do-db裡面)。又費勁搞了一下配置,O了,簡單的看Seconds_Behind_Master,大概1000秒。
到晚上一看,怎麼變3000秒了?再看,Slave_to_Runing和Slave_SQL_running都是Yes。與上午的某個表的狀態對比,的確是有新資料同步過來。
到第2天上班,直接就到2w秒了。網上一搜,一是網路IO和檔案IO,一看不是;二是replicate的重放是單線程的。倒! 我原資料庫基本上是16路並發在一刻不停的修改20多個表,這邊一個線程重放,當然跟不上。原系統如果要加寫緩衝,估計又是一個浩大的工程。網上據說是有多線程重放的解決方案,不過沒開放源碼啊。有高招嗎?這主從複製看來是白做了。