Liste des paramètres cachés d’ASM en 11.2.0.4

ASM pas de Commentaire »

Comment obtenir la liste des paramètres cachés d’ASM.

col value for a8
SQL> col name for a39
col describe for a70
SQL> set lines 260 pages 100
SQL> select a.ksppinm name, b.ksppstvl value, a.ksppdesc describe
2 from x$ksppi a, x$ksppcv b
3 where a.inst_id = userenv(’Instance’)
and b.inst_id = userenv(’Instance’)
5 and a.indx = b.indx
6 and a.ksppinm like ‘\_asm%’ escape ‘\’
7 order by name;

NAME VALUE DESCRIBE
————————————— ——– ———————————————————————-
_asm_acd_chunks 1 initial ACD chunks created
_asm_admin_with_sysdba FALSE Does the sysdba role have administrative privileges on ASM?
_asm_allow_appliance_dropdisk_noforce FALSE Allow DROP DISK/FAILUREGROUP NOFORCE on ASM Appliances
_asm_allow_lvm_resilvering TRUE Enable disk resilvering for external redundancy
_asm_allow_only_raw_disks TRUE Discovery only raw devices
_asm_allow_system_alias_rename FALSE if system alias renaming is allowed
_asm_appliance_config_file Appliance configuration file name
_asm_ausize 1048576 allocation unit size
_asm_automatic_rezone TRUE automatically rebalance free space across zones
_asm_avoid_pst_scans TRUE Avoid PST Scans
_asm_blksize 4096 metadata block size
_asm_check_for_misbehaving_cf_clients FALSE check for misbehaving CF-holding clients
_asm_compatibility 10.1 default ASM compatibility level
_asm_dba_batch 500000 ASM Disk Based Allocation Max Batch Size
_asm_dba_spcchk_thld 20000 ASM Disk Based Allocation Space Check Threshold
_asm_dba_threshold 0 ASM Disk Based Allocation Threshold
_asm_dbmsdg_nohdrchk FALSE dbms_diskgroup.checkfile does not check block headers
_asm_diag_dead_clients FALSE diagnostics for dead clients
_asm_direct_con_expire_time 120 Expire time for idle direct connection to ASM instance
_asm_disable_amdu_dump FALSE Disable AMDU dump
_asm_disable_async_msgs FALSE disable async intra-instance messaging
_asm_disable_multiple_instance_check FALSE Disable checking for multiple ASM instances on a given node
_asm_disable_profilediscovery FALSE disable profile query for discovery
_asm_disable_smr_creation FALSE Do Not create smr
_asm_disable_ufg_dump FALSE disable terminated umbilicus diagnostic
_asm_disk_repair_time 14400 seconds to wait before dropping a failing disk
_asm_emulate_nfs_disk FALSE Emulate NFS disk test event
_asm_emulmax 10000 max number of concurrent disks to emulate I/O errors
_asm_emultimeout 0 timeout before emulation begins (in 3s ticks)
_asm_evenread 2 ASM Even Read level
_asm_evenread_alpha 0 ASM Even Read Alpha
_asm_evenread_alpha2 0 ASM Even Read Second Alpha
_asm_evenread_faststart 0 ASM Even Read Fast Start Threshold
_asm_fail_random_rx FALSE Randomly fail some RX enqueue gets
_asm_fd_cln_idle_sess_twait 10000000 Idle session time wait to run ASM FD cleanup
_asm_fd_cln_on_fg TRUE ASM stale FD cleanup on foregrounds
_asm_fob_tac_frequency 9 Timeout frequency for FOB cleanup
_asm_force_quiesce FALSE Force diskgroup quiescing
_asm_global_dump_level 267 System state dump level for ASM asserts
_asm_hbeatiowait 15 number of secs to wait for PST Async Hbeat IO return
_asm_hbeatwaitquantum 2 quantum used to compute time-to-wait for a PST Hbeat check
_asm_imbalance_tolerance 3 hundredths of a percentage of inter-disk imbalance to tolerate
_asm_instlock_quota 0 ASM Instance Lock Quota
_asm_iostat_latch_count 31 ASM I/O statistics latch count
_asm_kfdpevent 0 KFDP event
_asm_kfioevent 0 KFIO event
_asm_kill_unresponsive_clients TRUE kill unresponsive ASM clients
_asm_libraries ufs library search order for discovery
_asmlib_test 0 Osmlib test event
_asm_log_scale_rebalance FALSE Rebalance power uses logarithmic scale
_asm_lsod_bucket_size 67 ASM lsod bucket size
_asm_max_cod_strides 5 maximum number of COD strides
_asm_maxio 1048576 Maximum size of individual I/O request
_asm_max_redo_buffer_size 2097152 asm maximum redo buffer size
_asm_partner_target_disk_part 8 target maximum number of disk partners for repartnering
_asm_partner_target_fg_rel 4 target maximum number of failure group relationships for repartnering
_asm_primary_load 1 Number of cycles/extents to load for non-mirrored files
_asm_primary_load_cycles TRUE True if primary load is in cycles, false if extent counts
_asm_random_zone FALSE Random zones for new files
_asm_rebalance_plan_size 120 maximum rebalance work unit
_asm_rebalance_space_errors 4 number of out of space errors allowed before aborting rebalance
_asm_repairquantum 60 quantum (in 3s) used to compute elapsed time for disk drop
_asm_reserve_slaves TRUE reserve ASM slaves for CF txns
_asm_root_directory ASM ASM default root directory
_asm_runtime_capability_volume_support FALSE runtime capability for volume support returns supported
_asm_secondary_load 10000 Number of cycles/extents to load for mirrored files
_asm_secondary_load_cycles FALSE True if secondary load is in cycles, false if extent counts
_asm_serialize_volume_rebalance FALSE Serialize volume rebalance
_asm_shadow_cycle 3 Inverse shadow cycle requirement
_asmsid asm ASM instance id
_asm_skip_rename_check FALSE skip the checking of the clients for s/w compatibility for rename
_asm_skip_resize_check FALSE skip the checking of the clients for s/w compatibility for resize
_asm_storagemaysplit FALSE PST Split Possible
_asm_stripesize 131072 ASM file stripe size
_asm_stripewidth 8 ASM file stripe width
_asm_sync_rebalance FALSE Rebalance uses sync I/O
_asm_usd_batch 64 ASM USD Update Max Batch Size
_asm_wait_time 18 Max/imum time to wait before asmb exits

78 ligne(s) selectionnee(s).

SQL>

Comme vous pouvez le constater, il y en a un certain nombre.

Comment augmenter le délai heatbeep ASM pendent lequel un disque n’est pas considéré comme offline lors d’une bascule multipath pas assez rapide!!!

ASM, Cluster RAC pas de Commentaire »

Augmenter le délai heartbeep pendent lequel un disque n’est pas considéré comme offline lors d’une bascule multipath pas assez rapide. Ou comment utiliser un paramètre caché d’ASM 11GR2!!!

Le contexte :
Rac étendu en version 11.2.0.4 avec deux diskgroups en miroir et un accès aux LUN’s en ISCSI vers des baies DELL EQUALOGIC.

Le multipath est configuré avec le driver multipath propriétaire de DELL puisque les bascules en driver linux natifs sont extrêmement lentes.
La configuration ASM a donc été faite sur des chemins du type /dev/eql/XXXXXX.

Quand on teste la perte d’une des deux cartes dédiées au ISCSI, la couche multipath doit gérer les io’s à travers le deuxième chemin.
Aléatoirement lorsque que l’on coupe le port du switch ou la carte ISCSI, nous allons perdre des disques d’un des deux diskgroups ou pas.

########################################################################
# ETAT DES DISQUES #
########################################################################

GROUP_NUMBER NAME STATE FAILGROUP PATH
———— ——————– ———- ——————– ———————————————
0 NORMAL /dev/oracleasm/disks/DSK_CLITX_FRA02
0 NORMAL /dev/oracleasm/disks/DSK_CLITX_DATA01
0 NORMAL /dev/oracleasm/disks/DSK_CLITX_OCR02
1 CLITX_DATA01 NORMAL FG_CLITX_DATA
1 CLITX_DATA05 NORMAL FG_CLITX_DATA /dev/oracleasm/disks/DSK_CLITX_DATA05
1 CLITX_DATA03 NORMAL FG_CLITX_DATA /dev/oracleasm/disks/DSK_CLITX_DATA03
1 CLITX_DATA02 NORMAL FG_CLITX_DATA /dev/oracleasm/disks/DSK_CLITX_DATA02
1 CLITX_DATA04 NORMAL FG_CLITX_DATA /dev/oracleasm/disks/DSK_CLITX_DATA04
1 TCY_DATA02 NORMAL FG_TCY_DATA /dev/oracleasm/disks/DSK_TCY_DATA02
1 TCY_DATA01 NORMAL FG_TCY_DATA /dev/oracleasm/disks/DSK_TCY_DATA01
1 TCY_DATA03 NORMAL FG_TCY_DATA /dev/oracleasm/disks/DSK_TCY_DATA03
1 TCY_DATA04 NORMAL FG_TCY_DATA /dev/oracleasm/disks/DSK_TCY_DATA04
1 TCY_DATA05 NORMAL FG_TCY_DATA /dev/oracleasm/disks/DSK_TCY_DATA05
2 CLITX_FRA03 NORMAL FG_CLITX_FRA /dev/oracleasm/disks/DSK_CLITX_FRA03
2 CLITX_FRA01 NORMAL FG_CLITX_FRA /dev/oracleasm/disks/DSK_CLITX_FRA01
2 CLITX_FRA02 NORMAL FG_CLITX_FRA
2 TCY_FRA03 NORMAL FG_TCY_FRA /dev/oracleasm/disks/DSK_TCY_FRA03
2 TCY_FRA01 NORMAL FG_TCY_FRA /dev/oracleasm/disks/DSK_TCY_FRA01
2 TCY_FRA02 NORMAL FG_TCY_FRA /dev/oracleasm/disks/DSK_TCY_FRA02
3 TCY_OCR02 NORMAL TCY_OCR02 /dev/oracleasm/disks/DSK_TCY_OCR02
4 OCRVOTING_0001 NORMAL OCRVOTING_0001 /dev/oracleasm/disks/DSK_CLITX_OCR01
4 OCRVOTING_0002 NORMAL OCRVOTING_0002 /dev/oracleasm/disks/DSK_TCY_OCR01
4 OCRVOTING_0003 NORMAL OCRVOTING_0003 /app/voting/vote3

########################################################################
# ETAT DES DISKGROUPS : PRESENCE DE DISQUES OFFLINE #
########################################################################

GROUP_NUMBER NAME STATE OFFLINE_DISKS
———— ——————– ———- ————-
1 DGDATA MOUNTED 1
2 DGFRA MOUNTED 1
3 OCRMIRROR MOUNTED 0
4 OCRVOTING MOUNTED 0

On voit que l’on a bien des disques offline dans chaque diskgroup DGFRA et DGDATA.

Alert_+ASM1.log
Dans les traces, on voit des erreurs d’écritures
WARNING: group 1 dismounted: failed to write virtual extent 0 of file 256
Errors in file /app/oracle/diag/rdbms/orcl/ORCL1/trace/ORCL1_ckpt_42424.trc:
ORA-00206: erreur lors de l’écriture (bloc 3, nbre blocs 1) du fichier de contrôle
ORA-00202: fichier de contrôle : ‘+DGDATA/orcl/controlfile/current.256.842798891′
ORA-15081: échec de la soumission d’une opération d’entrée-sortie sur un disque
ORA-15081: échec de la soumission d’une opération d’entrée-sortie sur un disque
Errors in file /app/oracle/diag/rdbms/orcl/ORCL1/trace/ORCL1_ckpt_42424.trc:
ORA-00221: erreur lors de l’écriture dans le fichier de contrôle
ORA-00206: erreur lors de l’écriture (bloc 3, nbre blocs 1) du fichier de contrôle
ORA-00202: fichier de contrôle : ‘+DGDATA/orcl/controlfile/current.256.842798891′
ORA-15081: échec de la soumission d’une opération d’entrée-sortie sur un disque
ORA-15081: échec de la soumission d’une opération d’entrée-sortie sur un disque
CKPT (ospid: 42424): terminating the instance due to error 221
Fri Mar 21 15:23:43 2014
System state dump requested by (instance=1, osid=42424 (CKPT)), summary=[abnormal instance termination].
System State dumped to trace file /app/oracle/diag/rdbms/orcl/ORCL1/trace/ORCL1_diag_42382_20140321152343.trc
Fri Mar 21 15:23:43 2014

Sur 10 coupures à 5 minutes d’intervalle, avec remise en état de la configuration entre temps bien sur, on aura dix résultats différents dont des fois ou l’on ne perd aucun disque, le résultat attendu…

On va positionner un des nombreux paramètres cachés d’ASM en 11GR2 qui va nous permettre d’augmenter le temps toléré de heartbeep avant que le disque soit considéré comme manquant et de ce fait mis offline.
Sa valeur par défaut est de 15 secondes.

SQL> alter system set “_asm_hbeatiowait”=200 scope=spfile;

System altered.

SQL>

On peut donc refaire les tests et O surprise, nous ne perdons plus un seul membre de diskgroup au bout de 10 changement / coupures de multipath.

Le rac étendu est opérationnel.

Attention au Real Time Query !!!! by albanlepunk

Administration Oracle, dataguard pas de Commentaire »

Comment se prémunir d’un passage non souhaité en Real Time Query.

Comme vous le savez, dans une configuration Dataguard, il est possible de faire de la consultation “temps réel”!
C’est à dire que la base applique les redologs qu’elle reçoit de sa base primaire tout en étant ouverte en lecture seule.
C’est un Option de l’Enterprise Edition : Le Real Time Query.

Seulement lorsque votre serveur va redémarer, si vous n’avez pas géré ce cas particulier dans votre script de redémarrage,
votre base standby va démarrer en startup normal et se mettre par défaut dans le mode Real Time Query.

SQL> SELECT open_mode FROM   V$DATABASE;

READ ONLY WITH APPLY

Comment faire pour ne pas utiliser malgré soi cette option payante?

il faut positionner (comme souvent) un paramètre caché : ‘_query_on_physical’
Il va nous prémunir d’un démarrage en mode Real Time Query en renvoyant une erreur “ORA-16669 : instance cannot be opened because the Active Data Guard option is disabled.”
Mais on pourra toujours ouvrir la base en lecture seule manuellement.

SQL> alter system set “_query_on_physical”=false scope=spfile;

System altered.

SQL> shutdown immediate
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  812529152 bytes

Fixed Size                  2264280 bytes

Variable Size             960781800 bytes

Database Buffers           54654432 bytes

Redo Buffers                3498640 bytes
Database mounted.
ORA-16669: instance cannot be opened because the Active Data Guard option is
disabled

SQL> alter database open read only;

Database altered.

SQL> select open_mode from v$database;

OPEN_MODE
——————–
READ ONLY

On est donc sûr de ne pas utiliser cette option malencontreusement!!!

Oracle - ASM : Miroir, mon beau miroir, ….

ASM, Cluster RAC pas de Commentaire »

Oracle - ASM : Miroir, mon beau miroir, ….by albanlepunk

Des fois on pense avoir tout prévu pour sécuriser son infrastructure Oracle : cluster RAC étendu, diskgroups ASM en redondance NORMAL, 3° voting disk sur un partage NFS distinct, ….

Ceinture et bretelle donc …

Sauf que …. dans la vraie vie d’un informaticien (et à plus forte raison d’un consultant Oracle) la loi de Murphy est incontournable.

Une coupure d’une baie de stockage suivie d’une fausse manipulation d’un administrateur plus tard et vous vous retrouvez avec la situation suivante qu’on vous demande à vous de dépatouiller :

SQL> select name, STATE, OFFLINE_DISKS from v$asm_diskgroup;

NAME                           STATE       OFFLINE_DISKS

------------------------------ ----------- -------------

DGDATA                         MOUNTED                 0

DGFRA                          MOUNTED                 0

OCRMIRROR                      MOUNTED                 0

OCRVOTING                      DISMOUNTED              0

Oups, le diskgroup OCRVOTING à l’état DISMOUNTED, ça ne sent pas très bon pour le cluster, d’autant plus  :

- qu’il est impossible de rajouter des disques à ce diskgroup vu qu’il est DISMOUNTED

- qu’il est impossible de le monter, même en mode FORCE, vu qu’il manque des disques

Heureusement l’architecture a été bien pensée, et l’existence d’un groupe de disques OCRMIRROR (contenant pour l’instant l’OCR mirroir comme son nom l’indique) va nous être utile.

On commence par ‘déplacer’ les voting disks sur ce diskgroup

root@dblc00000025vm01 dev]# crsctl replace votedisk +OCRMIRROR

Successful addition of voting disk 86b1b5a6583d4f22bf97f7af26f0ef9d.

Successful deletion of voting disk 2bbecebc98fd4fcbbf96de5cc98bed12.

Successful deletion of voting disk 18c58cd6ce034f3bbfca178420967aa0.

Successfully replaced voting disk group with +OCRMIRROR.

CRS-4266: Voting file(s) successfully replaced

Vérification :

[root@dblc00000025vm01 dev]# crsctl query css votedisk

##  STATE    File Universal Id                File Name Disk group

--  -----    -----------------                --------- ---------

1. ONLINE   86b1b5a6583d4f22bf97f7af26f0ef9d (/dev/oracleasm/disks/OCRVOTING_AB02) [OCRMIRROR]

Located 1 voting disk(s).

On continue en supprimant les entêtes des disques concernés puis en les recréant (attention : vous êtes sensés savoir ce que vous faites quand vous faites ce type de manipulation)

[root@dblc00000025vm01 dev]# dd if=/dev/zero of=/dev/xvdh1 bs=1024k count=10

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.215507 s, 48.7 MB/s

[root@dblc00000025vm01 dev]# oracleasm querydisk /dev/xvdj1

Device "/dev/xvdj1" is marked an ASM disk with the label "OCRVOTING_AA02"

[root@dblc00000025vm01 dev]# dd if=/dev/zero of=/dev/xvdj1 bs=1024k count=10

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.199342 s, 52.6 MB/s

[root@dblc00000025vm01 dev]#

[root@dblc00000025vm01 dev]# oracleasm createdisk OCRVOTING_AA01 /dev/xvdh1

Writing disk header: done

Instantiating disk: failed

Clearing disk header: done

[root@dblc00000025vm01 dev]# oracleasm createdisk OCRVOTING_AA02 /dev/xvdj1

Writing disk header: done

Instantiating disk: failed

Clearing disk header: done

[root@dblc00000025vm01 dev]#

[root@dblc00000025vm01 dev]# oracleasm scandisks

Reloading disk partitions: done

Cleaning any stale ASM disks...

Cleaning disk "OCRVOTING_AA01"

Cleaning disk "OCRVOTING_AA02"

Scanning system for ASM disks...

[root@dblc00000025vm01 dev]# oracleasm listdisks

DATA_AA01

DATA_AB01

FRA_AA01

FRA_AB01

OCRVOTING_AB01

OCRVOTING_AB02

[root@dblc00000025vm01 dev]#

[root@dblc00000025vm01 dev]# oracleasm createdisk OCRVOTING_AA02 /dev/xvdj1

Writing disk header: done

Instantiating disk: done

[root@dblc00000025vm01 dev]# oracleasm createdisk OCRVOTING_AA01 /dev/xvdh1

Writing disk header: done

Instantiating disk: done

[root@dblc00000025vm01 dev]# oracleasm scandisks

Reloading disk partitions: done

Cleaning any stale ASM disks...

Scanning system for ASM disks...

[root@dblc00000025vm01 dev]# oracleasm listdisks

DATA_AA01

DATA_AB01

FRA_AA01

FRA_AB01

OCRVOTING_AA01

OCRVOTING_AA02

OCRVOTING_AB01

OCRVOTING_AB02

On va créer un diskgroup temporaire pour faire changer le statut des disques concernés dans ASM de ‘MEMBER’ à ‘FORMER’, puis le supprimer.


SQL> create diskgroup DGTEST external redundancy disk '/dev/oracleasm/disks/OCRVOTING_AA01','/dev/oracleasm/disks/OCRVOTING_AA02';
Diskgroup created.

SQL> select name, state from v$asm_diskgroup;

NAME                           STATE

------------------------------ -----------

DGDATA                         MOUNTED

DGFRA                          MOUNTED

OCRMIRROR                      MOUNTED

OCRVOTING                      DISMOUNTED

DGTEST                         MOUNTED

SQL> drop diskgroup DGTEST;

Diskgroup dropped.

SQL> select name,path,header_status from v$asm_disk

NAME                           PATH                                                                                                                                HEADER_STATU

------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------

/dev/oracleasm/disks/OCRVOTING_AA01                                                                                                 FORMER

/dev/oracleasm/disks/OCRVOTING_AA02                                                                                                 FORMER

/dev/oracleasm/disks/OCRVOTING_AB01                                                                                                 MEMBER

/app/voting/vote3                                                                                                                   MEMBER

OCRMIRROR_0000                 /dev/oracleasm/disks/OCRVOTING_AB02                                                                                                 MEMBER

DGFRA_0001                     /dev/oracleasm/disks/FRA_AB01                                                                                                       MEMBER

DGFRA_0002                     /dev/oracleasm/disks/FRA_AA01                                                                                                       MEMBER

DGDATA_0000                    /dev/oracleasm/disks/DATA_AB01                                                                                                      MEMBER

DGDATA_0002                    /dev/oracleasm/disks/DATA_AA01                                                                                                      MEMBER

9 rows selected.

On droppe l’ancien diskgroup OCRVOTING

SQL> drop diskgroup OCRVOTING force including contents;
Diskgroup dropped

On recréé le diskgroup OCRVOTING

SQL> create diskgroup OCRVOTING normal redundancy disk '/dev/oracleasm/disks/OCRVOTING_AA01','/dev/oracleasm/disks/OCRVOTING_AA02';
Diskgroup created.

SQL> select name, state from v$asm_diskgroup;

NAME                           STATE

------------------------------ -----------

DGDATA                         MOUNTED

DGFRA                          MOUNTED

OCRMIRROR                      MOUNTED

OCRVOTING                      MOUNTED

Puis on lui rajoute son disque quorum NFS, il faut modifier le paramètre compatible.asm du diskgroup pour avoir accès à cette fonctionnalité.

SQL> alter diskgroup OCRVOTING SET ATTRIBUTE 'compatible.asm' = '11.2';
Diskgroup altered.

SQL> alter diskgroup OCRVOTING add QUORUM FAILGROUP OCRVOTING_0002 DISK '/app/voting/vote3';

Diskgroup altered.

SQL> select GROUP_NUMBER, NAME, NAME,FAILGROUP from v$asm_disk;

GROUP_NUMBER NAME                           NAME                           FAILGROUP

------------ ------------------------------ ------------------------------ ------------------------------

0

3 OCRMIRROR_0000                 OCRMIRROR_0000                 OCRMIRROR_0000

4 OCRVOTING_0000                 OCRVOTING_0000                 OCRVOTING_0000

4 OCRVOTING_0001                 OCRVOTING_0001                 OCRVOTING_0001

2 DGFRA_0001                     DGFRA_0001                     FG_FRA_AB01

2 DGFRA_0002                     DGFRA_0002                     FG_FRA_AA01

1 DGDATA_0000                    DGDATA_0000                    FG_DATA_AB01

1 DGDATA_0002                    DGDATA_0002                    FG_DATA_AA01

4 OCRVOTING_0002                 OCRVOTING_0002                 OCRVOTING_0002
9 rows selected.

il faut ensuite restaurer le spfile ASM dans le diskgroup, puis

on va redéplacer les voting sur OCRVOTING (Attention seulement en 11.2)

[root@dblc00000025vm01 dev]# crsctl replace votedisk +OCRVOTING
Successful addition of voting disk 4d47939b7e5c4f36bf3bbfcb04ec9c6d.

Successful addition of voting disk 2045390006194f34bf42086af70e5126.

Successful addition of voting disk 311f1a648aa04fa1bf241b204fe5652f.

Successful deletion of voting disk 86b1b5a6583d4f22bf97f7af26f0ef9d.

Successfully replaced voting disk group with +OCRVOTING.

CRS-4266: Voting file(s) successfully replaced

Vérifications

[root@dblc00000025vm01 dev]# crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group

--  -----    -----------------                --------- ---------

1. ONLINE   4d47939b7e5c4f36bf3bbfcb04ec9c6d (/dev/oracleasm/disks/OCRVOTING_AA01) [OCRVOTING]

2. ONLINE   2045390006194f34bf42086af70e5126 (/dev/oracleasm/disks/OCRVOTING_AA02) [OCRVOTING]

3. ONLINE   311f1a648aa04fa1bf241b204fe5652f (/app/voting/vote3) [OCRVOTING]

