1、寫在前面
閃回相對于備份恢復而言更輕量級,針對于某一個表因為錯誤的事務提交而導致的數據錯誤,閃回主要是針對于事務而言的,數據庫必須在正常的運行狀態下執行;如果介質損壞等還是需要使用傳統的備份恢復。
閃回功能針對于不同的存儲引擎會有相應的限制,因此在測試閃回之前先了解一下open Gauss的存儲引擎。
2、存儲引擎概述
用一張圖描述一下存儲引擎的劃分:
openGauss的存儲引擎主要分為磁盤存儲引擎和內存存儲引擎:
磁盤存儲引擎:顧名思義就是數據保存在磁盤上,通過特定的接口從磁盤中讀取數據,存儲結構以page為單位,為了方便與服務器進行交互,需要與操作系統中的block大小對齊,服務器的block大小一般是4k,因此數據庫在實際頁大小的時候都是4k的整數倍,比如:4k、8k、16k、32k。MogDB默認的頁大小就是8K。
內存存儲引擎(Mstore):顧名思義就是數據存儲在內存中,sql引擎指直接與內存交互,但為了保證數據的持久性,會有特殊的技術把內存引擎中的數據合并到磁盤當中,比如當下比較流行的LSM Tree。MogDB中的MOT表就屬于內存存儲引擎。
磁盤存儲引擎需要通過接口從磁盤中讀取到數據庫的緩沖區,而內存引擎則避免的與磁盤的io,所以在追求高并發、高性能的OLTP類系統中可以考慮使用內存存儲引擎。
磁盤存儲引擎又分為行存儲引擎和列存儲引擎。行存儲引擎,顧名思義數據是以行的形式存放在page中,主要應用于事務類交易系統;列存儲引擎是以列的形式存放在page中,主要應用于OLAP類統計查詢系統,并且可以使用更多的壓縮方式,存儲空間會更好的利用。
行存儲引擎又根據不同的優化方式分為Astore(優化追加寫)存儲引擎和Ustore(優化更新)存儲引擎。
Ustore是原地更新(in-place update)設計,支持 MVCC(Multi- Version Concurrency Control,多版本并發控制),類似于Oracle的設計,最新的數據(已提交)與前版本數據(undo)分開存儲。
Astroe也支持多版本查詢,只是前版本數據與數據都是在一起存儲,會更占用空間,一個page中可能存放4條Astroe的數據,但是在Ustore中可能會存儲8條。因為Astro歷史版本數據和最新的數據存放到有一起。
3、基于內存存儲引擎的MOT
MOT是通過內存存儲引擎管理的內存表,支持事務的ACID特性,由于內存是易丟失的,所以如果想保證數據的持久性,需要把MOT的數據同步到磁盤中,MOT是通過WAL重做日志和MOT檢查點實現了數據的持久性,詳細請參考官方文檔MOT的使用,當前只是測試功能。
1)編輯mot.conf配置文件
Mot.conf在data目錄下,把以下注釋內容取消掉
enable_checkpoint = true checkpoint_dir = /opt/mogdb/data/checkpoint checkpoint_segsize = 16 MB checkpoint_workers = 3 checkpoint_recovery_workers = 3 |
在postgresql.conf中增加一行指定mot配置文件路徑,另外需要修改enable_incremental_checkpoint 為off
mot_config_file = '/opt/mogdb/data/data/mot.conf' enable_incremental_checkpoint = off |
重啟數據庫
gs_om -t restart
2)給用戶賦權,可以創建和訪問MOT
db_mogdb=> grant USAGE ON FOREIGN SERVER mot_server TO zkh; |
3)使用FOREIGN關鍵字創建MOT
create FOREIGN TABLE mot_tables_mysql ( schemaname character varying(150), tablename character varying(150), tableowner character varying(150), tablespace character varying(150), hasindexes character varying(150), hasrules character varying(150), hastriggers character varying(150), tablecreator character varying(150), created character varying(150), last_ddl_time character varying(150) ); |
4)測試主庫中創建的MOT表沒有同步到從庫
5)轉換磁盤表到內存表
#導出數據 gs_dump -Fc db_mogdb -a --table dump_tables_mysql -f dump_tables_mysql.dump -U zkh -W Zkh12345678 #原表修改名稱 alter table dump_tables_mysql rename to dump_tables_mysql_bak; #創建一模一樣的MOT表 create FOREIGN TABLE dump_tables_mysql ( schemaname character varying(150), tablename character varying(150), tableowner character varying(150), tablespace character varying(150), hasindexes character varying(150), hasrules character varying(150), hastriggers character varying(150), tablecreator character varying(150), created character varying(150), last_ddl_time character varying(150) ); #導入數據 gs_restore -C -d db_mogdb dump_tables_mysql.dump -U zkh -W Zkh12345678 |
4、數據閃回
閃回限制
官方中檔中針對于Ustore和Astore存儲引擎支持的閃回功能存在區別,Ustroe存儲引擎支持DML類的事務閃回,比如delete、update、insert;Astore只支持drop、truncate的閃回,其實主要是應用了回收站的功能,實際測試結果只有Ustore支持truncate和drop的閃回恢復,MVCC多版本查詢沒有測試通過;Astroe不支持閃回功能。
在Mogdb中默認創建的Astore的表,通過設置enable_default_ustore_table參數為on可以修改為默認創建Ustore的表,當然在創建表的時候可以指定storage_parameter參數選擇存儲引擎。
與閃回相關的參數
參數 | 含義 | 默認值 |
undo_zone_count | Undozone的數量,保證undo的并發性,文檔中描述是預留參數,當前版本未支持,僅Ustore使用 | 0 |
version_retention_age | 舊版本保留的事務數,文檔中描述是預留參數,當前版本未支持,僅Ustore使用 | 0 |
enable_recyclebin | 回收站 | Off |
recyclebin_retention_time | 回收站保留時間 | 900s |
undo_space_limit_size | Undo空間總大小 | 33554432*8k |
undo_limit_size_per_transaction | 單個事務使用的最大undo大小 | 4194304*8k |
打開回收站
gs_guc reload -N all -I all -c "enable_recyclebin=on"; |
測試閃回功能
1)Astore的drop閃回
#驗證是否開啟了回收站功能 db_mogdb=> show enable_recyclebin; enable_recyclebin ------------------- on (1 row) #誤刪除表 db_mogdb=> drop table test_flashback; #嘗試閃回 db_mogdb=> TIMECAPSULE table zkh.test_flashback to before drop ; ERROR: recycle object "test_flashback" desired does not exist #查看pg_catalog.gs_recyclebin 仍然沒記錄。 |
又一次踩坑,試一下Ustore的表
#創建Ustroe的表 CREATE TABLE ustore_flasback ( id character varying(2) NOT NULL, name character varying(50), saler numeric(10,2), dept_no character varying(2) ) WITH (STORAGE_TYPE=USTORE); ALTER TABLE ustore_flasback ADD CONSTRAINT ustore_flasback_pkey PRIMARY KEY (id); #刪除表 db_mogdb=> drop table ustore_flasback; DROP TABLE #閃回表 db_mogdb=> TIMECAPSULE table ustore_flasback to before drop ; TimeCapsule Table db_mogdb=> select * from ustore_flasback; id | name | saler | dept_no ----+------+-----------+--------- 2 | zs | 6000.00 | 10 3 | ls | 7000.00 | 10 4 | wemz | 8000.00 | 10 5 | lucy | 9000.00 | 10 6 | lili | 10000.00 | 10 7 | ww | 50000.00 | 10 8 | tq | 10000.00 | 10 1 | zkh | 100000.00 | 10 (8 rows) |
可見Ustore的成功閃回了。那就是Astore不支持閃回,難道文檔中標記有誤?
2)Ustore的truncate閃回
db_mogdb=> truncate table ustore_flasback; TRUNCATE TABLE db_mogdb=> TIMECAPSULE table ustore_flasback to before truncate; TimeCapsule Table db_mogdb=> select * from ustore_flasback; id | name | saler | dept_no ----+------+-----------+--------- 2 | zs | 6000.00 | 10 3 | ls | 7000.00 | 10 4 | wemz | 8000.00 | 10 5 | lucy | 9000.00 | 10 6 | lili | 10000.00 | 10 7 | ww | 50000.00 | 10 8 | tq | 10000.00 | 10 1 | zkh | 100000.00 | 10 (8 rows) |
閃回成功。
3)Ustore的誤操作多版本查詢
db_mogdb=> select sysdate; sysdate --------------------- 2022-08-17 15:25:07 (1 row) db_mogdb=> update ustore_flasback set saler=100000; UPDATE 8 db_mogdb=> select * from ustore_flasback; id | name | saler | dept_no ----+------+-----------+--------- 2 | zs | 100000.00 | 10 3 | ls | 100000.00 | 10 4 | wemz | 100000.00 | 10 5 | lucy | 100000.00 | 10 6 | lili | 100000.00 | 10 7 | ww | 100000.00 | 10 8 | tq | 100000.00 | 10 1 | zkh | 100000.00 | 10 (8 rows) db_mogdb=> SELECT * FROM ustore_flasback AS t TIMECAPSULE TIMESTAMP to_timestamp ('2022-08-17 15:25:07', 'YYYY-MM-DD HH24:MI:SS'); ERROR: cannot find the restore point |
竟然閃回失敗了。。。頭大,按理說沒有問題
因為好多與undo有關的參數都是預留參數,當前版本不支持,難道多版本查詢當前版本也不支持?
5、寫在最后
這次測試首先了解了MogDB的存儲引擎,目前MogDB中enable_default_ustore_table默認是off,這樣創建的表是都是基于Astore存儲引擎,個人理解按照功能而言其實Ustroe會更好一些,不知道后續版本是否會默認開啟enable_default_ustore_table這個參數,其次測試了MOT表,MOT表不支持主從環境,這樣從庫無法同步,如果主庫本地介質損壞,MOT數據雖然有檢查點,但是如果檢查點路徑在本地磁盤,數據也可能無法恢復。最后測試了閃回功能,當前版本基于mvcc的閃回沒有支持,期待后續能開放更多的功能,也可能是我的測試方法不對,還請大佬指正。




