MYSQL数据回流
? ? ?一般的網(wǎng)站應(yīng)用中,總會有部分二次數(shù)據(jù)(處理過的原始數(shù)據(jù))展現(xiàn)給前臺,比如,拿購物網(wǎng)站來說,購買進口奶粉最多的用戶群體;哪類產(chǎn)品消費增長趨勢最旺盛;用戶的消費歷史歸類等都是二次數(shù)據(jù)。由于這部分數(shù)據(jù)通常是分析后的數(shù)據(jù),而且實時性不強,因此這個過程通常是通過離線計算得到。為了展現(xiàn)給前臺,需要將這部分數(shù)據(jù)回流到關(guān)系型數(shù)據(jù)庫【離線計算集群一般都是KV存儲,不支持SQL】,供前端用戶查詢。 ? ? ? 對于MYSQL而言,數(shù)據(jù)回流實質(zhì)就是通過mysqlimport或load data infile語句將離線計算的結(jié)果導(dǎo)入到數(shù)據(jù)庫中。mysqlimport實質(zhì)是對load data infile的封裝,所以搞清楚load data infile的原理,和使用過程中需要注意的事項,就搞清楚了mysql數(shù)據(jù)回流。 ? ? ? load data infile語法,大家可以通過mysql官方手冊查看,這里就不copy-paste了,這里主要介紹下原理和流程,下面所描述的都是針對innodb存儲引擎,復(fù)制采用行級復(fù)制的情況。流程如下: (1)主數(shù)據(jù)庫進行 ‘Load’ 操作 (2)主數(shù)據(jù)庫操作完成后,才開始向slave傳輸 load.txt文件, (3)slave接受文件,并在 slave_load_tmpdir 目錄下生成 load.txt 文件,接受并生成完整的load.txt 后,才開始讀取該文件,并將數(shù)據(jù)插入到本地表中。 備注:由于innodb是事務(wù)型的,所以會把load文件的整個操作當作一個事務(wù)來處理,中途中斷l(xiāng)oad操作,會導(dǎo)致回滾。? ? ? ? load data infile 結(jié)構(gòu)圖【來自網(wǎng)絡(luò)】 ? ? ? ? 在執(zhí)行l(wèi)oad data infile前,一定要根據(jù)實際情況設(shè)置好以下幾個參數(shù),否則很有可能因為參數(shù)設(shè)置不對,導(dǎo)致load失敗。? slave_load_tmpdir 含義:load data infile 存放臨時文件的目錄 建議:這個目錄所在磁盤空間應(yīng)該足夠大,防止因為目錄空間不足,導(dǎo)致失敗的情況。 ? max_allowed_packet 含義:客戶端/服務(wù)器之間通信的緩存區(qū)的最大大小。 最大值:1G 建議:因此對于含有大字段(BLOB,TEXT)的表操作,或主備之間含有大事務(wù)傳遞時,需要調(diào)大該值,否則會出現(xiàn)max_allowed_packet不夠大的錯誤。 max_binlog_cache_size 含義:用來限制用來緩存多語句事務(wù)的緩沖區(qū)總大小。如果某個事務(wù)大于該值,將會失敗并回滾。 最大值:4G(32位),16PB(64位) 建議:對于load data infile,或mysqlimport導(dǎo)入大文件時,由于是作為一個事務(wù),很可能導(dǎo)致max_binlog_cache_size不夠,而出現(xiàn)錯誤導(dǎo)致回滾的情況。 ? max_binlog_size 含義:事務(wù)以一個塊寫入二進制日志,當超過max_binlog_size時,文件進行切換。 于max_binlog_size。 最大值:1G 建議:這個值設(shè)置不會導(dǎo)致執(zhí)行報錯的情況。但是,有一點要注意,單個事務(wù)的binlog不會跨binlog文件,因此大事務(wù)可能導(dǎo)致binlog文件超出max_binlog_size值。 ?本人在使用mysql進行l(wèi)oad時,遇到過好幾個問題,都是與以上幾個參數(shù)有關(guān)。 1.max_binlog_cache_size不夠大,主庫導(dǎo)入出錯,或從庫復(fù)制出錯; 解決方法:調(diào)大該值 2.max_allowed_packet不夠大,導(dǎo)致從庫io_thread拉binlog失敗,主備復(fù)制中斷。 解決方法: 1.調(diào)大該值 2.重新建立復(fù)制關(guān)系 (1).記錄目前復(fù)制的位置(Relay_Master_Log_File, Exec_Master_Log_Pos); (2).reset slave [清理掉無效的relay-log,和master-info信息] (3).執(zhí)行change master to 命令 (4).start slave ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 大部分情況下,執(zhí)行第一步后,start slave應(yīng)該就可以了;但我碰到過,重啟復(fù)制后依然報錯的情況,主要原因是max_allowed_packet不夠大,relay-log只記錄了事務(wù)的一部分,復(fù)制報錯。那么,通過重建復(fù)制關(guān)系,則會重新開始拉事務(wù)的binlog,relay-log完整后,就不存在問題了。
轉(zhuǎn)載于:https://www.cnblogs.com/cchust/p/3309727.html
總結(jié)
- 上一篇: bootstrap模态框 遮挡_Boot
- 下一篇: Struts2+Spring3+Hibe