Located 3 voting disk(s).

On va supprimmer la référence à l’OCR d’OCRVOTING

[root@dblc00000025vm01 dev]# ocrconfig -delete +OCRVOTING
[root@dblc00000025vm01 dev]# ocrconfig -add +OCRVOTING

[root@dblc00000025vm01 dev]# ocrcheck

Status of Oracle Cluster Registry is as follows :

Version                  :          3

Total space (kbytes)     :     262120

Used space (kbytes)      :       3168

Available space (kbytes) :     258952

ID                       :  603000217

Device/File Name         : +OCRMIRROR

Device/File integrity check succeeded

Device/File Name         : +OCRVOTING

Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

[root@dblc00000025vm01 dev]# ocrconfig -delete +OCRMIRROR

[root@dblc00000025vm01 dev]# ocrconfig -add +OCRMIRROR

[root@dblc00000025vm01 dev]# ocrcheck

Status of Oracle Cluster Registry is as follows :

Version                  :          3

Total space (kbytes)     :     262120

Used space (kbytes)      :       3168

Available space (kbytes) :     258952

ID                       :  603000217

Device/File Name         : +OCRVOTING

Device/File integrity check succeeded

Device/File Name         : +OCRMIRROR

Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

Un test de reboot des serveurs et c’est bon, c’est reparti !

Changer les adresses IP publiques et virtuelles d’un cluster

Cluster RAC 1 Commentaire »

Sources

1. “How to Change Interconnect/Public Interface IP or Subnet in Oracle Clusterware”, Doc ID: 283684.1
2. “Modifying the VIP or VIP Hostname of a 10g or 11g Oracle Clusterware Node”, DOC ID: 276434.1
3. “How to change Public and VIP component address in case of RAC?”

Je veux changer le vlan de mes adresses publiques et virtuelles de mon cluster RAc 11.2.0.3.
Sur ce cluster, il y a une base SETRA active/active et une base BLACK active/passive.

Pour commenecr on arrête les ressources correspondantes aux bases.

[root@lrac1 bin]# srvctl stop database -d SETRA

[root@lrac1 bin]# ./crs_stop black.db
Tentative d’arrêt de ‘black.db’ sur le membre ‘lrac2′
‘black.db’ a été arrêté sur le membre ‘lrac2′.
[root@lrac1 bin]# ./crs_stop black.listener
Tentative d’arrêt de ‘black.listener’ sur le membre ‘lrac2′
‘black.listener’ a été arrêté sur le membre ‘lrac2′.
[root@lrac1 bin]# ./crs_stop black.vip
Tentative d’arrêt de ‘black.vip’ sur le membre ‘lrac2′
‘black.vip’ a été arrêté sur le membre ‘lrac2′.
[root@lrac1 bin]# ./crs_stop black.group
Tentative d’arrêt de ‘black.group’ sur le membre ‘lrac2′
‘black.group’ a été arrêté sur le membre ‘lrac2′.
[root@lrac1 bin]#

On arrête les ressources sur lequelles sont montées les VIP

[root@lrac1 bin]# srvctl stop nodeapps -n lrac1 -f
PRKO-2426 : ONS (Oracle Notification Service) est déjà arrêté sur les noeuds : lrac1

[root@lrac1 bin]# srvctl stop nodeapps -n lrac2 -f

Vérifications

[root@lrac1 bin]# crs
HA Resource                                   Target     State
———–                                   ——     —–
black.db                                      ONLINE     OFFLINE
black.group                                   ONLINE     OFFLINE
black.listener                                ONLINE     OFFLINE
black.vip                                     ONLINE     OFFLINE
ora.DGDATA.dg                                 ONLINE     ONLINE on lrac1
ora.DGFRA.dg                                  ONLINE     ONLINE on lrac1
ora.LISTENER.lsnr                             ONLINE     OFFLINE
ora.LISTENER_SCAN1.lsnr                       OFFLINE    OFFLINE
ora.OCRVOTING.dg                              ONLINE     ONLINE on lrac1
ora.asm                                       ONLINE     ONLINE on lrac1
ora.cvu                                       OFFLINE    OFFLINE
ora.gsd                                       OFFLINE    OFFLINE
ora.lrac1.ASM1.asm                            ONLINE     ONLINE on lrac1
ora.lrac1.LISTENER_LRAC1.lsnr                 ONLINE     OFFLINE
ora.lrac1.gsd                                 OFFLINE    OFFLINE
ora.lrac1.ons                                 OFFLINE    OFFLINE
ora.lrac1.vip                                 OFFLINE    OFFLINE
ora.lrac2.ASM2.asm                            ONLINE     ONLINE on lrac2
ora.lrac2.LISTENER_LRAC2.lsnr                 ONLINE     OFFLINE
ora.lrac2.gsd                                 OFFLINE    OFFLINE
ora.lrac2.ons                                 OFFLINE    OFFLINE
ora.lrac2.vip                                 OFFLINE    OFFLINE
ora.net1.network                              OFFLINE    OFFLINE
ora.oc4j                                      ONLINE     ONLINE on lrac2
ora.ons                                       OFFLINE    OFFLINE
ora.registry.acfs                             ONLINE     ONLINE on lrac1
ora.scan1.vip                                 OFFLINE    OFFLINE
ora.setra.db                                  OFFLINE    OFFLINE
[root@lrac1 bin]#

Editer les fichiers /etc/hosts et les mettre à jour avec les nouvelles adresses publiques et virtuelles.

Ensuite on change le vlan pour l’interface eth0 dans le clusterware.

[oracle@lrac1 bin]$ ./oifcfg getif
eth1  192.168.1.0  global  cluster_interconnect
eth0  10.1.0.0  global  public

[oracle@lrac1 bin]$ ./oifcfg delif -global eth0

[oracle@lrac1 bin]$ ./oifcfg setif -global eth0/192.168.255.0:public

On modifie les adresses virtuelles dans le clusterware

[root@lrac1 bin]# ./srvctl modify nodeapps -n lrac1 -A 192.168.255.112/255.255.255.0/eth0
[root@lrac1 bin]# ./srvctl modify nodeapps -n lrac2 -A 192.168.255.113/255.255.255.0/eth0

Changement des adresses au niveau OS.

Aller dans l’OS et changer les adresses publiques d’eth0 sur chaque noeud.
Redémarrer le réseau

service network restart (linux)

Changer les adresses dans les fichiers known_hosts sur chaque noeud pour le user oracle (ou grid si c’est le cas)
su – oracle
cd .ssh
cp known_hosts known_hosts.bak
vi known_hosts
Faire le changement des IP des anciennes vers les nouvelles.

Arrêter les crs sur chaque noeud et les redémarrer

crsctl stop crs
crsctl start crs

Changement de l’adresse scan

[root@lrac1 bin]# srvctl config scan_listener
Le processus d’écoute SCAN LISTENER_SCAN1 existe. Port : TCP:1521
[root@lrac1 bin]#
[root@lrac1 bin]# srvctl config scan
Nom SCAN : lrac-scan, réseau : 1/192.168.255.0/255.255.255.0/eth0
Nom d’adresse IP virtuelle SCAN : scan1, IP : /lrac-scan/10.1.1.14
[root@lrac1 bin]#

Vu que l’ip a été changé dans les /etc/hosts, sur les OS, on n’a plus qu’à redémarrer les ressources scan et listener associé.
Les ressources sont arrêtées.

[root@lrac1 bin]# ./crs_start ora.scan1.vip
Tentative de démarrage de ‘ora.scan1.vip’ sur le membre ‘lrac2′
‘ora.scan1.vip’ a été démarré sur le membre ‘lrac2′.
[root@lrac1 bin]#
[root@lrac1 bin]# ./crs_start ora.LISTENER_SCAN1.lsnr
Tentative de démarrage de ‘ora.LISTENER_SCAN1.lsnr’ sur le membre ‘lrac2′
‘ora.LISTENER_SCAN1.lsnr’ a été démarré sur le membre ‘lrac2′.
[root@lrac1 bin]#

[root@lrac1 bin]# crs
HA Resource                                   Target     State
———–                                   ——     —–
black.db                                      OFFLINE    OFFLINE
black.group                                   ONLINE     OFFLINE
black.listener                                ONLINE     OFFLINE
black.vip                                     ONLINE     OFFLINE
ora.DGDATA.dg                                 ONLINE     ONLINE on lrac1
ora.DGFRA.dg                                  ONLINE     ONLINE on lrac1
ora.LISTENER.lsnr                             ONLINE     ONLINE on lrac1
ora.LISTENER_SCAN1.lsnr                       ONLINE     ONLINE on lrac2
ora.OCRVOTING.dg                              ONLINE     ONLINE on lrac1
ora.asm                                       ONLINE     ONLINE on lrac1
ora.cvu                                       OFFLINE    OFFLINE
ora.gsd                                       OFFLINE    OFFLINE
ora.lrac1.ASM1.asm                            ONLINE     ONLINE on lrac1
ora.lrac1.LISTENER_LRAC1.lsnr                 ONLINE     ONLINE on lrac1
ora.lrac1.gsd                                 OFFLINE    OFFLINE
ora.lrac1.ons                                 ONLINE     ONLINE on lrac1
ora.lrac1.vip                                 ONLINE     ONLINE on lrac1
ora.lrac2.ASM2.asm                            ONLINE     ONLINE on lrac2
ora.lrac2.LISTENER_LRAC2.lsnr                 ONLINE     ONLINE on lrac2
ora.lrac2.gsd                                 OFFLINE    OFFLINE
ora.lrac2.ons                                 ONLINE     ONLINE on lrac2
ora.lrac2.vip                                 ONLINE     ONLINE on lrac2
ora.net1.network                              ONLINE     ONLINE on lrac1
ora.oc4j                                      ONLINE     ONLINE on lrac1
ora.ons                                       ONLINE     ONLINE on lrac1
ora.registry.acfs                             ONLINE     ONLINE on lrac1
ora.scan1.vip                                 ONLINE     ONLINE on lrac2
ora.setra.db                                  OFFLINE    OFFLINE
[root@lrac1 bin]#

Redémarrage de la base SETRA

[root@lrac1 bin]# srvctl start database -d SETRA

Redémarrage de la base standalone BLACK

Si des ressources suite aux redémarrage des crs ont redémarrées, on les arrête proprement et on les relance à la main.

black.db                                      OFFLINE    OFFLINE
black.group                                   OFFLINE    OFFLINE
black.listener                                OFFLINE    OFFLINE
black.vip                                     OFFLINE    OFFLINE

il faut modifier les fichiers /app/oracle/product/11.2.0/db_1/network/admin/listener.ora avec la nouvelle adresse
et faire le changement dans le DNS et/ou le fichier /etc/hosts.

On va maintenant changer l’adresse de la vip spécifique à la base BLACK dans le clusterware.

[root@lrac1 bin]# ./crs_stat -p black.vip
NAME=black.vip
TYPE=application
ACTION_SCRIPT=/app/grid/bin/usrvip
****
****
****
USR_ORA_LANG=
USR_ORA_NETMASK=255.255.0.0
USR_ORA_OPEN_MODE=
USR_ORA_OPI=false
USR_ORA_PFILE=
USR_ORA_PRECONNECT=none
USR_ORA_SRV=
USR_ORA_START_TIMEOUT=0
USR_ORA_STOP_MODE=immediate
USR_ORA_STOP_TIMEOUT=0
USR_ORA_VIP=10.1.1.15

On modifie l’IP et le netmask si besoin

[root@lrac1 bin]# ./crsctl modify resource black.vip -attr “USR_ORA_VIP=192.168.255.115″
[root@lrac1 bin]# ./crsctl modify resource black.vip -attr “USR_ORA_NETMASK=255.255.255.0″

Redémarrage des ressources

[root@lrac1 bin]# ./crs_start black.group
Tentative de démarrage de ‘black.group’ sur le membre ‘lrac2′
‘black.group’ a été démarré sur le membre ‘lrac2′.
[root@lrac1 bin]# ./crs_start black.vip
Tentative de démarrage de ‘black.vip’ sur le membre ‘lrac2′
‘black.vip’ a été démarré sur le membre ‘lrac2′.
[root@lrac1 bin]#
[root@lrac1 bin]# ./crs_start black.listener
Tentative de démarrage de ‘black.listener’ sur le membre ‘lrac2′
‘black.listener’ a été démarré sur le membre ‘lrac2′.
[root@lrac1 bin]# ./crs_start black.db
Tentative de démarrage de ‘black.db’ sur le membre ‘lrac2′
‘black.db’ a été démarré sur le membre ‘lrac2′.
[root@lrac1 bin]#

Il se peut que la ressource ora.cvu se doit mise en  target OFFLINE et state OFFLINE

on la redémarre à la main.

[oracle@lrac1 bin]$ ./crs_start ora.cvu
Tentative de démarrage de ‘ora.cvu’ sur le membre ‘lrac1′
‘ora.cvu’ a été démarré sur le membre ‘lrac1′.
[oracle@lrac1 bin]$ crs
HA Resource                                   Target     State
———–                                   ——     —–
black.db                                      ONLINE     ONLINE on lrac2
black.group                                   ONLINE     ONLINE on lrac2
black.listener                                ONLINE     ONLINE on lrac2
black.vip                                     ONLINE     ONLINE on lrac2
ora.DGDATA.dg                                 ONLINE     ONLINE on lrac1
ora.DGFRA.dg                                  ONLINE     ONLINE on lrac1
ora.LISTENER.lsnr                             ONLINE     ONLINE on lrac1
ora.LISTENER_SCAN1.lsnr                       ONLINE     ONLINE on lrac2
ora.OCRVOTING.dg                              ONLINE     ONLINE on lrac1
ora.asm                                       ONLINE     ONLINE on lrac1
ora.cvu                                       ONLINE     ONLINE on lrac1
ora.gsd                                       OFFLINE    OFFLINE
ora.lrac1.ASM1.asm                            ONLINE     ONLINE on lrac1
ora.lrac1.LISTENER_LRAC1.lsnr                 ONLINE     ONLINE on lrac1
ora.lrac1.gsd                                 OFFLINE    OFFLINE
ora.lrac1.ons                                 ONLINE     ONLINE on lrac1
ora.lrac1.vip                                 ONLINE     ONLINE on lrac1
ora.lrac2.ASM2.asm                            ONLINE     ONLINE on lrac2
ora.lrac2.LISTENER_LRAC2.lsnr                 ONLINE     ONLINE on lrac2
ora.lrac2.gsd                                 OFFLINE    OFFLINE
ora.lrac2.ons                                 ONLINE     ONLINE on lrac2
ora.lrac2.vip                                 ONLINE     ONLINE on lrac2
ora.net1.network                              ONLINE     ONLINE on lrac1
ora.oc4j                                      ONLINE     ONLINE on lrac2
ora.ons                                       ONLINE     ONLINE on lrac1
ora.registry.acfs                             ONLINE     ONLINE on lrac1
ora.scan1.vip                                 ONLINE     ONLINE on lrac2
ora.setra.db                                  ONLINE     ONLINE on lrac2
[oracle@lrac1 bin]$

Toutes les adresses publiques et virtuelles ont été changées et toutes les ressources du cluster sont à nouveau disponibles.

Temps d’indisponibilité entre 10mns et une demi heure.

Alban lepunk

Comment installer oracleasm sur Oracle Linux 6.x

ASM, Cluster RAC, Divers 1 Commentaire »

Installation d’oracleasmlib sur OL6.1

Ne le trouvant pas à télécharger sur oracle.com ou Metalink, j’ai tenté de l’installer avec yum.

D’aprés la note 1089399.1

“For RHEL6, Oracle will only provide ASMLib software and updates when configured with a kernel distributed

by Oracle. Oracle will not provide ASMLib packages for kernels distributed by Red Hat as part of RHEL6.

ASMLib updates will be delivered via Unbreakable Linux Network(ULN) which is available to customers with Oracle

Linux support. ULN works with both Oracle Linux or Red Hat Linux installations,

but ASMlib usage will require replacing any Red Hat kernel with a kernel provided by Oracle.”

Yum m’a proposé d’installer le kernel UEK dans lequel oracleasm est natif et de fait de mettre à jour certains packages

du même kernel.

Il faut au préalable avoir configuré son yum pour qu’il pointe sur le bon référentiel ou s’être enregistré sur Unbreakable Linux Network.

[root@racform1 app]# yum install oracleasm

Loaded plugins: refresh-packagekit

Setting up Install Process

Resolving Dependencies

–> Running transaction check

—> Package kernel-uek.x86_64 0:2.6.32-300.11.1.el6uek will be installed

–> Processing Dependency: kernel-uek-firmware = 2.6.32-300.11.1.el6uek for package: kernel-uek-2.6.32-300.11.1.el6uek.x86_64

–> Processing Dependency: dracut-kernel >= 004-242.0.3 for package: kernel-uek-2.6.32-300.11.1.el6uek.x86_64

–> Running transaction check

—> Package dracut-kernel.noarch 0:004-53.el6 will be updated

—> Package dracut-kernel.noarch 0:004-256.0.1.el6_2.1 will be an update

–> Processing Dependency: dracut = 004-256.0.1.el6_2.1 for package: dracut-kernel-004-256.0.1.el6_2.1.noarch

—> Package kernel-uek-firmware.noarch 0:2.6.32-100.34.1.el6uek will be updated

—> Package kernel-uek-firmware.noarch 0:2.6.32-300.11.1.el6uek will be an update

–> Running transaction check

—> Package dracut.noarch 0:004-53.el6 will be updated

—> Package dracut.noarch 0:004-256.0.1.el6_2.1 will be an update

–> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================

Package Arch Version Repository Size

==================================================================================================================

Installing:

kernel-uek x86_64 2.6.32-300.11.1.el6uek ol6_latest 21 M

Updating for dependencies:

dracut noarch 004-256.0.1.el6_2.1 ol6_latest 109 k

dracut-kernel noarch 004-256.0.1.el6_2.1 ol6_latest 20 k

kernel-uek-firmware noarch 2.6.32-300.11.1.el6uek ol6_latest 3.0 M

Transaction Summary

==================================================================================================================

Install 1 Package(s)

Upgrade 3 Package(s)

Total download size: 24 M

Is this ok [y/N]: y

Downloading Packages:

(1/4): dracut-004-256.0.1.el6_2.1.noarch.rpm | 109 kB 00:00

(2/4): dracut-kernel-004-256.0.1.el6_2.1.noarch.rpm | 20 kB 00:00

(3/4): kernel-uek-2.6.32-300.11.1.el6uek.x86_64.rpm | 21 MB 00:54

(4/4): kernel-uek-firmware-2.6.32-300.11.1.el6uek.noarch.rpm | 3.0 MB 00:07

——————————————————————————————————————

Total 383 kB/s | 24 MB 01:04

Running rpm_check_debug

Running Transaction Test

Transaction Test Succeeded

Running Transaction

Updating : kernel-uek-firmware-2.6.32-300.11.1.el6uek.noarch 1/7

Updating : dracut-004-256.0.1.el6_2.1.noarch 2/7

Updating : dracut-kernel-004-256.0.1.el6_2.1.noarch 3/7

Installing : kernel-uek-2.6.32-300.11.1.el6uek.x86_64 4/7

Cleanup : dracut-kernel-004-53.el6.noarch 5/7

Cleanup : dracut-004-53.el6.noarch 6/7

Cleanup : kernel-uek-firmware-2.6.32-100.34.1.el6uek.noarch 7/7

Installed:

kernel-uek.x86_64 0:2.6.32-300.11.1.el6uek

Dependency Updated:

dracut.noarch 0:004-256.0.1.el6_2.1 dracut-kernel.noarch 0:004-256.0.1.el6_2.1

kernel-uek-firmware.noarch 0:2.6.32-300.11.1.el6uek

Complete!

[root@racform1 app]#

Ensuite vu que c’est un module du noyau, il faut le charger : “Please note: Oracleasm kernel driver is included in OL 6 UEK, but requires an inital ‘modprobe oracleasm’ ».

[root@racform1 app]# modprobe oracleasm

On installe ensuite le seul package non natif d’Oracleasm.

[root@racform1 app]# rpm -ivh oracleasm-support-2.1.5-1.el6.x86_64.rpm

Préparation… ########################################### [100%]

1:oracleasm-support ########################################### [100%]

[root@racform1 app]#

On voit que le module oracleasm est présent mais pas démarré

[root@racform1 app]# /etc/init.d/oracleasm status

Checking if ASM is loaded: yes

Checking if /dev/oracleasm is mounted: no

[root@racform1 app]#

Comme dans les versions précedentes, il faut le configurer.

[root@RACFORM2 ~]# oracleasm configure -i

Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library

driver. The following questions will determine whether the driver is

loaded on boot and what permissions it will have. The current values

will be shown in brackets (’[]‘). Hitting <ENTER> without typing an

answer will keep that current value. Ctrl-C will abort.

Default user to own the driver interface []: oracle

Default group to own the driver interface []: dba

Start Oracle ASM library driver on boot (y/n) [n]: y

Scan for Oracle ASM disks on boot (y/n) [y]: y

Writing Oracle ASM library driver configuration: done

[root@RACFORM2 ~]#

Il ne reste plus qu’à le démarrer.

[root@racform1 app]# oracleasm init

Creating /dev/oracleasm mount point: /dev/oracleasm

Mounting ASMlib driver filesystem: /dev/oracleasm

[root@racform1 app]#

Et le tour est joué

[root@racform1 app]# /etc/init.d/oracleasm status

Checking if ASM is loaded: yes

Checking if /dev/oracleasm is mounted: yes

[root@racform1 app]#

Petite subtilité pour la suite, il arrive que l’installeur Oracle pour la couche cluster ne découvre pas les disques avec le chemin standard “ORCL:”, dans ce cas on peut faire la découverte des disques avec le chemin suivant : /dev/oracleasm/disks.

Oracle - 11GR2 RAC - 3° voting disk et nfs

ASM, Cluster RAC pas de Commentaire »

En version 10GR2 RAC et 11GR1 RAC, lorsqu’on était dans une configuration ‘cluster étendu’ avec deux baies de stockage, possibilité était donnée de stocker un des voting disks du cluster sur un partage NFS situé sur un autre serveur n’utilisant pas l’une des baies.

L’objectif de cette configuration était de fournir un quorum permettant à une des parties du cluster de continuer à fonctionner même en cas de perte complète d’une baie (ou d’une salle d’hébergement) ou en cas de perte du réseau privé entre les noeuds.

Si vous êtes encore en version 10GR2 ou 11GR1 vous trouverez des infos sur ce paramétrage ici

En version 11GR2 (11.2.0.2 en l’occurrence) où les voting disks peuvent être stockés dans ASM les choses se compliquent un peu pour mettre en place ce troisième voting disk :

On dispose d’un cluster RAC à deux nœuds utilisant deux baies de stockage, un diskgroup ‘OCRCONFIG1’ composé de quatre disques (deux sur chaque baie) est utilisé pour le stockage des OCR et voting disks.

Un partage nfs /votedisk est monté sur chacun des serveurs du cluster :

nfs-server:/votedisk /votedisk nfs rw,bg,hard,intr,rsize=32768,wsize=32768,tcp,noac,vers=3,timeo=600 0 0

La configuration des voting disks est pour l’instant la suivante :

[root@rac1 bin]# ./crsctl query css votedisk

##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   77d5d112ed054f97bf7049422ae169ff (ORCL:OCRCONFIG1) [OCRCONFIG1]
 2. ONLINE   4a72763dc7c94f5fbf4acbe0d51b4f69 (ORCL:OCRCONFIG2) [OCRCONFIG1]
 3. ONLINE   45936edfe3174f9fbff3e99794dab38a (ORCL:OCRCONFIG3) [OCRCONFIG1]
Located 3 voting disk(s).

On a trois voting disks, chacun sur un disque, deux dans une salle  (OCRCONFIG1 et OCRCONFIG3) et 1 dans l’autre (OCRCONFIG2)

Création du futur voting disk sur le partage nfs :

dd if=/dev/zero of=/votedisk/vote3 bs=1M count=500

Démarrer ensuite l’assistant asmca

Dans l’onglet ‘Groupe de disques’ sélectionner le groupe de disques  OCRCONFIG1 et sélectionner l’option ‘Ajouter des disques

votingnfs1

Cliquer ensuite sur le bouton ‘Modifier le chemin de repérage des disques’

votingnfs5

votingnfs3

Ajouter au(x) chemin(s) existant(s) l’emplacement du voting disk sur le partage NFS

Notre disque candidat apparait ensuite :

votingnfs4

Le sélectionner et cocher la case ‘Quorum’ (dernière colonne) pour indiquer qu’il s’agit d’un disque jouant le rôle de quorum.

votingnfs6

C’est fait !

Nous voici maintenant avec les disques suivants :

