MySQL 線上日志庫(kù)遷移實(shí)例
說(shuō)說(shuō)最近的一個(gè)案例吧,線上阿里云RDS上的一個(gè)游戲日志庫(kù)最近出現(xiàn)了一點(diǎn)問(wèn)題,隨著游戲人數(shù)的增加,在線日志庫(kù)的數(shù)據(jù)量越來(lái)越大,最新的日志庫(kù)都已經(jīng)到50G大小了,在線變更的時(shí)間非常長(zhǎng)。
之前之所以沒(méi)有發(fā)現(xiàn),是因?yàn)橹耙恢睕](méi)有進(jìn)行過(guò)日志庫(kù)的變更,但是隨著業(yè)務(wù)的深入,需要增加一些游戲?qū)傩?,要?duì)之前的日志庫(kù)進(jìn)行變更,這樣一來(lái),長(zhǎng)時(shí)間的維護(hù)窗口讓業(yè)務(wù)方和DBA都望而卻步,日志優(yōu)化迫在眉睫。
首先看日志庫(kù)的情況:
1、日志庫(kù)中數(shù)據(jù)量大于5000w的大表有5張;
2、這5張表開(kāi)量前每個(gè)月的數(shù)據(jù)量大概在2000w左右,開(kāi)量后會(huì)更多;
3、有2個(gè)表的索引大小已經(jīng)超過(guò)數(shù)據(jù)文件大小
詢問(wèn)了業(yè)務(wù)方和運(yùn)營(yíng)對(duì)這些表的要求,具體如下:
1、保留最近這3個(gè)月的數(shù)據(jù),其他的數(shù)據(jù)可以進(jìn)行流轉(zhuǎn),避免影響線上業(yè)務(wù)的性能。
2、3個(gè)月之前的數(shù)據(jù)流轉(zhuǎn)到一個(gè)本地庫(kù)中,可以支持查詢即可,查詢速度不能過(guò)于慢,分鐘級(jí)別的可以接受。
3、日志庫(kù)在遷移的過(guò)程中,能夠容忍幾分鐘的表數(shù)據(jù)丟失,對(duì)數(shù)據(jù)的同步實(shí)時(shí)性要求不是很高
4、線上的日志庫(kù)需要支持用戶活躍度等統(tǒng)計(jì)
5、不希望執(zhí)行分庫(kù)分表,有很多查詢近幾個(gè)月的SQL操作,表之間存在一定的耦合性,分表之后不利于關(guān)聯(lián)操作
基于上面的分析,結(jié)合實(shí)際情況,初步設(shè)想的方案是:
1、對(duì)線上數(shù)據(jù)庫(kù)game_log中的表進(jìn)行rename操作,然后將原來(lái)的表重新創(chuàng)建出來(lái),這個(gè)過(guò)程中不是連續(xù)的,可能會(huì)丟失幾秒鐘的數(shù)據(jù)。具體的操作如下:
#第一步 rename table game_log.table to game_log_bak.table; #第二步,獲取表結(jié)構(gòu),其中重要的是auto_increment的值, #保證后續(xù)導(dǎo)入三個(gè)月內(nèi)數(shù)據(jù)的時(shí)候不會(huì)發(fā)生沖突 show create table game_log_bak.table\G #第三步 在game_log庫(kù)中重新創(chuàng)建第二步的表結(jié)構(gòu)
2、將rename過(guò)后的game_log_bak庫(kù)中的數(shù)據(jù)流轉(zhuǎn)到本地的離線數(shù)據(jù)庫(kù)中,該數(shù)據(jù)庫(kù)采用infobright存儲(chǔ)引擎,這樣能夠支持離線數(shù)據(jù)的快速查詢
3、備份并清理線上表3個(gè)月之外的數(shù)據(jù),大概是40G,并將線上的game_log_bak數(shù)據(jù)庫(kù)中3個(gè)月以內(nèi)的數(shù)據(jù)(大概10G)重新灌入game_log數(shù)據(jù)庫(kù)中,這樣結(jié)構(gòu)就變成了:
4、刪除game_log_bak庫(kù),并搭建一個(gè)只讀從庫(kù),實(shí)時(shí)的從主庫(kù)上同步game_log庫(kù)的信息,如下:
5、從本地的只讀從庫(kù)中,像本地的infobright數(shù)據(jù)庫(kù)中同步數(shù)據(jù),同步的方法可以選用dataX工具,像下面這樣:
6、設(shè)置定時(shí)任務(wù),按照一定的周期清理線上的過(guò)期數(shù)據(jù),確保線上只保留最近3個(gè)月的數(shù)據(jù),不會(huì)對(duì)rds的磁盤(pán)存儲(chǔ)空間產(chǎn)生壓力。
這個(gè)方法中,目前看來(lái)存在下面幾個(gè)問(wèn)題:
1、經(jīng)常性的清理線上數(shù)據(jù),這些數(shù)據(jù)占用的表空間不能被立即回收,可能會(huì)造成數(shù)據(jù)表的碎片問(wèn)題。
2、后續(xù)如果游戲的量級(jí)上來(lái)之后,使用這個(gè)問(wèn)題可能還是會(huì)有問(wèn)題,屆時(shí)可以適當(dāng)調(diào)整日志表的清理周期,如果數(shù)據(jù)量過(guò)大,可以考慮其他的方案來(lái)處理。
回過(guò)頭來(lái)分析,表的設(shè)計(jì)上還是存在一定的問(wèn)題,日志表中記錄的應(yīng)該只是流水?dāng)?shù)據(jù),盡量不能出現(xiàn)關(guān)聯(lián)查詢的情況,或者說(shuō)可以提前評(píng)估數(shù)據(jù)量,然后使用季度表或者月表來(lái)處理這種的大量的日志情況,這樣在清理和維護(hù)的時(shí)候可能就方便的多。
以上就是MySQL 線上日志庫(kù)遷移實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于MySQL 線上日志庫(kù)遷移的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql5.x升級(jí)到mysql5.7后導(dǎo)入之前數(shù)據(jù)庫(kù)date出錯(cuò)的快速解決方法
這篇文章主要介紹了mysql5.x升級(jí)到mysql5.7后導(dǎo)入之前數(shù)據(jù)庫(kù)date出錯(cuò)的快速解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09window10系統(tǒng)下mysql5.7安裝審計(jì)插件(親測(cè)有用)
mysql有沒(méi)oracle這樣的審計(jì)功能,突然想在mysql做審計(jì)怎么辦,下面帶大家從零開(kāi)始給mysql安裝審計(jì)插件,親測(cè)絕對(duì)可用哦,需要的朋友可以參考下2022-09-09mysql嚴(yán)格模式Strict?Mode詳細(xì)說(shuō)明
使用mysql嚴(yán)格模式可以使數(shù)據(jù)更加安全嚴(yán)格,缺點(diǎn)是減少了對(duì)空數(shù)據(jù)入庫(kù)的兼容性,下面這篇文章主要給大家介紹了關(guān)于mysql嚴(yán)格模式Strict?Mode詳細(xì)說(shuō)明的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問(wèn)題解讀
這篇文章主要介紹了MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09