Script Collection - die wichtigsten Scripte für DBA- und Betriebstätigkeiten
Diese Scripte können frei verwendet werden. Alle Packages können so lange frei genutzt werden wie der Inhalt nicht verändert und die Copyright-Information nicht entfernt wird.
Scriptliste
Common Logging
Script herunterladen (pkg_common_logging.sql)
Das Paket kann als Standard-Logging-Framework in anderen Paketen eingesetzt werden. Die Loginformationen werden als autonome Transaktionen gespeichert. Es werden die Loglevel Debug, Info und Error unterstützt. Beispielnutzung:
begin
pkg_common_logging.init_log (
your_package_name,
your_subject,
'start'
);
-- some code
pkg_common_logging.write_log('started: '||v_owner||'.'||v_table_name);
-- some insert
pkg_common_logging.write_log_ins;
-- some delete
pkg_common_logging.write_log_del;
-- some update
pkg_common_logging.write_log_upd;
-- rest of code
pkg_common_logging.reset_log;
exception
when others then
-- log errors
PKG_COMMON_LOGGING.WRITE_LOG_ERROR;
commit;
raise;
end;Automatic Table Rebuild mit dbms_redefinition
Script herunterladen (PKG_OBJ_RBLD.sql)
Mit diesem Paket können Tabellen mittels dbms_redefinition bearbeitet werden. Die Wartungsarbeiten können dabei bei laufendem Betrieb ausgeführt werden. Es sind folgende Anwendungsfälle abgedeckt:
- Tabellen-Maintenance analog zu imp/exp der gesamten Tabelle
- Verschieben der Tabelle in einen neuen Tablespace
- Maintenance einzelner Partitionen oder aller Partitionen einer Tabelle
- Umpartitionieren einer Tabelle bzw Ändern von partitionierter in nicht partitionierte Tabellen und v.vs.
Beispielnutzung:
-- Partitionsweiser Umzug einer Tabelle in einen neuen (default) Tablespace
exec pkg_common_logging.set_log_level(3);
exec PKG_OBJ_RBLD.set_force_ddl(true);
exec PKG_OBJ_RBLD.use_orig_tbsp(false);
exec PKG_OBJ_RBLD.set_keep_intermed(true);
exec PKG_OBJ_RBLD.set_ddl_source_table('REBUILD_TABLE');
exec PKG_OBJ_RBLD.RUN_TBL_RBLD('OWNER','ORIGINAL_TABLE');
-- aus einer partitionierten Tabelle eine einfache Tabelle in einen neuen (default) Tablespace erstellen
exec pkg_common_logging.set_log_level(3);
exec PKG_OBJ_RBLD.set_force_ddl(true);
exec PKG_OBJ_RBLD.use_orig_tbsp(false);
exec PKG_OBJ_RBLD.set_remove_part(true);
exec PKG_OBJ_RBLD.RUN_TBL_RBLD('OWNER','ORIGINAL_TABLE');Automatic Table Partitioning mit dbms_redefinition und Partitionserstellung + Monitoring
Script herunterladen (pkg_tab_part.sql)
Mit diesem Paket können aus einfachen Tabellen mittels dbms_redefinition automatisch range-partitionierte Tabellen erstellt werden. Die Wartungsarbeiten können dabei bei laufendem Betrieb ausgeführt werden.
Beispielnutzung:
-- welche Tabelle soll partitiniert werden
exec pkg_tab_part.set_ddl_source_table('owner.Table_Name_not_partitioned');
-- nach welcher Spalte soll partitioniet werden, bei welchem Datum wird begonnen
exec pkg_tab_part.create_base_tab('part_column_name',sysdate -100);
-- erstellen initialer Partitionen
exec pkg_tab_part.add_parts('MONTH|WEEK|DAY',sysdate -100, sysdate +10);
-- ausführen von dbms_redefinition
exec pkg_tab_part.run_redefinition;Data Pump Wrapper für die Übertragung von Tabellen, Tabellengruppen und Schemas über einen DB Link
Script herunterladen (pkg_dp_transfer.sql)
Mit diesem Paket können über einen Database-Link Tabellen, Tabellengruppen und Schemas mittels Data Pump übertragen werden. Die Konfiguration des DB Links und des Tablespace-Mappings erfolgt im Package.
CREATE OR REPLACE package body pkg_dp_transfer as
c_version constant varchar2(32) := '01.00 / 20121105';
c_remote_link constant varchar2(32):= 'DB_LINK'; -- hier wird der DB Link eingetragen
type tbsp_type is table of varchar2(128);
-- hier werden die zu Mappenden Tablespaces angegeben
v_ar_remap_tbsp_rule tbsp_type := tbsp_type('TBSP1:TBSP_NEW,TBSP2:TBSP_NEW');
-- in diesem Fall findet kein Tablespace Mapping statt
--v_ar_remap_tbsp_rule tbsp_type := tbsp_type();
function show_version return varchar2
is
...
end;
Beispielnutzung:
-- kopieren einer Tabelle
exec pkg_dp_transfer.run_table('OWNER', 'TABLE_NAME');
--Kopieren eines Schemas ohne Tabelleninhalte
exec pkg_dp_transfer.run_schema('OWNER', true);
--Kopieren eines Schemas mit Tabelleninhalte
exec pkg_dp_transfer.run_schema('OWNER', false);Einige wichtige Scripte zum Suchen von potentiell schlecht laufenden SQL Statements.
Anzeige der TOP5 SQL Statements nach Disk-Reads, der SQL Statements nach genutzter CPU-Zeit und Ausführungszeit
-- top 5 full table scans
--
SELECT Disk_Reads DiskReads,
Executions,
SQL_ID,
SQL_Text SQLText,
SQL_FullText SQLFullText
FROM ( SELECT Disk_Reads,
Executions,
SQL_ID,
LTRIM (SQL_Text) SQL_Text,
SQL_FullText,
Operation,
Options,
ROW_NUMBER ()
OVER (PARTITION BY sql_text
ORDER BY Disk_Reads * Executions DESC)
KeepHighSQL
FROM (SELECT AVG (Disk_Reads) OVER (PARTITION BY sql_text)
Disk_Reads,
MAX (Executions) OVER (PARTITION BY sql_text)
Executions,
t.SQL_ID,
sql_text,
sql_fulltext,
p.operation,
p.options
FROM v$sql t, v$sql_plan p
WHERE t.hash_value = p.hash_value
AND p.operation = 'TABLE ACCESS'
AND p.options = 'FULL'
AND p.object_owner NOT IN ('SYS', 'SYSTEM')
AND t.Executions > 1)
ORDER BY DISK_READS * EXECUTIONS DESC)
WHERE KeepHighSQL = 1 AND ROWNUM <= 5;
--
-- top sql's
--
SELECT *
FROM (SELECT sql_id,
sql_text,
cpu_time / 1000000 cpu_time,
elapsed_time / 1000000 elapsed_time,
disk_reads,
buffer_gets,
rows_processed
FROM v$sqlarea)
ORDER BY cpu_time DESC
SELECT *
FROM ( SELECT sql_fulltext,
sql_id,
child_number,
disk_reads,
executions,
first_load_time,
last_load_time
FROM v$sql
ORDER BY elapsed_time DESC)
WHERE ROWNUM < 10;
--
-- show execution plan
--
SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR ('&sql_id', &child));
Beispiel für die Nutzung des SQL Tuning Advisors
Anzeige der TOP5 SQL Statements nach Disk-Reads, der SQL Statements nach genutzter CPU-Zeit und Ausführungszeit
set serveroutput on;
/
DECLARE
l_sql VARCHAR2(500);
l_sql_tune_task_id VARCHAR2(100);
BEGIN
-- hier kommt das sql script!
l_sql := 'select cp_trf.* FROM rpt_summary_x x, vic_cp_trf cp_trf '||
'where x.toi_no = cp_trf.toi_no(+) AND x.suffix = cp_trf.suffix(+)';
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
sql_text => l_sql,
bind_list => sql_binds(anydata.ConvertNumber(100)),
user_name => owner,
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 60,
task_name => 'vic_cp_trf',
description => 'Tuning task for an vic_cp_trf.');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'vic_cp_trf');
SELECT task_name, status FROM dba_advisor_log WHERE owner = OWNER;
SET LONG 10000;
SET PAGESIZE 1000
SET LINESIZE 200
SELECT DBMS_SQLTUNE.report_tuning_task('vic_cp_trf') AS recommendations FROM dual;
SET PAGESIZE 24
Monitoring der Nutzung von Tabellen
Script herunterladen (monitor_tables_usage.sql)
Das Script erstellt mittels FGAC (Fine-Grained Access Control) eine Liste aller genutzten Tabellen. Somit lassen sich nach einer je nach Applikation unterschiedlichen Laufzeit alle nicht benötigten Tabellen identifizieren
Liste aller laufenden SQL's
Script herunterladen (session_report.sql)
Das Script listet für alle laufenden SQL Statements das jeweilige Statement und die Session sowie die logops-Informationen auf.