Oracle DataPump via PL/SQL - DBMS_DATAPUMP

Oracle DataPump hat sich bei vielen Anwendern aufgrund seiner Vorteile als Import/Export-Werkzeug durchgesetzt. Neben den Werkzeugen impdp und expdp lässt sich die DataPump auch via PL/SQL steuern. Hierzu dient das Package DBMS_DATAPUMP. Die Verwendung für einen Schema-Export zeigt folgendes Beispiel:

DECLARE
  v_DPHandle_n      NUMBER;
  v_TimeStamp_vc    VARCHAR2(15);
  v_JobName_vc      VARCHAR2(30);
  v_DumpFilename_vc VARCHAR2(50);
  v_LogFilename_vc  VARCHAR2(50);
  v_JobStatus_vc    VARCHAR2(50);
  v_SchemaName_vc   VARCHAR2(8)  := 'SCOTT';
  
  -- dieses Oracle-Verzeichnis muss evtl. vorher angelegt werden
  --
  -- CREATE OR REPLACE DIRECTORY DPUMP_TEST_DIR AS '/tmp';
  --
  -- evtl. muessen auch Schreib-/Lese-Rechte gesetzt werden
  --
  -- GRANT READ, WRITE ON DIRECTORY DPUMP_TEST_DIR TO orauser;
  --
  v_DumpDir_vc      VARCHAR2(20) := 'DPUMP_TEST_DIR';
