lundi 27 février 2012

Outil d'export de tables sans authentification avec liste de filtrage

Voici un cas pratique qui m'a été posé.

Un utilisateur souhaite pouvoir backuper certaines tables via exp.
A priori pas de problème, mais cela veut dire que je doit lui donner le droit d'exporter y compris les objets que je ne souhaite pas lui donner accès.

De plus le ROLE EXP_FULL_DATABASE implique pour moi une faille de sécurtié, n'importe que grant sera bypassé à cause de ce role.

Pour ce faire, je met en place le mécanisme suivant :

  1. Je créé un nouveau compte dédié à l'export
  2. Sur un serveur je met en place un script (voir ci-dessous) qui va supplanter ma commande d'export
  3. J'empêche la lecture du script par les autres utilisateurs
  4. Je met en place les bonnes règles sudo pour que mon utilisateur puisse exporter

Résultat :

  1. L'utilisateur peut exporter
  2. Il ne connait pas le mot de passe
  3. Je peux mettre en place un mechanisme de filtrage pour l'empecher d'exporter certaines tables.

Reduire la taille d'un datafile au minimum requis


Il arrive souvent (voir trop souvent) que l'on se retrouve avec des ressources disque limitées.

Notre base de données à vécue, l'espace libre s’amenuise mais nous constatons que plus de la moitié de l'espace alloué dans un de nos tablespace est vide.

Voici une petite solution qui peut vous permettre d’éviter de redeverser les objets de notre tablespace dans un autre

Ce script va calculer la taille minimale pour chaque datafile de notre tablespace et générer les requêtes de resize.

set pagesize 0
set linesize 150
set head off
set verify off
set echo off
spool resize_tbs.sql


select 'alter database datafile ''' || file_name || ''' resize ' || CEIL( ( NVL( hwm,1) * blksize ) / 1024 / 1024 ) || 'm;' cmd
from dba_data_files a,
  (select file_id, max(block_id + blocks - 1) hwm from dba_extents group by file_id) b,
  (select to_number(value) blksize from v$parameter where name = 'db_block_size') c
where a.file_id = b.file_id (+)
and CEIL(blocks * c.blksize / 1024 /1024) - CEIL((nvl(b.hwm,1) * c.blksize) / 1024 /1024) > 0
and tablespace_name=<TABLESPACE NAME>;
spool off

jeudi 23 février 2012

Construction d'une standby à froid (Warm) en PostgreSQL 8.2

La version Postgresql 8.2 introduit une nouvelle fonctionnalité de haute disponibilité, le log shipping.

Le but est d'avoir un serveur de secours en attente permanente, qui va rejouer en quasi temps réel les journaux
de transaction (appelés WALs pour Write Ahead Log'') du serveur primaire, et qui est prêt à prendre le relai à tout
moment, en cas d'incident sur le serveur primaire.

Deux serveurs sont donc nécessaires :

  • Un serveur primaire (maître) qui archive les WALs et les envoie sur le serveur de secours (esclave)
  • Un serveur de secours qui lui est en mode recovery permanent et les rejoue dès leur réception.

Un lien réseau entre les deux serveurs doit donc exister, pour que l'envoi des WALs puisse se faire.

La réplication concerne l'instance Postgresql entière, c'est-à-dire toutes les bases de données Postgresql existantes sur le serveur primaire.

Résoudre ORA-24247: network access denied by access control list (ACL) when trying to send email

En 11G, Oracle à introduit des controles d'accès sur certain packages entrainant un accès exterieur à la base.


C'est le cas notamment du package utl_mail_send, pour ce faire, il faut définir des 'Access Control List' (ACL) pour définir qui, quoi et vers ou un utilisateur peut effectuer des connexions extérieures à la base de données.


Le pré requis est d'avoir tout d'abord la couche XML DB.


Exemple :
begin
dbms_network_acl_admin.create_acl (
acl => 'utl_mail.xml',
description => 'Allow mail to be send',
principal => 'USER1',
is_grant => TRUE,
privilege => 'connect'
);
commit;
end;
/

mercredi 22 février 2012

ORA-08104 : this index object xxxxx is being online built or rebuilt

Si votre session oracle a été killée lors d'un rebuild online d'un index, il y a de fortes chances que vous rencontriez une erreur ORA-08104 (this index object xxxxx is being online built or rebuilt).

Votre index se trouve alors dans un état incohérent et toute tentative de rebuild ou drop vous renvoi cette erreur.

Le seul moyen est d’utiliser le package DBMS_REPAIR.

La première étape est de valider l’état de l'objet, par expérience le flags 2563 confirme que l'index est en mode "online rebuild".

SQL> alter index S.SYS_C007740 rebuild online tablespace s_data01;

alter index S.SYS_C007740 rebuild online tablespace s_data01
*
ERROR at line 1:
ORA-08104: this index object 75350 is being online built or rebuilt
SQL> conn / as sysdba
Connected.
SQL> select obj#,flags from ind$ where obj#=75350;
OBJ# FLAGS
---------- ----------
75350 2563

Réparer l'erreur ORA-24248: .... XML DB not installed


$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus / as sysdba
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> spool install_xml_db.log
SQL> @catqm xdb sysaux temp YES