Трассировка определённого SQL. Tracing for a specific SQL.

Event 10046 — это событие является стандартным методом сбора расширенной sql_trace информации для Oraclовых сессий.
Для вопросов связанных с производительностью запросов (Query Performance) обычные требования — это записать информацию об ожиданиях и биндах переменных. Эта задача выполняется при использовании 10046 с уровнем 12 или 4 (level 12/level 4).

Для методов которые требуют уровня трассировки действительны следующие значения:
0 — Нет трейса. Как если sql_trace off.
2 — Эквивалент обычного sql_trace;
4 — То же, что и 2, но дополняется значениями забинженых переменных;
8 — То же, что и 2, но дополняется событиями ожидания;
12 — То же, что и 2, но с доп. значениями забинженых переменных и событиями ожидания (как у уровней 4 и 8, собственно 4+8=12).

В конкретном случае мне требуется узнать значение переменной B1 у запроса  10q4ut6chvak6 (выпадает ORA-00600: internal error code, arguments: [kdsgrp1] при определённых значениях):

--- Current SQL Statement for this session (sql_id=10q4ut6chvak6) ---
SELECT R.*, C.CCN_ID, C.CCN_TITLE FROM ARDOME.RUNDOWN_ROW R
LEFT OUTER JOIN ARDOME.COLLECTION C ON R.RDR_SITE_ID_STR=C.CCN_SITE_ID_STR AND C.CCN_TYPE='program' WHERE RDR_ID=:B1

Включить:
alter system set events 'sql_trace[sql: 10q4ut6chvak6] level=12';

Найти трейс можно по запросу:
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';

Через некоторое время в трейсе можно обнаружить то, что требовалось найти:
PARSING IN CURSOR #140038752954880 len=177 dep=1 uid=103 oct=3 lid=103 tim=1494421918938952 hv=2567809606 ad='41f2229a0' sqlid='10q4ut6chvak6'
SELECT R.*, C.CCN_ID, C.CCN_TITLE FROM ARDOME.RUNDOWN_ROW R LEFT OUTER JOIN ARDOME.COLLECTION C ON R.RDR_SITE_ID_STR=C.CCN_SITE_ID_STR AND C.CCN_TYPE='program' WHERE RDR_ID=:B1
END OF STMT
BINDS #140038752954880:
Bind#0
oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1206001 frm=00 csi=00 siz=24 off=0
kxsbbbfp=7f5d50211b40 bln=22 avl=11 flg=05
value=2101705100110951942

Выключить:
alter system set events 'sql_trace[sql: 10q4ut6chvak6] off';

Отследить отслеживаемые запросы можно через oradebug
SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump session
sql_trace[sql: 10q4ut6chvak6] level=12

 

N.B. Будьте бдительны, в моём случае я поймал то, что искал:
EXEC #140534692422696:c=0,e=303,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=2,plh=2289027174,tim=1494423351664104
* kdsgrp1-1: *************************************************
row 0x02cbbaca.7 continuation at
0x02cbbaca.7 file# 11 block# 768714 slot 7 not found

и далее +72Мб дополнительной информации. При многократном получении ошибки можно быстро забить файловую систему.

What a pid is using port.sh

Этот небольшой скрипт позволит узнать, какой PID занял порт на сервере Solaris:

#!/bin/ksh
#------
line='---------------------------------------------'
pids=$(/usr/bin/ps -ef | sed 1d | awk '{print $2}')
#------
if [ $# -eq 0 ]; then
read ans?"Enter port you would like to know pid for: "
else
ans=$1
fi
#------
for f in $pids
do
/usr/proc/bin/pfiles $f 2>/dev/null | /usr/xpg4/bin/grep -q "port: $ans"
if [ $? -eq 0 ]; then
echo $line
echo "Port: $ans is being used by PID:\c"
/usr/bin/ps -ef -o pid -o args | egrep -v "grep|pfiles" | grep $f
fi
done

Для RH проще
netstat -nlp | grep :1521
Вывод
tcp 0 0 :::1521 :::* LISTEN 32548/tnslsnr

Duplicate DB from backupset.

1. Копируем Бекапсет с арклогами и источника на приёмник.

2. Определяем переменные окружения (oracle_home и oracle_sid)

2. Проверяем параметры

SQL> show parameter convert

NAME TYPE VALUE
------------------------------------ ----------- ------------------------
db_file_name_convert string
log_file_name_convert string
pdb_file_name_convert string

3. Меняем параметры
SQL> alter system set db_file_name_convert='D:\Oradata\TEST','F:\Oradata\TEST' scope =spfile;
System altered.
SQL> alter system set log_file_name_convert='D:\Oradata\TEST','F:\Oradata\TEST' scope =spfile;
System altered.

4. Рестарт БД
SQL> shu immediate;
ORA-01507: database not mounted
ORACLE instance shut down.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 1.0289E+10 bytes
Fixed Size 2413360 bytes
Variable Size 5670702288 bytes
Database Buffers 4596957184 bytes
Redo Buffers 18542592 bytes

Проверяем применились ли настройки
SQL> show parameter convert

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string D:\Oradata\TEST, F:\Oradata\TEST
log_file_name_convert string D:\Oradata\TEST, F:\Oradata\TEST
pdb_file_name_convert string

5. rman AUXILIARY /
RUN
{
duplicate database to "TEST" nofilenamecheck
backup location 'D:\Backup\TEST';
}

…вывод на экран…

Прелесть данной конструкции в том, что мы може переименовать БД. Т.е. вместо «TEST» можно поставить «TEST2»

6. Убираем параметры
SQL> alter system reset db_file_name_convert scope=spfile;
System altered.
SQL> alter system reset log_file_name_convert scope=spfile;
System altered.

7. Restart instance and check parameters:
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1.0289E+10 bytes
Fixed Size 2413360 bytes
Variable Size 5670702288 bytes
Database Buffers 4596957184 bytes
Redo Buffers 18542592 bytes
Database mounted.
Database opened.

SQL> show parameter convert

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
log_file_name_convert string
pdb_file_name_convert string

—ready!

 

What is RH version?

What is RH version?
cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.8 (Santiago)

ln -s где_уже_что_то_находится по_какому_пути_линк_по_которому_нужен_доступ
ln -s /oracle/app/oracle/product/grid_12.2 /oracle/app/oracle/

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. Установка и настройка.»

Повышенное ожидание log file sync. LGWR — Post/wait и Polling.

Version 11.2.0.3 , Windows 2008R2

Столкнулись с ситуацией повышенного log file sync wait.

Конечно написанное приложение далеко от идеала, и в БД очень много коммитов. Но раньше такой ситуации по ожиданиям не возникало, а код остался нетронутым.

Деградации в производительности дискового хранилища и сети не были найдены, всё железо стабильно продолжало работать. В алертлоге ничего путного тоже нет, только:
«Thu Mar 30 15:20:19 2017
Thread 1 cannot allocate new log, sequence 4824
Private strand flush not complete»
Читать далее «Повышенное ожидание log file sync. LGWR — Post/wait и Polling.»

Лучшая практика и мифы Oracle RMAN.

Перевод незавершенной статьи Oracle RMAN Best Practices and Myths, Caleb Small (http://www.caleb.com/rman/) которая возможно будет завершенной.

Включая пример скрипта и логфайла.

Вне всякого сомнения RMAN — это лучший вариант для резервного копирования баз данных Oracle. Он прост настолько, что можно ввести BACKUP DATABASE и позволить RMAN-у сделать всё самому. Однако, RMAN это мощный и сложный инструмент, иногда даже ненадёжный, где требования к производственному резервированию сильно рознятся. Есть несколько хороших статей, касающихся наилучших практик, в дополнение к официальной документации Oracle, см. мою ссылку ниже.

Цель данной статьи- собрать все хорошие (и плохие) идеи и представить некоторые практические советы, основанные на многолетнем производственном опыте. Я также включил образцы скрипта и лога, которые демонстрирует некоторые из представленных здесь идей. В целях улучшения практического применения этого продукта на производстве, комментарии и отзывы приветствуются.

Ниже приводится растущее собрание тем, а также некоторые детальные обсуждения, количество которых будут увеличиваться с течением времени. Читать далее «Лучшая практика и мифы Oracle RMAN.»

Получить команду 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;

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