понедельник, 8 ноября 2010 г.

Как заблокировать/разблокировать статистику таблицы.

Пример показывает: 
- как заблокировать сбор статистики;
- что происходит когда Вы попытаетесь собрать на такой таблице статистику; 
- как разблокировать сбор статистики на таблицу.
Создаём таблицу

SQL> create table test ( x number );

Table created.

Создаём индекс

SQL> create index test_idx on test(x);

Index created.

Запрос возвращает NULL когда статистика не заблокирована 


SQL> SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'SCOTT';
STATT
—–


Заблокируем сбор статистики на таблице

SQL> exec dbms_stats.lock_table_stats('scott', 'test');

PL/SQL procedure successfully completed.


Запрос возвращает ALL когда статистика заблокирована

SQL> SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'SCOTT';
STATT
—–
ALL


Пробуем собрать статистику на "залоченной" таблице

SQL> exec dbms_stats.gather_index_stats('scott', 'test_idx');

BEGIN dbms_stats.gather_index_stats('scott', 'test_idx'); END;

 *
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at “SYS.DBMS_STATS”, line 10640
ORA-06512: at “SYS.DBMS_STATS”, line 10664
ORA-06512: at line 1


Пробуем собрать статистику на индексе используя analyze

SQL> analyze index ajaffer.test_idx compute statistics;

analyze index ajaffer.test_idx compute statistics
*
ERROR at line 1:
ORA-38029: object statistics are locked



Разблокируем сбор статистики на таблице

SQL> exec dbms_stats.unlock_table_stats('scott', 'test');

PL/SQL procedure successfully completed.

вторник, 2 ноября 2010 г.

Использование сессиями ресурсов

# SID - Session ID
# Username - Name of the user
# Statistic - Name of the statistic
# Value - Current value

    select     ses.SID,
        nvl(ses.USERNAME,'ORACLE PROC') username,
        sn.NAME statistic,
        sest.VALUE
    from     v$session ses,
        v$statname sn,
        v$sesstat sest
    where     ses.SID = sest.SID
    and     sn.STATISTIC# = sest.STATISTIC#
    and     sest.VALUE is not null
    and     sest.VALUE != 0           
    order     by ses.USERNAME, ses.SID, sn.NAME

Использование CPU сессиями

# Username - Name of the user
# SID - Session id
# CPU Usage - CPU centiseconds used by this session (divide by 100 to get real CPU seconds)

    select     nvl(ss.USERNAME,'ORACLE PROC') username,
        se.SID,
        VALUE cpu_usage
    from     v$session ss,
        v$sesstat se,
        v$statname sn
    where      se.STATISTIC# = sn.STATISTIC#
    and      NAME like '%CPU used by this session%'
    and      se.SID = ss.SID
    order      by VALUE desc

ORA-1652: unable to extend temp segment by 128 in tablespace TEMP


1. Ищем имя датафайла(оф) :

SQL> select file_name , TABLESPACE_NAME from DBA_TEMP_FILES;

/u01/oradata/orcl/temp01.dbf   TEMP

2. Проверяем есть ли свободное место в сегментах TEMP

SQL> SELECT   A.tablespace_name tablespace, D.mb_total,
SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
FROM     v$sort_segment A,
(
SELECT   B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total
FROM     v$tablespace B, v$tempfile C
WHERE    B.ts#= C.ts#
GROUP BY B.name, C.block_size
) D
WHERE    A.tablespace_name = D.name
GROUP by A.tablespace_name, D.mb_total;



TABLESPACE                        MB_TOTAL    MB_USED    MB_FREE
——————————-              ———-            ———-           ———-
TEMP                                     1024              1012              12


Свободно 12 Мб
.
3. Решение проблемы


a) Изменяем размер табличного пространства TEMP

SQL> ALTER DATABASE TEMPFILE ‘/u01/oradata/orcl/temp01.dbf’ RESIZE 3072M;

b) Добавляем датафайл в табличное простанство TEMP


SQL> ALTER TABLESPACE TEMP ADD TEMPFILE ‘/u01/oradata/orcl/temp02.dbf’
SIZE 1024M REUSE AUTOEXTEND ON NEXT 50M  MAXSIZE 1024M
;

Ищем корень проблемы


1.  Анализируем использование сегментов временного табличного пространства сессиями

SQL> SELECT   S.sid || ‘,’ || S.serial# sid_serial, S.username, S.osuser, P.spid, S.module,
P.program, SUM (T.blocks) * TBS.block_size / 1024 / 1024 mb_used, T.tablespace,
COUNT(*) statements
FROM     v$sort_usage T, v$session S, dba_tablespaces TBS, v$process P
WHERE    T.session_addr = S.saddr
AND      S.paddr = P.addr
AND      T.tablespace = TBS.tablespace_name
GROUP BY S.sid, S.serial#, S.username, S.osuser, P.spid, S.module,
P.program, TBS.block_size, T.tablespace
ORDER BY mb_used;