[root@rac1 bin]# ./crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   77d5d112ed054f97bf7049422ae169ff (ORCL:OCRCONFIG1) [OCRCONFIG1]
 2. ONLINE   4a72763dc7c94f5fbf4acbe0d51b4f69 (ORCL:OCRCONFIG2) [OCRCONFIG1]
 3. ONLINE   1912723de8bf4f9abf7c79052b008606 (/votedisk/vote3) [OCRCONFIG1]

Le disque OCRCONFIG1 est en salle 1, le disque OCRCONFIG2 en salle 2, le troisième /votedisk/vote3 joue donc le rôle de quorum.

Remarque : évidemment, le serveur hébergeant ce disque n’est situé ni dans l’une ni dans l’autre des salles, et utilise également un stockage indépendant, sinon ça ne sert pas à grand-chose …

Attention : il y a quelques effets de bord à cette configuration, en particulier lorsque le device NFS n’est pas accessible, cf la partie ‘Known issue’ du white paper Oracle.

Restauration d’un OCR dans ASM (11GR2)

ASM, Cluster RAC pas de Commentaire »

Contrairement au versions précédentes, pour la 11GR2, on a la possibilité de stocker l’OCR et les Voting Disks dans un diskgroup ASM.

Après avoir installé un cluster utilisant cette nouvelle fonctionnalité, et faisant quelques tests de recette qui comprennent notamment la restauration de l’OCR, je me suis demandé comment pouvait on restaurer l’OCR quand le cluster est arrêté et donc ASM où il est stocké ?

Attention, ce qui suit est valable uniquement pour la version 11.2.0.1, en 11.2.0.2 les choses sont un petit peu différentes

1. Arrêter le  clusterware sur chaque noeud :

crsctl stop cluster -all

2. On vérifie que les deux clusterware sont bien arrêtés sur chaque noeud

3. Sur le noeud sur lequel est présent le backup de l’OCR démarrer manuellement les ressources css et asm

[root@rac1 bin]# ./crsctl start res ora.cssd -init
CRS-2672: Attempting to start 'ora.cssdmonitor' on 'rac1'
CRS-2676: Start of 'ora.cssdmonitor' on 'rac1' succeeded
CRS-2672: Attempting to start 'ora.cssd' on 'rac1'
CRS-2672: Attempting to start 'ora.diskmon' on 'rac1'
CRS-2676: Start of 'ora.diskmon' on 'rac1' succeeded
CRS-2676: Start of 'ora.cssd' on 'rac1' succeeded
[root@rac1 bin]# ./crsctl start res ora.asm -init
CRS-2672: Attempting to start 'ora.cluster_interconnect.haip' on 'rac1'
CRS-2672: Attempting to start 'ora.ctssd' on 'rac1'
CRS-2676: Start of 'ora.ctssd' on 'rac1' succeeded
CRS-2676: Start of 'ora.cluster_interconnect.haip' on 'rac1' succeeded
CRS-2672: Attempting to start 'ora.asm' on 'rac1'
CRS-2676: Start of 'ora.asm' on 'rac1' succeeded

4. Restaurer l’OCR depuis le backup qui nous intéresse

[root@rac1 bin]# ./ocrconfig -showbackup

rac1     2010/12/22 12:53:13     /app/product/11.2.0/grid/cdata/rac-cluster/backup00.ocr

rac1     2010/12/22 08:53:11     /app/product/11.2.0/grid/cdata/rac-cluster/backup01.ocr

rac1     2010/12/22 04:53:11     /app/product/11.2.0/grid/cdata/rac-cluster/backup02.ocr

rac1     2010/12/21 20:53:10     /app/product/11.2.0/grid/cdata/rac-cluster/day.ocr

rac1     2010/12/21 20:53:10     /app/product/11.2.0/grid/cdata/rac-cluster/week.ocr

rac1     2011/03/03 14:54:21     /app/product/11.2.0/grid/cdata/rac-cluster/backup_20110303_145421.ocr

[root@rac1 bin]# ./ocrconfig -restore /app/product/11.2.0/grid/cdata/rac-cluster/backup_20110303_145421.ocr

5. Démarrer manuellement les ressources manquantes du cluster evmd et crsd.

 [root@rac1 bin]# ./crsctl start res ora.evmd –init
CRS-2672: Attempting to start 'ora.evmd' on 'rac1'
CRS-2676: Start of 'ora.evmd' on 'rac1' succeeded
[root@rac1 bin]# ./crsctl start res ora.crsd –init
CRS-2672: Attempting to start 'ora.crsd' on 'rac1'
CRS-2676: Start of 'ora.crsd' on 'rac1' succeeded

6. Démarrer le clusterware sur les autres noeuds : crsctl start cluster –all

[root@rac1 bin]# ./crsctl start cluster –all
CRS-2672: Tentative de drmarrage de 'ora.cssdmonitor' sur 'rac2'
CRS-2676: 'ora.cssdmonitor' a été démarré sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.cssd' sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.diskmon' sur 'rac2'
CRS-2676: 'ora.diskmon' a été démarré sur 'rac2'
CRS-2676: 'ora.cssd' a été démarré sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.ctssd' sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.cluster_interconnect.haip' sur 'rac2'
CRS-2676: 'ora.ctssd' a été démarré sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.evmd' sur 'rac2'
CRS-2676: 'ora.evmd' a été démarré sur 'rac2'
CRS-2676: 'ora.cluster_interconnect.haip' a été démarré sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.asm' sur 'rac2'
CRS-2676: 'ora.asm' a été démarré sur 'rac2'
CRS-2672: Tentative de démarrage de 'ora.crsd' sur 'rac2'
CRS-2676: 'ora.crsd' a été démarré sur 'rac2'
CRS-4690: Oracle Clusterware is already running on 'rac1'
CRS-4000: Command Start failed, or completed with errors

7. Vérification

 [root@rac1 bin]# ./crs_stat –t
Name           Type           Target    State     Host
ora.DGDATA.dg  ora....up.type ONLINE    ONLINE    rac1
ora.DGFRA.dg   ora....up.type ONLINE    ONLINE    rac1
ora....ER.lsnr ora....er.type ONLINE    ONLINE    rac1
ora....N1.lsnr ora....er.type ONLINE    ONLINE    rac1
ora....TING.dg ora....up.type ONLINE    ONLINE    rac1
ora.asm        ora.asm.type   ONLINE    ONLINE    rac1
ora.cvu        ora.cvu.type   ONLINE    ONLINE    rac1
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora....network ora....rk.type ONLINE    ONLINE    rac1
ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    rac1
ora.ons        ora.ons.type   ONLINE    ONLINE    rac1
ora....SM1.asm application    ONLINE    ONLINE    rac1
ora....C1.lsnr application    ONLINE    ONLINE    rac1
ora.rac1.gsd   application    OFFLINE   OFFLINE
ora.rac1.ons   application    ONLINE    ONLINE    rac1
ora.rac1.vip   ora....t1.type ONLINE    ONLINE    rac1
ora....SM2.asm application    ONLINE    ONLINE    rac2
ora....C2.lsnr application    ONLINE    ONLINE    rac2
ora.rac2.gsd   application    OFFLINE   OFFLINE
ora.rac2.ons   application    ONLINE    ONLINE    rac2
ora.rac2.vip   ora....t1.type ONLINE    ONLINE    rac2
ora....ry.acfs ora....fs.type ONLINE    ONLINE    rac1
ora.scan1.vip  ora....ip.type ONLINE    ONLINE    rac1
ora.setra.db   ora....se.type ONLINE    ONLINE    rac1

Un peu plus compliqué que dans les versions précédentes, mais ASM oblige ….

Migration couche RAC 10G vers 11G

ASM, Cluster RAC pas de Commentaire »

Migration crs 10G vers 11GR2

Les clusters RAC installés ces dernières années en 10g vont devoir être migrés un jour ou l’autre fatalement.

Les éditeurs mettant souvent du temps à valider leurs soft avec la version 11GR2,
on peut prendre de l’avance en ne migrant que les couche CRS et ASM en 11GR2 et en laissant les bases en 10G.

Si vous êtes sur OEL4, vérifier ou upgrader votre OS au minimum en 4.7

Appliquer les pré-requis pour la version 11GR2 sur votre système (note Metalink 880942.1 pour OEL4 et 880989.1 pour OEL5).

Un petit coup de cluster verify permet d’en avoir le coeur net.

runcluvfy.sh stage -pre crsinst -n node1,node2 -verbose

Une fois les binaires du grid 11GR2 copiés, on va utiliser la fonctionnalité “Mettre à niveau Oracle Grid Infrastructure” de l’installer.
Il n’est pas nécéssaire d’arrêter le crs, bien que ça marche quand même si c’est le cas.
On peut sinon passer le script clusterware/upgrade/preupdate.sh qui arrête le crs.

On peut donc théoriquement faire l’upgrade d’un noeud après l’autre, sans coupure de production.

Si vous utilisez ASM, alors arrêtez vos bases et vos instances ASM, l’installeur vous le demandera de toute façon.

Si les pré-requis ont été respecté et l’adresse scan convenablement renseignée, l’installation se déroule comme une installation 11GR2 standard.

Au lieu de lancer le fameux root.sh, on va lancer le rootupgrade.sh qui va arrêter le crs (s’il est démarré), effectuer les mises à jour nécéssaires et relancer la couche cluster.

[root@rac1 tmp]# /app/11.2.0/grid/rootupgrade.sh
Running Oracle 11g root.sh script...
The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /app/11.2.0/grid
Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file "dbhome" already exists in /usr/local/bin.  Overwrite it? (y/n)
[n]: y
   Copying dbhome to /usr/local/bin ...
The file "oraenv" already exists in /usr/local/bin.  Overwrite it? (y/n)
[n]: y
   Copying oraenv to /usr/local/bin ...
The file "coraenv" already exists in /usr/local/bin.  Overwrite it? (y/n)
[n]: y
   Copying coraenv to /usr/local/bin ...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
2011-03-29 15:23:53: Parsing the host name
2011-03-29 15:23:53: Checking for super user privileges
2011-03-29 15:23:53: User has super user privileges
Using configuration parameter file: /app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
Failure 1 contacting CSS daemon
Command return code of 6 (1536) from command: /app/oracle/product/10.2.0/crs/bin/crsctl check cssd
Cannot communicate with EVM
Cannot communicate with CRS
Command return code of 1 (256) from command: /app/oracle/product/10.2.0/crs/bin/crsctl check crsd
LOCAL ADD MODE
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
  root wallet
  root wallet cert
  root cert export
  peer wallet
  profile reader wallet
  pa wallet
  peer wallet keys
  pa wallet keys
  peer cert request
  pa cert request
  peer cert
  pa cert
  peer root cert TP
  profile reader root cert TP
  pa root cert TP
  peer pa cert TP
  pa peer cert TP
  profile reader pa cert TP
  profile reader peer cert TP
  peer user cert
  pa user cert
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
ADVM/ACFS is not supported on Redhat 4
CRS-2672: Tentative de démarrage de 'ora.mdnsd' sur 'rac1'
CRS-2676: 'ora.mdnsd' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.gipcd' sur 'rac1'
CRS-2676: 'ora.gipcd' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.gpnpd' sur 'rac1'
CRS-2676: 'ora.gpnpd' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.cssdmonitor' sur 'rac1'
CRS-2676: 'ora.cssdmonitor' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.cssd' sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.diskmon' sur 'rac1'
CRS-2676: 'ora.diskmon' a été démarré sur 'rac1'
CRS-2676: 'ora.cssd' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.ctssd' sur 'rac1'
CRS-2676: 'ora.ctssd' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.crsd' sur 'rac1'
CRS-2676: 'ora.crsd' a été démarré sur 'rac1'
CRS-2672: Tentative de démarrage de 'ora.evmd' sur 'rac1'
CRS-2676: 'ora.evmd' a été démarré sur 'rac1'
clscfg: EXISTING configuration version 3 detected.
clscfg: version 3 is 10G Release 2.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
rac1     2011/03/29 15:27:32     /app/11.2.0/grid/cdata/rac1/backup_20110329_152732.olr
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
Updating inventory properties for clusterware
Démarrage d'Oracle Universal Installer...
Vérification de l'espace de swap : il doit être supérieur à 500 Mo.   Réel 1567 Mo    Succès
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /app/oracle/oraInventory
'UpdateNodeList' a réussi.
Démarrage d'Oracle Universal Installer...
Vérification de l'espace de swap : il doit être supérieur à 500 Mo.   Réel 1567 Mo    Succès
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /app/oracle/oraInventory
'UpdateNodeList' a réussi.

Tout est redémarré sur ce noeud, il ne reste plus qu’à migrer ASM.

Pour cela on lance l’assistant asmca à partir du home grid.

L’assistant va vous proposer de mettre à niveau votre version d’ASM, et va arrêter successivement toutes les instances pour finir par les redémarrer dans la nouvelle version.

On verra apparaitre les ressources correspondantes aux diskgroups au fur et à mesure.

Vous avez maitenant un beau cluster en 11GR2 avec des bases en 10G.

Une bonne partie des actions à réaliser pouvant se faire en amont (pré requis, copie des binaires etc..) et sans arrêt de service, on peut donc s’en tirer avec des arrêts de production relativement courts.

PS : évidemment un retour arrière est à prévoir (et à tester :-))

solution erreur ORA-02304

Musée des erreurs, scripts et trucs pas de Commentaire »

Si vous obtenez

IMP-00003: ORACLE error 2304 encountered
ORA-02304: invalid object identifier literal
IMP-00017: following statement failed with ORACLE error 2304:
“CREATE TYPE “SYS_PLSQL_1823160_17_2″ TIMESTAMP ‘2011-04-13:08: …

lors d’un import cela est du au fait  que les identifiants de type sont unique dans la base et que le type que vous creez lors de l’import existe deja dans un autre schema.

3 solutions :

- la mauvaise (eclle qu’on vous conseille partout comme si vous aviez le choix de creer des schemas ou d’en supprimer en production comme bon vous semble…) : créer tous les TYPEs dans un schema dédié par ex; : ‘MES_TYPES’  ainsi ils deviennent transverrses et il n’y a plus de probleme de doublons d’IDs.

