0% found this document useful (0 votes)
194 views

HANA Backups BackupRuns

This SQL command provides backup run information from SAP HANA. It summarizes data from the M_BACKUP_CATALOG and M_BACKUP_CATALOG_FILES tables, including details like backup start time, host, service name, backup type, status, runtime and size. The command can be filtered and aggregated in different ways and provides output parameters to display the summarized backup details.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
194 views

HANA Backups BackupRuns

This SQL command provides backup run information from SAP HANA. It summarizes data from the M_BACKUP_CATALOG and M_BACKUP_CATALOG_FILES tables, including details like backup start time, host, service name, backup type, status, runtime and size. The command can be filtered and aggregated in different ways and provides output parameters to display the summarized backup details.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 8

SELECT

/*

[NAME]

- HANA_Backups_BackupRuns

[DESCRIPTION]

- Backup run information

[SOURCE]

- SAP Note 1969700

[DETAILS AND RESTRICTIONS]

- SERVICE_NAME instead of PORT needs to be used as M_BACKUP_CATALOG_FILES does not


contain PORT and a resolution via
M_SERVICES is not generally possible, because historic host names can deviate.
- NO_JOIN_REMOVAL hint required as workaround for bug 110097 (Rev. 112.02,
"Execution flow must not reach here", "scalar subquery is not allowed")

[VALID FOR]

- Revisions: all
- Statistics server type: all

[SQL COMMAND VERSION]

- 2014/03/31: 1.0 (initial version)


- 2014/05/28: 1.1 (MESSAGE and aggregation included)
- 2014/09/29: 1.2 (HOST, PORT and additional aggregation included)
- 2014/11/27: 1.3 (backup write throughput MB_PER_S included)
- 2015/04/18: 1.4 (DATA_BACKUP and BACKUP_ID included)
- 2015/07/08: 1.5 (FULL_LOG_PCT included)
- 2016/12/31: 1.6 (TIME_AGGREGATE_BY = 'TS<seconds>' included)
- 2017/02/21: 1.7 (truncation of message in case of "Not all data could be
written")
- 2017/10/23: 1.8 (TIMEZONE included)

[INVOLVED TABLES]

- M_BACKUP_CATALOG
- M_BACKUP_CATALOG_FILES

[INPUT PARAMETERS]

- BEGIN_TIME

Begin time

TO_TIMESTAMP('2014/06/05 14:05:00', 'YYYY/MM/DD HH24:MI:SS') --> Set begin time


to 5th of June 2014, 14:05
ADD_DAYS(CURRENT_TIMESTAMP, -2) --> Set begin time
to two days before current time

- END_TIME
End time

TO_TIMESTAMP('2014/06/08 14:05:00', 'YYYY/MM/DD HH24:MI:SS') --> Set end time to


8th of June 2014, 14:05
CURRENT_TIMESTAMP --> Set end time to
current time

- TIMEZONE

Used timezone (both for input and output parameters)

'SERVER' --> Display times in SAP HANA server time


'UTC' --> Display times in UTC time

- HOST

Host name

'saphana01' --> Specific host saphana01


'saphana%' --> All hosts starting with saphana
'%' --> All hosts

- SERVICE_NAME

Service name

'indexserver' --> Show information for indexserver


'%' --> No restriction to service names

- BACKUP_TYPE

Type of backup

'log backup' --> Log backup


'complete data backup' --> Normal data backup
'DATA_BACKUP' --> All types of data backup ( 'complete data backup',
'data snapshot' )
'%' --> No backup type restriction

- BACKUP_DATA_TYPE

Type of data backed up

'VOLUME' --> Normal data (data or log)


'CATALOG' --> Catalog data (provided by nameserver as part of any
backup)
'TOPOLOGY' --> Topology information (provided by nameserver as part
of data backups)

- BACKUP_STATUS

Status of backup

'successful' --> Successful backups


'failed' --> Unsuccessful backups
'%' --> No restriction by backup status

- MESSAGE
Backup message

'<ok>' --> Only return backups with message <ok>


'%' --> No restriction related to backup message

- AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'SAMPLE_TIME' --> Aggregation by sample time


'HOST, SERVICE' --> Aggregation by host and service (if multiple choices are
possible)
'%' --> No aggregation, pure filtering (if supported)

- AGGREGATION_TYPE

Type of aggregation (e.g. average, sum, maximum)

'AVG' --> Average value


'SUM' --> Total value
'MAX' --> Maximum value

- TIME_AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'HOUR' --> Aggregation by hour


'YYYY/WW' --> Aggregation by calendar week
'TS<seconds>' --> Time slice aggregation based on <seconds> seconds
'NONE' --> No aggregation

[OUTPUT PARAMETERS]

- START_TIME: Backup start time


- HOST: Host name
- SERVICE_NAME: Service name
- BACKUP_ID: Backup Id
- BACKUP_TYPE: Backup type
- DATA_TYPE: Type of backup data (VOLUME for normal data, CATALOG for
catalog data, TOPOLOGY for topology data)
- STATUS: Backup status
- BACKUPS: Number of backup runs
- FULL_LOG_PCT: Percentage of log backups of full logs (i.e. size of log >= 95
% of configured log_segment_size)
- AGG: Aggregation type for RUNTIME_H
- RUNTIME_MIN: Runtime of backups (in minutes)
- BACKUP_SIZE_MB: Backup size (MB)
- MB_PER_S: Backup write throughput (MB / s)
- DAYS_PASSED: Time since backup run (days)
- MESSAGE: Status message (e.g. error information in case of unsuccessful
execution)

[EXAMPLE OUTPUT]

-----------------------------------------------------------------------------------
-----------------
|START_TIME |HOST |PORT |BACKUP_TYPE|STATUS|BACKUPS|AGG|RUNTIME_H|
BACKUP_SIZE_GB|MESSAGE|
-----------------------------------------------------------------------------------
-----------------
|2014/09/29 12:00|saphana0032|30001|log backup |any | 55|AVG| 0.00|
0.03|any |
|2014/09/29 12:00|saphana0032|30003|log backup |any | 4|AVG| 0.00|
0.43|any |
|2014/09/29 12:00|saphana0032|30005|log backup |any | 14|AVG| 0.00|
0.05|any |
|2014/09/29 12:00|saphana0032|30007|log backup |any | 1|AVG| 0.00|
0.00|any |
|2014/09/29 12:00|saphana0033|30003|log backup |any | 4|AVG| 0.01|
0.60|any |
|2014/09/29 12:00|saphana0034|30003|log backup |any | 4|AVG| 0.00|
0.60|any |
|2014/09/29 12:00|saphana0041|30003|log backup |any | 4|AVG| 0.00|
0.17|any |
|2014/09/29 12:00|saphana0042|30003|log backup |any | 4|AVG| 0.00|
0.12|any |
|2014/09/29 12:00|saphana0043|30003|log backup |any | 8|AVG| 0.00|
0.89|any |
|2014/09/29 12:00|saphana0044|30003|log backup |any | 4|AVG| 0.00|
0.15|any |
-----------------------------------------------------------------------------------
-----------------

*/

