User Tools

Site Tools


database:oracle

Umgebung

oracle-xe oder oracle-xe-universal?

In der -universal bekommt man eine Datenbank mit UTF-8 Zeichensatz, die “normale” hat Latin1 (ISO-8859-1). Wer nur westeuropäische Zeichen speichern muss, spart sich mit der Latin1 geringfügig Platz. Aber sobald Daten aus anderen Sprachen (kyrillisch, griechisch, chinesisch, japanisch, …) hinzukommen, kann man sich glücklich schätzen, wenn man schon mal eine UTF-8 Datenbank hat. Deshalb klare Empfehlung: Im Zweifelsfall immer oracle-xe-universal verwenden!

Wichtige Spracheinstellungen

Insbesondere, wenn man UTF-8 Zeichensatz verwendet, ist es bequemer, wenn die Semantik für die Breite von String-Spalten auf CHAR und nicht auf BYTE steht.

SELECT *
  FROM NLS_DATABASE_PARAMETERS
  WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_LENGTH_SEMANTICS', 'NLS_NCHAR_CHARACTERSET')
Parameter Value
NLSCHARACTERSET |AL32UTF8| |NLSLENGTHSEMANTICS |BYTE| |NLSNCHAR_CHARACTERSET AL16UTF16

Umstellung auf char-Semantik:

ALTER system SET nls_length_semantics=CHAR scope=spfile

FIXME in der XE scheint das nicht zu funktionieren, aber selbst nach Neustart bleibt die Semantik auf BYTE.

oracle@minty ~ $ strings ./app/oracle/product/10.2.0/server/dbs/spfileXE.ora | grep semantics
*.nls_length_semantics='CHAR'

Installation Oracle XE auf Debian/Ubuntu amd64

Die Standardprozedur (/etc/apt/sources.list ergänzen und apt-get install oracle-xe) funktioniert für 64-Bit Debian nicht. Deshalb mit dieser etwas aufwändigeren Prozedur installieren:

Root-Shell aufmachen:

sudo -s

Sicherstellen, dass 386-Libraries installiert sind:

dpkg -L libc6-i386 > /dev/null

Wenn gemeckert wird, dass es das Paket nicht gibt, dann installieren:

apt-get install libc6-i386

Packages herunterladen (ggf. Versionsnummern anpassen):

cd /root
wget http://oss.oracle.com/debian/dists/unstable/main/binary-i386/libaio_0.3.104-1_i386.deb
wget http://oss.oracle.com/debian/dists/unstable/non-free/binary-i386/oracle-xe-universal_10.2.0.1-1.1_i386.deb
dpkg -i --force-architecture libaio_0.3.104-1_i386.deb
dpkg -i --force-architecture oracle-xe-universal_10.2.0.1-1.1_i386.deb
/etc/init.d/oracle-xe configure