- SI vous utilisez IMPORT :  mettre l’option TOID_NOVALIDATE de l’import. ATTENTION ! ce n’est pas ‘=Y ‘ la valeur mais ‘NOM_SCHEMA.NOM_TYPE’, ‘NOM_SCHEMA.NOM_TYPE’,
Si vous en avez 2000 …;-((

- Si vs utilisez DATAPUMP impdb : appliquez l’option  “ transform=OID:y “

comptes oracle , lock et passwords

Sécurité Oracle pas de Commentaire »

Quelques infos en vrac:

Infos générales sur le compte

SQL> select * from dba_users
where username='TOTO';
USERNAME 	USER_ID 	PASSWORD 	ACCOUNT_STATUS 	LOCK_DATE 	EXPIRY_DA 	DEFAULT_TABLESPACE 	TEMPORARY_TABLESPACE 	CREATED 	PROFILE 	INITIAL_RSRC_CONSUMER_GROUP 	EXTERNAL_NAME
TOTO 		5394 		EBD64F4E40B74042 	LOCKED 	24-FEB-11 	USERS 		TEMP						21-FEB-11 	DEFAULT 	DEFAULT_CONSUMER_GROUP

On voit notamment :

profil : DEFAUT
lockable apres 20 essai et LE PASSWORD crypté !

Infos plus détaillées (si on se souvient du USERID Oracle (USER# ici) vu précédemment :

SQL> select * from sys.user$
where user#=5394
USER# 	NAME 	TYPE# 	PASSWORD 	DATATS# 	TEMPTS# 	CTIME 	PTIME 	EXPTIME 	LTIME 	RESOURCE$ 	AUDIT$ 	DEFROLE 	DEFGRP# 	DEFGRP_SEQ# 	ASTATUS 	LCOUNT 	DEFSCHCLASS 	EXT_USERNAME 	SPARE1 	SPARE2 	SPARE3 	SPARE4 	SPARE5 	SPARE6
5394 	TOTO 	1 	EBD64F4E40B74042 	4 	250 	21-FEB-11 	03-MAR-11 	  	24-FEB-11 	0 	  	1 	  	  	8 	20 	DEFAULT_CONSUMER_GROUP 	  	0

Avec :

CTIME : date de création
PTIME : date de modification
LTIME: date du lock
EXPTIME : date d’expiration
LCOUNT :
ASTATUS : statut du compte. En gros ouvert, verrouillé ou expiré.

Plus d’infos sur la colonne ASTATUS de USER$ :

SQL> SELECT * FROM SYS.USER_ASTATUS_MAP;

STATUS# STATUS
———- ——————————–
0 OPEN
1 EXPIRED
2 EXPIRED(GRACE)
4 LOCKED(TIMED)
8 LOCKED
5 EXPIRED & LOCKED(TIMED)
6 EXPIRED(GRACE) & LOCKED(TIMED)
9 EXPIRED & LOCKED
10 EXPIRED(GRACE) & LOCKED

details du profile  (qui n’apparaissent pas tous dans la console) :

failed_login_attempts - This is the number of failed login attempts before locking the Oracle user account. The default is three failed attempts.
password_grace_time - This is the grace period after the password_life_time limit is exceeded.
password_life_time - This is how long an existing password is valid. The default here forces a password change every 60 days.
password_lock_time – This specifies how long to lock the account after the failed login attempts is met. Most DBA’s set this value to UNLIMITED.
password_reuse_max – This is the number of times that you may re-user a passwords and is intended to prevent repeating password cycles (north, south, east, west).
password_reuse_time – This parameter specifies a time limit before a previous password can be re-entered. To allow unlimited use of previously used passwords, set password_reuse_time to UNLIMITED.
password_verify_function - This allows you to specify the name of a custom password verification function.

Passer une base RAC en archivelog.

Administration Oracle, Cluster RAC pas de Commentaire »

Pour passer une base clusterisée en mode archivelog, rien de plus simple.

Se connecter sur l’instance du premier nœud et arrêter l’instance :

[oracle@rac1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 13 14:24:30 2010
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
Connecte a :
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> archive log list
mode Database log              mode No Archive
Archivage automatique             Desactive
Destination de l’archive             USE_DB_RECOVERY_FILE_DEST
Sequence de journal en ligne la plus ancienne     57
Sequence de journal courante            59
SQL>

On voit bien que la base n’est pas en mode archivelog et que la destination des archives est positionnée par défaut dans la Flash Recovery Area.

Normalement on arrête les instances sur tous les nœuds et on passe la base en archivelog.

Que se passe t il si on oublie d’arrêter la deuxième instance du cluster??

On va donc oublier d’arrêter l’instance sur le noeud 2 avant de modifier la base.

On fait la manip sur le noeud1.

SQL> shutdown immediate
Base de donnees fermee.
Base de donnees demontee.
Instance ORACLE arretee.
SQL> startup mount
Instance ORACLE lancee.
Total System Global Area  477073408 bytes
Fixed Size                  1337324 bytes
Variable Size             209717268 bytes
Database Buffers          260046848 bytes
Redo Buffers                5971968 bytes
Base de donnees montee.
SQL>
SQL> alter database archivelog;
Base de donnees modifiee.

SQL> alter database open;
Base de donnees modifiee.

On génère quelques archives :

SQL> alter system switch logfile;
Systeme modifie.

Le cluster gère le cas et arrête lui même l’instance “oubliée” sans mettre un seul message d’erreur!

On est donc forcée de la redémarrer à la main et elle prend obligatoirement la modification.

SQL> alter system archive log current;
Systeme modifie.

Si on vérifie :

SQL> select name, THREAD#, SEQUENCE#, ARCHIVED from v$archived_log;

+DGFRA/racdb/archivelog/2010_12_13/thread_1_seq_63.265.737650775
1         63 YES

NAME
——————————————————————————–
THREAD#  SEQUENCE# ARC
———- ———- —
+DGFRA/racdb/archivelog/2010_12_13/thread_2_seq_4.266.737650777
2          4 YES

La base archive bien les deux threads correspondants aux deux nœuds.

Albanlepunk

Le paramètre caché _allow_resetlogs_corruption

Administration Oracle, Divers, Rman, scripts et trucs pas de Commentaire »

Dans cet article nous allons voir un exemple de récupération de données après restauration et quand la base ne veut quand même pas s’ouvrir.

Par exemple un disque lâche sur le serveur et on perd le datafile présent dessus, pour restaurer convenablement ce datafile, il nous faut les archives générées entre le dernier backup et le crash mais il nous manque les archives en question. On ne peut donc plus ouvrir la base et manque de chance, ce datafile contient des tables super importantes.

On sait pertinemment que l’on va perdre des données mais on aimerait en perdre le moins possible quitte à utiliser des moyens “spéciaux” pour cela.

A cause de l’intégrité faussée de la base, on ne peut plus l’ouvrir normallement.

Le paramètre caché qui permet de démarrer la base soit en mode  désynchronisée c’est à dire avec au moins un de ses entêtes de datafiles incorrect soit parce qu’on a  endommagé un ou plusieurs redo logs ou encore parce qu’il nous manque une archive ou deux pour restaurer un datafile est _allow_resetlogs_corruption.

Dans le cas ou votre datafile contiendrait des données type index ou que l’on peut facilement recréer, le mieux serait toujours de dropper le tablespace, puis de le recréer / recharger mais dans le cas ou les données ne sont pas facilement reconstructibles quoi faire?

L’idée à suivre pourrait être la suivante :

Restaurer le datafile ou la base à partir du dernier backup.

Jouer les archives jusqu’au dernier numéro de séquence correct (pour cela regarder dans rman : list backup of archivelog all).

Arrêter et redémarrer l’instance avec le paramètre _allow_resetlogs_corruption = TRUE.

Exporter les données souhaitées.

Restaurer la base à partir du dernier backup.

Mettre le datafile offline.

Dropper et recréer le tablespace.

Réimporter les données “récupérées”. Vous risquez néanmoins d’avoir des décalages applicatifs selon les cas, vous n’êtes donc peut être pas exempt de correction des données.

Re backuper la base correctement.

Dans notre cas, la base refuse de s’ouvrir après une restauration RMAN.

la restauration until logseq s’est bien passée, le recover database aussi. Il n’y a qu’au moment d’ouvrir la base en open resetlogs que la base réclame “une récupération de données après défaillance matérielle”.

Ceci à cause d’un datafile dont la mise offline ne s’était pas déroulé correctement.

J’ai donc remis ce datafile online, redémarré avec le paramètre _allow_resetlogs_corruption à TRUE qui a permis de corriger l’entête du fichier.

Puis on arrête la base et on la redémarre normalement.

BEMOL & RESTRICTION : Oracle ne maintient les bases qui ont été démarrées avec ce paramètre, elles sont potentiellement corrompues. C’est donc en dernier ressort et dans le cas désespérés qu’il faut l’utiliser et tout de suite après exporter les données et les réimporter dans une belle base toute neuve.

Alban le punk

clean up - delete Enterprise manager ( EM ) console Alerts

Administration Oracle pas de Commentaire »

The GRID console , though a very useful tool, has the very bad habit to maintain the display of irrelevant ALERTS on its main / Home page.
To get rid of these informations is not obvious nor , of course, documented by Oracle.

SYSMAN account includes 3 relevant objects related to Alerts :
MGMT_SECURITY , actually a View, based on the TABLE SYSMAN.MGMT_VIOLATIONS
MGMT_CURRENT_SECURITY , actually a View, based on the TABLE SYSMAN.MGMT_CURRENT_VIOLATIONS

Here is its description :

Column Name	ID	Data Type	Null?

TARGET_GUID	1	RAW (16)	N
METRIC_GUID	2	RAW (16)	N
KEY_VALUE	3	VARCHAR2 (256 Byte)	N
COLLECTION_TIMESTAMP	4	DATE	N
SEVERITY_CODE	5	NUMBER	N
SEVERITY_TYPE	6	NUMBER	N
SEVERITY_DURATION	7	NUMBER	Y
SEVERITY_GUID	8	RAW (16)	Y
ANNOTATED_FLAG	9	NUMBER	Y
NOTIFICATION_STATUS	10	NUMBER	Y
MESSAGE	11	VARCHAR2 (4000 Byte)	Y
MESSAGE_NLSID	12	VARCHAR2 (64 Byte)	Y
MESSAGE_PARAMS	13	VARCHAR2 (4000 Byte)	Y
ACTION_MESSAGE	14	VARCHAR2 (4000 Byte)	Y
ACTION_NLSID	15	VARCHAR2 (64 Byte)	Y
ACTION_MESSAGE_PARAMS	16	VARCHAR2 (4000 Byte)	Y
ADVISORY_ID	17	VARCHAR2 (64 Byte)	Y
LOAD_TIMESTAMP	18	DATE	Y
USER_NAME	19	VARCHAR2 (64 Byte)	Yand

DELETE_CURRENT_SEVERITY a procedure that  belongs to SYSMAN.EM_SEVERITY package.
Here is its description :

PROCEDURE delete_current_severity (
p_target_guid IN RAW,
p_metric_guid IN RAW,
p_key_value   IN VARCHAR2);

Note : A trigger deltes Rows from MGMT_CURRENT_SSEVERITY AFTER DELETE from MGMT_SEVERITY !!?

A full description of the parameters  can be obtained via the Dictionnary :

SQL> select column_name, comments
from  dba_col_comments
where table_name=’MGMT_SEVERITY’

COLUMN_NAME	COMMENTS

ADVISORY_ID	Advisory ID of the severity
LOAD_TIMESTAMP	Date and time when the severity was loaded
USER_NAME	Name of the user to load the severity
TARGET_GUID	 The target guid of the severity
METRIC_GUID	 The metric guid of the severity
KEY_VALUE	 The key value of the severity
COLLECTION_TIMESTAMP	 The timestamp at which the severity occurred
SEVERITY_CODE	The severity codes for error, warnin, critical etc.
    These codes are backwards compatible with EM 9i and EM 10gR1.
      15 - CLEAR
      18 - INFO
      20 - WARNING
      25 - CRITICAL
     115 - AGENT UNREACHABLE CLEART
     125 - AGENT UNREACHABLE START
     215 - BLACKOUT END
     225 - BLACKOUT START
     315 - METRIC ERROR END
     325 - METRIC ERROR START
    Codes 115 and above are applicable only for response/status metric
SEVERITY_TYPE	 The severity type allows an application that is selecting
      from this table to filter the rows returned by the type of
      severity.  Values in this column are:
           0 - METRIC THRESHOLD ALERT
           1 - AVAILABILITY
SEVERITY_DURATION	The delta time, in hours, from when the severity was logged
    until it was cleared.
SEVERITY_GUID	 The unique id of the severity. Defaults to SYS_GUID()
ANNOTATED_FLAG	A flag to indicate whether the severity is annotated or not.
NOTIFICATION_STATUS	The column used by the notification sub system to determine
    notification status of the severity.
MESSAGE	The message of the severity.  The messages usually contain
    details about what triggered this severity.
MESSAGE_NLSID	The NLS ID of the severity message.
MESSAGE_PARAMS	URL encoded parameters separated by "&" to be used to
    format the severity message.
ACTION_MESSAGE	Suggested action message in english for this severity
ACTION_NLSID	The NLS ID of the action message.
ACTION_MESSAGE_PARAMS	URL encoded parameters for translating action message

Pour avoir des infos sur les alertes :

SELECT distinct s.target_guid, s.metric_guid,t.target_name,t.target_type,
    m.metric_name,   s.collection_timestamp, s.key_value
       FROM mgmt_targets t ,mgmt_current_severity s, mgmt_metrics m
            where s.target_guid = t.target_guid
            and m.metric_guid = s.metric_guid
            and t.target_type='oracle_database' -- interested only in database resultes (not hosts, application server,...)
            and s.collection_timestamp < to_timestamp('01/07/2010','DD/MM/YYYY') -- my deadline
            and t.target_name like 'my_database%'

To clean up, use something like (be careful could delete more rows than you expoect (i have to check that later on…)):

delete from mgmt_severity
WHERE (target_guid,metric_guid) IN
(SELECT s.target_guid,s.metric_guid
FROM mgmt_targets t ,mgmt_severity s
where s.target_guid = t.target_guid
and t.target_type=’oracle_database’
and s.collection_timestamp < to_timestamp(’25/06/2010′,’DD/MM/YYYY’)
and t.target_name like ‘pprtr%’)

ORA-01031: insufficient privileges sur SYS AS SYSDBA remote

Musée des erreurs, scripts et trucs pas de Commentaire »

(user SYS : remote connection failure or remote authentication failure)

Il est possible avec Oracle de se connecter SYSDBA à distance…mais pas toujours ;-) :

SQL> connect sys/monpassword@base_distante as sysdba
ERROR:
ORA-01031: insufficient privileges
Warning: You are no longer connected to ORACLE.

Il faut 3 conditions pour pouvoir faire une authentification a distance (remote authentication) :

  • un fichier de mot de passe (password file)
  • l’autorisation de s’authentifier ( REMOTE_OS_ATHENT=TRUE)
  • la déclaration du password file ( REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE …ou SHARED )

Attention : cette authentification à distance d’un user très privilégié, en fait le + privilégié  (équivallent à SYS) est fortement déconseillée pour des raisons de sécurité.

Le password file d’Oracle est créé avec un utilitaire : orapwd

A sa création le user SYS est par défaut ajouté dans le fichier, une fois que le fichier existe on peut y rajouter d’autres utilisateurs que SYS en utilisant la commande GRANT SYSDBA

– exemple minimal

$> orapwd password=mypassword
– par défaut le fichier créé est  <$ORACLE_HOME>/dbs/orapwd<$ORACLE_SID>
– et plus tard on rajoute un user
SQL> GRANT SYSDBA TO SCOTT;

Attention !!!!!!!!!!!!!!!!!! si on créé un fichier ailleurs (avec le parametre ‘file=’ la commande orapwd s’execute correctyement …et Oracle sera incapable de retrouver le fichier au démarrage !!!!!!!!!! ou si on ne redémarre pas on aura tjs l’erreur ORA-03113
Pas de FILE ici donc un nom par defaut si echoue on n’a aucune erreur !!!

On peut éventuellement s’en apercevoir si on fait un GRANT SYSDBA :
SQL> grant sysdba to sys;
grant sysdba to sys
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled

Syntaxe complete de orapwd :

Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n> nosysdba=<y/n>

where
file - name of password file (mand),le nom et l’emplacement du fichier, c’est faux ce n’est pas obligatoire, au contraire  !
password - password for SYS (mand),
entries - maximum number of distinct DBA, nb max de DBA dans le fichier
force - whether to overwrite existing file (opt), écrase le fichier existant
nosysdba - whether to shut out the SYSDBA logon (opt for Database Vault only).,

Il est possible de vérifier les users enregistrés dans le password file grace a la vue v$pwfile_users :

SQL> select * from v$pwfile_users;
USERNAME                       SYSDB SYSOP
SYS                            TRUE  TRUE

Solution erreur ORA-01157 , ORA-01110 : datafile perdu , corrompu ou effacé

Administration Oracle, Musée des erreurs, Rman, Sécurité Oracle pas de Commentaire »

En 6 clics

(oui je sais c’est un peu long)
L’hypothese est toujours qu’on ait une suavegarde RMAN en place qui tienne la route ( voir mon article : Sauvegarde Oracle 11g avec RMAN en 5 clics , pour + d’infos)
Avec la console OEM :
Cliquer sur l’onglet ‘Availability’, puis le lien ‘perform recovery’, choisir ‘recovery scope = datafile’ , clic ‘recover’, clic ‘Next’, clic ‘Next’ et ‘Submit’.
C’est fini ;-(

En 2 commandes

On va voir ici comment récupérer un fichier perdu…sans savoir lequel ni connaitre RMAN !
En fait 2 commandes suffisent : ADVISE FAILURE et REPAIR FAILURE. C’est tout bonnement miraculeux ca s’appelle Data Recovery Advisor !

Supposons qu’on ait donc perdu un datafile.
Au bout d’un moment (si, si) Oracle va finir par s’en apercevoir et on aura une erreur ORA-1157.
Oracle ERROR at line 1:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: ‘/tmp/dd.dbf’ DATAFILE

Les étapes de restauration sont très simples grace à DATA RECOVERY ADVISOR disponible avec Oracle 11g.
Concrètement ce Data recovery advisor consiste en qq commandes que l’on pourra lancer sous RMAN.

3 commandes utiles :

RMAN> LIST FAILURE : liste les pbs en cours détectés (fichiers manquents, corrompus, etc…)

RMAN> ADVISE FAILURE : propose des solution de recovery et produit un script associé

RMAN> REPAIR FAILURE : execute le script de récupération

Voici un exemple concret :

Connexion a RMAN

$> rman target sys@portab2-a-dd:1521/DD1.dd.com
connected to target database: DD1 (DBID=1767735647, not open)
RMAN>

Recherche de problemes éventuels :

RMAN> list failure;
using target database control file instead of recovery catalog
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
———- ——– ——— ————- ——-
1242 HIGH OPEN 23-JUL-10 One or more non-system datafiles are missing

Ou si l’on souhaite avoir des infos plus détaillées sur le problème on utilise l’ID qui nous intéresse , ici 1242

RMAN> list failure 1242 detail;

List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
———- ——– ——— ————- ——-
1242 HIGH OPEN 23-JUL-10 One or more non-system datafiles are missing
Impact: See impact for individual child failures
List of child failures for parent failure ID 1242
Failure ID Priority Status Time Detected Summary
———- ——– ——— ————- ——-
1245 HIGH OPEN 23-JUL-10 Datafile 6: ‘/tmp/dd.dbf’ is missing
Impact: Some objects in tablespace DD might be unavailable

En suite la partie Assistance / conseil proprement dite (ADvisor) :

RMAN> advise failure;

analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=155 device type=DISK
analyzing automatic repair options complete

Mandatory Manual Actions
========================
no manual actions available
Optional Manual Actions
=======================
1. If file /tmp/dd.dbf was unintentionally renamed or moved, restore it
Automated Repair Options
========================
Option Repair Description
—— ——————
1 Restore and recover datafile 6
Strategy: The repair includes complete media recovery with no data loss
Repair script: /oracle/diag/rdbms/dd1/DD1/hm/reco_1841908370.hm

On peut dès lors récupérer le fichier de données effacé en une étape :

RMAN> REPAIR FAILURE

Ou si l’on veut mieux maitriser ce que l’on fait, visualiser le script et lancer les étapes de restauration et recovery manuellement :

Vérification du script généré :

$> more /oracle/diag/rdbms/dd1/DD1/hm/reco_1841908370.hm
# restore and recover datafile
restore datafile 6;
recover datafile 6;

Restauration (récupération) du fichier perdu à partir des Backups Sets de la sauvegarde RMAN :

RMAN> restore datafile 6;

Starting restore at 23-JUL-10
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /tmp/dd.dbf
channel ORA_DISK_1: reading from backup piece /oracle/flash_recovery_area/DD1/DD1/backupset/2010_07_22/o1_mf_nnnd1_BACUP_INCR_DEL_BAC_0_64jlhkvc_.bkp
channel ORA_DISK_1: piece handle=/oracle/flash_recovery_area/DD1/DD1/backupset/2010_07_22/o1_mf_nnnd1_BACUP_INCR_DEL_BAC_0_64jlhkvc_.bkp tag=BACUP_INCR_DEL_BAC_072210033828
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 23-JUL-10

Récupération de données supplémentaires et synchronisation des fichiers si nécessaire :

RMAN> recover datafile 6;

Starting recover at 23-JUL-10

using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:01
Finished recover at 23-JUL-10

Information sur la FLASHBACH AREA

scripts et trucs pas de Commentaire »

On peut avoir des infos sur la FLASh (BACK) Recovery Area avec la commande simple :

SQL> SHOW PARAMETER DB_RECOVERY

NAME TYPE VALUE
db_recovery_file_dest string /oracle_work/flash
db_recovery_file_dest_size big integer 10G

Démarrage et arret automatique Oracle 11g sous Linux

Administration Oracle pas de Commentaire »

Démarrage automatique sous linux / Unix

Oracle (et le listener s’il n’est pas protégé par un mot de passe) peuvent être démarrés automatiquement comme un service.  L’implantation des fichiers et les ‘run level’ utilisés au boot dépendent des distributions.
Voici un exemple qui fonctionne sous Ubuntu :

  1. se positionner dans le répertoire d’initialisation qui va bien, ici /etc/init.d
  2. créer un fichier  /etc/oraclectl comme suit avec les bonnes valeur de ORACLE_HOME
    et de compte propriétaire oracle

    # les 2 commentaires ‘chkconfig’ et ‘description’ suivants sont OBLIGATOIRES
    # on fournit liste_run_level priorite_start priorite_stop, ici 2,3,5 et 80 , 20
    # chkconfig: 235 80 20
    # description: ajout de service auto pour start/stop oracle#!/bin/bash
    ORACLE_OWNER=”oracle”
    ORACLE_HOME=”/oracle/db11a”
    case “$1″ in
    start)
    echo -n $”Starting Oracle DB:”
    su - $ORACLE_OWNER -c “$ORACLE_HOME/bin/dbstart $ORACLE_HOME”
    echo “OK”
    ;;
    stop)
    echo -n $”Stopping Oracle DB:”
    su - $ORACLE_OWNER -c “$ORACLE_HOME/bin/dbshut $ORACLE_HOME”
    echo “OK”
    ;;
    *)
    echo $”Usage: $0 {start|stop}”
    esac

  3. changer le groupe (dba en général) et les permissions du fichier

    $> sudo chgrp dba oraclectl
    $> sudo chmod 750 oraclectl

  4. tester le script a la main

$>  ./oraclectl  start

  1. ajouter le service oraclectl
    Le moyen le plus simple pour ce faire plutôt que de bidouiller les rc0.d , rc1.d, rc2.d …et autres liens symboliques est d’utiliser la commande chkconfig qui va bien (cf parametres mlis en commentaires en début du script précédent

$> sudo chkconfig –add oraclectl
# ou sans utiliser les commentaires du script (on precise explicitement les levels :
$> chkconfig –level 235 oraclectl on
$> #verifier :$> chkconfig -l oraclectl
oraclectl 0:off 1:off 2:on 3:on 4:off 5:on 6:off
$> # verifier si necessaire le runlevel courant
$> runlevel
N 2

Apres un reboot de la machine  le service oracle devrait démarrer automatiquement…

Oracle Transparent data encrytion (TDE) , tutoriel

Sécurité Oracle pas de Commentaire »

TDE  (Transparent Data Encryption) permet comme son nom l’indique le chiffrement transparent des données d’une table ou d’un Tablespace.
Transparent cette modification qui peut être faite à priori ou a posteriori ne nécessite aucune modification du code des programmes.
Techniquement l’authentification nécessaire à la lecture des données non cryptées est faite par un fichier externe associé à la base , un ‘Wallet’ Oracle.

Il permet d’éviter que des utilisateurs malveillants accèdent aux données OFFLINe, c’est à dire aux données stockées physiquement dans les fichiers en court-circuitant SQL.

Une simple commande Unix
$> strings mon_fichier.dbf
suffit à voir les données ASCII en clair. ce qui pour les CHAR et VARCHAR est très pratique.

Nous allons  détailler ici les étapes necessaires à la mise en place du chiffrement de données sur les colonnes d’une table. Bonne lecture.

1) création d’un Wallet.

Lancer OWM : Wallet /new donner un pwd, ne pas creer de certificat de securite additionnel
ignorer les warning
sauvegarder le wallet dans une directory accessible

On peut vérifier au niveau de l’OS la création d’un fichier wallet :
$> ls -l /data/pprqu/wallet
-rw——-  1 oracle dba 7917 2010-07-02 11:07 ewallet.p12

2) configurer la  base pour utiliser le wallet
rajouter dans sqlnet.ora ($ORACLE_HOME/network/admin/sqlnet.ora)
l’emplacement du Wallet.

WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /data/pprqu/wallet)
)
)

tester la validité des paramaetres avec un eventuel
$> lsnrctl reload

3) ouvrir le Wallet

SQL> ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY  “mmxlv3ipu”;
– Attention aux guillemets !!!!!!!!!!!
– sensible à la casse en plus !!! (11g style !)

rem : on peut eviter cette ouverture manuelle à chaque redémarrage de la base, avec un AUTOLOGIN WALLET

4) créer le mot de passe de la clé de chiffrement principale

SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY “mmxlv3ipu”

!!!!!!!!!!!! doit etre le meme mot de passe sinon :
ORA-28353: failed to open wallet

L’Algorithme de chiffrement par défaut est AES192. On peut en choisir d’autres plus ou moins complexes …voir la doc.

rem : cette commande est valide tant que la base n’est pas redémarrée…

5) chiffrer la colonne confidentielle

SQL> alter table emp_cryptee modify( ename encrypt)
Table altered.

Migrer le Charset de WE8ISO8859P1 à W8ISOMSWIN1252 en Cluster RAC

Administration Oracle, Divers, scripts et trucs pas de Commentaire »

Passage du charset de WE8ISO8859P1 à W8ISOMSWIN1252 sous

RAC

Pour intégrer le passage à l’euro.

Le charset W8ISOMSWIN1252  est un subset de WE8ISO8859P1, il n’y a donc aucun risque mais que des avantages à passer en WE8ISOMSWIN1252 plutôt qu’en WE8ISO8859P15 qui possède mui aussi le caractère ‘€’ (y compris sur linux cf Note Metalink 264294.1).

Sur le nœud 1

[oracle@rac1 script]$ export ORACLE_SID=SID1

[oracle@rac1 script]$ sql

SQL*Plus: Release 10.2.0.4.0 - Production on Wed May 26 14:16:36 2010

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

With the Real Application Clusters option

SQL> create pfile=’/app/oracle/product/10.2.0/db_1/dbs/initSID1.ora’ from spfile;

File created.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

Sur le nœud 2

[oracle@rac2 ~]$ export ORACLE_SID=SID2

[oracle@rac2 ~]$ sql

SQL*Plus: Release 10.2.0.4.0 - Production on Wed May 26 14:14:49 2010

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

With the Real Application Clusters option

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL>

Sur le nœud 1

Dans /app/oracle/product/10.2.0/db_1/dbs on commente les  deux lignes  suivantes cluster_database_instances et cluster_database dans initSID1.ora.

SQL> startup mount pfile=’/app/oracle/product/10.2.0/db_1/dbs/initSID1.ora’

ORACLE instance started.

Total System Global Area 1577058304 bytes

Fixed Size 2084232 bytes

Variable Size 503317112 bytes

Database Buffers 1056964608 bytes

Redo Buffers 14692352 bytes

Database mounted.

SQL> alter system ENABLE RESTRICTED SESSION;

System altered.

SQL> alter database open;

Database altered.

SQL> ALTER DATABASE character SET WE8MSWIN1252 ;

Database altered.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

On dé commente les paramètres dans initSID1.ora.

Avant d’arrêter le noeud 1 penser à recréer le spfile dans ASM.

On re démarre les deux instances

Nœud 1

SQL> startup

ORACLE instance started.

Total System Global Area 1577058304 bytes

Fixed Size 2084232 bytes

Variable Size 503317112 bytes

Database Buffers 1056964608 bytes

Redo Buffers 14692352 bytes

Database mounted.

Database opened.

SQL> quit

Nœud 2

SQL> startup

ORACLE instance started.

Total System Global Area 1577058304 bytes

Fixed Size 2084232 bytes

Variable Size 503317112 bytes

Database Buffers 1056964608 bytes

Redo Buffers 14692352 bytes

Database mounted.

Database opened.

SQL> quit

Le tour est joué.

albanlepunk

Restaurer l’OCR sur un RAC 11GR2

ASM, Cluster RAC pas de Commentaire »

Après avoir installé un cluster 11GR2 incluant la nouvelle fonctionnalité majeure de cette version du clusterware à savoir de pouvoir mettre l’OCR et les voting disks dans ASM, et faisant quelques tests de recette qui comprennent notament la restauration de l’OCR, je me suis demandé comment pouvait on restaurer l’OCR à partir d’ASM quand le cluster est arrêtté?

1. Arrêter le  clusterware sur chaque noeud : crsctl stop cluster -all
2. Sur le noeud ou est présent le backup de l’OCR démarrer manuellementles ressources css and asm.

crsctl start res ora.cssd -init
crsctl start res ora.asm -init

3.Restorer l’ocr:

ocrconfig -showbackup
ocrconfig -restore <ocrbackup file>

4.Démarrer manuellement les ressources manquantes du cluster evmd and crsd.
crsctl start res ora.evmd -init
crsctl start res ora.crsd -init

5. Démarrer le clusterware sur les autres noeuds : crsctl start cluster -all

Un peu plus compliqué que dans les versions précédentes, mais ASM oblige.

Albanlepunk

probleme demarrage console entreprise manager 11g et solutions

Administration Oracle, Musée des erreurs pas de Commentaire »

Suite à des création successives de BDs la console standalone (db control) ne veut plus démarrer pour la BD courante.

$> emctl start dbconsole…failed

L’environnement minimal

…il en faut un !
Le <ORACLE_HOME> doit être correct, le < ORACLE_SID > doit être positionné sur la base cible et le <HOSTNAME>  (nom logique local de la machine) avoir une valeur correcte.
Si tel n’est pas le cas, Oracle ne trouve pas la configuration et on a un message d’erreur du genre

OC4J Configuration issue /oracle/db11g/oc4j/j2ee/OC4J_DBConsole_monpc_TEST not found.

La raison en est qu’il existe des répertoires suffixés avec la valeur de <HOSTNAME> et < ORACLE_SID> notamment :

<ORACLE_HOME>/oc4j/j2ee/OC4J_DBConsole_<HOSTNAME>_<ORACLE_SID>
exemple : /oracle/db11g/oc4j/j2ee/OC4J_DBConsole_monpc_TEST
<ORACLE_HOME><HOSTNAME>_<ORACLE_SID>
exemple : /oracle/db11g/monpc_TEST

Accessoirement la base et le listener doivent être démarrés pour que la console soit complètement fonctionnelle.

rem : on peut cependant lancer la console sans rien et s’en servir pour démarrer la base et le listener…mais je ne vous le conseille pas

Solution brute

1) recréer le référentiel de la console dans la base ( ou repository) qui correspond au schema SYSMAN :

$> emca -repos recreate

2) reconfigurer la console :

$> emca -config dbcontrol db

solution erreur ORA-01752

Musée des erreurs pas de Commentaire »

SQL> Connect scott / Tiger
SQL> create view v_emp as select *
from emp,dept
where emp.deptno=dept.deptno;
SQL> delete from v_emp
-> 14 rows deleted

La suppression de lignes à travers une vue (même avec jointure)  fonctionne !
La condition, qui est vérifiée ici,  est qu’il y ait une clé primaire sur la table maitre de la jointure


SQL> select constraint_name, constraint_type,  table_name
from user_constraints;

CONSTRAINT_NAME  C TABLE_NAME
---------------  - ----------
PK_EMP          P EMP
PK_DEPT      P DEPT
FK_DEPTNO      R EMP

Supprimons la PK de EMP :

SQL> alter table emp disable constraint pk_emp
SQL> delete from v_emp
-> OK

