Ищем сегменты в имени которых есть заданная последовательность (TMP, BKP, 6 и более цифр подряд, …) для которых есть сегменты без этой последовательности.
Скрипт расширяется в подзапросе template, поэтому если при бекапе добавляется и число и суффикс TMP, то необходимо задать нужную последовательность для замены такого имени.
WITH templates AS (
SELECT '_?TMP_?' t FROM dual UNION ALL
SELECT '_?TEMP_?' t FROM dual UNION ALL
SELECT '_?BKP_?' t FROM dual UNION ALL
SELECT '_?BACKUP_?' t FROM dual UNION ALL
SELECT '\d{6,}' t FROM dual
),
seg AS (
SELECT owner, segment_name, segment_type, SUM(bytes)/1024/1024 mb
FROM Dba_Segments_Prod_h
WHERE owner NOT IN ('SYS', 'SYSTEM', 'WMSYS', 'FLOWS_030100', 'APEX_030200')
GROUP BY owner, segment_name, segment_type
),
bad_segments AS (
SELECT /*+ materialize*/DISTINCT *
FROM (
SELECT regexp_replace(s.segment_name, templates.t) new_name, owner, segment_name
FROM seg s, templates
)
WHERE new_name <> segment_name
)
SELECT s.*, b.new_name "Exists"
FROM seg s, bad_segments b
WHERE s.segment_name = b.segment_name
AND EXISTS (SELECT NULL FROM seg s2 WHERE s2.segment_name = b.new_name)
ORDER BY 4 DESC
Комментариев нет:
Отправить комментарий