2. Ищем SQL наиболее сильно использующий TEMP

SQL> SELECT  S.sid || ‘,’ || S.serial# sid_serial, S.username, Q.hash_value, Q.sql_text,
T.blocks * TBS.block_size / 1024 / 1024 mb_used, T.tablespace
FROM    v$sort_usage T, v$session S, v$sqlarea Q, dba_tablespaces TBS
WHERE   T.session_addr = S.saddr
AND     T.sqladdr = Q.address
AND     T.tablespace = TBS.tablespace_name
ORDER BY mb_used;

понедельник, 18 октября 2010 г.

Использование I/O пользователями

# Username - Name of the Oracle process user
# OS User - Name of the operating system user
# PID - Process ID of the session
# SID - Session ID of the session
# Serial# - Serial# of the session
# Physical Reads - Physical reads for the session
# Block Gets - Block gets for the session
# Consistent Gets - Consistent gets for the session
# Block Changes - Block changes for the session
# Consistent Changes - Consistent changes for the session

    select    nvl(ses.USERNAME,'ORACLE PROC') username,
        OSUSER os_user,
        PROCESS pid,
        ses.SID sid,
        SERIAL#,
        PHYSICAL_READS,
        BLOCK_GETS,
        CONSISTENT_GETS,
        BLOCK_CHANGES,
        CONSISTENT_CHANGES
    from    v$session ses,
        v$sess_io sio
    where     ses.SID = sio.SID
    order     by PHYSICAL_READS, ses.USERNAME desc

вторник, 12 октября 2010 г.

Как восстановить старую статистику.

При использовании DBMS_STATS для сбора статистики, Oracle бэкапит старую перед тем как она изменится.

Следующий пример показывает как работает dbms_stats.gather_*_stats и как восстановить статистику

Пример:

– собираем для таблицы статистику

SQL> exec dbms_Stats.gather_table_stats('SCOTT', 'TEST');
PL/SQL procedure successfully completed.

–  проверяем last_analyzed дату сбора статистики

SQL> select to_char(last_analyzed, 'DD-MON-YYYY HH24:MI:SS') from user_tables where table_name = 'TEST';

TO_CHAR(LAST_ANALYZE
——————–
06-OCT-2010 00:08:05

– Произошли инсерты, апдейты, делиты из таблицы, сново соберём статистику

SQL> exec dbms_Stats.gather_table_stats('SCOTT', 'TEST');

–Смотрим последнюю дату анализа

SQL> select to_char(last_analyzed, 'DD-MON-YYYY HH24:MI:SS') from user_tables where table_name = 'TEST';

TO_CHAR(LAST_ANALYZE
——————–
06-OCT-2010 00:08:48

– Смотрим на время когда статистика собиралась ранее

SQL> select table_name, to_char(stats_update_time, 'DD-MON-YYYY HH24:MI:SS') from dba_tab_stats_history where owner = 'SCOTT';

TABLE_NAME TO_CHAR(STATS_UPDATE
—————————— ——————–
TEST 06-OCT-2010 00:08:05
TEST 06-OCT-2010 00:08:48

– восстанавливаем статистику на нужный момент времени

SQL> exec DBMS_STATS.RESTORE_TABLE_STATS (ownname=>'SCOTT', tabname=>'TEST', as_of_timestamp=>TO_DATE('06-OCT-2010 00:08:48', 'DD-MON-YYYY HH24:MI:SS'));

PL/SQL procedure successfully completed.

– проверяем что статистика восстановлена на нужное время

SQL> select to_char(last_analyzed, 'DD-MON-YYYY HH24:MI:SS') from user_tables where table_name = 'TEST';

TO_CHAR(LAST_ANALYZE
——————–
06-OCT-2010 00:08:05

воскресенье, 10 октября 2010 г.

RUS_Vova - BFBC2 Stats

 Владельцам приставок PlayStation 3, мой таг в PSN, буду рад порубиться с Вами в онлайне, как в BFBC2 так и в COD: BLACK OPS.
RUS_Vova - BFBC2 Stats

понедельник, 4 октября 2010 г.

Решаем проблему с запуском базы с помошью file_hdrs dump

http://orainternals.wordpress.com/category/recovery/

четверг, 23 сентября 2010 г.

Выравниваем STANDBY и PRODUCTION в случае возникновения GAP.

 Останавливаем накат логов на стендбае.

1.) Alter database recover managed standby database cancel;

Определяем номер последнего изменения на стендбае.
Select surrent_scn from v$database;

Бэкапим продакшен начиная  с номера из пункта 2.
3). backup incremental from scn NN database;

Бэкапим контролфайл на продакшене.
4). Backup current controlfile for standby;

Копируем всё что забэкапили на хост со стендбаем  и начинаем восстановление.
5). RMAN -> Restore standby controlfile from '';
     RMAN -> recover database noredo;