(car on a supprimé la contrainte sur la table détail°

PAR CONTRE  si on invalide (ou supprime)  la contrainte unique de la table maitre

SQL> — on invalide d’abord la clé étrangère de EMP avant la clé primaire de EMP sinon ca marche Pô
SQL> alter table emp disable constraint fk_deptno
SQL>  alter table dept disable constraint pk_dept
SQL> delete from v_emp
ERROR at line 1:
ORA-01752: cannot delete from view without exactly one key-preserved table

Conclusion : on peut faire des suppressions de lignes dans une table à travers une vue avec jointures MAIS
il faut une contrainte unique (ou une clé primaire) sur la table maitre…
sinon ORA-01752.

Accessoirement ORA-01752 :  cannot delete from view without exactly one key-preserved table

Veut bien dire…ce que ca veut dire.

Il y a apparemment un probleme de table sous jacente sans contrainte unique cqfd

ubuntu et oracle : ulimit: 25: bad number

Musée des erreurs pas de Commentaire »

Lorsque l’on lance ceratins utilitaire comme emctl par exemple on a cette erreur qui survient

exemple :

$> emctl start dbconsole

$> ulimit: 25: bad number

Le pb vient de ce que cette commande s’execute en Shell ( sh ) et non pas bash.

Solution : modifier $ORACLE_HOME/bin/emctl et remplacer le

#!/bin/sh -f

par

#!/bin/bash -f

Change Oracle control files location

scripts et trucs pas de Commentaire »

keywords : control file, Oracle control file, Change Control File location,  CONTROL_FILES, Change default Control File location

Its not possible to change CONTROL FILES location with Oracle ENterprise Manager Console ( OEM ) . But you can do it with some SQL commands and…a SPFILE. Here is the script :

$> sqlplus /nolog
SQL> connect sys as sysdba

SQL> show parameter CONTROL_FILES
NAME                                 TYPE        VALUE
———————————— ———– ——————————
control_files                        string      E:\ORADATA\ORCL\CONTROL01.CTL,
E:\ORADATA\ORCL\CONTROL02.CTL
,  E:\ORADATA\ORCL\CONTROL03.CTL

SQL> CREATE PFILE=’c:\temp\pfile.ora’ FROM SPFILE;

edit  c:\temp\pfile.ora and change one of the PATH value for CONTROL_FILES
here :
E:\ORADATA\ORCL\CONTROL03.CTL becomes  C:\TEMP\CONTROL03.CTL

copy the  control file
ici CONTROL03.CTL de E:\ORADATA\ORCL\ vers c:\TEMP

– shutdown and restart with the new parameter
SQL> shutdown abort
SQL> startup

SQL> show parameter control_files
NAME                                 TYPE        VALUE
———————————— ———– ——————————
control_files                        string      E:\ORADATA\ORCL\CONTROL01.CTL,
E:\ORADATA\ORCL\CONTROL02.CTL
, C:\TEMP\CONTROL03.CTL

You’re done !

Changer l’emplacement d’un Control File Oracle

scripts et trucs pas de Commentaire »

Mots ckés : control file, Oracle control file, Changer l’emplacement d’un Control File , changer l’emplacement par défaut d’un control file, CONTROL_FILES

Il n’est pas possible de changer dynamiquement l’emplacement d’un  CONTROL FILE  pour le multiplexer par exemple, avec  Oracle ENterprise Manager Console ( OEM ) . Quelques commandes SQL et l’appui du SPFILE suffisent… :

$> sqlplus /nolog
SQL> connect sys as sysdba

SQL> show parameter CONTROL_FILES
NAME                                 TYPE        VALUE
———————————— ———– ——————————
control_files                        string      E:\ORADATA\ORCL\CONTROL01.CTL,
E:\ORADATA\ORCL\CONTROL02.CTL
,  E:\ORADATA\ORCL\CONTROL03.CTL

SQL> CREATE PFILE=’c:\temp\pfile.ora’ FROM SPFILE;

editer  c:\temp\pfile.ora and change one of the PATH value for CONTROL_FILES
ici :
E:\ORADATA\ORCL\CONTROL03.CTL becomes  C:\TEMP\CONTROL03.CTL

copier le control file
ici CONTROL03.CTL de E:\ORADATA\ORCL\ vers c:\TEMP

SQL> shutdown abort
SQL> startup

SQL> show parameter control_files
NAME                                 TYPE        VALUE
———————————— ———– ——————————
control_files                        string      E:\ORADATA\ORCL\CONTROL01.CTL,
E:\ORADATA\ORCL\CONTROL02.CTL
, C:\TEMP\CONTROL03.CTL

C’est fait!

Configuration SQLdeveloper , instant client Oracle, OID LDAP

Musée des erreurs, Oracle Net, scripts et trucs pas de Commentaire »

Par défaut SQL Developer ne reconnait pas la configuration standard Oracle Net et notamment la résolution de nom via OID, même  si le client est correctement configuré par ailleurs.

ie : une connexion sqlplus fonctionne avec la résolution via OID mais pas sqldeveloper.

Si vous tentez une connexion LDAP vous risquez une erreur du genre : ‘ property ‘hostname’ not set on the database provider ‘ …

Les hypotheses ici :

ORACLE_HOME c:\oracle\instant_client

et dans le sous répertoire standard \network\admin les fichiers de configuration pour la résolution de nom via OID / LDAP :

sqlnet.ora
NAMES.DIRECTORY_PATH= (LDAP, EZCONNECT)
TNSPING.TRACE_DIRECTORY = c:\oracle\instant_client_10g
TNSPING.TRACE_LEVEL = c:\oracle\instant_client_10g

ldap.ora
DEFAULT_ADMIN_CONTEXT = “dc=mondomaine,dc=fr”
DIRECTORY_SERVERS = (sr-oid.mondomaine.fr:389)
DIRECTORY_SERVER_TYPE = OID

Pour que SQLdevelopper fonctionne il faut rajouter la variable TNS_ADMIN dans l’environnement WINDOWS qui pointe sur votre rep NETWORK\ADMIN

C:\>set tns_admin=C:\oracle\instant_client_10g\Network \Admin

ou utiliser la fenetre ‘propriétés’ de vopre poste de travail et le bouton ‘variables d’environnement’ pour ajouter TNS_ADMIN

Dès lors SQLdevelopper reconnait votre serveur LDAP qui apparait dans la liste déroulante (si vous avez choisit ‘type de connexion’ LDAP)

sqld_ldap

Ensuite il ne vous reste plus qu’a choisir le contexte racine dans la liste et cliquer sur le bouton ‘charger’ pour avoir la liste de vos alias définis dans OID…

ORA-03001: unimplemented feature sur un RENAME - solution

Musée des erreurs pas de Commentaire »

On peut pârfois obtenir une erreur ORA-3001 sur un RENAME TABLE.
Après avoir vérifié que ce n’est pas un pb de version (RENAME a du arriver en V 10 je crois) :
VErifier par exemple qu’on est bien en V10 ou 11, et pas en mode dégradé : Voir le parametre ‘COMPATIBLE’.
En fait il s’avere qu’il faut être connecté en tant qu’utilisateur propriétaire.
C’est le ALTER SESSION SET CURRENT_SCHEMA=proprietaire qui pose probleme.

SQL>
SQL> rename code_postaux to codes_postaux;
rename code_postaux to codes_postaux
*
ERROR at line 1:
ORA-03001: unimplemented feature

3 solutions :
- se connecter dans le compte si on a le mot de passe
- utiliser un su, pour substituer réellement l’utilisateur voir l’article sur le su
- faire un execute immediate du RENAME via pl/sql comme suggéré ici

ORA-27102 no space left on device (Linux)

Musée des erreurs pas de Commentaire »

Que faire quand on a cette erreur?

Elle se produit souvent quand on vient d’augmenter la sga_max_size au redémarrage de la base.

A l’installation d’oracle sous linux, il faut positionner certains paramètres noyau pour la gestion de la mémoire (metalink 301830.1).

le shmmall qui correspond à la valeur total de la ram en bytes divisé par la taille de la page mémoire et le shmmax qui correspond à la moitié de la valeur de la Ram totale mais maximum 4Go.

Vérifier que la valeur du shmmall soit la bonne.

Par défaut on met souvent 4Go et pour les gros serveurs de 32Go de ram la valeur est de 8Go (avec une page size à 4096).  Si l’on veut dépasser 4Go de SGA, il faut donc positionner correctement ce paramètre.

$ getconf PAGE_SIZE pour avoir la taille de la page mémoire
4096
# sysctl -p pour voir tous les paramètres kernel
vi /etc/sysctl.conf pour modifier les paramètres
albanlepunk

interroger OID ( Oracle LDAP ) avec Php

PhP et Oracle pas de Commentaire »

Voici un exemple de code qui renvoie un tableau avec tous les Alias de base enregistrés dans OID (Oracle Internet Directory) l’annuaire d’Oracle compatible LDAP.

Pour mettre au point votre programme et interroger votre serveur Oracle OID vous pouvez utiliser un soft gratuit comme le LDAP Browser (navigateur d’annuaire) de Softerra disponible ici : http://www.softerra.com/download.htm

<?php
//liste_base_ldap.php
// renvoie un tableau dynamique contenant la liste des bases de OID
//
function liste_base_ldap() {
// LDAP variables
$ldaphost = “srv_oid.estsurinternet.com”; // serveur LDAP
$ldapport = 389; // port de serveur LDAP
$dn=”dc=esrsurinternet,dc=com”;
$filtre = “objectclass=*Service”;

// Connexion LDAP
$ldapconn = ldap_connect($ldaphost, $ldapport)
or die(”Serveur LDAP $ldaphost introuvable”);
$ldapbind = ldap_bind($ldapconn)
or die (”Connexion anonyme HS”);

// recherche
$rech=ldap_search($ldapconn, $dn, $filtre);

// affichage resultats
$t_base=array();
$info = ldap_get_entries($ldapconn, $rech);
$n=$info['count'];
for ($i=0; $i<$n; $i++) {
$base=$info[$i]["cn"][0] ;// DN de la n-ième entrée du résultat
$t_base[$i]=$base;
}
sort($t_base);
return ($t_base);
}
// print_r (liste_base_ldap());
?>

Comment échapper à Dataguard et à son coût ??

Divers pas de Commentaire »

Il existe un produit nettement moins cher que la solution Dataguard proposé par Oracle et qui de surcroit ne nécessite pas d’être en Enterprise edition, c’est un produit New zelandais, DBVISIT.

Il s’appuie sur les techniques des Standby Database.

Il n’est certes pas zéro perte de données mais peu de solutions le sont et surtout peu d’applicatifs le réclament.

Adaptable sur RAC et ASM, permettant de faire du switchover avec ASm à partir de la version 11, et facile à installer, c’est une belle alternative à Dataguard, sa complexité et son prix.

http://www.dbvisit.com/

Albanlepunk

Introduction sécurité des bases de données

Sécurité bases de données pas de Commentaire »

Introduction

Evolution des architectures vers plus de complexité

On trouvera ci’-après un résumé succint des principales étapes de l’évolution des architectures matérielles et
logicielles qui se sont profondément modifiées lors des deux dernières décennies.

Type client Type serveur Type connexion / architecture logiciels clients logiciels serveur
terminal Mainframe directe - OS + Applicatif
+ fichiers de données
PC terminal Départemental réseau émulateur OS + Applicatif + SGBD
PC lourd Départemental client /
serveur
applicatif
nav + applet
OS + Applicatif + SGBD
PC léger Départemental / Central n-tier+
X Net
navigateur Srv d’application :OS + web
Srv de données : OS + SGBD


la plupart de ces architectures peuvent sembler désuettes, voire anachroniques, mais il suffit de se pencher sur l’écran d’un ordinateur dans une grande surface ou un aéroport pour constater que l’émulation de terminal (même enjolivée) est toujours très utilisée .
Quoi qu’aie pu en penser SUN il y a quelques années :” the Network is NOT YET the computer”

On constate cependant à l’évidence une tendance à la complexité :

  • multiplication des matériels (plusieurs clients fixes ou mobiles,
    plusieurs serveurs, réseau hétérogènes)
  • multiplication des couches logicielles (OS client, application client, client
    reseau, OS serveur, serveur reseau, serveur applicatif, SGBD)
  • multiplication (voire ubiquité) des réseaux ( intranet, internet
    et surtout en ce qui concerne la sécurité des données
    EXTRAnet)
  • généralisation du partage de données : entre particuliers,
    mais aussi employés, entreprises, clients, fournisseurs, partenaires

qui fait de la sécurité des données un enjeu majeur

La sécurité : un nouvel enjeu

Plusieurs raisons font que la sécurité devient un enjeu important :

  • complexité croissante des SI
  • exigence croissante de qualité (certification ISO 9001, et plus spécifiquement ISO 27001)
  • exposition accrue des données et applications avec INTERNET + INTRANET ++ EXTRANET
  • augmentation (et meilleure diffusion / communication) des attaques

Pour info, ci après les statistiques du CERT sur les enregistrements d’incidents des dernières années :

stats_cert

Note : l’absence de statistiques depuis 2003 indique simplement que le CERT a arrété de compter !!!!!!!!!!!!!!!!! Notamment à cause du fait que de + en + d’automates font des attaques massives, ce qui rend leur nombre de moins en moins significatif.

Statistiques sur les incidents réel…et supposés

On trouve dans le tableau ci après issu d’une étude du CLUSIF (Club de la Sécurité de l4Information Francais) de 2008, la perception des incidents de sécurité des SI :

perception_incidents_secu1perception des incidents

et dans le tableau suivant (même source), les statistiques réelles sur les incidents en entreprise

typo_incidents_secu

Un petit exemple de dérive

Voici un extrait du site ‘comment ca marche’ sur l’introduction à la sécurité des systèmes d’information :

<< …Afin de pouvoir sécuriser un système, il est nécessaire d’identifier les menaces potentielles, et DONC de connaître et de prévoir la façon de procéder de l’ennemi. Le but de ce dossier est ainsi de donner un aperçu des motivations éventuelles des pirates, de catégoriser ces derniers, et enfin de donner une idée de leur façon de procéder afin de mieux comprendre comment il est possible de limiter les risques d’intrusions…>>

en 3 lignes on retrouve les termes : menaces, ennemi, motivation, pirate, intrusion… qui présupposent que la sécurité des SI est forcément (’donc’) mise en péril par des Hackers malveillants, ce qui est loin d’être la réalité comme en témoignent les stats précédentes…

Comme quoi tout ce qui est sur le net (sauf mon site bien sûr) n’est pas parole d’évangile.

A savoir (et à se rappeler…)

  • La complexité des SI impose une approche globale,
    ’systémique’ du problème (attention de ne pas envisager QUE la sécurité des BDs)

  • K.I.S.S principle (Keep It Simple Stupid !) : VISEZ LA SIMPLICITE
    • pour réduire la complexité du SI ( Normes et standards des différentes couches matérielles et logicielles + moyens d’imposer et vérifier ces standards)
    • pour produire des règles, des procédures et des contraintes pragmatiques, de bon sens et ‘respectables’
    • adapter les procédures et règles en fonction des populations (un poste admin local n’est pas un PC d’internaute)
  • Un SI a le niveau de sécurité du plus faible de ses composant (principe du “maillon faible” !)

  • Elle nécessite l’implication ET SURTOUT L’ADHESION de TOUS (si certains employés n’adhèrent pas, ils généreront du “maillon faible”)

  • La sécurité est fonction d’objectifs et d’un enjeu (la mise en place d’un plan de sécurité est un projet)

  • Il n’existe pas de système totalement sûr ( on visera à satisfaire au mieux les objectifs et répondre aux besoins)

Le projet Sécurité

Sécurité bases de données pas de Commentaire »

Les grandes étapes

Elles peuvent être résumées dans le schéma suivant :

strategie_pgssi

La phase stratégique

note : la phase stratégique reboucle sur elle même : la décision stratégique , plutôt une VOLONTé STRATEGIQUE au départ donne lieu à une étude d’opportunité / faisabilité (en fonction des risques, des enjeux, des obligations légales, etc) et donne (ou pas) la décison stratégique.

  • La législation

Pourquoi la prendre en compte :
- il existe des lois, nul n’est censé les ignorer
- les enfreindre implique une responsabilité civile ou pénale de l’entreprise
- la loi peut imposer de nouvelles activités à l’entreprise (pas seulement interne) : exemple : la dématérialisation des marchés publics et l’e administration

Quelle législation ?
- lois nationales, directives, Européennes, lois internationales
- règlements intérieurs, conventions collectives (de la métallurgie par exemple), délibération des collectivités

Les lois nationales concernent principalement :
- la loi informatique et libertés (CNIL) (respect de la vie privée, des données personnelles, obligation de déclaration)
- la propriété intellectuelle
- protection/la copie/le piratage d’oeuvres ou de logiciels
- le recyclage de déchets électroniques et informatiques

  • L’analyse des risques

On sait qu’il y a des risques, encore faut il les analyser / évaluer.
Il existe différentes catégories de menaces :
- internes / externes (80% / 20 % !!)
- par intérêt économique ou par jeu / défi intellectuel

Il existe différents types d’acteurs :
- des individus (employés rancuniers ou cupides, hackers)
- des entreprises
- des états (espionnage industriel, terrorisme)

On évaluera par exemple leur probalité (est ce qu’une administration est susceptible d’être attaquées par des entreprises concurrentes ???)

  • La classification

Pragmatisme !! : toutes les informations ou ressources associées ne demandent pas le même niveau de sécurité. Cela implique de les classifier / quantifier. Un effet de bord intéressant sera que l’on limitera l’énergie et l’argent dépensé !

On quantifie la SENSIBILITE des infos et ressources (en fonction de la loi, des enjuex , des missions de l’entreprise)
==> taxinomie :

- par niveau de sensiblité
- par domaine de sécurité (confidentialité, disponiblité,…)
Ceci implique des procédures de protection et de gestion des documents et des ressources.
ET aussi un niveau de diffsuion des docs (de libre à…secret défense!)

+ d’infos  sur Wikipedia : http://fr.wikipedia.org/wiki/Sécurité du_système_d’information

Méthodologie

EBIOS
mise au point par le SCSSI : Service central de Sécurité des SI, du gouvernement (1er ministre)

Les principales étapes de la démarche sont les suivantes

ÉTAPE 1 – ÉTUDE DU CONTEXTE
ACTIVITÉ 1.1 – ÉTUDE DE L’ORGANISME
ACTIVITÉ 1.2 – ÉTUDE DU SYSTÈME-CIBLE
ACTIVITÉ 1.3 – DÉTERMINATION DE LA CIBLE DE L’ÉTUDE DE SÉCURITÉ
ÉTAPE 2 – EXPRESSION DES BESOINS DE SÉCURITÉ
ACTIVITÉ 2.1 – RÉALISATION DES FICHES DE BESOINS
ACTIVITÉ 2.2 – SYNTHÈSE DES BESOINS DE SÉCURITÉ
ÉTAPE 3 – ÉTUDE DES MENACES
ACTIVITÉ 3.1 – ÉTUDE DES ORIGINES DES MENACES
ACTIVITÉ 3.2 – ÉTUDE DES VULNÉRABILITÉS
ACTIVITÉ 3.3 – FORMALISATION DES MENACES
ÉTAPE 4 – IDENTIFICATION DES OBJECTIFS DE SÉCURITÉ
ACTIVITÉ 4.1 – CONFRONTATION DES MENACES AUX BESOINS
ACTIVITÉ 4.2 – FORMALISATION DES OBJECTIFS DE SÉCURITÉ
ACTIVITÉ 4.3 – DÉTERMINATION DES NIVEAUX DE SÉCURITÉ
ÉTAPE 5 – DÉTERMINATION DES EXIGENCES DE SÉCURITÉ
ACTIVITÉ 5.1 – DÉTERMINATION DES EXIGENCES DE SÉCURITÉ FONCTIONNELLES
ACTIVITÉ 5.2 – DÉTERMINATION DES EXIGENCES DE SÉCURITÉ D’ASSURANCE

Le memento de la méthode EBIOS

Conversion d’une base oracle de 7 bits en 8 bits

scripts et trucs 1 Commentaire »

A partir de Oracle 8.1 on peut utiliser une commande ‘ALTER’ pour changer le jeu de caractères ( CHARACTER SET) de la base Oracle(qui est codé en dur lors du CREATE DATABASE…) Pour par exemple la convertir de US7ASCII à WE8MSWIN1252 ou WE8ISO8859P1. Note : la conversion peut fonctionner car tous les caratères encodés de la sources sont représentables dans le jeu de caractère cible. En d’autres termes par que les jeux de caractères 8bits sont en général des sur ensembles (supersets) de U7ASCII. Faire une sauvegarde de la base puis passer les commandes suivantes :

SQL> STARTUP MOUNT; — la base doit être en mode RESTRICT
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET WE8MSWIN1252;
– ou par exemple CHARACTER SET WE8ISO8859P1;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

Cela permettra de résoudre des problèmes de compatibilité d’export / import par exemple.

Remarque : il est peu évident d’admettre qu’une base en jeu de caractère 7 bits US7ASCII, puisse afficher des caractères accentués, c’est pourtant le cas.

Il suffit de laisser la base telle quelle et de paramétrer les clients avec un jeu de caractères 8 bits, via le paramètre d’environnement NLS_LANG par exemple. Voir la doc NLS pour + d’infos.
ATTENTION ! il faut bien sûr que les données aient été saisies (INSERT SQL) dans CET environnement pour que cela marche !

Solution de l’erreur Oracle ORA-01843

Musée des erreurs, scripts et trucs pas de Commentaire »

Un exemple :

SQL> update ma_table
set ma_date=’10/04/2009′
/
ERROR at line 1:
ORA-01843: not a valid month

Le format de date proposé est incompatible avec la base de données cible.

Ceci se produit lorsque le client Oracle n’est pas dans la même configuration que le serveur au niveau de son environnement de ‘localisation’ : environnement NLS (Oracle National Language Support

solution temporaire (la durée de la session)
SQL> ALTER SESSION SET NLS_DATE_FORMAT=’MM/DD/YYYY’;

solution un peu plus pérenne sous Unix/Linux :
Changer le paramétrage du client Oracle, pour positionner le nouveau format de date par défaut.
Ceci se fait avec une variable d’environnement Unix :

$> export NLS_DATE_FORMAT=DD/MM/YYYY

Sous Windows (personne n’est parfait) l’environnement client Oracle est spécifié dans la base de registres, donc on modifiera / ajoutera une clé NLS_DATE_FORMAT dans la section HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE avce regedit par exemple.

Note : lorsqu’on utilise un client léger (application Web ou i*SQLPlus par exemple), il ne faut pas regarder la cofiguration du poste client bien sûr, mais celle su serveur Web qui, dans une architecture 3-tier, est le ‘vrai’ client de la base de données…

Introduction au langage PLSQL d’Oracle

PLSQL 3 Commentaires »

Cet article a pour but de présenter ce qu’est PLSQL, pour les tous débutants et sera suivi de quelques autres, qui rentrent dans le vif du sujet et apprennent à coder / programmer avec le PLSQL d’Oracle.

PL SQL ?
L’acronyme veut dire Procedural Langage SQL, donc en Francais Langage procédural  SQL.

Si SQL est un langage ensembliste et non procédural soumis à une norme (à peu prés portable), il n’est pas un langage de programmation.
PL/SQL EST un vrai langage de programmation, procédural, propre à Oracle et donc NON PORTABLE
PL/SQL comme SQL s’exécutent sur le moteur de la base de données et non sur le client
SQL interprète les commandes une à une, Le moteur PL/SQL interprète des blocs de commandes (et est donc à priori plus performant)
PL/SQL peut être stocké dans la base ou utilisé de manière interactive

Environnements de travail

PL:SQL peut s’utiliser dans les environnement suivants :
Interpréteurs SQL : SQL*Plus, i*SQLPlus
Précompilateurs (Pro*C, Pro*Cobol.) (ca commence à dater !)
Outils de développement : SQLDeveloper, Designer, Forms, et même APEX
Autre langages de développement : C,C++,Java,PHP

Le + simple pour démarrer avec PLSQL est d’utiliser SQL*developper l’outil de développement gratuit d’Oracle, téléchargeable sur http://otn.oracle.com

Avantages / inconvénients

PLSQL est complémentaire du SQL (qui lui n’est pas un langage de programmation)
est en général stocké dans la base, et permet donc un emeilleure intégration/cohérence du code avec les données
permet le traitement par bloc de SQL et donc optimise le trafic réseau
utilisation de variable de stockage et de type simple et structuré dynamique (%TYPE, %ROWTYPE, etc)
traitements plus complexes, notamment pour la gestion des cas particuliers et des erreurs (traitement des exceptions)
l’utilisation de librairies standards prédéfinies (supplied PLSQL packages, comme les RDBMS_xxx)
paramétrage et création d’ordres SQL dynamiques.

Fonctionnalités issues de SQL

PL/SQL intègre des ordres SQL de gestion de la base :
interrogation de données : SELECT
manipulation de données : INSERT, UPDATE, DELETE
gestion transactionnelle : COMMIT, ROLLBACK
fonctions : TO_CHAR, TO_DATE, UPPER, ROUND…
manipulation de structures : CREATE, ALTER , DROP, RENAME, …

rem : Avec les versions antérieures à la 9i, Les ordres du LDD ne sont pas supportés par défaut il faut utiliser un package spécial : DBMS_SQL !

Spécificités PL/SQL

Définition de variables simple, et structurées (tableaux, record)
Définbitiion de nouveaux types
Traitements conditionnels (if, then , else)
Traitements répétitifs (boucles for, while, …)
Gestion des curseurs
Gestion des erreurs / exceptions

Déclinaisons et mécanismes implémentatnt la Sécurité des SGBDs

Sécurité bases de données pas de Commentaire »

Les différents aspects de la sécurité

On envisage souvent la sécurité sous un angle fermé, essentiellement celui de la confidentialité. Mais bien d’autres concepts sous tendent la sécurité. Ils sont pratiquement tous applicables aux OS ET aux SGBDs, tant il est vrai que ces deux domaines sont extrêmement recouvrants.

  • confidentialité
    Tout n’est pas accessible à tout le monde! Se connecter à l’OS ou à la base de données, donne un certain nombre de droits et de ressources en fonction d’un profil défini et maintenu par un administrateur. La granularité d’accès peut aller jusqu’à la vision unique d’un champ d’un enregistrement d’une table articulière.
  • disponibilité
    Faculté de délivrer correctement un service en terme de délai et de qualité à l’utilisateur. Se mesure en pourcentage du temps de fonctionnement total.Une disponibilité de 100% est possible (temps
    de reprise nul) il suffit de s’en donner les moyens logiciels et matériels…
  • fiabilité
    Des mécanismes de sauvegarde variés (physique, logique, off-line, on-line, totale, partielle, incrémentale), ainsi que des mécanismes de journalisation, et de reprise permettent de restaurer une information sans
    pratiquement aucune perte, dans tous les cas de problème matériel ou logiciel.
  • intégrité
    Que les données soient réparties ou non –dans ce dernier cas les mécanismes mis en jeux seront plus complexes– elles doivent être cohérentes. Cela sous entend, d’une part que les accès concurrents d’utilisateurs, notamment lors de mises à jour, ne doivent pas compromettre la cohérence des données et d’autre part que ces dernières satisfassent aux contraintes d’intégrité du modèle, et / ou aux règles de gestion de l’entreprise.
  • tracabilité
    en cas de problème important ou d’attaque du système, on peut recourir à l’analyse de traces ou de logs. Le niveau de détail de ces traces est paramétrable, et concerne soit les aspects système, soit réseau, soit l’accès aux données élémentaires elles-mêmes.
  • maintenabilité aptitude à la réparation, évolution, maintenance du système. Mesuré en temps de reprise après panne (Mean Time To Recover)

Les mécanismes mis en oeuvre pour la sécurité des BDs

Les SGBDs (dignes de ce nom) se doivent de fournir un certain n ombre de mécanismes internes ou de fonctionnalités assurant un niveau satisfaisant de sécurité.

  • L’authentification, est le processus qui permet de vérifier
    qu’un utilisateur réclamant un accès est bien celui qu’il prétend être, ou plus simplement le processus qui contrôle l’identité de l’utilisateur. Cette action (login) se fait en général via la fourniture du couple nom d’utilisateur / mot de passe.
    Dans certains cas l’authentification peut être implicite et héritée d’une authentification précédente, ou reconnue automatiquement (@IP du user sur le réseau par exemple), bien que simplifiant les accès ce choix peut évidemment s’avérer dangereux.

La multiplication des couches logicielles sus évoquée, et l’inflation d’applications sur les postes utilisateur fait que ce dernier est fréquemment amené à s’authentifier des dizaines de fois par jour. La signature unique (Single Sign On ou SSO) est un objectif très louable mais rarement atteint !

  • Les droits et privilèges : une fois correctement identifié l’utilisateur doit pouvoir accéder aux informations
    et ressources auxquelles il a droit (et uniquement à celle là! ) Ce problème est résolu le + simplement avec la gestion de droits élémentaires accordé à un individu, ou plus efficacement avec des rôles et / ou profils affectés à des groupes d’invidus…ou à des rôles ou profils.
  • Les LOGs ou traces : permet d’enregistrer tout ou partie des informations concernant les accès (réussis ou échoués). Cette trace pourra être plus ou moins verbeuse et son volume étroitement surveillée. De ce fait on l’utilisera de manière cibllée sur des périodes de temps spécifiques
  • tolérance aux pannes : permet par du matériel ou du logiciel redondant (CPUs, disques, IOs) de supporter de manière partiellemnt ou complètement transparentes différents types de pannes, tant au niveau du client, que du réseau, que du serveur. Une tolérancec totale a bien sur un cout certain.
  • sauvegarde et restauration
    sauvegarder les données sur des supports externes (disques, bandes, etc.) et pouvoir les restituer, les plus à jour possible. Le but est de ne pas perdre de données suite à un pb matériel (panne disque) , logiciel (bug) ou une fausse manipulation d’un utilisateur.
  • mécanismes transactionnels
    l’atomicité des transactions, par définition assure la cohérence des données, même dans des environnements distribués. L’image avant modification, stockée de manière redondante dans ou hors de la BD, permet de faire d’éventuels retours arrière pour retrouver le dernier état cohérent, ou de s’assurer qu’il n’y aps pas eu d’opérations partielles ou incomplète (transaction bancaires par exemple)
Aspect sécurité mécanisme mis en oeuvre exemple d’implémentationau niveau SGBD exemple d’implémentationau niveau OS
confidentialité
  • authentification
  • indépendance logique / physique
  • référentiel user / password : DBA_USERS
  • tables de user applicatifs
  • identification externe :
    CREATE USER …IDENTIFIED EXTERNALLY
  • tables / tbs / fichiers
  • vues (1)
  • virtual private database
  • SSO LDAP
  • identification externe
  • architecture client serveur
  • droits et privilèges
  • droits d’accès aux données
    GRANT SELECT ON toto
  • droits du LDD ou Systeme
    GRANT CREATE TABLE TO…
    GRANT CREATE SESSION TO…
  • roles
  • user OS DBA ou root
traçabilité
  • logs et traces
  • tables d’audit
  • log Oracle Net
  • logs apache
  • logs OS
  • logs réseau
fiabilité, disponibilité, maintenabilité
  • tolérance de panne
  • stand by DB
  • cluster logiciels : architecture R.A.C
  • H.A.C.M.P
  • techno RAID
  • machine redondantes
  • sauvegarde et restauration
  • physique : sauvegarde + journalisation + restauration
  • logique : export / import
  • génération de SQL
  • copie physique totale
intégrité
  • transaction atomique
  • contraintes d’intégrité
  • Two Phase Commit (2PC)
  • contraintes ‘reference’
  • read consistancy

(1) la vue est pratiquement le seul contrôle d’accès offrant un niveau de granularité ligne ou colonne ! et qui plus est de manière contextuelle, en les paramétrant (tranches horaires, @ IP, etc.)

Principes de base sécurité Oracle

Divers, Sécurité Oracle pas de Commentaire »

Les principaux sont expliqués ici :

Compatibilité Dataguard Logique en 10gR2

dataguard pas de Commentaire »

Avant de se lancer dans l’entreprise de mettre en place un dataguard, il est judicieux de vérifier si vos applications le supportent !

En effet Quelques fonctionnalités et types de données ne sont pas supportés par un Dataguard Logique (LOGICAL STANDBY DATABASE).

Principalement :

  • un certain nombre de types de données un peu ‘exotiques’
  • les segments compressés
  • certains packages standards (supplied packages)

En détail ca nous donne :

DATATYPES non supportés
BFILE
Collections : VARRAYS , NESTED TABLE
Encrypted columns
spatial : SDO_%
media : ORD%
still images : SI_%
ROWID, UROWID
User-defined types : TYPE
XMLType

SUPPLIED PACKAGES non supportés
DBMS_JAVA, DBMS_REGISTRY,DBMS_ALERT, DBMS_SPACE_ADMIN, DBMS_REFRESH,
DBMS_REDEFINITION, DBMS_SCHEDULER, et DBMS_AQ.

Voici de petits scripts qui permettent de générer un rapport sur la compatibilité de votre base de données avec une STandby database logique. Ils recherchent les schémas et/ou objets qui peuvent poser problème :

Prompt Schemas internes non supportés
SELECT OWNER FROM DBA_LOGSTDBY_SKIP
WHERE STATEMENT_OPT = ‘INTERNAL SCHEMA’
/

PROMPT “Nested Tables”
SELECT owner, table_name
FROM DBA_NESTED_TABLES
WHERE OWNER NOT LIKE ‘%SYS%’
ORDER by 1,2
/

PROMPT “Types non supportés”
SELECT OWNER,TABLE_NAME,COLUMN_NAME, DATA_TYPE
FROM DBA_TAB_COLUMNS
WHERE DATA_TYPE NOT IN
(
‘BINARY_DOUBLE’,
‘BINARY_FLOAT’,
‘BLOB’,
‘CHAR’,
‘CLOB’,
‘NCLOB’,
‘DATE’,
‘INTERVAL YEAR TO MONTH’,
‘INTERVAL DAY TO SECOND’,
‘LONG’,
‘LONG RAW’,
‘NCHAR’,
‘NUMBER’,
‘FLOAT’,
‘INTEGER’,
‘NVARCHAR2′,
‘RAW’,
‘VARCHAR2′,
‘VARCHAR’,
‘UNDEFINED’
)
AND DATA_TYPE NOT LIKE ‘TIMESTAMP%’
AND OWNER NOT LIKE ‘%SYS%’
AND OWNER <> ‘XDB’
ORDER BY 1,2,3
/

PROMPT “Segments compressés”
SELECT OWNER, TABLE_NAME
FROM DBA_TABLES
WHERE COMPRESSION=’ENABLED’
/

PROMPT Table sans identifiant unique
SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE
WHERE (OWNER, TABLE_NAME) NOT IN
(SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)
AND BAD_COLUMN = ‘Y’
/

Rem : on pourrait utiliser une vue du dictionnaire apparemment faite pour ca : DBA_LOGSTDBY_UNSUPPORTED mais cette vue mélange “segment compression” et data type non supportés, et donne d’après ce que j’ai pu tester des résultats incomplets…
PROMPT “Rapport générique

SQL non supporté

Un certain nombre d’ordres SQL ne son pas répliqués sur la base STANDBY (Skipped SQL) :

ALTER DATABASE
ALTER MATERIALIZED VIEW
ALTER MATERIALIZED VIEW LOG
ALTER SESSION
ALTER SYSTEM
CREATE CONTROL FILE
CREATE DATABASE
CREATE DATABASE LINK
CREATE PFILE FROM SPFILE
CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW LOG
CREATE SCHEMA AUTHORIZATION
CREATE SPFILE FROM PFILE
DROP DATABASE LINK
DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW LOG
EXPLAIN
LOCK TABLE
SET CONSTRAINTS
SET ROLE
SET TRANSACTION

La plupart n’ont rien à faire dans une application standard et ne devraient donc pas poser de problème.

Attention !

on portera une attention particulière à l’instruction ‘ ALTER SESSION’ souvent utilisée soit pour changer l’identité d’un user applicatif, ou pour positionner des paramètres NLS et ainsi paramétrer les dates, langues et autres monnaies (NLS_DATE, NLS_LANGUAGE, NLS_CURRENCY, …).

Vérifiez bien que vos applicatifs n’utilisent pas cette instruction pour changer de contexte au démarrage…

Introduction à Oracle Streams

Oracle Streams pas de Commentaire »

Oracle Streams est une fonctionnalité standard d’Oracle (depuis la version 9i) qui permet de répliquer des données, d’une base source vers une ou plusieurs bases destination.

Et ce avec différents niveau de granularité :

  • réplication de table(s)
  • de schema(s)
  • de base complète

sachant que chaque niveau peut lui même être affiné en le filtrant par des règles…

Comment fonctionne Oracle Streams

Oracle Streams s’appuie sur 3 processus distincts :

  • la capture : sur la db source, intercepte toutes les modifications faites sur les données (via les redo logs) et les transforme en enregistrements logiques (Logical Change Record ou LCRs). CEs LCRs sont empilés dans une queue de messages,
  • la propagation : entre db source et destination, transporte ces LCRs et les empile dans une queue de messages
  • l’application (apply process) : sur la db destination, qui dépile les messages, les transforme et répercute les modifications sur les données cibles.

streams_capture

détail d’une capture

streams_propagation

détail de la propagation

Techniquement, la configuration et la mise en oeuvre d’Oracle Streams se fait avec un nombre restreint de procédures du package PL/SQL standards DBMS_STREAMS_ADM. Ce package permet :

  • la gestion des queues de messages (procédure DBMS_STREAMS_ADM.SETUP_QUEUES, DBMS_STREAMS_ADM.REMOVE_QUEUES
  • la gestion des règles de filtrage (procédures DBMS_STREAMS_ADM.ADD_%_RULES)
  • (procedures DBMS_STREAMS_ADM.MAINTAIN_GLOBAL, DBMS_STREAMS_ADM.MAINTAIN_SCHEMA, DBMS_STREAMS_ADM.MAINTAIN_TABLES,…)

Quelques utilisations d’Oracle Streams

Oracle streams peut être utilisé notamment pour les sctions suivantes :

  • réplication automatique de données
  • chargement d’infocentre / entrepot de données
  • sauvegarde de données
  • audit
  • gestion de piles de messages

Surveillance d’Oracle STreams

On peut également, administrer une partie de Streams avec la GRID Console

Les principales vues du dictionnaire de données concernant Streams sont les suivantes :

  • DBA_APPLY, DBA_APPLY_%
  • DBA_CAPTURE, DBA_CAPTURE_%
  • DBA_HIST_STREAMS_%
  • DBA_PROPAGATION
  • DBA_RULE_%
  • DBA_STREAMS_%

ainsi que les vues dynamiques suivantes :

V$BUFFERED_%, V$PROPAGATION_SENDER, V$PROPAGATION_RECEIVER, V$RULE_%, V$STREAMS_%

Réplication de schéma automatique avec Oracle Streams

Oracle Streams 4 Commentaires »

Cet article vous propose une mise en oeuvre pas à pas, d’une réplication automatique de schéma, entre 2 bases de données Oracle.

Une fois les process mis en place, toute modification sur le schema source (update, delete, insert) et même DDL (create, alter , drop,…) sera répercutée automatiquement et en temps réel (si on a COMMITé bien sûr ;-) , sur le schéma répliqué.

Pour plus d’infos voir mon autre article sur ce qu’est Oracle STREAMS et comment marche Oracle STREAMS

Cet exemple a été testé sur une 10gR2.

Pour quoi ca va marcher :

  • db1 et db2 sont en 10gR2
  • db1 est en ARCHIVELOG
  • il existe un user d’administration STREAMS (strmadmin) sur db1 ET db2
  • on veut répliquer toutes les tables du schéma SCOTT2 de db1, de manière synchrone
  • le schéma SCOTT2 existe avec droits de création d’objets et quotas sur db2
  • DB1 est accessible à partir de db2 via un database link

Mise en oeuvre pas à pas

1) verif archivelog mode sur source

SQL> select name, log_mode
from v$database;

2) verifier positionner les paramètres minimaux de INSTANCE

job_queue_processes >=2
sga_target=0 (sinon streams_pool_size >=200M)
open_links>=2
logmnr_max_persistent_sessions >=1
parallel_max_servers >=2

on pourra utiliser pour ce faire la commande :

SQL> ALTER SYSTEM SET nom_parametre = valeur SCOPE=BOTH;

3) créer un user d’administration de stream avec son TBS sur la source et la destination

