當讀事務很長時,租戶進行轉儲會報 4138/ORA-01555 錯誤。本文介紹該錯誤的處理方法。
適用版本
OceanBase 數據庫 V2.X 及以后的版本
問題現象
當讀事務很長,租戶進行轉儲時會出現以下錯誤。
Oracle 租戶:
ORA-01555:snapshot too old
MySQL 租戶:
ERROR 4138 ( HY000 ): Request to read too old versioned data
對應錯誤碼,日志中會記錄以下信息,表示無法找到指定版本的歷史數據。
[2019-05-14 14:30:05.533606] WARN [STORAGE] get_inc_read_tables (ob_table_store.cpp:592) [98811][1313][YA4110AF40426-000588D011D3DED2] [lt=12] [dc=0] not table found for specified version((ret=-4138, major_sstable=0x7f9b8326a140, snapshot_version=1557815286383342, *this={this:0x7f9f4775f290, pkey:{tid:1110506744528557, partition_id:0, part_cnt:0}, table_id:1110506744528557, uptime:1557815401424782, table_count:2, start_pos:0, inc_pos:1, is_ready_for_read:true, replay_tables:[{table_type:1, pkey:{tid:1110506744528557, partition_id:0, part_cnt:0}, table_id:1110506744528557, trans_version_range:{multi_version_start:1557805624036243, base_version:0, snapshot_version:1557805624036243}, version:"41-0-0"}, {table_type:4, pkey:{tid:1110506744528557, partition_id:0, part_cnt:0}, table_id:1110506744528557, trans_version_range:{multi_version_start:1557815324038719, base_version:1557805624036243, snapshot_version:1557815324038719}, version:"0-0-0"}], [{i:0, type:1, partition_id:0, version:"41-0-0", version_range:{multi_version_start:1557805624036243, base_version:0, snapshot_version:1557805624036243}, ref:2}, {i:1, type:4, partition_id:0, version:"0-0-0", version_range:{multi_version_start:1557815324038719, base_version:1557805624036243, snapshot_version:1557815324038719}, ref:2}, ]}, *last_memtable={ObITable:{this:0x7f9ae6e669e0, key:{table_type:0, pkey:{tid:1110506744528557, partition_id:0, part_cnt:0}, table_id:1110506744528557, trans_version_range:{multi_version_start:1557815324038719, base_version:1557815324038719, snapshot_version:9223372036854775807}, version:"0-0-0"}, ref_cnt:2}, timestamp:1557815324045746, active_trx_count:0, state:0, max_schema_version:1557815227050056, write_ref_cnt:0, local_allocator:{ListHandle:{freeze_stat:1, id:62, clock:64975960024}, host:0x7fa2e58316f8, arena_handle:{allocated:376315264}}})
可能原因
OceanBase 數據庫轉儲的數據會保留多個版本的歷史數據行,您可以通過?undo_retention
?來控制轉儲中保留的多版本數據范圍。undo_retention 默認為 0(單位為秒),表示僅保留當前最新版本的數據。
這些多版本信息可以用來構造一致性讀以及用于一系列的閃回,如果閃回請求的時間點在開啟?undo_retention
?前,或者閃回請求的時間點距離現在的時間大于?undo_retention
?的設置,則會出現該問題。
有關?undo_retention
的詳細信息,參見《OceanBase 數據庫 參考指南》中的?系統變量?章節。
解決方式
可以通過調整?undo_retention
?的值來緩解該問題。
obclient> SET GLOBAL undo_retention=7200;
該配置表示開啟多版本轉儲,并且轉儲文件保留 7200 秒以內的多版本行數據,這部分數據會在多次轉儲中保留。
注意
租戶開啟多版本轉儲后,大版本合并會保留對應增量轉儲文件,但 major SSTable 中不會存放多版本數據。避免對該參數設置過大,該參數過大時可能導致合并超時。
注意事項
多版本查詢的生效時間在設置?undo_retention
?后,并不能立刻實現多版本回溯到?undo_retention
?之內的任何時間。例如在時間點 T1 設置了?undo_retention=900s
,此時并不能回溯任何 900s 內的版本;需要等到時間點 T2 = T1 + 900s 后,才可以查詢 T1~T2 的數據。這是由于多版本數據需要時間來填充。