title: mysql · myrocks · myrocks之備份恢複
myrocks支援邏輯備份和實體備份,邏輯備份仍然采用mysqldump,實體備份采用自己開發的myrocks_hotbackup工具,傳統的實體備份工具xtrabackup不支援rocksdb。由于rocksdb的存儲特性,myrocks不管是邏輯備份還是實體備份,與innodb的備份恢複均有較大差别。
myrocks的mysqldump工具支援rocksdb的邏輯備份,其使用方式與原生的mysqldump備份innodb沒有差別,一般的使用方式如下
雖然使用方式相同,但内部實作會用一些差别
傳統的mysqldump備份方式簡化如下
加鎖ftwl:flush table with read lock
設定rr模式:set session transaction isolation level repeatable read
開啟一緻讀:start transaction with consistent snapshot
擷取位點:show master status
解鎖:unlock tables
依次導出資料select * from table
myrocks的mysqldump備份方式簡化如下
設定讀取時不緩存到block cache:set session rocksdb_skip_fill_cache=1
開啟一緻讀:start transaction with consistent rocksdb snapshot
可以看出myrocoks mysqldump導資料時,設定了engine層的優化rocksdb_skip_fill_cache。同時少了傳統的ftwl的加鎖和解鎖操作,換了新的快照擷取方式start transaction with consistent rocksdb snapshot, 此方式會加一些記憶體鎖(lock_log等)同時傳回位點資訊,此方式比ftwl更高效。
myrocoks mysqldump不能同時備份innodb和rocksdb, 備份innodb時也采用新的start transaction with consistent innodb snapshot方式。如果需支援同時備份innodb和rocksdb,需修改mysqldump采用老的start transaction with consistent snapshot方式,同時開啟innodb和rocksdb的快照。
myrocks 有專門的實體備份工具myrocks_hotbackup,此工具是一個python腳本,源碼在scripts/myrocks_hotbackup,總共才600多行,整個備份邏輯比較簡單。
分析myrocks_hotbackup之前,先介紹下myrocks的checkpoint快照功能
執行以下語句會在目錄/path/to/backup下建立一個一緻性的資料快照
建立快照過程如下
禁止sst檔案的删除操作
建立空目錄/path/to/backup
在/path/to/backup下為每個sst檔案的建立硬連結
copy manifest和options檔案到/path/to/backup下
備份wal檔案,最後一個wal檔案通過copy方式,其他wal檔案通過硬連結備份到/path/to/backup下
允許sst檔案的删除操作
note: sst内容是不會變化的,進而能夠以硬連結的方式備份檔案,充分利用硬連結的特性。同時快照過程中禁止删除sst檔案,進而保證manifest檔案的一緻性。
checkpoint快照中sst檔案占主要部分,sst通過hardlink方式建立,使得快照操作比較快,同時也節省了空間。
再來看看myrocks_hotbackup的備份過程
通過set global rocksdb_create_checkpoint=‘path_n’建立快照
依次備份快照中的檔案,先備份sst檔案再備份, 再備份wal,manifest和options檔案。備份sst過程會比較長,如果超過checkpoint_interval(由參數--interval指定)sst檔案還沒有備份完,就會清理目前快照,傳回步驟1重新開始。
步驟1,2完成後,rocksdb相關的檔案備份完成,清理最後一次checkpoint快照檔案。步驟1,2可能重複執行多次。
開始備份mysql其他檔案。比如其他資料庫檔案,test,mysql資料等,另外還有datadir下其他檔案,但過濾掉這些檔案'master.info', 'relay-log.info', 'worker-relay-log.info','auto.cnf', 'gaplock.log', 'ibdata', 'ib_logfile'。
checkpoint renewing
上面步驟1,2重複建立快照的過程稱為checkpoint renewing,圖檔來自facebook

checkpoint renewing 過程中已經備份過的sst檔案不會重複備份,隻在最後一次checkpoint snapshot中備份wal檔案,manifest和options檔案。checkpoint renewing 使得我們備份的資料比較新,進而通過此備份集建立的備庫與主庫同步的時間比較短。
遠端備份
一個用tar方式備份的例子
備份日志如下,從日志也可以看整個備份的過程
備份恢複
備份完成後,所有的資料都在同一個目錄下,我們需要通過--move_back 将資料移動到我們需要的地方。
通過備份集搭建一個備庫
傳統的實體備份工具xtrabackup備份過程中會通過加鎖擷取一緻的binlog位點資訊,并儲存到檔案中,恢複後通過這些位點資訊來重建複制關系。而myrocks_hotbackup備份過程中沒有加鎖,也沒有儲存位點資訊。
在myrocks中enging層rocksdb會保持位點資訊,每次事務送出時,都會将binlog位點以及gtid資訊儲存到資料字典binlog_info_index_number中。
備份集通過--move_back恢複後,直接啟動mysqld,mysqld在recover 過程中會将資料字典binlog_info_index_number的資訊列印到錯誤日志中,例如
從錯誤日志中解析出位點,然後可以通過以下方式建立複雜關系
myrocks_hotbackup僅支援rocksdb備份,不支援innodb備份
myrocks支援實體備份和邏輯備份,但這兩種方式都隻支援rocksdb備份,如果需要同時指出innodb和rocksdb的備份,還需要對備份邏輯稍加改造才行。
myrocks的實體備份方式比較高效,一般建議采用myrocks_hotbackup實體備份方式。