–creation TBS
SQL>CREATE TABLESPACE streams_dat
DATAFILE ‘/work/devun/streams_dat1.dbf’ SIZE 25M
AUTOEXTEND ON MAXSIZE 256M;
– creation administrateur
SQL>CREATE USER strmadmin IDENTIFIED BY strmadmin
DEFAULT TABLESPACE streams_dat
QUOTA UNLIMITED ON streams_dat;
– cession des privileges adequats
SQL>grant dba to strmadmin;
– et en tant que SYS
BEGIN
DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(
grantee => ’strmadmin’,
grant_privileges => true);
END;
/

– idem sur destination

4) créer les queues nécessaire (sur S et D)

– en tant que strmadmin !!!
– creation des tables de queue
– sur source
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table => ’strmadmin.streams_queue_table_S’,
queue_name => ’strmadmin.streams_queue_S’);
END;
/

– sur destination
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table => ’strmadmin.streams_queue_table_D’,
queue_name => ’strmadmin.streams_queue_D’);
END;
/

check :
SQL> select OWNER , NAME ,QUEUE_TABLE ,QID
from DBA_QUEUES where OWNER = ‘STRMADMIN’

5) créer LES db link nécessaires

– de la source vers la destination…
– pour la propagation (je suppose)

SQL>CONNECT strmadmin/strmadmin@DEVUN
SQL>CREATE DATABASE LINK STREAMS_DEST
CONNECT TO strmadmin
IDENTIFIED BY strmadmin
USING ‘PPRUN’;

– de la destination vers la source
– ca c’est par qu’on utilise DBMS_DATAPUMP
– qui importe la source a travers un dblink
– pour initialiser le compte
SQL>CREATE DATABASE LINK DEVUN
CONNECT TO strmadmin
IDENTIFIED BY strmadmin
USING ‘DEVUN’;

6) create schema cible ’scott2′ VIDE sur db2, s’il n’existe pas

SQL> CREATE USER SCOTT2
identified by tiger2;
SQL> alter user scott2 default tablespace USERS;
SQL> alter user scott2 quota unlimited on users;
SQL> grant create session, resource to scott2;

7) simulation à blanc (ceux qui sont optimistes peuvent sauter cette étape…)

– il est possible de faire un test à blanc qui généer un script SQL
- et de verifier si la configuration est correcte
– on a a lors besoin de creer des DIRECTORY et de spécifier des emplacements pour le script
– parametres : source_directory_object, destination_directory_object,
– script_directory_object,script_name

BEGIN
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names=>’scott2′,
source_directory_object=>’STREAMS_SRC_DIR’,
destination_directory_object=>’STREAMS_DEST_DIR’,
script_directory_object=>’STREAMS_SRC_DIR’,
script_name=>’script_streams.sql’,
source_database=>’DEVUN’,
destination_database=>’STREAMS_DEST’,
capture_name=>’capture_scott2′,
capture_queue_table=>’strmadmin.streams_queue_table_S’,
capture_queue_name=>’strmadmin.streams_queue_S’,
capture_queue_user=>null,
apply_name=>’apply_scott2′,
apply_queue_table=>’strmadmin.streams_queue_table_D’,
apply_queue_name=>’strmadmin.streams_queue_D’,
apply_queue_user=>null,
propagation_name=>’prop_scott2′,
bi_directional=>false,
include_ddl=>true,
instantiation=>dbms_streams_adm.instantiation_schema_network,
perform_actions=>false
);
END;

8) ACTIVATION effective de la réplication

– source, dest directories, script_directory_object et script_name inutiles et perform_action a TRUE
– l’initialisation du compte se fait par DBMS_DATAPUMP
– (grace au parametre : instantiation=>dbms_streams_adm.instantiation_schema_network)

BEGIN
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names=>’scott2′,
source_directory_object=>NULL,
destination_directory_object=>NULL,
source_database=>’DEVUN’,
destination_database=>’STREAMS_DEST’,
capture_name=>’capture_scott2′,
capture_queue_table=>’strmadmin.streams_queue_table_S’,
capture_queue_name=>’strmadmin.streams_queue_S’,
capture_queue_user=>null,
apply_name=>’apply_scott2′,
apply_queue_table=>’strmadmin.streams_queue_table_D’,
apply_queue_name=>’strmadmin.streams_queue_D’,
apply_queue_user=>null,
propagation_name=>’prop_scott2′,
bi_directional=>false,
include_ddl=>true,
instantiation=>dbms_streams_adm.instantiation_schema_network,
perform_actions=>true
);
END;

Le miracle

SQL> select count(*) from scott2.dept;
5
SQL> select count(*) from scott2.dept@DB2;
5
SQL> insert into scott2.dept
values (60, ‘DRH’, ‘Soisy”)
1 row created
SQL> select count(*) from scott2.dept;
6
SQL> select count(*) from scott2.dept@DB2;
5
SQL> commit;
SQL> select count(*) from scott2.dept@DB2;
6
– CQFD !

TroubleShooting

L’erreur étant humaine et malheureusement assez fréquemment présente, voici en vrac quelques commandes, pour vérifier ou ca coince … si par le plus grand des hasards…ca coince

—————————–
check des differents process
—————————–
sur la db source

statut de la capture :
SQL>SELECT * FROM DBA_CAPTURE;

statut de la propagation :
SQL>SELECT * FROM DBA_PROPAGATION;

sur la db dest :
statut apply :
SQL>select * from dba_apply
ou
SQL>select apply_name, queue_name,
status, to_char(STATUS_CHANGE_TIME,’DD/MM HH24:MI’) time,
error_number, error_message
from DBA_apply

si aborted
SQL>SELECT REASON, SUGGESTED_ACTION
FROM DBA_ALERT_HISTORY
WHERE MODULE_ID LIKE ‘%STREAMS%’;

!!! atenntion il se peut que le APPLY soit ENABLE tant qu’on a pas fait de maj sur la source
et aborte ensuite !

——————–
RECUPERATION ERREUR
——————-
begin
*
ERROR at line 1:
ORA-23616: Failure in executing block 33 for script 6EE472512816A0A0E043C0A80B47A0A0

a t’on de l’info sur le script qui s’est planté ?
SQL> SELECT * FROM dba_recoverable_script

– on recupere l’erreur exacte
SQL> SELECT * FROM DBA_RECOVERABLE_SCRIPT_ERRORS;

6EE472512816A0A0E043C0A80B47A0A0
33
-19504
ORA-19504: failed to create file “/tmp/test/export_scott.dmp”
ORA-27038: created file already exists
Additional information: 1
ORA-02063: preceding 3 lines from CIBLE_STRM_DEVUN
17/07/2009

———————————————————–
check JOBS et QUEUES
———————————————————–
SQL>select * from dba_jobs
where WHAT like ‘%dbms_aqadm.aq$_propaq%’

ou
SQL>select JOB,LOG_USER,PRIV_USER,SCHEMA_USER,
THIS_DATE,THIS_SEC,NEXT_DATE,NEXT_SEC,TOTAL_TIME
from dba_jobs
where WHAT like ‘%dbms_aqadm.aq$_propaq%’

JOB LOGUSR PRVUSER SCHUSER THIS_DATE THIS_SEC NEXT_DATE NEXT_SEC TOTAL_TIME
18058 SYS SYS SYS 21-JUL-09 11:13:32 21-JUL-09 11:13:31 98
18059 SYS SYS SYS 21-JUL-09 11:13:42 21-JUL-09 11:13:41 88
18060 SYS SYS SYS 21-JUL-09 11:13:53 21-JUL-09 11:13:51 77
18061 SYS SYS SYS 21-JUL-09 11:14:03 21-JUL-09 11:14:01 67
18062 SYS SYS SYS 21-JUL-09 11:14:13 21-JUL-09 11:14:11 57

SQL>select NAME, OWNER ,QUEUE_TABLE, QID,QUEUE_TYPE, MAX_RETRIES
from dba_queues
where owner= ‘STRMADMIN’

NAME OWNER QUEUE_TABLE QID QUEUE_TYPE MAX_RETRIES
AQ$_STREAMS_QUEUE_TABLE_E STRMADMIN STREAMS_QUEUE_TABLE 1100193 EXCEPTION_QUEUE 0
STREAMS_QUEUE STRMADMIN STREAMS_QUEUE_TABLE 1100194 NORMAL_QUEUE 5
AQ$_STREAMS_QUEUE_TABLE1_E STRMADMIN STREAMS_QUEUE_TABLE1 1100224 EXCEPTION_QUEUE 0
STREAMS_QUEUE1 STRMADMIN STREAMS_QUEUE_TABLE1 1100225 NORMAL_QUEUE 5
AQ$_STREAMS_QUEUE_TABLE2_E STRMADMIN STREAMS_QUEUE_TABLE2 1101288 EXCEPTION_QUEUE 0
STREAMS_QUEUE2 STRMADMIN STREAMS_QUEUE_TABLE2 1101289 NORMAL_QUEUE 5

————–
check activité
————–
les messages empilés et dépilés :

SQL>select * from v$streams_apply_reader;
select * from v$propagation_sender
+ l’utilitaire ‘STRMMON’

—————————
suppression de la queue
—————————
on recupere le nom de la queue dans DBA_QUEUES et on utilise DBMS_STREAMS_ADM.REMOVE_QUEUE

BEGIN
DBMS_STREAMS_ADM.REMOVE_QUEUE(
queue_name => ’strmadmin.STREAMS_QUEUE1′,
cascade => true,
drop_unused_queue_table => true);
END;
/

—————————
gestion apply process
———————–
SI erreur ERROR at line 1:
ORA-26668: STREAMS process APPLY_SCOTT exists

SQL>select * from dba_apply;

BEGIN
DBMS_APPLY_ADM.STOP_APPLY(
apply_name => ‘APPLY_SCOTT’);
END;
/

et on peut faire apres un DROP :
begin
dbms_apply_adm.drop_apply(’APPLY_SCOTT’);
end;

————————
nettoyage/iunit apres erreur
————————–
– on recupere le script ID
SQL> SELECT SCRIPT_ID, INVOKING_PACKAGE, INVOKING_PROCEDURE,
TO_CHAR(CREATION_TIME,’DD/MM HH:MI’)
from DBA_RECOVERABLE_SCRIPT ;

