Suivre ce blog
Administration Créer mon blog
15 février 2009 7 15 /02 /février /2009 19:34
Bonsoir,

Dans l'article précédent, nous avons vu comment mettre en place une base de secours tout en utilisant une version standard d'Oracle.

Maintenant que notre base est de secours est en place voyons comment effectuer la mise à jour de notre base.

1 ère étape : Créer de l'activité transactionnel sur la base principale.


SET ORACLE_SID=DB1

SQLPLUS /nolog
CONNECT system/oracle

CREATE USER app IDENTIFIED BY app;
GRANT CONNECT, RESOURCE TO app;

CONNECT app/app

CREATE TABLE my_table (col1 NUMBER);

BEGIN
   FOR i IN 1..10000 LOOP
      INSERT INTO my_table VALUES (i);
   END LOOP;
   COMMIT;
END;
/




Afin de s'assurer que les fichiers d'archives log soient générés


CONNECT system/oracle
ALTER SYSTEM SWITCH LOGFILE;



2 ème étape : Appliquer les modifications sur la base de secours

On peut facilement vériifier dans C:\FRA\DB1\ARCHIVELOG\YYYY_MM_DD\ qu'un fichier d'archive vient d'étre fraichement crée.

Nous allons copier le fichier d'archive crée sur le serveur de secours, dans le répertoire C:\FRA\DB1\ARCHIVELOG\YYYY_MM_DD\

Puis sur le serveur de secours, dans une fenêtre dos:


SET ORALCE_SID=DB2

SQLPLUS /nolog
CONNECT / as sysdba

ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL;
ALTER DATABASE RECOVER CANCEL;




Et voila... le tour est joué, votre base de secours est maintenant au même niveau que votre base primaire.

REMARQUE : La base est à l'état "MOUNT" et par conséquent n'est pas accessible pour intérrogation.

On peut cependant vérifier que la mise à jour a bien été effectuée.


SQLPLUS /nolog
CONNECT / as sysdba

ALTER DATABASE OPEN;

CONNECT  app/app
SELECT COUNT(*) FROM my_table;



Remarque :  On constate, que les trois types d'opérations (CREATE USER, CREATE TABLE , INSERT) ont bien été appliquées.

Si nous voulons que notre base de secours puisse à nouveau être mise à jour, il faut la remettre en etat "MOUNT"


SQLPLUS /nolog
CONNECT / as sysdba
STARTUP FORCE MOUNT;




Remarque : Lorsque la base est ouverte, elle en fait accessible en lecture seule. Il n'est pas possible de modifier les données ou de créer de  nouveaux objets.


On voit bien ici le début des limites de ce type d'architecture. La première c'est qu'il va falloir se fabriquer un petit script pour déplacer régulièrement les archives et les appliquer sur la ou les bases de secours.

Une autre limite concerne la structure de la base. Si il me venait la bonne idée d'ajouter un tablespace, la transaction echouerait sur la base de secours.

Au final, tout n'est pas à jeter. Lorsque l'on n'a pas les budgets, cela peut quand même être utile.
  • En cas de crash, on peut limiter l'interruption de service à la durée du "recover" des archives logs manquants.
  • Dans le cas d'une opération de maintenance nécessitant l'arrêt de la base, on peut donner l'accès en lecture aux utilisateurs en attendant la remise en route du serveur principal.
  • ....
Dans un prochain article, nous étudierons le cas d'un crash de la base primaire, et comment transformer notre base de secours en base principale.

LAO.

Partager cet article

Published by LAO - dans Dataguard
commenter cet article

commentaires

siouat 24/08/2009

Bjr,
J'ai cherché à refaire les 2 parties Dataguard du 15/02/09.
La partie 1 se déroule sans problème. Par contre, après plusieurs tentatives, la 2è partie ne se passe pas comme indiqué.
Ci-dessous mes résultats.
J'utilise Oracle 10.2.0.1 sur Redhat5.
Aurez-vous une explication à mes problèmes ?
Merci d'avance.

SQL> conn system/dba1
Connected.
SQL> CREATE USER app IDENTIFIED BY app;
User created.
SQL> GRANT CONNECT, RESOURCE TO app;
Grant succeeded.
SQL> CONNECT app/app
Error accessing PRODUCT_USER_PROFILE
Warning: Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
SQL> show user
USER is "APP"
==============================================
j'ai déroulé pupbld.sql suite à l'erreur ci-dessus.
==============================================
[oracle@RH5_a ~]$ export ORACLE_SID=DB2
[oracle@RH5_a ~]$ rman target sys/dba@DB1_SRV1 auxiliary sys/dba

Recovery Manager: Release 10.2.0.1.0 - Production on Sun Aug 23 01:13:02 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: DB1 (DBID=1289267841)
connected to auxiliary database: DB1 (not mounted)

RMAN> duplicate target database for standby nofilenamecheck;

Starting Duplicate Db at 23-AUG-09
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=156 devtype=DISK

contents of Memory Script:
{
restore clone standby controlfile;
sql clone 'alter database mount standby database';
}
executing Memory Script