START_TIME,
HOST,
SERVICE_NAME,
LPAD(BACKUP_ID, 13) BACKUP_ID,
BACKUP_TYPE,
DATA_TYPE,
STATUS,
LPAD(BACKUPS, 7) BACKUPS,
LPAD(TO_DECIMAL(MAP(BACKUPS, 0, 0, NUM_LOG_FULL / BACKUPS * 100), 10, 2), 12)
FULL_LOG_PCT,
AGG,
LPAD(TO_DECIMAL(RUNTIME_H * 60, 10, 2), 11) RUNTIME_MIN,
LPAD(TO_DECIMAL(BACKUP_SIZE_MB, 10, 2), 14) BACKUP_SIZE_MB,
LPAD(TO_DECIMAL(MAP(RUNTIME_H, 0, 0, BACKUP_SIZE_MB / RUNTIME_H / 3600), 10, 2),
8) MB_PER_S,
LPAD(TO_DECIMAL(SECONDS_BETWEEN(MAX_START_TIME, CURRENT_TIMESTAMP) / 86400, 10,
2), 11) DAYS_PASSED,
MESSAGE
FROM
( SELECT
START_TIME,
HOST,
SERVICE_NAME,
BACKUP_ID,
BACKUP_TYPE,
BACKUP_DATA_TYPE DATA_TYPE,
STATUS,
NUM_BACKUP_RUNS BACKUPS,
NUM_LOG_FULL,
AGGREGATION_TYPE AGG,
CASE AGGREGATION_TYPE
WHEN 'SUM' THEN SUM_RUNTIME_H
WHEN 'AVG' THEN MAP(NUM_BACKUP_RUNS, 0, 0, SUM_RUNTIME_H / NUM_BACKUP_RUNS)
WHEN 'MAX' THEN MAX_RUNTIME_H
END RUNTIME_H,
CASE AGGREGATION_TYPE
WHEN 'SUM' THEN SUM_BACKUP_SIZE_MB
WHEN 'AVG' THEN MAP(NUM_BACKUP_RUNS, 0, 0, SUM_BACKUP_SIZE_MB /
NUM_BACKUP_RUNS)
WHEN 'MAX' THEN MAX_BACKUP_SIZE_MB
END BACKUP_SIZE_MB,
MAX_START_TIME,
MESSAGE
FROM
( SELECT
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'),
CASE BI.TIMEZONE WHEN 'UTC' THEN ADD_SECONDS(B.SYS_START_TIME,
SECONDS_BETWEEN(CURRENT_TIMESTAMP, CURRENT_UTCTIMESTAMP)) ELSE B.SYS_START_TIME
END) / SUBSTR(BI.TIME_AGGREGATE_BY, 3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)),
'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(CASE BI.TIMEZONE WHEN 'UTC' THEN
ADD_SECONDS(B.SYS_START_TIME, SECONDS_BETWEEN(CURRENT_TIMESTAMP,
CURRENT_UTCTIMESTAMP)) ELSE B.SYS_START_TIME END, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END START_TIME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HOST')
!= 0 THEN BF.HOST ELSE MAP(BI.HOST, '%',
'any', BI.HOST) END HOST,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SERVICE')
!= 0 THEN BF.SERVICE_TYPE_NAME ELSE MAP(BI.SERVICE_NAME,
'%', 'any', BI.SERVICE_NAME) END SERVICE_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'BACKUP_ID')
!= 0 THEN TO_VARCHAR(B.BACKUP_ID) ELSE 'any'
END BACKUP_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'BACKUP_TYPE')
!= 0 THEN B.ENTRY_TYPE_NAME ELSE MAP(BI.BACKUP_TYPE,
'%', 'any', BI.BACKUP_TYPE) END BACKUP_TYPE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY,
'BACKUP_DATA_TYPE') != 0 THEN BF.SOURCE_TYPE_NAME ELSE
MAP(BI.BACKUP_DATA_TYPE, '%', 'any', BI.BACKUP_DATA_TYPE) END BACKUP_DATA_TYPE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATE')
!= 0 THEN B.STATE_NAME ELSE
MAP(BI.BACKUP_STATUS, '%', 'any', BI.BACKUP_STATUS) END STATUS,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'MESSAGE')
!= 0 THEN CASE WHEN B.MESSAGE LIKE 'Not all data could be written%' THEN 'Not all
data could be written'
ELSE B.MESSAGE END ELSE MAP(BI.MESSAGE, '%', 'any', BI.MESSAGE) END
MESSAGE,
COUNT(DISTINCT(B.BACKUP_ID)) NUM_BACKUP_RUNS,
SUM(SECONDS_BETWEEN(B.SYS_START_TIME, B.SYS_END_TIME) / 3600) *
SUM(BF.BACKUP_SIZE) / SUM(BF.TOTAL_BACKUP_SIZE) SUM_RUNTIME_H,
MAX(SECONDS_BETWEEN(B.SYS_START_TIME, B.SYS_END_TIME) / 3600) *
MAX(BF.BACKUP_SIZE / BF.TOTAL_BACKUP_SIZE) MAX_RUNTIME_H,
IFNULL(SUM(BF.BACKUP_SIZE / 1024 / 1024 ), 0) SUM_BACKUP_SIZE_MB,
IFNULL(MAX(BF.BACKUP_SIZE / 1024 / 1024 ), 0) MAX_BACKUP_SIZE_MB,
MAX(CASE BI.TIMEZONE WHEN 'UTC' THEN ADD_SECONDS(B.SYS_START_TIME,
SECONDS_BETWEEN(CURRENT_TIMESTAMP, CURRENT_UTCTIMESTAMP)) ELSE B.SYS_START_TIME
END) MAX_START_TIME,
SUM(IFNULL(CASE WHEN B.ENTRY_TYPE_NAME = 'log backup' AND BF.SOURCE_TYPE_NAME
= 'volume' AND BF.BACKUP_SIZE / 1024 / 1024 >= L.SEGMENT_SIZE * 0.95 THEN 1 ELSE 0
END, 0)) NUM_LOG_FULL,
BI.MIN_BACKUP_TIME_S,
BI.AGGREGATION_TYPE,
BI.AGGREGATE_BY
FROM
( SELECT
BEGIN_TIME,
END_TIME,
TIMEZONE,
HOST,
SERVICE_NAME,
BACKUP_TYPE,
BACKUP_DATA_TYPE,
BACKUP_STATUS,
MESSAGE,
MIN_BACKUP_TIME_S,
AGGREGATION_TYPE,
AGGREGATE_BY,
MAP(TIME_AGGREGATE_BY,
'NONE', 'YYYY/MM/DD HH24:MI:SS',
'HOUR', 'YYYY/MM/DD HH24',
'DAY', 'YYYY/MM/DD (DY)',
'HOUR_OF_DAY', 'HH24',
TIME_AGGREGATE_BY ) TIME_AGGREGATE_BY
FROM
( SELECT /*
Modification section */
TO_TIMESTAMP('1900/01/01 12:00:00', 'YYYY/MM/DD HH24:MI:SS') BEGIN_TIME,
TO_TIMESTAMP('9999/01/13 12:00:00', 'YYYY/MM/DD HH24:MI:SS') END_TIME,
'SERVER' TIMEZONE, /* SERVER, UTC */
'%' HOST,
'%' SERVICE_NAME,
'log backup' BACKUP_TYPE, /* e.g. 'log
backup', 'complete data backup', 'incremental data backup', 'differential data
backup', 'data snapshot',
'DATA_BACKUP' for
all data backup and snapshot types */
'%' BACKUP_DATA_TYPE, /* VOLUME -> log or
data, CATALOG -> catalog, TOPOLOGY -> topology */
'%' BACKUP_STATUS, /* e.g.
'successful', 'failed' */
'%' MESSAGE,
-1 MIN_BACKUP_TIME_S,
'AVG' AGGREGATION_TYPE, /* SUM, MAX, AVG */
'HOST, TIME, SERVICE, BACKUP_TYPE' AGGREGATE_BY, /* HOST, SERVICE,
TIME, BACKUP_ID, BACKUP_TYPE, BACKUP_DATA_TYPE, STATE, MESSAGE or comma separated
list, NONE for no aggregation */
'HOUR' TIME_AGGREGATE_BY /* HOUR, DAY, HOUR_OF_DAY or database time
pattern, TS<seconds> for time slice, NONE for no aggregation */
FROM
DUMMY
)
) BI INNER JOIN
M_BACKUP_CATALOG B ON
CASE BI.TIMEZONE WHEN 'UTC' THEN ADD_SECONDS(B.SYS_START_TIME,
SECONDS_BETWEEN(CURRENT_TIMESTAMP, CURRENT_UTCTIMESTAMP)) ELSE B.SYS_START_TIME END
BETWEEN BI.BEGIN_TIME AND BI.END_TIME AND
( BI.BACKUP_TYPE = 'DATA_BACKUP' AND B.ENTRY_TYPE_NAME IN ( 'complete data
backup', 'differential data backup', 'incremental data backup', 'data snapshot' )
OR
BI.BACKUP_TYPE != 'DATA_BACKUP' AND UPPER(B.ENTRY_TYPE_NAME) LIKE
UPPER(BI.BACKUP_TYPE)
) AND
B.STATE_NAME LIKE BI.BACKUP_STATUS AND
B.MESSAGE LIKE BI.MESSAGE INNER JOIN
( SELECT
BACKUP_ID,
SOURCE_ID,
HOST,
SERVICE_TYPE_NAME,
SOURCE_TYPE_NAME,
BACKUP_SIZE,
SUM(BACKUP_SIZE) OVER (PARTITION BY BACKUP_ID) TOTAL_BACKUP_SIZE
FROM
M_BACKUP_CATALOG_FILES
) BF ON
B.BACKUP_ID = BF.BACKUP_ID AND
BF.HOST LIKE BI.HOST AND
BF.SERVICE_TYPE_NAME LIKE BI.SERVICE_NAME AND
UPPER(BF.SOURCE_TYPE_NAME) LIKE UPPER(BI.BACKUP_DATA_TYPE) LEFT OUTER JOIN
M_LOG_BUFFERS L ON
L.HOST = BF.HOST AND
L.VOLUME_ID = BF.SOURCE_ID
GROUP BY
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'),
CASE BI.TIMEZONE WHEN 'UTC' THEN ADD_SECONDS(B.SYS_START_TIME,
SECONDS_BETWEEN(CURRENT_TIMESTAMP, CURRENT_UTCTIMESTAMP)) ELSE B.SYS_START_TIME
END) / SUBSTR(BI.TIME_AGGREGATE_BY, 3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)),
'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(CASE BI.TIMEZONE WHEN 'UTC' THEN
ADD_SECONDS(B.SYS_START_TIME, SECONDS_BETWEEN(CURRENT_TIMESTAMP,
CURRENT_UTCTIMESTAMP)) ELSE B.SYS_START_TIME END, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HOST')
!= 0 THEN BF.HOST ELSE MAP(BI.HOST, '%',
'any', BI.HOST) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SERVICE')
!= 0 THEN BF.SERVICE_TYPE_NAME ELSE MAP(BI.SERVICE_NAmE,
'%', 'any', BI.SERVICE_NAME) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'BACKUP_ID')
!= 0 THEN TO_VARCHAR(B.BACKUP_ID) ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'BACKUP_TYPE')
!= 0 THEN B.ENTRY_TYPE_NAME ELSE MAP(BI.BACKUP_TYPE,
'%', 'any', BI.BACKUP_TYPE) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY,
'BACKUP_DATA_TYPE') != 0 THEN BF.SOURCE_TYPE_NAME ELSE
MAP(BI.BACKUP_DATA_TYPE, '%', 'any', BI.BACKUP_DATA_TYPE) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATE')
!= 0 THEN B.STATE_NAME ELSE
MAP(BI.BACKUP_STATUS, '%', 'any', BI.BACKUP_STATUS) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'MESSAGE')
!= 0 THEN CASE WHEN B.MESSAGE LIKE 'Not all data could be written%' THEN 'Not all
data could be written' ELSE B.MESSAGE END
ELSE MAP(BI.MESSAGE, '%', 'any', BI.MESSAGE) END,
BI.MIN_BACKUP_TIME_S,
BI.AGGREGATION_TYPE,
BI.AGGREGATE_BY
)
WHERE
( MIN_BACKUP_TIME_S = -1 OR SUM_RUNTIME_H >= MIN_BACKUP_TIME_S / 3600 )
)
ORDER BY
START_TIME DESC,
HOST,
SERVICE_NAME
WITH HINT (NO_JOIN_REMOVAL)

You might also like