SCRIPT_ID INVOKING_PACKAGE INVOKING_PROCEDURE TO_CHAR(CRE
——————————– —————- —————— ———–
6ED114012A586054E043C0A80B476054 DBMS_STREAMS_ADM MAINTAIN_SCHEMAS 16/07 12:24

begin
exec dbms_streams_adm.recover_operation(
script_id=>’6F3198DAFDBF90CAE043C0A80B4790CA ‘,
operation_mode=>’PURGE’
);
end;

–> vide dba_recoverable_script et …_errors

begin
exec dbms_streams_adm.recover_operation(
script_id=>’6F3198DAFDBF90CAE043C0A80B4790CA ‘,
operation_mode=>’ROLLBACK’
);
end;

Les principales attaques ciblant les Bases de Données

Sécurité bases de données pas de Commentaire »

Nous allons passer en revue les principaux types d’ attaques envers les SGBDs, ainsi que les précautions à prendre pour s’en prémunir.

rem : le ‘Buffer Overflow’ et ‘linjection SQL’ seront détaillés dans un autre document.

Crack de password

programmes spécialisé aléatoires ou basés sur dictionnaire, ou crack manuel

mesures à prendre :

  • ‘politique’ de mots de passes (durée de vie , historique, complexité
  • imposée, etc.)
  • chiffrement ou hash non réversible
  • changement ou suppression des users connus : super user, administrator,
    system, guest, etc (==> AUdit régulier des bases)
  • SSO (évite les passwords utilisateurs faibles)

exemple de crack de password Oracle

La table DBA_TABLES est est une table du référentiel Oracle, qui recèle, outre le nom et différentes info sur les utilisateurs de la base, leurs mos de passe crypté. On peut l’utiliser pour cracker un mot de passe avec une méthode brute.

Les avantages de travailler sur ce mot de passe crypté sont multiples :

• Efficacité : on sait en gros comment Oracle chiffre ses mots de passe : algorithme DES 64 bits, password crypté de 30 caractères maximum, utilisation du user + mot de passe pour le hashage, etc. On ne part
donc pas de zéro
• travail OFFLINE : Contournement d’une éventuelle politique de mot de passe (password policy) : ce n’est pas le cas par défaut, mais le DBA peut limiter le nombre de tentatives de connexions infructueuses
et faire échouer une méthode brute. Voir l’utilisation des ‘PROFILES’ Oracle pour plus d’information. En travaillant sur une valeur cryptée, sans tentative effective de connexion

• Discrétion : Cf. le point précédent, on peut travailler tranquillement OFFLINE, sur un poste extérieur sans limite de temps ou de nombre d‘essais. Un programme de forçage de mot de passe peut être trouvé
sur le site ‘toolcrypt.org’ à l’adresse suivante :

logo_toolcrypt.gifhttp://www.toolcrypt.org/index.html?orabf

Sur un poste de Windows moyen, il m’a fallu une dizaine de minutes avec ce programme pour casser un mot de passe ‘SYSTEM’ de 6 caractères.
En mode commande il suffit d’entrer la commande suivante :

C:> orabf 70F277D6E92A1D9B:SYSTEM -n 6
– 70F277D6E92A1D9B est la valeur chiffrée lue dans le dictionnaire
– SYSTEM est le nom de l’utilisateur correspondant
– 6 la longueur minimale du mot de passe cherché

Mais attention : le décryptage d’un mot de passe alphanumérique > 8 caractères peut durer de quelques jours à plusieurs semaines !

Un comparatif intéressant des programmes de forçage des mots de passe Oracle, gratuits ou payants a été fait par la société ‘Red Database Security’ et peut être trouvé ici :
http://www.red-database-security.com/whitepaper/oracle_password_cracker.html

Contournement de l’applicatif par programme client SQL

Au lieu de se connecter via le programme apllicatif, on peut utiliser le mode commande ligne ou un interpréteur SQL standard (SQL+ d’Oracle) ou un outil d’admin (PHPMyAdmin, OEM). On utilise alors directement les droits
du compte propriétaire des données (en général tous les droits).

mesures à prendre :

pas de gestion de droits applicative !
connexion au compte propriétaire interdite (compte locké par exemple)
une gestion des droits fine (connexion + consultation et / ou mise à jour de tables (voire de vues) ciblées

Récupération de données OFFLINE ou Hors production

Il existe des sources de données partiellement ou parfois totalement redondantes de la base de données de production. Ces données peuvent être dans le même format que les données d’origine (tables d’une BD Oracle) ou dans des formats différents (texte, CSV, SQL, …).

Ces données redondantes sont en général moins (ou pas du tout) sécurisées, par rapport à la base de production,
et seront donc une cible plus facile pour les pirates fatigués.

Pour corser le tout, une mauvaise habitude assez répandue dans les entreprises consiste à recopier intégralement des données de production, dans les bases de test ou de développement, pouyr éviter d’extraire des jeux d’essai de données complexes, ou pour ne pas repartir de données vides lors d’un eopération de maintenance logicielle…

Comme données Offline, on citera par exemple :

  • BDs de développement, BDs de test,
  • export de données au format propriétaire (export Oracle par exemple)
  • reverse engineering SQL
  • export au format texte fixe ou CSV
  • sauvegardes binaires des fichiers de la BD, sur bande, disque ou DVD
  • fichier de trace, de LOG ou d’audit
  • base redondante de secours (standby DB)
  • données répliquées en synchrone ou asynchrone pour infocentre et reporting

donnees_offline

Back doors

(”Portes dérobées”) : Programmes usurpateurs qui détournent des fonctionnalités systèmes dans le but d’ouvrir
des accès utiles aux pirates pour contrôler à distance les machines ciblées (modification des programmes de login avec user/passwd en dur, ouverture de ports particuliers, etc.) . Ces programmes sont la plupart
du temps installés par le biais d’un “cheval de Troie”. Parmi les plus (tristement) célèbres, on peut citer BackOrifice (BO) ou encore NetBus.

Les accès illicites via ces backdoors pouvant être facilement détectés par des commandes système standards (liste des process connectés, des ports ouverts) ils sont parfois utilisés conjointement avec des rootkits, ensemble de commandes standards modifiées pour masquer les intrusions.

certaines back doors peuvent être inclsues dans le code d’applications standards,
sans intention forcément malveillante mais pour réserver au développeur du programme, un accès ‘privé’ à toute
les machines hébergeant son code. L’accès au source d’un logiciel libre peut nous prémunir contre ce genre d’indélicatesse.

Refus de service (Deny of Service)

voir le papier de sogoodtobe sur http://www.securiteinfo.com

Recherche d’infos de configuration

( d’identification, d’authentification , méta données )

  • au sein de l’applicatif (en clair dans le source interprété… ou désassemblé)
  • dans l’environnement (fichiers de configuration accessibles sur le serveur ou pire sur le client : *.ini)
  • dans la bases de données elle même
  • sur le réseau (écoute / sniff des lignes)

mesures à prendre :

  • chiffrer (solidement) les infos sensibles dans la BD, dans les fichiers de config,
  • restreindre les accès aux répertoires et fichiers
  • restreindre l’accès aux méta données
  • s’appuyer sur des mécanismes existant identification / authentification par le SGBD, par l’OS
  • réseau : utiliser des protocoles sécurisés : SSL (nécessite des certificats), IPSec, paramétrer finement le firewall, utiliser ports et user ‘originaux’
  • ‘politique’ de mots de passe

Les menaces les plus connues du grand public, visent à paralyser, ou détruire tout ou partie du système d’information. Elles ne ciblent pas vraiment les SGBDs mais nous les citerons néanmoins parce qu’incontournables.
Jetons un oeil aux définitions données par le grand glossaire de la sécurité de ECHU.ORG


Autres menaces et faiblesses de comportement

  • Virus : Au sens large du terme, on qualifie généralement de virus tout programme capable de se reproduire (techniquement, se recopier) lui-même et d’endommager des données informatiques. On les classe
    en plusieurs catégories, principalement: parasite, compagnon, amorce, multiformes, résident mémoire ou non, furtifs, polymorphes, réseau et flibustier.
  • Ver (ou Worm) : programme qui peut s’auto-reproduire et se déplacer à travers un réseau en utilisant les mécanismes réseau, sans avoir réellement besoin d’un support physique ou logique (disque dur, programme hôte, fichier …) pour se propager; un ver est donc un virus réseau.
  • Cheval de Troie : (en anglais trojan horse) un programme informatique effectuant des opérations malicieuses à l’insu de l’utilisateur : vol des mots de passe, copie de données sensibles, exécution d’action nuisible …Une intro très accessible de ces notions est dispo sur :
    http://www.commentcamarche.net/
    et d’autres infos encore sur : http://assiste.com

Quelques faiblesses de comportement

  • ‘portes’ ouvertes : (pas seulement les ‘back doors’ !)porte de la salle machine ouverte, poste ou serveur sans mot de passe ou mot de passe faible, poste sans veille, post it (!)
    ;-) fermez les portes !! mettez en oeuvre la gestion de mots de passe !!
  • Installation par défaut :- les valeurs de paramètres sont connues (port 80 / 1525, les administrateurs sont connus (SA SQLServer, SYS et SYSTEM Oracle, ROOT MySQL)
    - des services superflus sont accessibles (srv ftp, srv samba, snmp, serveur d’admin, etc )- les communications ne sont pas chiffrées (ftp, telnet, pop)
    ;-) lisez la doc !! auditez vos serveurs !!
  • mauvaise politique de gestion des droits (top, au lieu de bottom-up) :- installation confortable : tous les logiciels sont installés sous root, tous les utilisateurs de l’applicatif sont DBAs
    - allow all implicite…deny N / deny all.. allow n
    - utilisation abusive de l’héritage
    - mots de passe faibles
    ;-) maitrisez la gestions des droits de vos OS / logiciels serveurs / bases de données
  • absence de mise à jour
    ;-) faites de la veille technologique, patchez régulièrement, surveillez les alertes
  • mauvais codage (parametres en clair dans les URLs, connexion non chiffrées, code ‘injectable’, etc.) ;-) documentez vous (best practices, faites tester vos programmes)
  • controle d’accès au niveau applicatif, qui peut facilement être court circuité
    ;-) (re) centralisez (ET FACTORISEZ!) les controles au niveau données : contraintes d’intégrité

Comme chacun sait (depuis certaines émissions de télé) c’est le maillon faible de la chaîne qui cassera imanquablement. On peut mettre en place le plus beau (et le + cher) des firewalls, il sera bien
inutile si un adminitrateur est resté ‘loggé’ root sur son poste (Statistiquement la majorité des attaques provient de l’intérieur des entreprises !)

Cependant, on n’oubliera pas de rester pragmatique : tous les PMEs ne sont pas le pentagone et n’intéressent pas tous les hackers de la planète.
Les besoins et les objectifs doivent être clairement définis au départ et l’adéquation de la solution vérifiée.
Un certains nombres d’utilitaires libres sont disponibles sur internet pour vérifier la fiabilité de votre système d’information. Voir parmi la liste des liens utiles.

Il faudra de + trouver un équilibre entre niveau de sécurité satisfaisant et confort (voire simple possibilité) de travai ldes autres acteurs.

Installation de Tivoli Data Protection pour Oracle by albanlepunk

Rman 3 Commentaires »

RMAN vous permet d’effectuer des sauvegardes complètes ou partielles, hors ligne ou en ligne. Une fois que vous avez identifié la base de données à sauvegarder, Oracle localise tous les fichiers nécessaires et les envoie au serveur Tivoli Storage Manager Server à l’aide de Data Protection pour Oracle. Data Protection pour Oracle fournit une interface entre les appels d’API de gestion des supports Oracle et les routines de Tivoli Storage Manager.

En gros il permet à RMAN d’écrire directement dans TSM server sans passer par la case disque.

Installation :

Pré Requis à L’install de TDP 5.X
Vérifier la version de java : java –version
En effet le pré requis Oracle concernant Java est minimum 1.4.2.0.
Pour installer TDP 5.X il faut un niveau minimum de java en version 1.5.
[root@PRO-ORA-AJA-01 linux86_64]# java -version
java version “1.4.2″
gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-44)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@PRO-ORA-AJA-01 linux86_64]#

Download du binaire chez Sun.
Installation de java 1.6.14
./ jre-6u14-linux-x64-rpm.bin

you agree to the above license terms? [yes or no]
yes
Unpacking…
Checksumming…
Extracting…
UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (Zip-Bugs@lists.wku.edu).
inflating: jre-6u14-linux-amd64.rpm
Préparation…              ########################################### [100%]
1:jre                    ########################################### [100%]
Unpacking JAR files…
rt.jar…
jsse.jar…
charsets.jar…
localedata.jar…
plugin.jar…
javaws.jar…
deploy.jar…
Done.
2.3    Installation de TDP en mode Graphique.

Il faut préalablement positionner un DISPLAY et un client X11 ou être en VNC sur le serveur.
Se positionner dans le répertoire téléchargé sur le site Password Advantage d’IBM.
/DATA/downloads/TDP_passportadvantage/LCD7-3080-00/oracle/linux86_64
Exporter les bonnes variables d’environnement JAVA
[root@PRO-ORA-AJA-01 linux86_64]# export JAVA_HOME=/usr/java/
[root@PRO-ORA-AJA-01 linux86_64]# export JRE_HOME=/usr/java/jre1.6.0_14/
[root@PRO-ORA-AJA-01 linux86_64]# export CLASSPATH=/usr/java/jre1.6.0_14/lib
[root@PRO-ORA-AJA-01 linux86_64]# export PATH=/usr/java/jre1.6.0_14/bin:$PATH

[root@PRO-ORA-AJA-01 linux86_64]# ls
Api
TDP-Oracle.msg.es_ES.x86_64.bin
TDP-Oracle.msg.ja_JP.x86_64.bin
TDP-Oracle.msg.zh_CN.x86_64.bin
readmedporc_enu.htm
TDP-Oracle.msg.fr_FR.x86_64.bin
TDP-Oracle.msg.ko_KR.x86_64.bin
TDP-Oracle.msg.zh_TW.x86_64.bin
TDP-Oracle.msg.de_DE.x86_64.bin
TDP-Oracle.msg.it_IT.x86_64.bin
TDP-Oracle.msg.pt_BR.x86_64.bin
TDP-Oracle.x86_64.bin
[root@PRO-ORA-AJA-01 linux86_64]# ./TDP-Oracle.x86_64.bin
Preparing to install…
Extracting the installation resources from the installer archive…
Configuring the installer for this system’s environment…
Launching installer…
tdp11

tdp21

tdp31

tdp41

tdp51

tdp61

Configuration de TSM et TDP.
Pour TSM il faut configurer les fichiers dsm.sys et dsm.opt dans /opt/tivoli/tsm/client/ba/bin
Pour TDP il faut configurer les fichiers dsm.opt et tdpo.opt dans /opt/tivoli/tsm/client/oracle/bin64
Ici le serveur s’appelle TSM.TOTO.FR et le moeud de sauvegarde PRO-ORA-01.
/opt/tivoli/tsm/client/ba/bin dsm.sys :
servername tsm.toto.fr
COMMMethod         TCPip
TCPPort            1500
TCPServeraddress   tsm.toto.fr
NODENAME           PRO-ORA-01
PASSWORDACCESS     PROMPT
PASSWORDDIR        /home/oracle
SCHEDLOGNAME       “/var/log/tsm/dsmsched.log”
SCHEDLOGRETENTION  3
ERRORLOGNAME       “/var/log/tsm/dsmerror.log”
ERRORLOGRETENTION  5

/opt/tivoli/tsm/client/ba/bin dsm.opt :
Servername tsm.toto.fr

/opt/tivoli/tsm/client/oracle/bin64/dsm.opt :
Servername tsm.toto.fr

/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt :
****************************************************************************

IBM Tivoli Storage Manager for Databases
* Data Protection for Oracle
* Sample tdpo.opt for the LinuxAMD64 Data Protection for Oracle
*********************************************************************
DSMI_ORC_CONFIG    /opt/tivoli/tsm/client/oracle/bin64/dsm.opt
DSMI_LOG           /var/log/tsm
TDPO_FS            /bckseapro
TDPO_NODE          PRO-ORA-01
TDPO_OWNER         <username>
TDPO_PSWDPATH      /opt/tivoli/tsm/client/oracle/bin64
TDPO_DATE_FMT      1
TDPO_NUM_FMT       1
TDPO_TIME_FMT      1
TDPO_MGMT_CLASS_2   mgmtclass2
TDPO_MGMT_CLASS_3   mgmtclass3
TDPO_MGMT_CLASS_4   mgmtclass4

Ensuite pour que tout fonctionne :

chown –R oracle  /opt/tivoli/tsm/client/oracle/bin64
chmod -770 /opt/tivoli/tsm/client/oracle/bin64/dtpo.opt
chmod 775 /opt/tivoli/tsm/client/ba/bin/dsm.sys
chmod 775 /opt/tivoli/tsm/client/ba/bin/dsm.opt
ln –s /opt/tivoli/tsm/client/ba/bin/dsm.sys /opt/tivoli/tsm/client/api/bin64/dsm.sys
ln –s /opt/tivoli/tsm/client/lang/fr_FR /opt/tivoli/tsm/client/oracle/bin64/fr_FR
chmod 775 /var/log/tsm
Le pilotage d’RMAN se fait à travers une librairie TDP :
Vérifier qu’il existe un lien symbolique /usr/lib64/libobk.so vers /opt/tivoli/tsm/client/oracle/bin64/libobk.so et de /app/oracle/product/10.2.0/db_1/lib/libobk.so vers /usr/lib64/libobk.so.
Ensuite il faut configurer le fichier de password.

./opt/tivoli/tsm/client/oracle/bin64/tdpconf password
IBM Tivoli Storage Manager for Databases:
Data Protection for Oracle
Version 5, Release 5, Level 2.0
(C) Copyright IBM Corporation 1997, 2009. All rights reserved.
***************************************************************
*   IBM Tivoli Storage Manager for Databases Utility
*   Password file initialization/update program
***************************************************************
Please enter current password:
Please enter new password:
Please reenter new password for verification:
ANU0260I Password successfully changed.
[root@PRO-ORA-01 bin64]#

Puis verifier la config au moyen de l’option showenvironment

[root@PRO-ORA-01 bin64]# ./tdpoconf showenvironment
ANS0102W Unable to open the message repository /opt/tivoli/tsm/client/oracle/bin64/fr_FR/tdpo.cat. The American English repository will be used instead.

IBM Tivoli Storage Manager for Databases:
Data Protection for Oracle
Version 5, Release 5, Level 2.0
(C) Copyright IBM Corporation 1997, 2009. All rights reserved.
Data Protection for Oracle Information
Version:              5
Release:              5
Level:                2
Sublevel:             0
Platform:             64bit TDPO Linux86-64
Tivoli Storage Manager Server Information
Server Name:          TSM.TOTO.FR
Server Address:       TSM.TOTO.FR
Server Type:          Linux/i386
Server Port:          1500
Communication Method: TCP/IP
Session Information
Owner Name:           <username>
Node Name:            pro-ora-01
Node Type:            TDPO Linux86-64
DSMI_DIR:             /opt/tivoli/tsm/client/api/bin64
DSMI_ORC_CONFIG:      /opt/tivoli/tsm/client/oracle/bin64/dsm.opt
TDPO_OPTFILE:         /opt/tivoli/tsm/client/oracle/bin64/tdpo.opt
Password Directory:   /opt/tivoli/tsm/client/oracle/bin64
Compression:          FALSE
License Information:  License File Error - see tdpoerror.log for details
[root@PRO-ORA-01 bin64]#

On peut vérifier la licence  par la présence du fichier agent.lic ou oracle.lic dans /opt/tivoli/tsm/client/oracle/bin64.

Test de communication RMAN :
oracle@ORA : /opt/tivoli/tsm/client/oracle/bin64 > rman
Recovery Manager: Release 10.2.0.4.0 - Production on Mon Mar 30 18:51:49 2009
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
RMAN> connect target /
connected to target database: SEAPRO (DBID=2807096304)
RMAN> @rman_test.rcv
RMAN> run
2> {
3>    allocate channel t1 type ’sbt_tape’ parms
4>             ‘ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)’;
5>    backup
6>       filesperset 5
7>       format ‘df_%t_%s_%p’
8>       (database);
9> }
using target database control file instead of recovery catalog
ANS0102W Unable to open the message repository /opt/tivoli/tsm/client/oracle/bin64/fr_FR/tdpo.cat. The American English repository will be used instead.
allocated channel: t1
channel t1: sid=1076 devtype=SBT_TAPE
channel t1: Data Protection for Oracle: version 5.5.1.0
Starting backup at 30-MAR-09
channel t1: starting full datafile backupset

On arrive bien à écrire directement sur “bande” même si ça passe par les pools disques de TSM server.

Le Buffer overflow

Sécurité bases de données pas de Commentaire »

Buffer overflow

Un buffer overflow (BOF) est littéralement un dépassement de la capacité d’un buffer de données. Rien de bien méchant, cela arrive fréquement lorsque l’on manipule des pointeurs et que l’on programme sans trop de précautions.
La conséquence est généralement un ‘crash’ du programme, qui tente un accès à des zones en dehors de son espace d’adressage (donne des segmentation fault ou protection fault).

fwd2La saturation ou le crash de serveur n’est généralement pas le but ultime des hackers. L’acquisition de privilèges ou l’ouverture de backdoor est plus souvent ciblée.

Dans le domaine de la sécurité cette technique du BOF est utilisée pour ‘dérouter’ la séquence normale des instructions d’un programme et le forcer à éxécuter une routine spécifique, permettant généralement l’obtention de droits ’super utilisateur’. Cette routine ou ce programme exploitant la faille est appelé un “exploit” (en Anglais dans le texte)

fwd2 ‘droits super utilisateur’ ne veut pas dire seulement obtention de l’UID ‘root’ ou ‘Administrateur’. Beaucoup d’applications utilisent des variables ou des tables pour gérér en interne des niveaux de privilèges indépendemment de l’OS. Des flags du type ‘useradmin=1′ ou ‘loginok=true’ ou ‘privileges=ALL’ sont monnaie courante dans les programmes et beaucoup plus facilement exploitables.

De l’importance des attaques par buffer oveflow

Ce problème est important de par sa notoriété et également de par sa persistance. Les premières mises en évidence de la possibilité de ce type d’attaque datent de 1995 et sont toujours d’actualité.
Statistiquement si l’on consulte les sites de référérence que sont le site du Cert et le site d’infosys security par exemple, on constate qu’une part importante des pbs traités concerne le BOF. Voir plus particulièrement le rapport du dernier trimestre 2003 du CERT.

fwd2bien qu’abondamment documenté sur le web, ce type d’attaque nécessite une grande ténacité et de bonnes compétences en programmation de bas niveau (assembleur), en désassemblage (les sources sauf cas ideal de certains logiciels libres n’étant pas à la disposition des hackers) et en gestion de la mémoire et architecture système (structure et adressage de la pile, contenu des bibliothèques sytème notamment).

Des conditions d’occurence d’un buffer overflow