BEGIN
  v_TimeStamp_vc    := TO_CHAR(sysdate, 'YYYYMMDD-HH24MISS');
  v_JobName_vc      := v_TimeStamp_vc || '_' || v_SchemaName_vc;
  
  -- wichtig ist der Platzhalter %U, je nach Parallelitaet werden so
  -- mehrere Dump-Files erzeugt
  v_DumpFilename_vc := v_SchemaName_vc || '_' || v_TimeStamp_vc || '_%U.dmp';
  v_LogFilename_vc  :=  v_SchemaName_vc || '_' || v_TimeStamp_vc || '.log';
    
  -- Datapump-Job oeffnen  
  v_DPHandle_n := DBMS_DATAPUMP.open(
    operation   => 'EXPORT',
    job_mode    => 'SCHEMA',
    job_name    => v_JobName_vc
  );

  -- Dump-File fuer den Job definieren
  DBMS_DATAPUMP.add_file(
    handle    => v_DPHandle_n,
    filename  => v_DumpFilename_vc,
    directory => v_DumpDir_vc
  );

  -- Log-File definieren
  DBMS_DATAPUMP.add_file(
    handle    => v_DPHandle_n,
    filename  => v_LogFilename_vc,
    directory => v_DumpDir_vc,
    filetype  => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE
  );

  -- welches Schema soll exportiert werden?
  DBMS_DATAPUMP.metadata_filter(
    handle => v_DPHandle_n,
    name   => 'SCHEMA_EXPR',
    value  => '= ''' || v_SchemaName_vc || ''''
  );
    
  -- Parallelitaet auf 4 setzen  
  DBMS_DATAPUMP.SET_PARALLEL(
    handle => v_DPHandle_n,
    degree => 4
  );
    
  -- eigene Eintraege im Log-File sind moeglich
  DBMS_DATAPUMP.LOG_ENTRY(
    handle => v_DPHandle_n,
    message => '---> Schema Export via PL/SQL'
  );

  -- Job starten
  DBMS_DATAPUMP.start_job(v_DPHandle_n);
 
  -- auf das Job Ende wird normalerweise nicht gewartet
  -- mit WAIT_FOR_JOB laesst sich dies aber bei Bedarf
  -- realisieren
  DBMS_DATAPUMP.WAIT_FOR_JOB(
    handle => v_DPHandle_n,
    job_state => v_JobStatus_vc
  );
  
END;
/

Ein allgemeiner Hinweis zu Oracle DataPump:
DataPump-Prozesse laufen immer auf dem Oracle-Server!
Dies hat in der Praxis folgende Auswirkungen:

  • Der Betriebssystem-Benutzer, dem die Oracle-Server Prozesse zugeordnet sind, braucht Schreib-Rechte auf dem gewünschten Export-Verzeichnis (läuft die Datenbank-Instanz als Windows-Dienst und dem Benutzer LocalSystem ist kein Schreiben auf Netzwerk-Shares möglich, da dieser Benutzer keine Netzwerk-Shares sieht)
  • Es gibt keinen Client-/Server-Modus (z.B. Export eines Schemas von einem entfernten Oracle Server über einen lokalen Oracle Client)

Links for Oracle Application Express

Mario a colleague of mine is starting to work on an project to extend an PL/SQL-based web application - so I thought it would be a good idea to give him a view links for Oracle Application Express - Que se divierta con ella.

Sometimes customers have the need for an ad hoc web development tool, especially when an PHP- or Java-based approach seams to be oversized. One solution provided from Oracle is called Application Express (APEX) - the former name was HTML-DB.

To get an first impression from APEX I recommend to view the APEX Quick Tour at the Oracle website.

The Official Home Page for Oracle Application Express can be found here.

To get you started with APEX and AJAX I have to links for you:

Well and for Charting you have a lot of options too:

Cloning Oracle Homes

You are tired of installing and patching Oracle Software over and over again and creating response files for a silent installation is to cumbersome for you? May be Oracle Home cloning is what you are looking for!

Step 1 - Create an tar-file on the source server

[oracle@centos4-ora10g ~]$ cd /opt/oracle/
[oracle@centos4-ora10g oracle]$ tar -cjf ~/ora10gr2.tar.bz2 ora10g
[oracle@centos4-ora10g oracle]$ cd
[oracle@centos4-ora10g ~]$ ls -l
total 583484
-rw-r--r--  1 oracle oinstall 596885752 Jan 23 08:45 ora10gr2.tar.bz2
-rw-r--r--  1 oracle oinstall      1023 Oct 26  2006 oraenv.sh
-rw-r--r--  1 oracle oinstall       804 Jul 14  2007 ora_gc.sh

Step 2 - Copy the tar-file to the target

[oracle@centos4-ora10g ~]$ scp ora10gr2.tar.bz2 oracle@192.168.76.100:/tmp/

Step 3 - Extract the tar-file on the target

-bash-2.05b$ cd /opt/oracle/
-bash-2.05b$ tar -xjf /tmp/ora10gr2.tar.bz2

Step 4 - Start the Cloning process

-bash-2.05b$ /opt/oracle/ora10g/oui/bin/runInstaller \\
-silent \\
-clone ORACLE_HOME="/opt/oracle/ora10g" \\
ORACLE_HOME_NAME="ora10g"

Starting Oracle Universal Installer...

You can find a log of this install session at:
 /opt/oracle/oraInventory/logs/cloneActions2008-02-26_05-42-48AM.log

Installation in progress (Tue Feb 26 05:44:01 CET 2008)
Install successful

Linking in progress (Tue Feb 26 05:44:09 CET 2008)
Link successful

Setup in progress (Tue Feb 26 05:47:50 CET 2008)
Setup successful

End of install phases.(Tue Feb 26 05:48:00 CET 2008)

Step 5 - Run the orainstRoot.sh and root.sh as usual

$ su -
Password: 
[root@centos3-t01 root]# /opt/oracle/oraInventory/orainstRoot.sh
Changing permissions of /opt/oracle/oraInventory to 770.
Changing groupname of /opt/oracle/oraInventory to oinstall.
The execution of the script is complete
[root@centos3-t01 root]# /opt/oracle/ora10g/root.sh

Step 6 - Configuration and Cleanup

The Oracle Home is now ready to use, but before you start with your configuration work,
check and cleanup the following directories:

  • $ORACLE_HOME/dbs
  • $ORACLE_HOME/network/admin

Material für meinen Oracle Grid Control Vortrag

Wie bereits angekündigt, halte ich dieses Jahr einen Vortrag zu Oracle Grid Control auf der 20. Deutsche ORACLE-Anwenderkonferenz in Nürnberg. Meine Präsentation steht ab jetzt unter http://www.fm-berger.de/download/oragc-02.pdf zum Download bereit.

Hier noch einige Links zu diesem Thema:

Access MySQL Databases with Oracle HSODBC

Sometimes you need to access data stored in an different RDBMS like MySQL. Oracle provides an convenient way to access external data-sources via ODBC. To use Oracle HSODBC you can follow my step-by-step notes:

  • Install unixODBC and the MySQL ODBC Driver
    For Fedora Core 6 I installed the following RPMs:

    • unixODBC-2.2.11-7.1
    • mysql-connector-odbc-3.51.12-2.2
  • Configure /etc/odbc.ini
    [ODBC Data Sources]
    TimeSheetTest = MySQL ODBC PHP.TimeSheetTest DSN
    
    [TimeSheetTest]
    Driver       = /usr/lib/libmyodbc3.so
    Description  = MySQL ODBC 3.51 Driver DSN
    SERVER       = localhost
    PORT         = 3306
    USER         = root
    Password     = SECRET
    Database     = timesheet
    OPTION       = 3
    SOCKET       =
    
  • Test the ODBC Connection via isql
    [frank@w0004]$ isql TimeSheetTest
    Connected!
    sql-statement
    help [tablename]
    quit
    SQL> 
    
  • Oracle Configuration
    First ensure that the shell environment used to start the Oracle listener includes the following
    environment variables:

    export ODBCINI=/etc/odbc.ini
    export ODBCSYSINI=/etc
    

    To integrate that ODBC connection into Oracle you have to edit several configuration files:

    $ORACLE_HOME/hs/admin/initTimeSheetTest.ora

    HS_FDS_CONNECT_INFO = TimeSheetTest
    HS_FDS_TRACE_LEVEL = off
    HS_FDS_SHAREABLE_NAME = /usr/lib/libmyodbc3.so
    

    $ORACLE_HOME/network/admin/listener.ora

    ...
    SID_LIST_LISTENER =
    ...
        (SID_DESC =
          (PROGRAM = hsodbc)
          (ORACLE_HOME = /opt/oracle/ora10g)
          (SID_NAME = TimeSheetTest)
          (ENVS=LD_LIBRARY_PATH = /usr/lib:/opt/oracle/ora10g/lib)
        )
      )
    ...
    

    $ORACLE_HOME/network/admin/tnsnames.ora

    ...
    TIMESHEET = (DESCRIPTION = 
        (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)))
        (CONNECT_DATA = (SID= TimeSheetTest))(HS=OK)
      )
    ...
    
  • Test the Configuration with tnsping
    $ tnsping timesheet
    
    TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 05-SEP-2007 18:26:16
    
    Copyright (c) 1997, 2005, Oracle.  All rights reserved.
    
    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
    (HOST = localhost)(PORT = 1521))) (CONNECT_DATA = (SID= TimeSheetTest))(HS=OK))
    OK (10 msec)
    
  • Create an Oracle Link in your Oracle Database instance
    SQL> CREATE PUBLIC DATABASE LINK timesheet
      CONNECT TO "root" IDENTIFIED BY "SECRET" USING 'TIMESHEET';
    

Please note that MySQL is case-sensitive on tablenames, so you have to use:

SQL> select * from "timesheet_times"@timesheet;
...