Запускаем накат логов на стендбае.
6). SQL -> alter database recover managed standby database disconnect from session;

Готово.

Чем занят RMAN и как долго он будет этим заниматься.

set line 100
SELECT dense_rank() over (order by to_char(lo.start_time, 'dd.mm.yyyyy hh24:mi:ss')) NN,
to_char( lo.start_time, 'dd.mm.yyyyy hh24:mi:ss' ) "Start Time", lo.sid,decode(lo.totalwork,0,0,round(100*lo.sofar/lo.totalwork,2))"%",
replace(to_char(floor(lo.time_remaining/60/60),'00')||':'|| to_char(floor(lo.time_remaining/60)-floor(lo.time_remaining/60/60)*60,'00')||':'||
to_char( lo.time_remaining - floor( lo.time_remaining / 60 ) * 60, '00' ),' ')  "remaining(hour)",
replace(to_char(floor(lo.elapsed_seconds/60/60),'00')||':'|| to_char( floor(lo.elapsed_seconds/60)-floor(lo.elapsed_seconds/60/60)*60,'00')||':'||
to_char(lo.elapsed_seconds- floor( lo.elapsed_seconds / 60 ) * 60, '00' ),' ') elapsed,round( lo.sofar/decode(lo.elapsed_seconds,0,1,lo.elapsed_seconds),4) "V,b/s"
FROM gv$session_longops lowhere  lo.time_remaining!=0 and opname like 'RMAN%' and opname not like '%aggregate%' ORDER BY lo.start_time DESC;

Хороший скриптик для "снятия нагрузки " с винтов.

set lines 400 pages 50000

alter session set nls_date_format='dd-mm-yyyy hh24:mi';

col Phys_Read_Total_Bps for 999999999999
col Phys_Write_Total_Bps for 999999999999
col Redo_Bytes_per_sec for 999999999999
col Phys_Read_IOPS for 999999999999
col Phys_write_IOPS for 999999999999
col Phys_redo_IOPS for 999999999999
col OS_LOad for 999999999999
col DB_CPU_Usage_per_sec for 999999999999
col Host_CPU_util for 999999999999
col Network_bytes_per_sec for 999999999999
col Phys_IO_Tot_MBps for 999999999999
col Phys_IOPS_Tot for 999999999999

spool io_max_checkup.log

select min(begin_time), max(end_time),
sum(case metric_name when 'Physical Read Total Bytes Per Sec' then maxval end) Phys_Read_Tot_Bps,
sum(case metric_name when 'Physical Write Total Bytes Per Sec' then maxval end) Phys_Write_Tot_Bps,
sum(case metric_name when 'Redo Generated Per Sec' then maxval end) Redo_Bytes_per_sec,
sum(case metric_name when 'Physical Read Total IO Requests Per Sec' then maxval end) Phys_Read_IOPS,
sum(case metric_name when 'Physical Write Total IO Requests Per Sec' then maxval end) Phys_write_IOPS,
sum(case metric_name when 'Redo Writes Per Sec' then maxval end) Phys_redo_IOPS,
sum(case metric_name when 'Current OS Load' then maxval end) OS_LOad,
sum(case metric_name when 'CPU Usage Per Sec' then maxval end) DB_CPU_Usage_per_sec,
sum(case metric_name when 'Host CPU Utilization (%)' then maxval end) Host_CPU_util, --NOTE 100% = 1 loaded RAC node
sum(case metric_name when 'Network Traffic Volume Per Sec' then maxval end) Network_bytes_per_sec,
snap_id
from dba_hist_sysmetric_summary
group by snap_id
order by snap_id;

spool off

spool io_maxtot_summary.log

select min(begin_time), max(end_time),
sum(case metric_name when 'Physical Read Total Bytes Per Sec' then maxval end)/1024/1024 +
sum(case metric_name when 'Physical Write Total Bytes Per Sec' then maxval end)/1024/1024 +
sum(case metric_name when 'Redo Generated Per Sec' then maxval end)/1024/1024 Phys_IO_Tot_MBps,
sum(case metric_name when 'Physical Read Total IO Requests Per Sec' then maxval end) +
sum(case metric_name when 'Physical Write Total IO Requests Per Sec' then maxval end) +
sum(case metric_name when 'Redo Writes Per Sec' then maxval end) Phys_IOPS_Tot,
sum(case metric_name when 'Current OS Load' then maxval end) OS_LOad,
sum(case metric_name when 'CPU Usage Per Sec' then maxval end) DB_CPU_Usage_per_sec,
sum(case metric_name when 'Host CPU Utilization (%)' then maxval end) Host_CPU_util, --NOTE 100% = 1 loaded RAC node
sum(case metric_name when 'Network Traffic Volume Per Sec' then maxval end) Network_bytes_per_sec,
snap_id
from dba_hist_sysmetric_summary
group by snap_id
order by snap_id;

spool off