Un certain nombre de conditions sont indispensables à l’occurence d’un BOF :

  • code de programmation vulnérable
    • langage utilisé permissif (C),
    • fonctions utilisées laxistes (strcpy(), strcat(), sprintf(), vsprintf(), gets(), scanf())
    • appels à des fonctions privilégiées (system()),
    • utilisation de variable donnant des privilèges,
    • absence de test du code, etc.
  • programme attaqué s’exécutant avec un niveau de privilège fort (uid root par exemple)
  • lisibilité / accessibilité du code (accès au source ou désassemblage explicite, pas de free(), ni de user_check())
  • ordonnancement des données dans le programme (variable importante ‘écrasable’ , adresse de retour de subroutines ‘écrasable’

mais aussi

  • exposition / intérêt du site
  • ténacité du hacker

Principe détaillé du buffer overflow

Un exemple idéal (un heap overflow)

D’après Ghost Rider “Introduction to Buffer Overflow”, www.governmentsecurity.org

Soit le petit programme C suivant


main(int argc, char **argv) {
char *somevar;
char *important;
somevar = (char *)malloc(sizeof(char)*4);
important = (char *)malloc(sizeof(char)*14);
strcpy(important, “command”); /*This one is the important variable*/
stcrpy(somevar, argv[1]);
….. Code here ….
}

Il présente qq caractéristiques remarquables :

  • Il utilise des appels de commande système via la variable ‘important’.
  • Il a (au moins) un paramètre d’entrée (argv[1]) stocké dans la variable ’somevar’.
  • La variable ’someva’r est allouée en mémoire AVANT ‘important’, on peut en déduire que son adresse sera probablement inférieure a celle de ‘important’.
  • Enfin, malgré cette précédence, ’somevar’ prendra sa valeur a l’execution APRES ‘important’

Modifions ce programme pour lui faire imprimer les adresses et les contenus, et executons le en lui passant le parametre ‘TOTO’ :

$mon_programme TOTO
0×8049700: T(0×616c62)
0×8049701: O(0×616c)
0×8049702: T(0×61)
0×8049703: O(0×0)
0×8049704: (0×0)
0×8049705: (0×0)
0×8049706: (0×0)
0×8049707: (0×0)
0×8049708: (0×0)
0×8049709: (0×19000000)
0×804970a: (0×190000)
0×804970b: (0×1900)
0×804970c: (0×19)
0×804970d: (0×63000000)
0×804970e: (0×6f630000)
0×804970f: (0×6d6f6300)
0×8049710: c (0×6d6d6f63)
0×8049711: o (0×616d6d6f)
0×8049712: m (0×6e616d6d)
0×8049713: m (0×646e616d)
0×8049714: a (0×646e61)
0×8049715: n (0×646e)
0×8049716: d (0×64)
0×8049717: (0×0)

On connait désormais le décalage d’adresse entre ’somevar’ et ‘important’.
Le C et strcpy() le permettant, on va se permettre un dépassement de buffer de la variable ’somevar’ pour substituer NOTRE commande à la ‘command’ d’origine.

0×8049700: T(0×646e6573)
0×8049701: O(0×2d646e65)
0×8049702: T(0×2d2d646e)
0×8049703: O(0×2d2d2d64)
0×8049704: - (0×2d2d2d2d)
0×8049705: - (0×2d2d2d2d)
0×8049706: - (0×2d2d2d2d)
0×8049707: - (0×2d2d2d2d)
0×8049708: - (0×2d2d2d2d)
0×8049709: - (0×2d2d2d2d)
0×804970a: - (0×2d2d2d2d)
0×804970b: - (0×2d2d2d2d)
0×804970c: - (0×2d2d2d2d)
0×804970d: - (0×6e2d2d2d)
0×804970e: - (0×656e2d2d)
0×804970f: - (0×77656e2d)
0×8049710: n (0×6377656e) <— c’est la !
0×8049711: e (0×6f637765)
0×8049712: w (0×6d6f6377)
0×8049713: c (0×6d6d6f63)
0×8049714: o (0×616d6d6f)
0×8049715: m (0×6e616d6d)
0×8049716: m (0×646e616d)
0×8049717: a (0×646e61)
0×8049718: n (0×646e)
0×8049719: d (0×64)
0×804971a: (0×0)

C’est la le miracle : on peut modifier le déroulement de l’exécution d’un programme sans en modifier le code (heureusement il faudrait le recompiler et reinstaller l’executable sur la cible). Le paramètre d’entrée est le seul point…d’entrée du programme et on peut faire une subsitution de code, si tant est que certains appels se fassent à travers des variables et qu’elles soient correctement ‘rangées’ en mémoire.

Un exemple un peu moins ideal (un stack overflow)

D’après airWalk, “Introduction to buffer overflows” - for interScape, may 1999

Soit le programme C suivant :

void someFunction(char *str) {
char buffer[16];
strcpy(buffer, str);
}
void main()
{
char bigString[256];
int i;
for( i = 0; i < 255; i++)
bigString[i] = ‘A’;
someFunction(bigString);
}

A l’exécution il provoque une erreur du type : ‘Segmentation violation’ .
Pourquoi ? Parce que c’est au sein, et plus précisément juste avant le ‘return’ de la fonction qu’a lieu un dépassement de buffer.
Les 240 ‘A’ supplémentaires vont écraser les zones mémoires suivant la fin de la variable ‘buffer’ , et en particulier l’adresse de retour de la fonction, en y subsituant une valeur (pleine de ‘A’) invalide…d’ou l’erreur sus nommée.
On perçoit que dans ce cas, si l’on si prend bien il est possible de modifier l’adresse de retour d’une fonction et donc modifier le déroulement de l’exécution d’un programme.

Reste maintenant un détail, écrire une exploit capable de menacer le système. A la différence de l’exemple précédent qui faisait des appels à des commandes système, que l’on remplaçait, celui ci n’en fait pas…c’est son coté moins idéal.

fwd2rappelons que “l’exploit” du programme est souvent conditionnée par le niveau de privilège d’exécution du programme hacké. Un uid root (ou son équivallent Windows administrateur) permet + facilement d’executer des commandes fatales.

Les “exploit”s de buffer overflow

Nous savons comment on peut derouter un programme en écrivant l’exacte quantité de mémoire et en écrasant l’adresse de retour de la routine par une nouvelle adresse. Rest e à faire exécuter un nouveau code.
Ou peut se trouver le nouveau code agressif ?
ll est impossible de modifier physiquemnt le programme compilé de la cible. Le nouveau code ne peut qu’être passé qu’AU SEIN des données modifiées responsables du buffer overflow !
La taille du code ne correspondant pas forcément exactement à l’offset entre début de buffer et adresse de retour à écraser, précédera le code par des NOPs.
Que contient le code agressif ?
L’hypothèse étant que le programme vulnérable a un niveau de privilège intéressant (root), une des exploits les + classiques sera de lancer un shell permettant d’executer des commandes ‘intéressantes’ : rm -R /*, cat /etc/passwd, mail, etc.
Le code sera d’abord écrit en C, compilé , linké (gcc) et désassemblé (avec gdb). Les codes hexadécimaux du programme seront ensuite passés directement dans le buffer.

fwd2 Si certains octets du code sont à zero, certaines des fonctions vulnérables (comme strcpy()) risquent d’interpréter le 0×00 comme une fin de chaîne ;-((

Les moyens d’actions

  • Utiliser des langages ’sécurisés’ : Cyclone ou Java Vs C, strncpy() Vs strcpy()
  • tester le code avec des outils spécialisés (Flawfinder, BFBtester, StackGuard)
  • Patcher !

Flashback et ORA-38760 au redémarrage sur RAC

Musée des erreurs pas de Commentaire »

Au reboot de la base vous récuperez une erreur ORA-38760.

PB : This database instance failed to turn on flashback database

Cause : Database flashback is on but this instance failed to start generating flashback data. Look in alert log for more specific errors.

C’est très souvent du au fait que vous avez créé des points de restauration garantis.

Arrêtez les deux instances et démarrez en une en mode mount.

C:\Documents and Settings\admin.avassallo>set TNS_ADMIN=E:\admin_oracle\network_admin
C:\Documents and Settings\admin.avassallo>set ORACLE_SID=QUALIF1
C:\Documents and Settings\admin.avassallo>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Mar. Juin 23 09:47:14 2009
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
Connecté à une instance inactive.
SYS@QUALIF1> startup mount
Instance ORACLE lancée.
Total System Global Area  629145600 bytes
Fixed Size                  1298264 bytes
Variable Size             260047016 bytes
Database Buffers          360710144 bytes
Redo Buffers                7090176 bytes
Base de données montée.

On vérifie l’existence de point de restauration garantis que l’on va dropper allègrement.

SYS@QUALIF1> select name from v$restore_point where guarantee_flashback_database
= ‘YES’;
NAME
——————————————————————————–
PRC_SECOND
PRC_TROIS
SYS@QUALIF1> drop restore point PRC_TROIS;
Point de restauration supprimé.
SYS@QUALIF1> drop restore point PRC_SECOND;
Point de restauration supprimé.

Arrêt de la flashback!

SYS@QUALIF1> alter database flashback off;
Base de données modifiée.
SYS@QUALIF1> alter database open;
Base de données modifiée.
SYS@QUALIF1>
Vérification de la place dans la Flash back Recovery Area.
E:\admin_oracle\scripts>sqlplus -S / as sysdba  @E:\admin_oracle\scripts\asm_dis
kgroup.sql
NAME                             TOTAL_MB    FREE_MB USABLE_FILE_MB
—————————— ———- ———- ————–
DGDATA                             307098     104932          26874
DGFRA                              102348      52146          13279
DGHISTO                            245676     104586          31820

Arrêt à nouveau de l’instance 1

SYS@QUALIF1> shutdown immediate
Base de données fermée.
Base de données démontée.
Instance ORACLE arrétée.
SYS@QUALIF1> quit
Déconnecté de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Produc
tion
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

Redémarrage de la Flashback

C:\Documents and Settings\admin.avassallo>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Mar. Juin 23 09:58:50 2009
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
Connecté à une instance inactive.
SYS@QUALIF1> startup mount
Instance ORACLE lancée.
Total System Global Area  629145600 bytes
Fixed Size                  1298264 bytes
Variable Size             260047016 bytes
Database Buffers          360710144 bytes
Redo Buffers                7090176 bytes
Base de données montée.
SYS@QUALIF1> alter database flashback on;
Base de données modifiée.
SYS@QUALIF1> alter database open;
Base de données modifiée.

Redémarrage de la deuxième instance.
SYS@QUALIF2>
SYS@QUALIF2> startup
Instance ORACLE lancée.
Total System Global Area  629145600 bytes
Fixed Size                  1298264 bytes
Variable Size             226492584 bytes
Database Buffers          394264576 bytes
Redo Buffers                7090176 bytes
Base de données montée.
Base de données ouverte.
SYS@QUALIF2>

Et le tour est joué.

Astuce : Créér une DB avec ASM sur windows avec un fichier au lieu d’un disque. by albanlepunk

ASM 2 Commentaires »

Sous windows (ici avec une version 10.2.0.4).

Avec le DBCA lancer la création d’une base, au moment de choisir la destination des fichiers de la db , choisir ASM.

Il faut à ce moment là lui présenter un disque ou une volume non formaté.

Vous n’avez pas de partition libre et non formaté sous la main.

On peut avec asmtool -create Nom_Fichier taille en mégas

EX : D:\>asmtool -create D:\oracle\product\10.2.0\oradata\ASM\asmdb_setra.asm 5000

Après ce “disque” est vu comme éligible pour ASM.

Ensuite Créer une instance ASM avec oradim sans oublier de créer les répertoires qui vont bien.

mkdir %ORACLE_BASE%\admin\+ASM\bdump
mkdir %ORACLE_BASE%\admin\+ASM\cdump
mkdir %ORACLE_BASE%\admin\+ASM\hdump
mkdir %ORACLE_BASE%\admin\+ASM\pfile
mkdir %ORACLE_BASE%\admin\+ASM\udump
oradim -new -asmsid +ASM -syspwd change_on_install -pfile C:\oracle\product\10.1.0\admin\+ASM\pfile\initASM.ora -spfile
    -startmode auto -shutmode immediate

D:\>set ORACLE_SID=+ASM

D:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Mer. Juin 10 16:28:11 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

ConnectÚ Ó :
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create pfile=’D:\oracle\product\10.2.0\db_1\database\initASM.ora’ from spfi
le;

Fichier créé.
SQL> shutdown immediate
ORA-15100: nom de groupe de disques non valide ou absent
Instance ASM arrétée

Modifier le initASM.ora créé précédemment.

_asm_allow_only_raw_disks=false
asm_diskgroups='DATADG'

SQL> startup pfile=D:\oracle\product\10.2.0\db_1\database\initASM.ora
Instance ASM démarrée

Total System Global Area   83886080 bytes
Fixed Size                  1295152 bytes
Variable Size              57425104 bytes
ASM Cache                  25165824 bytes
ORA-15110: aucun groupe de disques n’est monte

SQL> create diskgroup DATADG external redundancy disk ‘D:\oracle\product\10.2.0\
oradata\ASM\asmdb_setra.asm’;

Groupe de disques crÚÚ.

SQL>

Démarrer le dbca et lancer la création d’une base de données sur ASM, votre diskgroup sera vu dans dbca.

On peut procéder de même en créant un deuxième fichier puis diskgroup FRADG pour la Flash Recovery Area .

Et le tour est joué.

Vider ASM de ses fichiers avec Alter diskgroup drop file! by albanlepunk

ASM pas de Commentaire »

Il est possible de “rentrer” dans ASM et de naviguer dedans en utilisant l’exécutable asmcmd.

C:\oracle\product\10.2.0\db_1\BIN>asmcmd -p
ASMCMD [+] > ls
DATADG/
FRADG/
ASMCMD [+] > cd DATADG
ASMCMD [+DATADG] > ls
ASMCMD [+DATADG] > ls
ASMCMD [+DATADG] > cd ..
ASMCMD [+] > cd FRADG
ASMCMD [+FRADG] > ls
TEST/

la commande rm ayant cours, on peut donc supprimer des fichiers manuellement

Comment automatiser cette tache, par exemple avant de faire un Rman Duplicate sur un serveur de restauration?

Il est possible de supprimer des fichiers dans ASM en étant connecté sys  (cad ORACLE_SID=+ASM) avec l’instruction :  alter diskgroup “XXXXX” drop file ‘yyyyyyyy’;

Toute la difficulté consiste à récupérer les bons noms de fichiers tels qu’ils sont dans ASM.

Voilà un script qui permet de le faire.

set long 20000
set line 200
set pagesize 10000
set heading off
set verify off
set feedback off
set echo off

spool c:\temp\00_nettoie_file_asm.sql

select ‘alter diskgroup ‘||g.name||’ drop file ‘||”’+'|| g.name||’.'||f.file_number||’.'||f.incarnation||”’;’
FROM v$asm_diskgroup g,
v$asm_file f,
v$asm_alias a
where g.name in (’DATADG’,'FRADG’)
and g.group_number = f.group_number
and g.group_number = a.group_number
and f.file_number = a.file_number
order by f.file_number;

spool off

@c:\temp\00_nettoie_file_asm.sql

set heading on
set verify on
set feedback on
set echo on
exit

Penser à renseigner le diskgroup in (’   ‘,’   ‘).

Votre instance ASM est vide et prête à accueuillir de nouveaux fichiers.

Faire un duplicate avec RMAN sous windows! by albanlepunk

Administration Oracle, Rman pas de Commentaire »

# Créer le fichier de mot de passe pour la base clone

orapwd file=$ORACLE_HOMEdbsorapwCLONE.ora password=XXXXXXXXXX

# Créer le fichier d’init pour la base clone

# Copier le init.ora de la base cible

SQL> create pfile=’$ORACLE_HOMEdbsinitCLONE.ora’ from spfile;

File created.

#  Apporter les modifs nécéssaires au fichier init.

db_file_name_convert = (’$ORADATACLONE’, ‘$ORADATACLONE’)
log_file_name_convert = (’$ORADATACLONE’, ‘$ORADATACLONE’)
control_files = ‘$ORADATACLONEcontrol01.ctl’
, ‘$ORADATACLONEcontrol02.ctl’
, ‘$ORADATACLONEcontrol03.ctl’
db_name = ‘CLONE’
instance_name = ‘CLONE’
background_dump_dest = ‘$ADMINCLONEbdump’
core_dump_dest = ‘$ADMINCLONEcdump’
user_dump_dest = ‘$ADMINCLONEudump’
service_names = ‘SERVICE.CLONE’
log_archive_dest_1 = ‘location=$ORADATACLONEarchive MANDATORY’

# Créer un nouveau service windows pour la base CLONE à dupliquer.

oradim -new -sid CLONE -intpwd D:oracleproduct10.2.0db_1databaseorapwCLONE.ora.ora -startmode auto -pfile ‘D:oracleproduct10.2.0db_1databaseinitCLONE.ora’

# Créer les repertoires admin

mkdir $ORADATACLONE
mkdir $ORADATACLONEarchive
mkdir $ORADATACLONEbdump
mkdir $ORADATACLONEcdump
mkdir $ORADATACLONEcreate
mkdir $ORADATACLONEpfile
mkdir $ORADATACLONEscripts
mkdir $ORADATACLONEudump

# Démarrer l’instance CLONE

set ORACLE_SID=CLONE

sqlplus “/ as sysdba”

SQL> startup nomount

# Modifier le listener et le tnsnames pour que l’on puisse se connecter à la base auxiliaire

sqlplus “sys/XXXXXXXX@CLONE as sysdba”

# Vérifier que la base cible soit montée ou ouverte

# Se connecter à la base cible et la base auxiliaire avec RMAN

rman target sys/XXXXXXXX@TARGET auxiliary sys/xxxxxxxx@CLONE

connected to target database: TARGET (DBID=3850478880)
connected to auxiliary database: CLONE (not mounted)

RMAN>

# Lancer la commande duplicate
# On peut mettre un critère de temps.
# ex : duplicate target database to CLONE until time ‘SYSDATE-1′;.
# ou dans un script run

duplicate target database to CLONE;

Ex de script jusqu’à la sequence X du Thread Y (because RAC)

run
{ sql ‘alter system archive log current’;
set until sequence=11212 THREAD=2;
allocate auxiliary channel ch1 type disk;
allocate auxiliary channel ch2 type disk;
allocate auxiliary channel ch3 type disk;
allocate auxiliary channel ch4 type disk;
duplicate target database to ‘DBRESTAU’ pfile=’D:oracleproduct10.2.0db_1databaseinitCLONE.ora’ nofilenamecheck; }
exit

Droits sur les procédures et packages (Sécurité Oracle)

Sécurité Oracle pas de Commentaire »

Il existe 2 types gestion des droits des procédures (et fonctions et packages bien sûr)
Procédure avec Droits du propriétaire ou Procédure avec droits de celui qui lance la procédure.
Respectivement DEFINER’S RIGHT Procedure et INVOKER’S Right procedure.

Nous allons étudier dans cet article les DEFINER’s RIGHT .

Par défaut une procédure stockée s’exécute avec les droits du propriétaire, et non les droits de celui qui l’exécute !
Ceci implique que, par défaut l’exécuteur n’a pas besoin de droits particuliers sur les objets sous jacents, mais juste le droit d’exécuter la procédure !
Ces procédures ont la visibilité par défaut des objets du propriétaire, et pas de celui qui lance la procédure.
Et dernier point : LES ROLES NE SONT PAS SUPPORTéS !!!!

————————————————————-
1er cas simple :
une procédure (PDD) appartenant a DD, accede à une table de DD (TDD).
Cette procédure est utilisée par SCOTT.

SQL> connect DD
SQL> CREATE TABLE tdd (n integer);
SQL> create or replace PROCEDURE PDD AS
BEGIN
INSERT INTO tdd values (1);
END;
SQL> GRANT EXECUTE ON pdd TO scott;
SQL> connect SCOTT
SQL> CREATE SYNONYM pdd for dd.pdd
SQL> EXECUTE PDD
—> OK !!

rem : créer un synonyme pour la procédure est obligatoire ici (?!) car Oracle cherche l’objet
dans le shema courant..et il n’existe pas de DD.PDD dans SCOTT.
Le synonyme est lui traduit sans ambiguité.
- un EXECUTE DD.PDD donnerait:
erreur : ORA-06550: line 1, column 10:
PLS-00302: component ‘PDD’ must be declared

rem: il est à noter également que les objets accédés par la procédure sont implicitement
ceux du schéma propriétaire :
Bien que ce soit SCOTT qui appelle la procédure,
TDD référence un objet de DD
(sans avoir a le préfixer et même si SCOTT avait aussi une table qui s’appelle TDD !!!!)

————————————————————-
2eme cas simple :
une procédure (PDD) appartenant a DD, accede à une table de SCOTT (TSCOTT)

L’exécuteur n’étant pas le propriétaire de l’objet accédé il a donc besoin de droits explicites.

A) droit direct

SQL> connect SCOTT/TIGER
CREATE TABLE tscott (n INTEGER);
GRANT INSERT ON tscott to DD;

SQL> connect DD/DD
create or replace PROCEDURE PDD AS
BEGIN
INSERT INTO SCOTT.TSCOTT values (1);
END;

EXECUTE pdd –> OK !

B) via un role

SQL> REVOKE INSERT ON tscott FROM DD;
SQL> CREATE ROLE inscott;
SQL> GRANT INSERT ON scott.tscott TO inscott;

l’execution du package le rend invalide et sa recompilation nous donne plus de précisions :

SQL> CONNECT dd/dd
EXECUTE pdd

ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object DD.PDD is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

SQL> ALTER PROCEDURE pdd COMPILE
Error
PL/SQL: SQL Statement ignored
PL/SQL: ORA-00942: table or view does not exist

CQFD les roles ne sont pas supportés.

Listener et services Oracle Net 10g…

Oracle Net pas de Commentaire »

…en 10g !!!!!!!

La plupart des configurations d’Oracle que l’on trouve sur les machines, sont faites manuellement et héritées de Oracle 9i, elles même héritées de Oracle 8i, etc…
Bilan des courses on fonctionne dans un mode dégradé sans utiliser les fonctionnalités de la 10g et notamment :

  • les outils de configuration graphiques de Oracle Net (oui j’en vois dans le fond qui font des copier/coller dans tnsnames.ora et listener.ora
  • la notion de SERVICE (oui , les mêmes mettent encore des SID a la place!)
  • et l’enregistrement dynamique des instances Oracle auprès du LISTENER.

C’est ce a quoi nous allons essayer de remédier ici.

Intérêt des services dynamiques

Si Oracle Net et la base sont correctement configurés , il ne sera plus nécessaire de spécifier / décrire des services dans le LISTENER.ORA, ce qui constituait un écueil lors de changement de la configuration dans les versions précédentes (un LISTENER.ORA vide ou presque est assez portable!)
De plus lors du démarrage ou de l’arrêt de bases celles-ci s’attachent dynamiquement au LISTENER, via le processus PMON.

Cas d’un LISTENER par défaut.

Un listener par défaut c’est un listener qui s’appelle …LISTENER, qui écoute sur le port 1521 et qui s’appuie sur TCP/IP !

Dans ce cas il suffit de positionner 2 paramètres de l’instance :

  • DB_NAME : le nom de l’instance (dont héritera DB_UNIQUE_NAME)
  • DB_DOMAIN : le domaine par défaut

Ces 2 paramètres concaténés vont servir à constituer un nom de base global, sensiblement équivallent (d’après ce que j’ai compris) au SERVICE NAME.

note : DB_DOMAIN est un paramètre statique et ne peut donc être modifié avec un ‘ALTER SYSTEM SET DB_DOMAIN’
Voir le paragraphe ‘modifier DB_DOMAIN ci- après…

Un nom de base unique sur le réseau (nom_base + domaine) donnera par défaut le nom de service.

A partir de la…ca marche tout seul.

SQL> show parameter NAME
NAME            TYPE        VALUE
--------        ------      ------
db_name         string      DBAUN
db_unique_name  string      DBAUN
global_names    boolean     FALSE
instance_name   string      DBAUN
service_names   string
...
SQL> show parameter DOMAIN

On voit que DB_NAME est positionné, (et donc DB_UNIQUE_NAME aussi) et que DB_DOMAIN également

Si la base est démarrée (et le LISTENER aussi) on peut voir les services enregistrés automatiquement avec la commande ‘lsnrctl service’

srv7$> lsnrctl service
LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.3.0 - Production on 06-FEB-2009 11:30:34
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv7)(PORT=1521)))
Services Summary…
Service “DBAUN.dd.fr” has 1 instance(s).
Instance “DBAUN”, status READY, has 2 handler(s) for this service…
Handler(s):
“D000″ established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: srv7, pid: 5070866>
(ADDRESS=(PROTOCOL=tcp)(HOST=srv7)(PORT=38988))
“DEDICATED” established:0 refused:0 state:ready
LOCAL SERVER
The command completed successfully

rem : Oracle BROKER pour Dataguard démarre 2 services particuliers qui s’appellent <ORACLE_SID>_XPT et <ORACLE_SID>_DGB

Symétriquement, si l’on arrete la base, les services sont détachées automatiquement (et miraculeusement) du listener :

sv7$ >sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on Fri Feb 6 11:43:50 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> shutdown abort
ORACLE instance shut down.
SQL>exit

et si l’on vérifie les services du LISTENER on a :

srv7$> >lsnrctl service
LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.3.0 - Production on 06-FEB-2009 11:45:51
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv7)(PORT=1521)))
The listener supports no services
The command completed successfully

Services compris !

L’enregistrement automatique déclenche un service gratuit (et généralement superflu) qui a poour nom : <ORACLE_SID>_XPT.
Ce service est utile a Dataguard et donc aux stand by database. En architecture classique…il ne sert à rien.

Pour le supprimer, on utilise un paramètre caché de l’instance (__dg_broker_service_names, avec 2 underscores) , que l’on initialise à vide :

SQL> alter system set “__dg_broker_service_names” = ‘ ‘ scope=both;

Cas d’un listener spécifique (non par défaut)

Cf la définition vue plus haut, un listener spécifique est un listener :

  • qui ne s’appelle pas LISTENER ou…
  • qui n’écoute pas sur le port 1521
  • ou qui n’utilise pas TCP/IP

Dans ce cas on utilisera un parametre d’initialisation particulier pour spécifier ce LISTENER.

SQL> ALTER SYSTEM SET LOCAL_LISTENER=LISNERDD SCOPE=BOTH;
SQL> show parameter LOCAL_L
NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------
local_listener                       string      LISTENERDD

Le nom du listener ici LISTENERDD doit être traduit, pour en préciser les caractéristiques spécifiques.
Ceci peut être fait avec une chaine de connexion (CONNECT STRING° explicite dans le tnsnames.ora

LISTENERDD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1522)) )

Parenthèse : Comment modifier DB_DOMAIN ?

Si on utilise un init.ora il suffit de modifier (ou ajouter) le paramètre avec un éditeur de texte :

DB_DOMAIN = mon_domaine.fr

et faire un Shutdown / startup de la base.

Si on utilise un SPFILE, il faut créer un init.ora, le modifier et recréer le SPFILE :

SQL> CREATE PFILE FROM SPFILE;
vi $ORACLE_HOME/dbs/initMON_SID.ora … (et ajout de DB_DOMAIN = mon_domaine.fr)
SQL> SHUTDOWN ABORT
SQL> STARTUP PFILE=iniTMON_SID.ora
SQL> CREATE SPFILE FROM PFILE;
SQL> SHUTDOWN ABORT
SQL> STARTUP