Tanto na versão 10g como na 11g a utilização das features de DIAGNOSTIC e TUNING (controlada a partir do 11g pelo parâmetro control_management_pack_access) exige a necessidade de uma licença a parte. Sem a mesma o Oracle não irá armazenar dados relacionados a performance do ambiente, o que pode dificultar nosso trabalho como DBA’s.
Afim de evitar que o ambiente fique sem coleta de informações relacionadas a performance, uma alternativa que não exige licenciamento é a utilização do STATAPACK.
O STATSPACK é fornecido pela Oracle desde a versão 8i e tem como objetivo auxiliar na análise e monitoramento de performance do ambiente, fornecendo um relatório detalhado, semelhante ao AWR.
Abaixo estarei demonstrando o processo para implementar o statspack. O processo de ser executado através de uma conexão sysdba.
Na primeira etapa será criada uma tablespace que será utilizada pelo statspack.
Abaixo estarei mostrando os 2 exemplos:
Na execução do script será solicitado o intervalo de snapshots a serem removidos.
Afim de evitar que o ambiente fique sem coleta de informações relacionadas a performance, uma alternativa que não exige licenciamento é a utilização do STATAPACK.
O STATSPACK é fornecido pela Oracle desde a versão 8i e tem como objetivo auxiliar na análise e monitoramento de performance do ambiente, fornecendo um relatório detalhado, semelhante ao AWR.
Abaixo estarei demonstrando o processo para implementar o statspack. O processo de ser executado através de uma conexão sysdba.
Na primeira etapa será criada uma tablespace que será utilizada pelo statspack.
create tablespace statspack datafile '/oraprd02/oradata/dbtrn/statspack01.dbf' size 100m autoextend on next 100m maxsize 5000m; Tablespace created.O próximo passo consiste na execução do script spcreate.sql localizado em $ORACLE_HOME/rdbms/admin conectado como sysdba.
- Durante a execução deste script será solicitada a definição de uma senha para o usuário perfstat (criado pelo processo). A definição de uma senha é obrigatório para possamos continuar com a instalação;
- Após definir a senha, será solicitada a default tablespace. No exemplo abaixo estarei definindo como statspack (tablespace criada anteriormente);
- Por último será solicitado qual a tablespace temporária a ser utilizada. Neste caso, definirei como a tablespace padrão (TEMP).
SQL> @?/rdbms/admin/spcreate.sql Choose the PERFSTAT user's password ----------------------------------- Not specifying a password will result in the installation FAILING Enter value for perfstat_password: perfstat perfstat Choose the Default tablespace for the PERFSTAT user --------------------------------------------------- Below is the list of online tablespaces in this database which can store user data. Specifying the SYSTEM tablespace for the user's default tablespace will result in the installation FAILING, as using SYSTEM for performance data is not supported. Choose the PERFSTAT users's default tablespace. This is the tablespace in which the STATSPACK tables and indexes will be created. TABLESPACE_NAME CONTENTS STATSPACK DEFAULT TABLESPACE ------------------------------ --------- ---------------------------- STATSPACK PERMANENT SYSAUX PERMANENT * USERS PERMANENT Pressing will result in STATSPACK's recommended default tablespace (identified by *) being used. Enter value for default_tablespace: STATSPACK Using tablespace STATSPACK as PERFSTAT default tablespace. Choose the Temporary tablespace for the PERFSTAT user ----------------------------------------------------- Below is the list of online tablespaces in this database which can store temporary data (e.g. for sort workareas). Specifying the SYSTEM tablespace for the user's temporary tablespace will result in the installation FAILING, as using SYSTEM for workareas is not supported. Choose the PERFSTAT user's Temporary tablespace. TABLESPACE_NAME CONTENTS DB DEFAULT TEMP TABLESPACE ------------------------------ --------- -------------------------- TEMP TEMPORARY * Pressing will result in the database's default Temporary tablespace (identified by *) being used. Enter value for temporary_tablespace: TEMP . . . Creating Package STATSPACK... Package created. No errors. Creating Package Body STATSPACK... Package body created. No errors. NOTE: SPCPKG complete. Please check spcpkg.lis for any errors.Para que possamos gerar um relatório do ambiente, assim como no AWR, precisamos gerar snapshots da base. Um snapshot pode ser gerado manualmente ou automaticamente.
Abaixo estarei mostrando os 2 exemplos:
- Para uma coleta automática, estarei executando o script spauto.sql. Este script criará um job que por padrão irá gerar um snapshot por hora. De acordo com a necessidade do ambiente é possível alterar o intervalo de execução deste job.
SQL> @?/rdbms/admin/spauto.sql PL/SQL procedure successfully completed. Job number for automated statistics collection for this instance ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that this job number is needed when modifying or removing the job: JOBNO ---------- 43 Job queue process ~~~~~~~~~~~~~~~~~ Below is the current setting of the job_queue_processes init.ora parameter - the value for this parameter must be greater than 0 to use automatic statistics gathering: NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ job_queue_processes integer 1000 Next scheduled run ~~~~~~~~~~~~~~~~~~ The next scheduled run for this job is: JOB NEXT_DATE NEXT_SEC ---------- ------------------ -------- 43 30/04/014 15:00:00 15:00:00 1 row selected.
- Para uma coleta manual usamos o comando abaixo, conectados com o usuário perfstat.
SQL> EXEC STATSPACK.snap PL/SQL procedure successfully completed. SQL>Ao utilizar um processo automatizado para a geração de snapshots, devemos ficar atentos e realizar periodicamente uma limpeza dos mesmos. Para o processo de limpeza usamos o script sppurge.sql.
Na execução do script será solicitado o intervalo de snapshots a serem removidos.
SQL> select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT order by 2; SNAP_ID SNAP_TIME ---------- ------------------ 57 29/04/014 15:00:00 58 29/04/014 16:00:01 59 29/04/014 17:00:02 60 29/04/014 18:00:02 61 29/04/014 19:00:03 62 29/04/014 20:00:04 63 29/04/014 21:00:00 64 29/04/014 22:00:01 71 29/04/014 23:00:02 72 30/04/014 00:00:03 73 30/04/014 01:00:04 74 30/04/014 02:00:04 75 30/04/014 03:00:00 76 30/04/014 04:00:01 77 30/04/014 05:00:01 78 30/04/014 06:00:02 79 30/04/014 07:00:03 80 30/04/014 08:00:03 81 30/04/014 09:00:04 82 30/04/014 10:00:00 83 30/04/014 11:00:00 84 30/04/014 12:00:01 85 30/04/014 13:00:02 86 30/04/014 14:00:02 24 rows selected. SQL> @$ORACLE_HOME/rdbms/admin/sppurge.sql Database Instance currently connected to ======================================== Instance DB Id DB Name Inst Num Name ----------- ---------- -------- ---------- 3062688822 DBTST 1 dbtst Snapshots for this database instance ==================================== Base- Snap Snap Id Snapshot Started line? Level Host Comment -------- --------------------- ----- ----- --------------- -------------------- 57 29 Apr 2014 15:00:00 5 baseteste 58 29 Apr 2014 16:00:01 5 baseteste 59 29 Apr 2014 17:00:02 5 baseteste 60 29 Apr 2014 18:00:02 5 baseteste 61 29 Apr 2014 19:00:03 5 baseteste 62 29 Apr 2014 20:00:04 5 baseteste 63 29 Apr 2014 21:00:00 5 baseteste 64 29 Apr 2014 22:00:01 5 baseteste 71 29 Apr 2014 23:00:02 5 baseteste 72 30 Apr 2014 00:00:03 5 baseteste 73 30 Apr 2014 01:00:04 5 baseteste 74 30 Apr 2014 02:00:04 5 baseteste 75 30 Apr 2014 03:00:00 5 baseteste 76 30 Apr 2014 04:00:01 5 baseteste 77 30 Apr 2014 05:00:01 5 baseteste 78 30 Apr 2014 06:00:02 5 baseteste 79 30 Apr 2014 07:00:03 5 baseteste 80 30 Apr 2014 08:00:03 5 baseteste 81 30 Apr 2014 09:00:04 5 baseteste 82 30 Apr 2014 10:00:00 5 baseteste 83 30 Apr 2014 11:00:00 5 baseteste 84 30 Apr 2014 12:00:01 5 baseteste 85 30 Apr 2014 13:00:02 5 baseteste 86 30 Apr 2014 14:00:02 5 baseteste Warning ~~~~~~~ sppurge.sql deletes all snapshots ranging between the lower and upper bound Snapshot Id's specified, for the database instance you are connected to. Snapshots identified as Baseline snapshots which lie within the snapshot range will not be purged. It is NOT possible to rollback changes once the purge begins. You may wish to export this data before continuing. Specify the Lo Snap Id and Hi Snap Id range to purge ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enter value for losnapid: 57 Using 57 for lower bound. Enter value for hisnapid: 60 Using 60 for upper bound. Deleting snapshots 57 - 60. Number of Snapshots purged: 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Purge of specified Snapshot range complete. Afim de reduzir a necessidade de intervenção manual no processo de gerenciamento dos snapshots, estarei criando uma procedure chamada statspackpurge para limpeza dos snapshots, com uma retenção de 7 dias, porém esse valor pode ser alterado de acordo com a necessidade do ambiente. SQL> CREATE OR REPLACE PROCEDURE perfstat.statspackpurge IS var_lo_snap NUMBER; var_hi_snap NUMBER; var_db_id NUMBER; var_instance_no NUMBER; noofsnapshot NUMBER; n_count NUMBER ; CURSOR cursor_inst IS SELECT instance_number FROM gv$instance; BEGIN n_count := 0; FOR cur_inst IN cursor_inst LOOP SELECT COUNT (*) INTO n_count FROM stats$snapshot WHERE snap_time < sysdate-7 AND instance_number=cur_inst.instance_number; IF n_count > 0 THEN SELECT MIN(s.snap_id) , MAX(s.snap_id), MAX(di.dbid), MAX(di.instance_number) INTO var_lo_snap, var_hi_snap, var_db_id, var_instance_no FROM stats$snapshot s , stats$database_instance di WHERE s.dbid = di.dbid AND s.instance_number = di.instance_number AND di.startup_time = s.startup_time AND s.instance_number = cur_inst.instance_number AND s.snap_time < sysdate-7; noofsnapshot := statspack.purge( i_begin_snap => var_lo_snap , i_end_snap => var_hi_snap , i_snap_range => true , i_extended_purge => true , i_dbid => var_db_id , i_instance_number => var_instance_no); dbms_output.Put_line('snapshot deleted'||TO_CHAR(noofsnapshot)); END IF; END LOOP; END; / Procedure created.Após criada a procedure, estarei criando um job que executara o processo de limpeza diariamente.
SQL> declare my_job number; begin dbms_job.submit(job => my_job, what => 'perfstat.statspackpurge;', next_date => trunc(sysdate)+1, interval => 'trunc(sysdate)+1'); end; / PL/SQL procedure successfully completed.Para consultar os snpshots existentes, podemos usar o comando abaixo, conectados com o owner perfstat.
SQL> select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT; Snap Id SNAP_TIME -------- ------------------ 63 29/04/014 21:00:00 74 30/04/014 02:00:04 82 30/04/014 10:00:00 61 29/04/014 19:00:03 62 29/04/014 20:00:04 75 30/04/014 03:00:00 76 30/04/014 04:00:01 77 30/04/014 05:00:01 80 30/04/014 08:00:03 81 30/04/014 09:00:04 83 30/04/014 11:00:00 84 30/04/014 12:00:01 86 30/04/014 14:00:02 71 29/04/014 23:00:02 72 30/04/014 00:00:03 73 30/04/014 01:00:04 78 30/04/014 06:00:02 79 30/04/014 07:00:03 85 30/04/014 13:00:02 64 29/04/014 22:00:01 20 rows selected.Após gerado o snapshot, estarei gerando um relatório com a análise do ambiente. Assim como o AWR, para gerar o relatório do statspack, devemos selecionar um snapshot inicial e um final e posteriormente definimos o nome do arquivo a ser gerado, que pode ser precedido pelo local de destino.
Para executar o statspack deve executar o script spreport.sql, e informar os dados que serão solicitados para a geração do relatório.
SQL> @?/rdbms/admin/spreport.sql
Trecho final do statspack:
STATSPACK report for Database DB Id Instance Inst Num Startup Time Release RAC ~~~~~~~~ ----------- ------------ -------- --------------- ----------- --- 3442772195 dbtrn 1 16-Apr-14 16:48 11.2.0.4.0 NO Host Name Platform CPUs Cores Sockets Memory (G) ~~~~ ---------------- ---------------------- ----- ----- ------- ------------ cce Linux IA (32-bit) 1 0 0 2.0 Snapshot Snap Id Snap Time Sessions Curs/Sess Comment ~~~~~~~~ ---------- ------------------ -------- --------- ------------------ Begin Snap: 1 16-Apr-14 21:35:37 33 2.0 End Snap: 3 16-Apr-14 21:44:06 35 2.0 Elapsed: 8.48 (mins) Av Act Sess: 0.0 DB time: 0.34 (mins) DB CPU: 0.05 (mins) Cache Sizes Begin End ~~~~~~~~~~~ ---------- ---------- Buffer Cache: 752M Std Block Size: 8K Shared Pool: 240M Log Buffer: 15,360K Load Profile Per Second Per Transaction Per Exec Per Call ~~~~~~~~~~~~ ------------------ ----------------- ----------- ----------- DB time(s): 0.0 0.3 0.01 0.09 DB CPU(s): 0.0 0.0 0.00 0.01 Redo size: 4,975.9 34,694.7 Logical reads: 32.5 226.7 Block changes: 13.8 96.4 Physical reads: 0.0 0.1 Physical writes: 3.7 25.6 User calls: 0.4 3.0 Parses: 3.2 22.1 Hard parses: 0.2 1.4 W/A MB processed: 0.1 0.9 Logons: 0.1 0.5 Executes: 5.5 38.4 Rollbacks: 0.0 0.0 Transactions: 0.1 Instance Efficiency Indicators ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 99.99 Redo NoWait %: 100.00 Buffer Hit %: 99.96 Optimal W/A Exec %: 100.00 Library Hit %: 93.92 Soft Parse %: 93.49 Execute to Parse %: 42.43 Latch Hit %: 100.00 Parse CPU to Parse Elapsd %: 39.29 % Non-Parse CPU: 96.27 Shared Pool Statistics Begin End ------ ------ Memory Usage %: 84.57 85.56 % SQL with executions>1: 48.16 51.64 % Memory for SQL w/exec>1: 53.34 57.77 Top 5 Timed Events Avg %Total ~~~~~~~~~~~~~~~~~~ wait Call Event Waits Time (s) (ms) Time ----------------------------------------- ------------ ----------- ------ ------ control file parallel write 208 14 67 35.2 log file parallel write 94 8 90 21.4 db file async I/O submit 366 6 16 15.3 log file sync 37 5 131 12.3 CPU time 3 7.5 ------------------------------------------------------------- Host CPU (CPUs: 1 Cores: 0 Sockets: 0) ~~~~~~~~ Load Average Begin End User System Idle WIO WCPU ------- ------- ------- ------- ------- ------- -------- 0.44 0.55 1.09 0.96 97.94 11.98 Note: There is a 12% discrepancy between the OS Stat total CPU time and the total CPU time estimated by Statspack OS Stat CPU time: 570(s) (BUSY_TIME + IDLE_TIME) Statspack CPU time: 509(s) (Elapsed time * num CPUs in end snap)
- Para remover o statspack, baste executar o comando spdrop.sql.
@?/rdbms/admin/spdrop.sqlReferências:http://docs.oracle.com/cd/B10500_01/server.920/a96533/statspac.htm
Para ambientes RAC apenas é necessário a criação dos jobs nas 2 instancias, tanto o job para coleta, quanto o job para limpeza.
ResponderExcluir