Ausgabe (hier mit geändertem Port, außerdem wird die Datenbank beim Start von Linux nicht gestartet:

Specify the HTTP port that will be used for Oracle Application Express [8080]:18080
Specify a port that will be used for the database listener [1521]:
Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 
different passwords for each database account.  This can be done after 
initial configuration:
Confirm the password:
Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:n

Je nachdem, auf welchem Port der HTTP-Listener konfiguriert wurde, ist das Frontend im Browser zu erreichen.
Nachdem fast jeder Servlet-Container standardmäßig auf Port 8080 geht, hab ich Oracle auf 18080 gelegt:

Umgebung einrichten

/etc/profile.d/oracle_xe.sh
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export ORACLE_SID=XE
PATH=$PATH:$ORACLE_HOME/bin

Start und Stop von Oracle XE

Wenn Oracle so konfiguriert ist, dass beim Booten gestartet wird, wird so gestartet und gestoppt:

/etc/init.d/oracle-xe start

# ... mit Oracle arbeiten ...

/etc/init.d/oracle-xe stop

Ist Oracle nicht mit automatischem Start konfiguriert, dann muss vorher aktiviert werden:

/etc/init.d/oracle-xe enable
/etc/init.d/oracle-xe start

# ... mit Oracle arbeiten ...

/etc/init.d/oracle-xe stop
/etc/init.d/oracle-xe disable

Connect/Startup/Shutdown

system/manager, scott/tiger, sys/oracle [[as sysdba|sysoper]
connect username/pwd@service
sqlplus /nolog
ps -ax | grep -e ora_
STARTUP [[NOMOUNT|MOUNT|OPEN] [[pfile=<filename>] ;

init.ora: /usr/oraInventory/admin/<instancename>/init<instancename>.ora oder: $ORACLE_HOME/dbs/…

SHUTDOWN [[NORMAL|IMMEDIATE|TRANSACTIONAL|ABORT] ;

Oracle Architecture

  • DBWn: at least one Database Writer
  • LGWR: Log Writer (redo log buffer)
  • ARCH: Archiver copies offline redo logs (optional)
  • CKPT: Checkpoint: DBWR writes all modified data blocks to data files
  • SMON: System Monitor: performs internal ops, free space, …
  • PMON: Process Monitor: notices when user connections have been broken
  • RECO: Recoverer: resolve in-doubt distributed transactions
  • SNPn: Job Queue (Snapshot Process), QMNn (Adv. Queue Time Mgr)

Checking status of background process: v$bgprocess where paddr<>'00' Dedicated Server Architecture: foreground proc for each client connection

Multithreaded Servers (MTS):

  • must start at least one dispatcher for every network protocol
  • automatically adjust the number of shared servers (threadcount?)
  • Configuring for MTS Connections: Starter Kit (54ff)

TNS

TNS: Transparent Network Substrate TNS Connection Pooling, TNS Listener $ORACLEHOME/network/admin/… * tnsnames.ora: address information * sqlnet.ora: special config params * listener.ora: only on servers Oracle Names: centrally manage network names and addresses Net8 Assistant: netasst ($ORACLEHOME/bin) Starting/Stopping Listener: lsnrctl [[STATUS|START|STOP|HELP|…]

Entsprechung JDBC-Connect-String und TNS:

  • (DESCRIPTION=(ADDRESSLIST=(ADDRESS=(PROTOCOL=TCP)(Host=myhost)(Port=1599)))(CONNECTDATA=(SID=mysid)))
  • jdbc:oracle:thin:@myhost:1599:mysid

Startup

/etc/oratab, /etc/rc.d/init.d/dbora, $ORACLE_HOME/bin/dbshut,dbstart
/etc/oratab: $ORACLE_SID:$ORACLE_HOME$:{Y|N}

Oracle Users

useradd xyz -d /usr/xyz -g sysdba
passwd xyz
/usr/oracle/.bash_profile:
   ORAENV_ASK=NO; export ORAENV_ASK
   . /usr/local/bin/oraenv

start session with oracle user; end session account login file:

   . /usr/local/bin/oraenv

SQL/SQL*Plus

l=list, del, i=insert, a=append, host, @=start, set
DESCRIBE <tablename>;
NVL(expr, <if_null_value>)
DECODE(expr, val1, then1, val2, then2, else)
outer join: WHERE tab1.id = tab2.id (+)
SET TRANSACTION [[READ WRITE|READ ONLY]
abbrev for BEGIN foo(); END ==> EXECUTE foo();

DDL

Schema

  • database schema = database user
  • Referential integrity: on update/delete RESTRICT, CASCADE, SET NULL, SET DEFAULT
  • constraint violation: automatic rollback effects of statement
  • deferrable integrity constraint
  CREATE TABLE tab (
   col datatype [[DEFAULT expr]
   [[CONSTRAINT constraint_name]
   [[NOT] NULL | UNIQUE|PRIMARY KEY
   | REFERENCES tab [[(col)] [[ON DELETE CASCADE]
   | CHECK(condition)
   , [[CONSTRAINT constraint_name]
     {UNIQUE|PRIMARY KEY} (col [[,col] ...)
     | FOREIGN KEY (col, col) REFERENCES tab [[(col, col)]
       [[ON DELETE {CASCADE|SET NULL}
     | CHECK(condition)
  )
  ALTER TABLE MODIFY col NOT NULL;
  ALTER TABLE ADD CONSTRAINT constraint ... [[DEFERRABLE]
  ALTER TABLE ADD (col datatype ..., col datatype ...)
 
  SET CONSTRAINT[[S] {constr1, constr2 | ALL} {IMMEDIATE | DEFERRED}

Views

  CREATE OR REPLACE VIEW viewName AS subquery [[WITH READ ONLY]
  CREATE TRIGGER tr_name INSTEAD OF INSERT ON viewName ...

Sequences

  CREATE SEQUENCE seqName START WITH int INCREMENT BY int
   MAXVALUE int | NOMAXVALUE (analog MINVALUE)
   CYCLE|NOCYCLE  CACHE int | NOCACHE  ORDER | NOORDER
 
  SELECT sq.NEXTVAL, sq.CURRVAL

Synonyms

  CREATE [[PUBLIC] SYNONYM synName FOR object

Indexes

  CREATE [[UNIQUE] INDEX indexName ON tableName (col ASC|DESC, ...)

Data Dictionary (USER_xxx, DBA_xxx, ALL_xxx)

USERTABLES, USERTABCOLUMNS, USERCONSTRAINTS, USERCONSCOLUMNS USERVIEWS, USERSEQUENCES, USERSYNONYMS, USEROBJECTS USERINDEXES, USERIND_COLUMNS

  • DBA_ SELECT ANY TABLE priviledge
  • ALL_ specific to the priviledge domain of the current user
  • USER_ specific to the current user

DBA

DBA misc

DROP USER scott cascade;
 
CREATE tablespace ts_abc
  datafile '/usr/lib/oracle/xe/oradata/XE/ts_abc.dbf'
  size 600 M reuse autoextend ON next 100 M online permanent;
 
CREATE USER scott identified BY tiger DEFAULT tablespace ts_abc;
 
grant dba TO scott;
grant CONNECT, CREATE SYNONYM TO read_scott;

imp, exp

exp scott/tiger@xe owner=scott file=scott-20100420.exp rows=y log=exp_scott.log

update statistics

BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS (
  ownname           => 'SCOTT',
  estimate_percent  => NULL,              -- Small table, lets compute
  block_sample      => FALSE,
  method_opt        => 'FOR ALL COLUMNS',
  degree            => NULL,              -- No parallelism used in this example
  granularity       => 'ALL',
  cascade           => TRUE,              -- Make sure we include indexes
  options           => 'GATHER'           -- Gather mode
  );
END;
/

Es gibt wohl Fälle, in denen gatherschemastats nicht zu dem Ergebnis führt, dass der Optimizer besser arbeitet.
Alternativ könnte man auch folgendes Kommando ausführen:

EXECUTE DBMS_UTILITY.analyze_schema('SCOTT','COMPUTE');

recompile schema

database/oracle.txt · Last modified: 2011/05/27 19:09 by hgoebl