Частота переключения REDO логов по часам

Online Redo Log Switch Frequency Map Query.

Взято с: https://blog.zeddba.com/2019/05/31/online-redo-log-switch-frequency-map/
Пусть будет здесь, в последнее время часто ищу подобного рода запрос

SELECT TRUNC (first_time) "Date", inst_id, TO_CHAR (first_time, 'Dy') "Day",
 COUNT (1) "Total",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '00', 1, 0)) "h0",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '01', 1, 0)) "h1",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '02', 1, 0)) "h2",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '03', 1, 0)) "h3",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '04', 1, 0)) "h4",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '05', 1, 0)) "h5",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '06', 1, 0)) "h6",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '07', 1, 0)) "h7",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '08', 1, 0)) "h8",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '09', 1, 0)) "h9",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '10', 1, 0)) "h10",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '11', 1, 0)) "h11",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '12', 1, 0)) "h12",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '13', 1, 0)) "h13",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '14', 1, 0)) "h14",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '15', 1, 0)) "h15",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '16', 1, 0)) "h16",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '17', 1, 0)) "h17",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '18', 1, 0)) "h18",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '19', 1, 0)) "h19",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '20', 1, 0)) "h20",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '21', 1, 0)) "h21",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '22', 1, 0)) "h22",
 SUM (DECODE (TO_CHAR (first_time, 'hh24'), '23', 1, 0)) "h23",
 ROUND (COUNT (1) / 24, 2) "Avg"
FROM gv$log_history
WHERE thread# = inst_id
AND first_time > sysdate -7
GROUP BY TRUNC (first_time), inst_id, TO_CHAR (first_time, 'Dy')
ORDER BY 1,2;

под катом — шапка для корретного отображения в sqlplus
Читать далее «Частота переключения REDO логов по часам»

Чистим-чистим арклоги в FRA ASM Standby

Automatic Storage Management на стендбай сервере ругается, что Disk Group FRA is 90.358% used ?
Давайте почистим Fast Recovery Area.

Немного подхачим гуляющий по интернету скрипт и получим готовую к выполнению в RMAN команду для удаления применённых арклогов с учётом тредов. Минус 2 от максимального, т.к. бывали случаи, что стендбай ломался и требовал пару уже применённых логов. Выполнять строго на Standby:

select 'DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE '|| (max(sequence#)-2)||' THREAD '||THREAD# ||';'
from v$archived_log
where applied = 'YES'
AND  RESETLOGS_TIME = (select MAX(RESETLOGS_TIME) from V$DATABASE_INCARNATION)
group by THREAD#;---

Чтобы быть уверенным, что особого отставания нет и адских гепов, посмотрим на PRIMARY

select max(SEQUENCE#),THREAD# from v$archived_log
where RESETLOGS_TIME = (select MAX(RESETLOGS_TIME) from V$DATABASE_INCARNATION)
group by THREAD#;

Получим что-то вроде этого:

DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE 3786 THREAD 1;
DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE 3571 THREAD 2;

Возможно, будет хорошим решением будет включение опции автоматического удаления накатившихся арклогов:

CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;

Drop и Create индекса на Primary key

Появилась задача — Drop и Create индекса на Primary key (Именно такое потенциальное решение, из всех других предложенных вариантов, остаётся для Internal error ORA 600 [kdsgrp1] по рекомендации MOS)

Alter table "ARDOME"."RUNDOWN_ROW" drop primary key
Error report -
SQL Error: ORA-02273: denna UNIQUE/PRIMARY KEY refereras från några främmande nycklar
02273. 00000 - "this unique/primary key is referenced by some foreign keys"
*Cause: Self-evident.
*Action: Remove all references to the key before the key is to be dropped.

I. Давайте определим имя PK при помощи представления DBA_CONSTRAINTS:

В нашем случае это таблица RUNDOWN_ROW в схеме ARDOME.
select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW'
and CONSTRAINT_TYPE='P'

Типы констрейнтов:

  • C (check constraint on a table)
  • P (primary key)
  • U (unique key)
  • R (referential integrity) — он же FK, который ссылаясь мешает удалить PK
  • V (with check option, on a view)
  • O (with read only, on a view)

Немного подшаманим и увидим информацию о FK на наш PK:
select * from DBA_CONSTRAINTS
where R_CONSTRAINT_NAME in (
select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW' and CONSTRAINT_TYPE='P')

Читать далее «Drop и Create индекса на Primary key»

Statspack. Установка и настройка.

«А у нас в квартире газ! А у вас?» А у нас Standard Edition!

Лишенные радости использования AWR (Automatic Workload Repository) в Enterprise Edition администраторы SE могут использовать набор утилит мониторинга производительности Statspack.

Установить Statspack
@%ORACLE_HOME%\rdbms\admin\spcreate

OR
@?/rdbms/admin/spcreate

Хорошо, установили, но статистика от этого собирается просто так не станет.
Что бы автоматом собиралась статистика:
@?/rdbms/admin/spauto.sql
Читать далее «Statspack. Установка и настройка.»

Получить команду DDL, GET_DDL

Вывод получится довольно большой, потому перед началом лучше дать:
set pagesize 0
set long 30000

Получиться DDL команду для VIEW:
select dbms_metadata.get_ddl('VIEW','ИМЯ_ПРЕДСТАВЛЕНИЯ','ИМЯ_СХЕМЫ') from dual;
select dbms_metadata.get_ddl('VIEW','ACCOUNT_MANAGERS','OE') from dual;

 

 

 

select dbms_metadata.get_ddl('INDEX','ИМЯ_ИНДЕКСА','ИМЯ_СХЕМЫ') from dual;
select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual;

Доп инфа

Перенос файлов временного табличного пространства.

    «Место на файловой системе начало подходить к коцу. Здесь же, на диске D располагаются bigfile пространства, довольно большие, переносить их не очень хочется, да и особо некуда, а место для их роста освободить не помешает.» — руководствуясь такими рассуждениями принимаю решение перенести что-то наименее критичное — это пара temp файлов.

1. Используя следующий запрос, посмотрим какие TEMP файлы имеет смысл переносить:
select round((bytes/1024/1024/1024),2) GB, Name from v$tempfile;

Нашли два файла по 60Гб каждый, их и будем переносить. Идём дальше. Читать далее «Перенос файлов временного табличного пространства.»

Перекомпиляция инвалидных объектов схемы

Определение инвалидных объектов

Для определения инвалидных объектов можно использовать представление DBA_OBJECTS, как в этом запросе:

COLUMN object_name FORMAT A30
SELECT owner,
object_type,
object_name,
status
FROM dba_objects
WHERE status = 'INVALID'
ORDER BY owner, object_type, object_name;

Полученную информацию можно использовать для выбора метода рекомпиляции. Читать далее «Перекомпиляция инвалидных объектов схемы»

Bunch of queries I use.

При работе в SQL*pus бывает удобно посмотреть не только дату, но и конкретное время:
alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";

Теперь мы знаем точное время запуска экземпляра : )

Порой autoextend = YES (автоматическое расширение файлов данных) не очень хорошая идея. Добавление файлов данных, их расширение и прочие манипуляции будут проводиться вручную, в этом нам помогут :

--Добавление нового файла данных в табличное пространство
ALTER TABLESPACE "ИМЯ_ТАБЛИЧНОГО_ПРОСТРАНСТВА"   ADD     DATAFILE 'ПОЛНЫЙ_ПУТЬ_К_НОВОМУ_ФАЙЛУ_ДАННЫХ' SIZE 10240m;

--Добавление нового файла данных с авторасширением в табличное пространство
ALTER TABLESPACE "PSAPUNDO"   ADD     DATAFILE 'ПОЛНЫЙ_ПУТЬ_К_НОВОМУ_ФАЙЛУ_ДАННЫХ' SIZE 100M autoextend on;
--Изменение размера файла данных
ALTER DATABASE DATAFILE 'ИМЯ_ТАБЛИЧНОГО_ПРОСТРАНСТВА' RESIZE 32767M;

--Список файлов в табличном пространстве с информацией о размере и наличии авторасширения
select substr(file_name,instr(file_name,'\',-1,1)+1,100) as "FileName", file_name "FullName",tablespace_name "TS Name", file_id "ID", autoextensible,
floor((bytes)/(1024*1024*1024))as Total_Gb,floor((bytes)/(1024*1024))as Total_Mb from dba_data_files
where tablespace_name=upper('ИМЯ_ТАБЛИЧНОГО_ПРОСТРАНСТВА')
order by relative_fno;

--Создание табличного пространства
create tablespace "ИМЯ_НОВОГО_ТАБЛИЧНОГО_ПРОСТРАНСТВА" datafile 'ПОЛНЫЙ_ПУТЬ_К_НОВОМУ_ФАЙЛУ_ДАННЫХ' size 1000M;

--Добавление файла во временное табличное пространство
ALTER TABLESPACE "ИМЯ_ВРЕМЕННОГО_ТП"
ADD TEMPFILE 'ПОЛНЫЙ_ПУТЬ_К_НОВОМУ_ФАЙЛУ' SIZE 100M;

--Удаление табличного пространства
DROP TABLESPACE ИМЯ_ТП INCLUDING CONTENTS AND DATAFILES;

--Место занимаемое DF, redo и temp [Можно использовать подзапрос]
select round(sum(Total_GB),2) as Total_GB from
(select File_name, sum(total_mb/1024) as Total_GB from
(
select file_name as File_name, floor((bytes)/(1024*1024)) as Total_Mb from dba_data_files
union all
select lf.member as dir, l.bytes/(1024*1024)as Total_Mb from v$logfile lf, v$log l where lf.group#=l.group#
union all
select name as dir, bytes/(1024*1024) as Total_Mb from v$tempfile
union all
select name, round((block_size*file_size_blks)/1024/1024,2) from v$controlfile
)
group by File_name
);

--Directory list (Список папок/Каталогов Windows)
select substr(file_name,0,instr(file_name,'\',-1,1)) as dir from dba_data_files
union all
select substr(lf.member,0,instr(lf.member,'\',-1,1)) as dir from v$logfile lf, v$log l where lf.group#=l.group#
union all
select substr(name,0,instr(name,'\',-1,1)) as dir from v$tempfile
union all
select substr(name,0,instr(name,'\',-1,1)) as dir from v$controlfile;

--Directory list (Список папок/Каталогов *nix)
select substr(file_name,0,instr(file_name,'/',-1,1)) as dir from dba_data_files
union all
select substr(lf.member,0,instr(lf.member,'/',-1,1)) as dir from v$logfile lf, v$log l where lf.group#=l.group#
union all
select substr(name,0,instr(name,'/',-1,1)) as dir from v$tempfile
union all
select substr(name,0,instr(name,'/',-1,1)) as dir from v$controlfile;

--Свободное место в TS
select t.tablespace_name,floor((t.total)/(1024*1024*1024)) as Total_Gb,floor((f.free)/(1024*1024*1024)) as Free_Gb, floor((t.total-f.free)*100/t.total) as pct from
(select tablespace_name, sum(bytes) as free from dba_free_space group by tablespace_name) f,
(select tablespace_name, sum(bytes) as total from dba_data_files group by tablespace_name) t
where t.tablespace_name=f.tablespace_name
--and t.tablespace_name like 'ИМЯ_ТАБЛИЧНОГО_ПРОСТРАНСТВА_ЕСЛИ_НУЖНО%'
order by pct desc;

--Размер таблицы
SELECT owner, segment_name, segment_type,tablespace_name,
ROUND(SUM (BYTES) / 1024 / 1024) "SIZE (MB)",
SUM (blocks) blocks, COUNT (*) extents
FROM dba_extents
WHERE owner = 'ВЛАДЕЛЕЦ' AND segment_name = 'ИМЯ_ТАБЛИЦЫ'
AND segment_type = 'TABLE'
GROUP BY owner, segment_name, segment_type, tablespace_name;

 

--Размер объектов схемы:
select sum(bytes)/1024/1024 as size_in_mega,
segment_type
from dba_segments
where owner='&owner_name'
group by segment_type;

--Размер всех схем с разбивкой по юзерам:
select sum(bytes)/1024/1024 as size_in_mega, owner
from dba_segments
group by owner;

--Размер данных в базе данных 8192-размер блока:
select (sum(blocks)*8192)/1024/1024/1024 from dba_segments;

Сбор статистики

Иногда просадка по производительности запросов связана с тем, что собранная статистика по таблицам  не актуальна. Поможет нам в этом

Сбор статистики по схеме:
begin
dbms_stats.gather_schema_stats(ownname => 'ИМЯ_СХЕМЫ',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, cascade=>TRUE);
end;

Сбор статистики по таблице:
dbms_stats.gather_table_stats('ИМЯ_СХЕМЫ',upper('ИМЯ_ТАБЛИЦЫ'))

Посмотреть статистику по юзеру:
select * from DBA_TAB_STATISTICS
where OWNER like 'ИМЯ_СХЕМЫ'
--and num_rows is not null
--order by num_rows desc