diff --git a/src/rootserver/backup/ob_backup_data_scheduler.cpp b/src/rootserver/backup/ob_backup_data_scheduler.cpp index 01a76c6c4..6a54055e0 100644 --- a/src/rootserver/backup/ob_backup_data_scheduler.cpp +++ b/src/rootserver/backup/ob_backup_data_scheduler.cpp @@ -670,22 +670,7 @@ int ObBackupDataScheduler::get_backup_scn( if (OB_FAIL(trans.end(true))) { LOG_WARN("failed to commit", K(ret)); } else { - if (!is_start) { - // The conversion accuracy of SCN to time_stamp is inconsistent under MySQL mode and Oracle mode. - // The conversion accuracy in ORALCE mode is nanosecond, but it is microsecond in mysql - // for backup and restore, we keep the end scn round up to microseconds that keep the conversion accuracy is consistent. - // meanwhile, in order to solve that boundary is not included in the restore, scn + 1; - // 1658475549197665190 --> 1658475549197666000 - int64_t ts = 0; - ts = tmp_scn.convert_to_ts(); - if (OB_FAIL(scn.convert_from_ts(ts))) { - LOG_WARN("fail to convert from ts", K(ret), K(ts)); - } else if (tmp_scn != scn && OB_FAIL(scn.convert_from_ts(ts + 1))) { - LOG_WARN("fail to convert from ts", K(ret), K(ts)); - } - } else { - scn = tmp_scn; - } + scn = tmp_scn; } } else { int tmp_ret = OB_SUCCESS; diff --git a/src/rootserver/backup/ob_backup_data_set_task_mgr.cpp b/src/rootserver/backup/ob_backup_data_set_task_mgr.cpp index a789e034e..2d7886cf6 100644 --- a/src/rootserver/backup/ob_backup_data_set_task_mgr.cpp +++ b/src/rootserver/backup/ob_backup_data_set_task_mgr.cpp @@ -1904,7 +1904,6 @@ int ObBackupSetTaskMgr::write_extern_locality_info_(ObExternTenantLocalityInfoDe int ret = OB_SUCCESS; ObSchemaGetterGuard schema_guard; const ObTenantSchema *tenant_info = NULL; - const ObSysVarSchema *var_schema = nullptr; if (OB_FAIL(schema_service_->get_tenant_schema_guard(job_attr_->tenant_id_, schema_guard))) { LOG_WARN("[DATA_BACKUP]failed to get_tenant_schema_guard", KR(ret), "tenant_id", job_attr_->tenant_id_); } else if (OB_FAIL(schema_guard.get_tenant_info(job_attr_->tenant_id_, tenant_info))) { @@ -1917,10 +1916,10 @@ int ObBackupSetTaskMgr::write_extern_locality_info_(ObExternTenantLocalityInfoDe LOG_WARN("[DATA_BACKUP]failed to assign primary zone", K(ret), K(tenant_info)); } else if (OB_FAIL(locality_info.cluster_name_.assign(GCONF.cluster))) { LOG_WARN("fail to assign cluster name", K(ret)); - } else if (OB_FAIL(schema_guard.get_tenant_system_variable(job_attr_->tenant_id_, share::SYS_VAR_SYSTEM_TIME_ZONE, var_schema))) { - LOG_WARN("fail to get tenant system variable", K(ret)); - } else if (OB_FAIL(locality_info.sys_time_zone_.assign(var_schema->get_value()))) { - LOG_WARN("fail to assign time zone", K(ret), KPC(var_schema)); + } else if (OB_FAIL(ObBackupUtils::get_tenant_sys_time_zone_wrap(set_task_attr_.tenant_id_, + locality_info.sys_time_zone_, + locality_info.sys_time_zone_wrap_))) { + LOG_WARN("failed to get tenant sys time zone wrap", K(ret)); } else { locality_info.tenant_id_ = job_attr_->tenant_id_; locality_info.backup_set_id_ = job_attr_->backup_set_id_; @@ -1946,9 +1945,10 @@ int ObBackupSetTaskMgr::write_extern_diagnose_info_( } else { HEAP_VAR(ObExternTenantDiagnoseInfoDesc, diagnose_info) { diagnose_info.tenant_id_ = job_attr_->tenant_id_; - diagnose_info.tenant_locality_info_ = locality_info; diagnose_info.backup_set_file_ = backup_set_info.backup_set_file_; - if (OB_FAIL(store_.write_tenant_diagnose_info(diagnose_info))) { + if (OB_FAIL(diagnose_info.tenant_locality_info_.assign(locality_info))) { + LOG_WARN("failed to assign", K(ret), K(locality_info)); + } else if (OB_FAIL(store_.write_tenant_diagnose_info(diagnose_info))) { LOG_WARN("[DATA_BACKUP]failed to write teannt diagnose info", K(ret), K(diagnose_info)); } } diff --git a/src/rootserver/backup/ob_tenant_archive_scheduler.cpp b/src/rootserver/backup/ob_tenant_archive_scheduler.cpp index 072326789..10d74fb5e 100644 --- a/src/rootserver/backup/ob_tenant_archive_scheduler.cpp +++ b/src/rootserver/backup/ob_tenant_archive_scheduler.cpp @@ -181,9 +181,6 @@ static int record_piece_info(const ObDestRoundCheckpointer::GeneratedPiece &piec single_ls_desc.round_id_, single_ls_desc.piece_id_, single_ls_desc.ls_id_, single_ls_desc.filelist_))) { LOG_WARN("failed to get archive file list", K(ret), K(single_ls_desc)); - } else if (single_ls_desc.filelist_.empty()) { - ret = OB_ENTRY_NOT_EXIST; - LOG_WARN("no archive file exist", K(ret), K(single_ls_desc)); } else if (OB_FALSE_IT(std::sort(single_ls_desc.filelist_.begin(), single_ls_desc.filelist_.end()))) { } else if (OB_FAIL(piece_info_desc.filelist_.push_back(single_ls_desc))) { LOG_WARN("failed to push backup single_ls_desc", K(ret), K(single_ls_desc), K(piece_info_desc)); diff --git a/src/share/backup/ob_backup_data_table_operator.cpp b/src/share/backup/ob_backup_data_table_operator.cpp index b507a0906..79d42e148 100755 --- a/src/share/backup/ob_backup_data_table_operator.cpp +++ b/src/share/backup/ob_backup_data_table_operator.cpp @@ -69,9 +69,18 @@ int ObBackupSetFileOperator::fill_dml_with_backup_set_(const ObBackupSetFileDesc tenant_version_display, OB_INNER_TABLE_BACKUP_TASK_CLUSTER_FORMAT_LENGTH, backup_set_desc.tenant_compatible_); const int64_t pos1 = ObClusterVersion::get_instance().print_version_str( cluster_version_display, OB_INNER_TABLE_BACKUP_TASK_CLUSTER_FORMAT_LENGTH, backup_set_desc.cluster_version_); - const char *comment = OB_SUCCESS == backup_set_desc.result_ ? "" : common::ob_strerror(backup_set_desc.result_); - if (OB_FAIL(dml.add_pk_column(OB_STR_BACKUP_SET_ID, backup_set_desc.backup_set_id_))) { + char min_restore_scn_display[OB_INNER_TABLE_BACKUP_TASK_CLUSTER_FORMAT_LENGTH] = ""; + if (backup_set_desc.min_restore_scn_.is_valid_and_not_min()) { + if (OB_FAIL(ObBackupUtils::backup_scn_to_str(backup_set_desc.tenant_id_, + backup_set_desc.min_restore_scn_, + min_restore_scn_display, + OB_INNER_TABLE_BACKUP_TASK_CLUSTER_FORMAT_LENGTH))) { + LOG_WARN("failed to backup scn to str", K(ret), K(backup_set_desc)); + } + } + + if (FAILEDx(dml.add_pk_column(OB_STR_BACKUP_SET_ID, backup_set_desc.backup_set_id_))) { LOG_WARN("[DATA_BACKUP]failed to add column", K(ret)); } else if (OB_FAIL(dml.add_pk_column(OB_STR_TENANT_ID, backup_set_desc.tenant_id_))) { LOG_WARN("[DATA_BACKUP]failed to add column", K(ret)); @@ -139,6 +148,8 @@ int ObBackupSetFileOperator::fill_dml_with_backup_set_(const ObBackupSetFileDesc LOG_WARN("[DATA_BACKUP]failed to add column", K(ret)); } else if (OB_FAIL(dml.add_column(OB_STR_CONSISTENT_SCN, backup_set_desc.consistent_scn_.get_val_for_inner_table_field()))) { LOG_WARN("[DATA_BACKUP]failed to add column", K(ret)); + } else if (OB_FAIL(dml.add_column(OB_STR_MIN_RESTORE_SCN_DISPLAY, min_restore_scn_display))) { + LOG_WARN("[DATA_BACKUP]failed to add column", K(ret)); } return ret; } diff --git a/src/share/backup/ob_backup_struct.cpp b/src/share/backup/ob_backup_struct.cpp index aa4343dbd..d147d9bba 100755 --- a/src/share/backup/ob_backup_struct.cpp +++ b/src/share/backup/ob_backup_struct.cpp @@ -24,6 +24,7 @@ #include "storage/tx/ob_i_ts_source.h" #include "storage/backup/ob_backup_data_store.h" #include "share/backup/ob_archive_struct.h" +#include "observer/omt/ob_tenant_timezone_mgr.h" #include "storage/tx/ob_ts_mgr.h" @@ -2201,6 +2202,57 @@ int ObBackupUtils::get_backup_scn(const uint64_t &tenant_id, share::SCN &scn) return ret; } +int ObBackupUtils::backup_scn_to_str(const uint64_t tenant_id, const share::SCN &scn, char *buf, int64_t buf_len) +{ + int ret = OB_SUCCESS; + ObTimeZoneInfoWrap time_zone_info_wrap; + ObFixedLengthString time_zone; + int64_t pos = 0; + if (OB_FAIL(ObBackupUtils::get_tenant_sys_time_zone_wrap(tenant_id, time_zone, time_zone_info_wrap))) { + LOG_WARN("failed to get tenant sys time zone wrap", K(tenant_id)); + } else if (OB_FAIL(ObTimeConverter::scn_to_str(scn.get_val_for_inner_table_field(), + time_zone_info_wrap.is_position_class() ? + &time_zone_info_wrap.get_tz_info_pos() : time_zone_info_wrap.get_time_zone_info(), + buf, + buf_len, + pos))) { + LOG_WARN("failed to scn to str", K(ret)); + } + return ret; +} + +int ObBackupUtils::get_tenant_sys_time_zone_wrap( + const uint64_t tenant_id, + ObFixedLengthString &time_zone, + ObTimeZoneInfoWrap &time_zone_info_wrap) +{ + int ret = OB_SUCCESS; + ObMultiVersionSchemaService *schema_service = nullptr; + ObSchemaGetterGuard schema_guard; + ObTZMapWrap tz_map_wrap; + const ObSysVarSchema *var_schema = nullptr; + ObTimeZoneInfoManager *tz_info_mgr = nullptr; + if (OB_ISNULL(schema_service = GCTX.schema_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema service must not be null", K(ret)); + } else if (OB_FAIL(schema_service->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("failed to get_tenant_schema_guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(schema_guard.get_tenant_system_variable(tenant_id, share::SYS_VAR_SYSTEM_TIME_ZONE, var_schema))) { + LOG_WARN("fail to get tenant system variable", K(ret)); + } else if (OB_ISNULL(var_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("var schema must not be null", K(ret)); + } else if (OB_FAIL(OTTZ_MGR.get_tenant_timezone(tenant_id, tz_map_wrap, tz_info_mgr))) { + LOG_WARN("failed to get tenant timezone", K(ret)); + } else if (OB_FAIL(time_zone.assign(var_schema->get_value()))) { + LOG_WARN("failed to assign timezone", K(ret)); + } else if (OB_FAIL(time_zone_info_wrap.init_time_zone(var_schema->get_value(), OB_INVALID_VERSION, + *(const_cast(tz_map_wrap.get_tz_map()))))) { + LOG_WARN("failed to init time zone", K(ret)); + } + return ret; +} + int ObBackupUtils::convert_timestamp_to_timestr(const int64_t ts, char *buf, int64_t len) { int ret = OB_SUCCESS; diff --git a/src/share/backup/ob_backup_struct.h b/src/share/backup/ob_backup_struct.h index 055d274b9..8cb63f328 100755 --- a/src/share/backup/ob_backup_struct.h +++ b/src/share/backup/ob_backup_struct.h @@ -412,6 +412,7 @@ const char *const OB_STR_BACKUP_DATA_VERSION = "backup_data_version"; const char *const OB_STR_CLUSTER_VERSION = "cluster_version"; const char *const OB_BACKUP_SUFFIX=".obbak"; const char *const OB_ARCHIVE_SUFFIX=".obarc"; +const char *const OB_STR_MIN_RESTORE_SCN_DISPLAY = "min_restore_scn_display"; enum ObBackupFileType { @@ -1023,6 +1024,10 @@ public: static int get_backup_scn(const uint64_t &tenant_id, share::SCN &scn); static int check_tenant_data_version_match(const uint64_t tenant_id, const uint64_t data_version); static int get_full_replica_num(const uint64_t tenant_id, int64_t &replica_num); + static int backup_scn_to_str(const uint64_t tenant_id, const share::SCN &scn, char *buf, int64_t buf_len); + static int get_tenant_sys_time_zone_wrap(const uint64_t tenant_id, + ObFixedLengthString &time_zone, + ObTimeZoneInfoWrap &time_zone_info_wrap); private: static const int64_t RETRY_INTERVAL = 10 * 1000 * 1000; static const int64_t MAX_RETRY_TIMES = 3; diff --git a/src/share/inner_table/ob_inner_table_schema.12251_12300.cpp b/src/share/inner_table/ob_inner_table_schema.12251_12300.cpp index 81f18e295..fb32cebbd 100644 --- a/src/share/inner_table/ob_inner_table_schema.12251_12300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12251_12300.cpp @@ -11989,6 +11989,25 @@ int ObInnerTableSchema::all_virtual_backup_set_files_schema(ObTableSchema &table major_turn_id_default, major_turn_id_default); //default_value } + + if (OB_SUCC(ret)) { + ObObj min_restore_scn_display_default; + min_restore_scn_display_default.set_varchar(ObString::make_string("")); + ADD_COLUMN_SCHEMA_T("min_restore_scn_display", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_INNER_TABLE_DEFAULT_VALUE_LENTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + min_restore_scn_display_default, + min_restore_scn_display_default); //default_value + } table_schema.set_index_using_type(USING_BTREE); table_schema.set_row_store_type(ENCODING_ROW_STORE); table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); diff --git a/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp b/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp index 3557ba5e5..a7ffeb0d1 100644 --- a/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp @@ -11997,6 +11997,21 @@ int ObInnerTableSchema::all_virtual_backup_set_files_ora_schema(ObTableSchema &t false, //is_nullable false); //is_autoincrement } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MIN_RESTORE_SCN_DISPLAY", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_INNER_TABLE_DEFAULT_VALUE_LENTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } table_schema.set_index_using_type(USING_BTREE); table_schema.set_row_store_type(ENCODING_ROW_STORE); table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); diff --git a/src/share/inner_table/ob_inner_table_schema.21101_21150.cpp b/src/share/inner_table/ob_inner_table_schema.21101_21150.cpp index 89c3e0a96..3d1a54599 100644 --- a/src/share/inner_table/ob_inner_table_schema.21101_21150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21101_21150.cpp @@ -660,7 +660,7 @@ int ObInnerTableSchema::cdb_ob_backup_set_files_schema(ObTableSchema &table_sche table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, BACKUP_SET_ID, DEST_ID, INCARNATION, BACKUP_TYPE, PREV_FULL_BACKUP_SET_ID, PREV_INC_BACKUP_SET_ID, USEC_TO_TIME(START_TS) AS START_TIMESTAMP, CASE WHEN END_TS = 0 THEN NULL ELSE USEC_TO_TIME(END_TS) END AS END_TIMESTAMP, STATUS, FILE_STATUS, CASE WHEN END_TS = 0 THEN 0 ELSE ROUND((END_TS - START_TS)/1000/1000,0) END AS ELAPSED_SECONDES, PLUS_ARCHIVELOG, START_REPLAY_SCN, CASE WHEN START_REPLAY_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(START_REPLAY_SCN) END AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE WHEN MIN_RESTORE_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE WHEN END_TS = 0 THEN 0 ELSE OUTPUT_BYTES / ((END_TS - START_TS)/1000/1000) END AS OUTPUT_RATE_BYTES, EXTRA_BYTES AS EXTRA_META_BYTES, TABLET_COUNT, FINISH_TABLET_COUNT, MACRO_BLOCK_COUNT, FINISH_MACRO_BLOCK_COUNT, FILE_COUNT, META_TURN_ID, DATA_TURN_ID, RESULT, COMMENT, ENCRYPTION_MODE, PASSWD, TENANT_COMPATIBLE, BACKUP_COMPATIBLE, PATH, CLUSTER_VERSION, CONSISTENT_SCN, MINOR_TURN_ID, MAJOR_TURN_ID FROM OCEANBASE.__ALL_VIRTUAL_BACKUP_SET_FILES )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, BACKUP_SET_ID, DEST_ID, INCARNATION, BACKUP_TYPE, PREV_FULL_BACKUP_SET_ID, PREV_INC_BACKUP_SET_ID, USEC_TO_TIME(START_TS) AS START_TIMESTAMP, CASE WHEN END_TS = 0 THEN NULL ELSE USEC_TO_TIME(END_TS) END AS END_TIMESTAMP, STATUS, FILE_STATUS, CASE WHEN END_TS = 0 THEN 0 ELSE ROUND((END_TS - START_TS)/1000/1000,0) END AS ELAPSED_SECONDES, PLUS_ARCHIVELOG, START_REPLAY_SCN, CASE WHEN START_REPLAY_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(START_REPLAY_SCN) END AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE WHEN MIN_RESTORE_SCN_DISPLAY != '' THEN MIN_RESTORE_SCN_DISPLAY WHEN MIN_RESTORE_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE WHEN END_TS = 0 THEN 0 ELSE OUTPUT_BYTES / ((END_TS - START_TS)/1000/1000) END AS OUTPUT_RATE_BYTES, EXTRA_BYTES AS EXTRA_META_BYTES, TABLET_COUNT, FINISH_TABLET_COUNT, MACRO_BLOCK_COUNT, FINISH_MACRO_BLOCK_COUNT, FILE_COUNT, META_TURN_ID, DATA_TURN_ID, RESULT, COMMENT, ENCRYPTION_MODE, PASSWD, TENANT_COMPATIBLE, BACKUP_COMPATIBLE, PATH, CLUSTER_VERSION, CONSISTENT_SCN, MINOR_TURN_ID, MAJOR_TURN_ID FROM OCEANBASE.__ALL_VIRTUAL_BACKUP_SET_FILES )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp b/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp index b7af96093..3d8a85f76 100644 --- a/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp @@ -760,7 +760,7 @@ int ObInnerTableSchema::dba_ob_backup_set_files_schema(ObTableSchema &table_sche table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT BACKUP_SET_ID, DEST_ID, INCARNATION, BACKUP_TYPE, PREV_FULL_BACKUP_SET_ID, PREV_INC_BACKUP_SET_ID, USEC_TO_TIME(START_TS) AS START_TIMESTAMP, CASE WHEN END_TS = 0 THEN NULL ELSE USEC_TO_TIME(END_TS) END AS END_TIMESTAMP, STATUS, FILE_STATUS, CASE WHEN END_TS = 0 THEN 0 ELSE ROUND((END_TS - START_TS)/1000/1000,0) END AS ELAPSED_SECONDES, PLUS_ARCHIVELOG, START_REPLAY_SCN, CASE WHEN START_REPLAY_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(START_REPLAY_SCN) END AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE WHEN MIN_RESTORE_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE WHEN END_TS = 0 THEN 0 ELSE OUTPUT_BYTES / ((END_TS - START_TS)/1000/1000) END AS OUTPUT_RATE_BYTES, EXTRA_BYTES AS EXTRA_META_BYTES, TABLET_COUNT, FINISH_TABLET_COUNT, MACRO_BLOCK_COUNT, FINISH_MACRO_BLOCK_COUNT, FILE_COUNT, META_TURN_ID, DATA_TURN_ID, RESULT, COMMENT, ENCRYPTION_MODE, PASSWD, TENANT_COMPATIBLE, BACKUP_COMPATIBLE, PATH, CLUSTER_VERSION, CONSISTENT_SCN, MINOR_TURN_ID, MAJOR_TURN_ID FROM OCEANBASE.__ALL_VIRTUAL_BACKUP_SET_FILES WHERE TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT BACKUP_SET_ID, DEST_ID, INCARNATION, BACKUP_TYPE, PREV_FULL_BACKUP_SET_ID, PREV_INC_BACKUP_SET_ID, USEC_TO_TIME(START_TS) AS START_TIMESTAMP, CASE WHEN END_TS = 0 THEN NULL ELSE USEC_TO_TIME(END_TS) END AS END_TIMESTAMP, STATUS, FILE_STATUS, CASE WHEN END_TS = 0 THEN 0 ELSE ROUND((END_TS - START_TS)/1000/1000,0) END AS ELAPSED_SECONDES, PLUS_ARCHIVELOG, START_REPLAY_SCN, CASE WHEN START_REPLAY_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(START_REPLAY_SCN) END AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE WHEN MIN_RESTORE_SCN_DISPLAY != '' THEN MIN_RESTORE_SCN_DISPLAY WHEN MIN_RESTORE_SCN = 0 THEN NULL ELSE SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE WHEN END_TS = 0 THEN 0 ELSE OUTPUT_BYTES / ((END_TS - START_TS)/1000/1000) END AS OUTPUT_RATE_BYTES, EXTRA_BYTES AS EXTRA_META_BYTES, TABLET_COUNT, FINISH_TABLET_COUNT, MACRO_BLOCK_COUNT, FINISH_MACRO_BLOCK_COUNT, FILE_COUNT, META_TURN_ID, DATA_TURN_ID, RESULT, COMMENT, ENCRYPTION_MODE, PASSWD, TENANT_COMPATIBLE, BACKUP_COMPATIBLE, PATH, CLUSTER_VERSION, CONSISTENT_SCN, MINOR_TURN_ID, MAJOR_TURN_ID FROM OCEANBASE.__ALL_VIRTUAL_BACKUP_SET_FILES WHERE TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.25151_25200.cpp b/src/share/inner_table/ob_inner_table_schema.25151_25200.cpp index 74f6e31e7..b017cad17 100644 --- a/src/share/inner_table/ob_inner_table_schema.25151_25200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25151_25200.cpp @@ -1560,7 +1560,7 @@ int ObInnerTableSchema::dba_ob_backup_set_files_ora_schema(ObTableSchema &table_ table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT BACKUP_SET_ID, DEST_ID, INCARNATION, BACKUP_TYPE, PREV_FULL_BACKUP_SET_ID, PREV_INC_BACKUP_SET_ID, TO_CHAR(START_TS / (1000 * 60 * 60 * 24 * 1000) + TO_DATE('1970-01-01 08:00:00', 'yyyy-mm-dd hh:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') AS START_TIMESTAMP, CASE WHEN END_TS = 0 THEN NULL ELSE TO_CHAR(END_TS / (1000 * 60 * 60 * 24 * 1000) + TO_DATE('1970-01-01 08:00:00', 'yyyy-mm-dd hh:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') END AS END_TIMESTAMP, STATUS, FILE_STATUS, CASE WHEN END_TS = 0 THEN 0 ELSE ROUND((END_TS - START_TS)/1000/1000,0) END AS ELAPSED_SECONDES, PLUS_ARCHIVELOG, START_REPLAY_SCN, SCN_TO_TIMESTAMP(START_REPLAY_SCN) AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE WHEN END_TS = 0 THEN 0 ELSE OUTPUT_BYTES / ((END_TS - START_TS)/1000/1000) END AS OUTPUT_RATE_BYTES, EXTRA_BYTES AS EXTRA_META_BYTES, TABLET_COUNT, FINISH_TABLET_COUNT, MACRO_BLOCK_COUNT, FINISH_MACRO_BLOCK_COUNT, FILE_COUNT, META_TURN_ID, DATA_TURN_ID, RESULT, "COMMENT", ENCRYPTION_MODE, PASSWD, TENANT_COMPATIBLE, BACKUP_COMPATIBLE, PATH, CLUSTER_VERSION, CONSISTENT_SCN, MINOR_TURN_ID, MAJOR_TURN_ID FROM SYS.ALL_VIRTUAL_BACKUP_SET_FILES WHERE TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT BACKUP_SET_ID, DEST_ID, INCARNATION, BACKUP_TYPE, PREV_FULL_BACKUP_SET_ID, PREV_INC_BACKUP_SET_ID, TO_CHAR(START_TS / (1000 * 60 * 60 * 24 * 1000) + TO_DATE('1970-01-01 08:00:00', 'yyyy-mm-dd hh:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') AS START_TIMESTAMP, CASE WHEN END_TS = 0 THEN NULL ELSE TO_CHAR(END_TS / (1000 * 60 * 60 * 24 * 1000) + TO_DATE('1970-01-01 08:00:00', 'yyyy-mm-dd hh:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') END AS END_TIMESTAMP, STATUS, FILE_STATUS, CASE WHEN END_TS = 0 THEN 0 ELSE ROUND((END_TS - START_TS)/1000/1000,0) END AS ELAPSED_SECONDES, PLUS_ARCHIVELOG, START_REPLAY_SCN, SCN_TO_TIMESTAMP(START_REPLAY_SCN) AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE WHEN MIN_RESTORE_SCN_DISPLAY != '' THEN MIN_RESTORE_SCN_DISPLAY WHEN MIN_RESTORE_SCN = 0 THEN NULL ELSE TO_CHAR(SCN_TO_TIMESTAMP(MIN_RESTORE_SCN),'YYYY-MM-DDHH24:MI:SS.FF9') END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE WHEN END_TS = 0 THEN 0 ELSE OUTPUT_BYTES / ((END_TS - START_TS)/1000/1000) END AS OUTPUT_RATE_BYTES, EXTRA_BYTES AS EXTRA_META_BYTES, TABLET_COUNT, FINISH_TABLET_COUNT, MACRO_BLOCK_COUNT, FINISH_MACRO_BLOCK_COUNT, FILE_COUNT, META_TURN_ID, DATA_TURN_ID, RESULT, "COMMENT", ENCRYPTION_MODE, PASSWD, TENANT_COMPATIBLE, BACKUP_COMPATIBLE, PATH, CLUSTER_VERSION, CONSISTENT_SCN, MINOR_TURN_ID, MAJOR_TURN_ID FROM SYS.ALL_VIRTUAL_BACKUP_SET_FILES WHERE TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.301_350.cpp b/src/share/inner_table/ob_inner_table_schema.301_350.cpp index 7822f0356..de5c6a7ec 100644 --- a/src/share/inner_table/ob_inner_table_schema.301_350.cpp +++ b/src/share/inner_table/ob_inner_table_schema.301_350.cpp @@ -1725,6 +1725,25 @@ int ObInnerTableSchema::all_backup_set_files_schema(ObTableSchema &table_schema) major_turn_id_default, major_turn_id_default); //default_value } + + if (OB_SUCC(ret)) { + ObObj min_restore_scn_display_default; + min_restore_scn_display_default.set_varchar(ObString::make_string("")); + ADD_COLUMN_SCHEMA_T("min_restore_scn_display", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_INNER_TABLE_DEFAULT_VALUE_LENTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + min_restore_scn_display_default, + min_restore_scn_display_default); //default_value + } table_schema.set_index_using_type(USING_BTREE); table_schema.set_row_store_type(ENCODING_ROW_STORE); table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 670c90181..19a0f1df1 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -2864,6 +2864,7 @@ all_backup_set_files_def = dict( ('consistent_scn', 'uint', 'false', '0'), ('minor_turn_id', 'int', 'false', '0'), ('major_turn_id', 'int', 'false', '0'), + ('min_restore_scn_display', 'varchar:OB_INNER_TABLE_DEFAULT_VALUE_LENTH', 'false', ''), ], ) def_table_schema(**all_backup_set_files_def) @@ -15847,11 +15848,13 @@ def_table_schema( END AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE - WHEN MIN_RESTORE_SCN = 0 - THEN NULL - ELSE - SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) - END AS MIN_RESTORE_SCN_DISPLAY, + WHEN MIN_RESTORE_SCN_DISPLAY != '' + THEN MIN_RESTORE_SCN_DISPLAY + WHEN MIN_RESTORE_SCN = 0 + THEN NULL + ELSE + SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) + END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE @@ -22378,11 +22381,13 @@ def_table_schema( END AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, CASE - WHEN MIN_RESTORE_SCN = 0 - THEN NULL - ELSE - SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) - END AS MIN_RESTORE_SCN_DISPLAY, + WHEN MIN_RESTORE_SCN_DISPLAY != '' + THEN MIN_RESTORE_SCN_DISPLAY + WHEN MIN_RESTORE_SCN = 0 + THEN NULL + ELSE + SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) + END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE @@ -42965,7 +42970,14 @@ def_table_schema( START_REPLAY_SCN, SCN_TO_TIMESTAMP(START_REPLAY_SCN) AS START_REPLAY_SCN_DISPLAY, MIN_RESTORE_SCN, - SCN_TO_TIMESTAMP(MIN_RESTORE_SCN) AS MIN_RESTORE_SCN_DISPLAY, + CASE + WHEN MIN_RESTORE_SCN_DISPLAY != '' + THEN MIN_RESTORE_SCN_DISPLAY + WHEN MIN_RESTORE_SCN = 0 + THEN NULL + ELSE + TO_CHAR(SCN_TO_TIMESTAMP(MIN_RESTORE_SCN),'YYYY-MM-DDHH24:MI:SS.FF9') + END AS MIN_RESTORE_SCN_DISPLAY, INPUT_BYTES, OUTPUT_BYTES, CASE diff --git a/src/storage/backup/ob_backup_data_store.cpp b/src/storage/backup/ob_backup_data_store.cpp index 1b118ffc1..936436e32 100755 --- a/src/storage/backup/ob_backup_data_store.cpp +++ b/src/storage/backup/ob_backup_data_store.cpp @@ -88,8 +88,26 @@ bool ObExternTenantLocalityInfoDesc::is_valid() const && !tenant_name_.is_empty() && !cluster_name_.is_empty() && !locality_.is_empty() - && !primary_zone_.is_empty() - && !sys_time_zone_.is_empty(); + && !primary_zone_.is_empty(); +} + +int ObExternTenantLocalityInfoDesc::assign(const ObExternTenantLocalityInfoDesc &that) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(sys_time_zone_wrap_.deep_copy(that.sys_time_zone_wrap_))) { + LOG_WARN("failed to deep copy", K(ret)); + } else { + tenant_id_ = that.tenant_id_; + backup_set_id_ = that.backup_set_id_; + cluster_id_ = that.cluster_id_; + compat_mode_ = that.compat_mode_; + tenant_name_ = that.tenant_name_; + cluster_name_ = that.cluster_name_; + locality_ = that.locality_; + primary_zone_ = that.primary_zone_; + sys_time_zone_ = that.sys_time_zone_; + } + return ret; } /* diff --git a/src/storage/backup/ob_backup_data_store.h b/src/storage/backup/ob_backup_data_store.h index 486cf4b07..9bd327ce0 100755 --- a/src/storage/backup/ob_backup_data_store.h +++ b/src/storage/backup/ob_backup_data_store.h @@ -140,12 +140,14 @@ public: cluster_name_(), locality_(), primary_zone_(), - sys_time_zone_() {} + sys_time_zone_(), + sys_time_zone_wrap_() {} virtual ~ObExternTenantLocalityInfoDesc() {} - + int assign(const ObExternTenantLocalityInfoDesc &that); bool is_valid() const override; INHERIT_TO_STRING_KV("ObExternBackupDataDesc", ObExternBackupDataDesc, K_(tenant_id), K_(backup_set_id), K_(cluster_id), - K_(compat_mode), K_(tenant_name), K_(cluster_name), K_(locality), K_(primary_zone), K_(sys_time_zone)); + K_(compat_mode), K_(tenant_name), K_(cluster_name), K_(locality), K_(primary_zone), K_(sys_time_zone), + K_(sys_time_zone_wrap)); public: uint64_t tenant_id_; int64_t backup_set_id_; @@ -156,6 +158,7 @@ public: Locality locality_; PrimaryZone primary_zone_; TimeZone sys_time_zone_; + ObTimeZoneInfoWrap sys_time_zone_wrap_; }; struct ObExternBackupSetInfoDesc final : public ObExternBackupDataDesc