Si vous souhaitez mettre en place un Data Guard Oracle 19c, vous devez disposer de deux serveurs.
Un Data Guard physique est la configuration par défaut d'Oracle Data Guard.
Fournit une copie physiquement identique de la base de données principale, avec des structures de base de données sur disque identiques à la base de données principale, bloc par bloc. Le schéma de la base de données, y compris les index, est identique.
Une base de données physique de réserve est synchronisée avec la base de données principale par l'intermédiaire de Redo Apply, qui récupère les données de réserve reçues de la base de données principale et les applique à la base de données physique de réserve.
Sur le serveur 1, vous devriez avoir une base de données déjà créée et sur le serveur 2, vous n'avez besoin que des binaires sans base de données créée.
J'utilise le fichier /etc/hosts pour configurer la résolution de noms.
Voici mon /etc/hosts sur les deux serveurs
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.130 srv1.localdomain srv1
192.168.1.131 srv2.localdomain srv2
Dans ce guide, je vais vous montrer comment créer une base de données de secours entre Barcelone et Paris.
C'est très simple si vous suivez cette procédure de mise en place d'un gardien de données étape par étape.
BCN est la base de données primaire sur le serveur srv1.
PARIS est la base de données en attente sur le serveur srv2.
Table des matières
1. Préparer la base de données primaire
Vous devez d'abord activer l'archivage dans votre base de données.
Activer l'archivage
sqlplus / as sysdba
select log_mode from v$database ;
alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=both;
shutdown immediate
startup mount
alter database archivelog;
alter database open;
alter system switch logfile;
select name from v$archived_log;
Activer la journalisation forcée
select force_logging from v$database;
alter database force logging;
select force_logging from v$database;
Vérifier la taille du redo log
select group#, thread#, bytes/1024/1024 mb from v$log;
select thread#, instance from v$thread ;
Créer des journaux de réapprovisionnement de secours (standby redo logs)
Vous devez créer des fichiers journaux de secours de la même taille que le résultat obtenu lors de la requête précédente, et du même nombre.
Puisque j'ai 3 redo logs et que leur taille est de 200m, je crée 3 fichiers log en attente de 200m chacun.
alter database add standby logfile thread 1 size 200m;
alter database add standby logfile thread 1 size 200m;
alter database add standby logfile thread 1 size 200m;
Vérifier les journaux redo en attente
select group#, thread#, sequence#, bytes/1024/1024 mb, archived, status
from v$standby_log;
select member from v$logfile where type = 'STANDBY';
Vérifier le nom unique de la base de données
show parameter db_unique_name
Configurer log_archive_config
alter system set log_archive_config='DG_CONFIG=(BCN,PARIS)' scope=both;
Set log_archive_dest_2
alter system set log_archive_dest_2='SERVICE=PARIS ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PARIS' scope=both;
Définir fal_server
show parameter fal_server ;
alter system set fal_server ='PARIS' scope=both;
fal_client n'est plus nécessaire dans Oracle 19c.
Définir la gestion des fichiers en attente
show parameter standby_file_management
alter system set standby_file_management='AUTO' scope=both;
Obtenir une liste de paramètres dépendant des répertoires et créer les répertoires nécessaires dans le serveur en attente :
select name, value from v$parameter
where upper(value) like upper('%/bcn/%');
Vous créerez le répertoire adump plus tard.
Activer le flashback
alter database flashback on;
Vérifier le fichier des mots de passe.
ls /u01/app/oracle/product/19.0.0/db_1/dbs/orapw*
Ajouter à tnsnames.ora
vi $TNS_ADMIN/tnsnames.ora
BCN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BCN.localdomain)
)
)
LISTENER_BCN =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
PARIS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv2.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PARIS.localdomain)
)
)
Sur le serveur primaire, ajoutez un enregistrement d'auditeur statique
vi $TNS_ADMIN/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=BCN.localdomain)
(SID_NAME=BCN)
(ORACLE_HOME=/u01/app/oracle/product/19.0.0/db_1)
)
)
Recharger l'auditeur
lsnrctl reload
2. Préparer la base de données en attente
Créer un fichier d'initialisation avec seulement le nom de la base de données.
N'oubliez pas que le nom de la base de données sera le même dans la base de données primaire et dans la base de données de secours.
Seul le nom unique de la base de données sera différent.
echo 'DB_NAME=BCN' > $ORACLE_HOME/dbs/initPARIS.ora
Copiez le fichier de mots de passe du serveur primaire vers le serveur en attente.
scp oracle@srv1:/u01/app/oracle/product/19.0.0/db_1/dbs/orapwBCN /u01/app/oracle/product/19.0.0/db_1/dbs/orapwPARIS
ls -al /u01/app/oracle/product/19.0.0/db_1/dbs/orapwPARIS
Copier le fichier tnsnames.ora
scp oracle@srv1:/u01/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora /u01/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
Sur le serveur en attente, ajoutez un enregistrement d'auditeur statique qui sera nécessaire pour dupliquer une base de données.
vi $TNS_ADMIN/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv2.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=PARIS.localdomain)
(SID_NAME=PARIS)
(ORACLE_HOME=/u01/app/oracle/product/19.0.0/db_1)
)
)
Recharger l'auditeur
lsnrctl reload
Créer le dossier adump
mkdir -p /u01/app/oracle/admin/PARIS/adump
Démarrer le BD en veille en mode nomade
sqlplus / as sysdba
startup nomount
exit
3. Dupliquer la base de données
Se connecter à RMAN
Vous devez vous connecter à la base de données principale et à la base de données secondaire en même temps.
rman TARGET sys/oracle@BCN AUXILIARY sys/oracle@PARIS
Dupliquer la base de données
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER
SPFILE
SET DB_UNIQUE_NAME 'PARIS' COMMENT 'Is standby'
SET LOG_ARCHIVE_DEST_2 'SERVICE=BCN ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=BCN'
SET AUDIT_FILE_DEST '/u01/app/oracle/admin/PARIS/adump'
SET CONTROL_FILES '/u01/app/oracle/oradata/PARIS/controlfile/control01.ctl'
SET FAL_SERVER 'BCN'
NOFILENAMECHECK;
Une fois la commande de duplication effectuée, vous avez déjà créé votre base de données de secours.
Connectez-vous maintenant à la base de données en attente et vérifiez son rôle.
sqlplus / as sysdba
select database_role from v$database;
show parameter db_name
show parameter db_unique_name
Le nom db_name doit être le même que celui de la base de données primaire et le nom db_unique_name doit être PARIS.
Lancez maintenant le processus d'application des données de référence sur la base de données en attente.
alter database recover managed standby database
disconnect from session;
Vérifier sur la base de données en attente qu'elle applique les archiveurs avec ceci.
select role, thread#, sequence#, action
from v$dataguard_process;
Maintenant, allez sur le primaire et vérifiez les archiveurs aussi et faites un switch logfile pour générer un nouvel archiveur.
select sequence#, first_time, next_time
from v$archived_log
order by sequence#;
alter system switch logfile;
Allez maintenant dans la base de données en attente et vérifiez que le nouvel archiveur a été appliqué.
select sequence#, first_time, next_time, applied
from v$archived_log
order by sequence#;
Arrêter le processus de récupération sur l'ordinateur en attente
alter database recover managed standby database cancel;
Activer le flashback en mode veille
alter database flashback on;
Recommencez le processus de récupération sur l'ordinateur en veille
alter database recover managed standby database
disconnect from session;
4. Effectuer un basculement avec sqlplus
La première confirme que la synchronisation est prête à effectuer un basculement.
sqlplus / as sysdba
alter database switchover to PARIS verify;
Si vous n'obtenez aucune erreur dans la commande précédente, tout va bien.
Si vous obtenez des erreurs, consultez le fichier d'alerte pour plus de détails.
Sur la base de données primaire, vérifiez qu'il n'y a pas de lacunes.
select status, gap_status
from v$archive_dest_status
where dest_id = 2;
Basculement vers la base de données de secours
Exécuter à partir de la base de données primaire :
alter database switchover to PARIS;
Allez maintenant à srv2 (qui est maintenant la base de données primaire) et ouvrez la base de données
sqlplus / as sysdba
alter database open;
Allez maintenant sur srv1 (la nouvelle base de données en attente) et montez la base de données
startup mount
alter database recover managed standby database disconnect;
Sur srv1, vérifiez que tout va bien
select database_role from v$database;
select role, thread#, sequence#, action from v$dataguard_process;
Maintenant, ramenons tout au point de départ.
Vous effectuerez un virage en épingle à cheveux.
Vérifiez d'abord que les deux bases de données sont prêtes.
alter database switchover to BCN verify;
Allez maintenant dans srv2 et exécutez à nouveau le basculement.
alter database switchover to BCN;
Et ouvrir la base de données sur srv1
alter database open;
Sur srv2, montez la base de données et relancez le processus de récupération.
startup mount
alter database recover managed standby database disconnect;
Sur srv2, vérifier que le switchback s'est déroulé correctement
select database_role from v$database;
5. Dépannage
Si vous rencontrez des problèmes, vérifiez les paramètres de la base de données primaire et de la base de données de secours à l'aide de cette requête.
set linesize 200 pages 50
col value for a85
col name for a50
select name, value
from gv$parameter
where name in ('db_name','db_unique_name','log_archive_config',
'log_archive_dest_1','log_archive_dest_2','log_archive_dest_3',
'log_archive_dest_state_1','log_archive_dest_state_2','log_archive_dest_state_3',
'remote_login_passwordfile','log_archive_format','log_archive_max_processes',
'fal_server','fal_client','db_file_name_convert',
'log_file_name_convert', 'standby_file_management')
order by 1;
C'était génial, merci beaucoup