Starting restore at 23-AUG-09
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/admin/DB1/FRA/DB1/backupset/2009_08_22/o1_mf_ncnnf_TAG20090822T205113_590hnp88_.bkp
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/u01/app/oracle/admin/DB1/FRA/DB1/backupset/2009_08_22/o1_mf_ncnnf_TAG20090822T205113_590hnp88_.bkp tag=TAG20090822T205113
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
output filename=/mnt/hd2/oracledb/DB2/control01.ctl
output filename=/mnt/hd2/oracledb/DB2/control02.ctl
output filename=/mnt/hd2/oracledb/DB2/control03.ctl
Finished restore at 23-AUG-09

sql statement: alter database mount standby database
released channel: ORA_AUX_DISK_1

contents of Memory Script:
{
set newname for tempfile 1 to
"/mnt/hd2/oracledb/DB1/temp.dbf";
switch clone tempfile all;
set newname for datafile 1 to
"/mnt/hd2/oracledb/DB1/system.dbf";
set newname for datafile 2 to
"/mnt/hd2/oracledb/DB1/UNDOTBS1.dbf";
set newname for datafile 3 to
"/mnt/hd2/oracledb/DB1/sysaux.dbf";
restore
check readonly
clone database
;
}
executing Memory Script

executing command: SET NEWNAME

renamed temporary file 1 to /mnt/hd2/oracledb/DB1/temp.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 23-AUG-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=156 devtype=DISK

channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /mnt/hd2/oracledb/DB1/system.dbf
restoring datafile 00002 to /mnt/hd2/oracledb/DB1/UNDOTBS1.dbf
restoring datafile 00003 to /mnt/hd2/oracledb/DB1/sysaux.dbf
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/admin/DB1/FRA/DB1/backupset/2009_08_22/o1_mf_nnndf_TAG20090822T205113_590hk1rh_.bkp
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/u01/app/oracle/admin/DB1/FRA/DB1/backupset/2009_08_22/o1_mf_nnndf_TAG20090822T205113_590hk1rh_.bkp tag=TAG20090822T205113
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:02:18
Finished restore at 23-AUG-09

contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy recid=4 stamp=695610972 filename=/mnt/hd2/oracledb/DB1/system.dbf
datafile 2 switched to datafile copy
input datafile copy recid=5 stamp=695610972 filename=/mnt/hd2/oracledb/DB1/UNDOTBS1.dbf
datafile 3 switched to datafile copy
input datafile copy recid=6 stamp=695610972 filename=/mnt/hd2/oracledb/DB1/sysaux.dbf
Finished Duplicate Db at 23-AUG-09

RMAN> exit


Recovery Manager complete.
=========================================
application des archives après création de my_table dans DB1
-----------------------------------------
[oracle@RH5_a ~]$ export ORACLE_SID=DB2
[oracle@RH5_a ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 23 01:32:15 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn sys/dba as sysdba
Connected.
SQL> ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL;
ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL
*
ERROR at line 1:
ORA-00279: change 230701 generated at 08/22/2009 20:51:13 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/admin/DB2/FRA/DB2/archivelog/2009_08_23/o1_mf_1_11_%u_.arc
ORA-00280: change 230701 for thread 1 is in sequence #11
ORA-00278: log file
'/u01/app/oracle/admin/DB2/FRA/DB2/archivelog/2009_08_23/o1_mf_1_11_%u_.arc' no
longer needed for this recovery
ORA-00308: cannot open archived log
'/u01/app/oracle/admin/DB2/FRA/DB2/archivelog/2009_08_23/o1_mf_1_11_%u_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

SQL> ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL;
ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL
*
ERROR at line 1:
ORA-00275: media recovery has already been started

SQL> shutdown abort
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@RH5_a ~]$ export ORACLE_SID=DB2
[oracle@RH5_a ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 23 01:39:23 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn sys/dba as sysdba
Connected to an idle instance.
SQL> startup mount
ORACLE instance started.

Total System Global Area 268435456 bytes
Fixed Size 1218892 bytes
Variable Size 88082100 bytes
Database Buffers 176160768 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL;
ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE UNTIL CANCEL
*
ERROR at line 1:
ORA-00279: change 230701 generated at 08/22/2009 20:51:13 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/admin/DB2/FRA/DB2/archivelog/2009_08_23/o1_mf_1_11_%u_.arc
ORA-00280: change 230701 for thread 1 is in sequence #11
ORA-00278: log file
'/u01/app/oracle/admin/DB2/FRA/DB2/archivelog/2009_08_23/o1_mf_1_11_%u_.arc' no
longer needed for this recovery
ORA-00308: cannot open archived log
'/u01/app/oracle/admin/DB2/FRA/DB2/archivelog/2009_08_23/o1_mf_1_11_%u_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
SQL>

sara 20/04/2010



Très intéressant . Quand l'article sur  le cas d'un crash de la base primaire, et comment transformer notre base de secours en base principale pourra t-il
être consulté?