Usa Oracle Data Guard con l'interfaccia CLI del database

In questo articolo viene descritto come utilizzare l'interfaccia CLI del database per impostare Data Guard con Fast-Start Failover (FSFO) in Oracle Cloud Infrastructure. Gli argomenti di questo articolo spiegano come preparare i database primari e in standby, quindi configurare Data Guard per trasmettere i dati di redo dal database primario e applicarli al database in standby.

Oracle consiglia di utilizzare la console anziché l'interfaccia CLI del database per impostare e utilizzare Data Guard in Oracle Cloud Infrastructure.

Nota: in questo articolo si presume che tu abbia familiarità con Data Guard e FSFO. Per ulteriori informazioni, vedere Utilizzare Oracle Data Guard in un sistema DB.

Prerequisiti

Per eseguire le procedure in questo argomento, saranno necessarie le informazioni riportate di seguito per i database primario e in standby.

Ricerca delle informazioni sul database

Dopo aver avviato i sistemi DB primario e in standby e creato i database come descritto più avanti in questo argomento, è possibile utilizzare l'interfaccia CLI su tali sistemi per trovare le informazioni necessarie sul database.

  1. SSH sul sistema DB.

    ssh -i <private_key_path> opc@<db_system_ip_address>
  2. Eseguire il login come opc e quindi sudo all'utente root. Usare sudo su - con un trattino per richiamare il profilo dell'utente root, che imposterà PATH nella directory dbcli (/opt/oracle/dcs/bin).

    sudo su -
  3. Per trovare db_name (o oracle_sid) e db_uniqueName, eseguire il comando dbcli list-databases -j.

    dbcli list-databases -j

    Output:

    [ {
      "id" : "80ad855a-5145-4f8f-a08f-406c5e4684ff",
      "name" : "dbtst",
      "dbName" : "dbtst",
      "databaseUniqueName" : "dbtst_phx1cs",
      "dbVersion" : "12.1.0.2",
      "dbHomeId" : "2efe7af7-0b70-4e9b-ba8b-71f11c6fe287",
      "instanceOnly" : false,
       .
       .
       .
  4. Per trovare la directory home oracle (o la home del database), eseguire il comando dbcli list-dbhomes. Se nel sistema DB sono presenti più home del database, utilizzare quella che corrisponde a "dbHomeId" nell'output del comando dbcli list-databases -j mostrato sopra.

    dbcli list-dbhomes

    Output:

    ID                                       Name                 DB Version                               Home Location                                 Status
    ---------------------------------------- -------------------- ---------------------------------------- --------------------------------------------- ----------
    2efe7af7-0b70-4e9b-ba8b-71f11c6fe287     OraDB12102_home1     12.1.0.2.160719 (23739960, 23144544)     /u01/app/oracle/product/12.1.0.2/dbhome_1     Configured
    
    33ae99fe-5413-4392-88da-997f3cd24c0f     OraDB11204_home1     11.2.0.4.160719 (23054319, 23054359)     /u01/app/oracle/product/11.2.0.4/dbhome_1     Configured

Creare un sistema DB primario

Se non si dispone già di un sistema DB primario, crearne uno come descritto nella sezione Panoramica sulla creazione di un sistema DB. Il sistema DB includerà un database iniziale. È possibile creare database aggiuntivi utilizzando i comandi del database disponibili nel sistema DB.

Creare un sistema DB in standby

Nota: il database di standby deve avere lo stesso db_name del database primario, ma deve avere un db_unique_name diverso. Se utilizzi lo stesso nome di database per il database in standby e primario, dovrai eliminare il database dal sistema DB in standby utilizzando il comando dbcli delete-database prima di poter eseguire il comando dbcli create-database descritto di seguito. Il completamento dell'eliminazione e della creazione del database richiederà alcuni minuti. I comandi dbcli devono essere eseguiti come utente root.

  1. Creare un sistema DB in standby come descritto in Panoramica sulla creazione di un sistema DB e attendere che il sistema DB termini il provisioning e diventi disponibile.

    Puoi creare il sistema DB in standby in un dominio di disponibilità diverso dal sistema DB primario a scopo di disponibilità e disaster recovery (è fortemente consigliato). Puoi creare il sistema DB in standby nella rete cloud del sistema DB primario in modo che entrambi i sistemi si trovino in una singola rete instradabile.

  2. SSH sul sistema DB.

    ssh -i <private_key_path> opc@<db_system_ip_address>
  3. Eseguire il login come opc e quindi sudo all'utente root. Usare sudo su - con un trattino per richiamare il profilo dell'utente root, che imposterà PATH nella directory dbcli (/opt/oracle/dcs/bin).

    sudo su -
  4. Il sistema DB includerà un database iniziale, ma sarà necessario creare un database in standby utilizzando il comando dbcli create-database con il parametro --instanceonly. Questo parametro crea solo la struttura di storage del database e avvia il database in modalità nomount (non vengono creati altri file di database).

    Quando si utilizza --instanceonly, sono richiesti entrambi i parametri --dbname e --adminpassword e devono corrispondere al nome db e alla password di amministratore del database primario per evitare confusione.

    Il comando di esempio seguente richiede la password dell'amministratore e quindi crea una struttura di memorizzazione per un database denominato dbname.

    dbcli create-database --dbname <same as primary dbname>;--databaseUniqueName <different from primary uniquename>;--instanceonly --adminpassword

    Se si utilizzano i pluggable database, specificare anche il parametro --cdb.

    Per una sintassi completa dei comandi, vedere Comandi del database.

  5. Attendere alcuni minuti prima che il comando dbcli create-database crei il database di standby.

    È possibile utilizzare il comando dbcli list-jobs per verificare che il job di creazione sia stato eseguito correttamente, quindi il comando dbcli list-databases verifica che il database sia configurato.

Prepara sistema DB primario

Per preparare il sistema DB primario, dovrai configurare listener statici, aggiornare tnsnames.ora e configurare alcune impostazioni e parametri del database.

Configurazione dei listener statici

Crea listener statici da utilizzare da RMAN e Data Guard Broker.

  1. SSH al sistema DB primario, eseguire il login come utente opc o root e sudo all'utente del sistema operativo Grid.

    sudo su - grid
  2. Modificare /u01/app/<version>/grid/network/admin/listener.ora e aggiungervi il contenuto seguente. Il primo listener statico visualizzato qui è facoltativo. Il secondo listener statico DGMGRL è facoltativo per i database della versione 12.1 o successiva, ma è necessario per i database della versione 11.2.

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <primary_db_unique_name>.<primary_db_domain>)
        (SID_NAME = <primary_oracle_sid>)
        (ORACLE_HOME=<oracle_home_directory>)
        (ENVS="TNS_ADMIN=<oracle_home_directory>/network/admin")
        )
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <primary_db_unique_name>_DGMGRL.<primary_db_domain>)
        (SID_NAME = <primary_oracle_sid>)
        (ORACLE_HOME=<oracle_home_directory>)
        (ENVS="TNS_ADMIN=<oracle_home_directory>/network/admin")
        )
      )
  3. Salvare le modifiche, quindi riavviare il listener.

    srvctl stop listener
    srvctl start listener

Aggiunta dei nomi di servizi di rete a tnsnames.ora

Come utente oracle, modificare $ORACLE_HOME/network/admin/tnsnames.ora e aggiungere il nome del servizio di rete del database di standby.

<standby db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <standby_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <standby db_unique_name>.<standby db_domain>)
    )
  )

L'esempio precedente presuppone che la risoluzione dei nomi funzioni e che <standby_server>.<domain> sia risolvibile nel database primario. Puoi anche utilizzare l'indirizzo IP privato del server in standby se gli indirizzi IP sono instradabili all'interno di una singola rete cloud (VCN).

Configurazione dei parametri del database primario

Suggerimento: se gli host primario e in standby hanno strutture di directory diverse, potrebbe essere necessario impostare parametri aggiuntivi non discussi qui, ad esempio il parametro log_file_name_convert. Per ulteriori informazioni sulla creazione di standby per host con strutture di directory diverse, consultare la documentazione di RMAN.

  1. Abilitare la gestione automatica dei file in standby come utente oracle.

    alter system set standby_file_management=AUTO;
  2. Identificare i nomi e le posizioni dei file di configurazione del broker. I comandi utilizzati dipendono dal tipo di memorizzazione del database. Se non si è certi del tipo di storage del database, utilizzare i comandi del database nel sistema DB.

    Per la memorizzazione del database ACFS, utilizzare i comandi riportati di seguito per impostare i file di configurazione del broker.

    alter system set dg_broker_config_file1='/u02/app/oracle/oradata/<Primary db_unique_name>/dbs/dr1<Primary db_unique_name>.dat';
    alter system set dg_broker_config_file2='/u02/app/oracle/oradata/<Primary db_unique_name>/dbs/dr2<Primary db_unique_name>.dat';

    Per la memorizzazione del database ASM, utilizzare i comandi riportati di seguito per impostare i file di configurazione del broker.

    alter system set dg_broker_config_file1='+DATA/<Primary db_unique_name>/dr1<db_unique_name>.dat';
    alter system set dg_broker_config_file2='+DATA/<Primary db_unique_name>/dr2<db_unique_name>.dat';
  3. Abilita il processo Broker DMON per il database.

    alter system set dg_broker_start=true;
  4. Forza la registrazione del database per tutte le transazioni del database.

    alter database force logging ;
  5. Aggiungere i redo log in standby (SRL), in base ai redo log in linea (ORL). Su un sistema DB appena lanciato, ci saranno tre ORL di dimensioni 1073741824, quindi crea quattro SRL delle stesse dimensioni.

    È possibile utilizzare la query riportata di seguito per determinare il numero e la dimensione (in byte) degli ORL.

    select group#, bytes from v$log;

    Output:

        GROUP# BYTES
    ---------- ----------
             1 1073741824
             2 1073741824
             3 1073741824

    Tutti gli ORL devono avere le stesse dimensioni.

    Le SRL devono avere le stesse dimensioni degli ORL, ma devono esserci almeno una SRL in più rispetto agli ORL. Nell'esempio precedente, ci sono tre ORL, quindi sono necessari quattro SRL. Specificare quindi i redo log correnti più uno e utilizzare le stesse dimensioni dei redo log.

    alter database add standby logfile thread 1 size <size>;

    Nel gruppo SRL deve essere presente un solo membro (per impostazione predefinita, viene creato un sistema DB con un solo membro per gruppo SRL). A tale scopo, è possibile assegnare un nome al file con la seguente sintassi.

    alter database add standby logfile thread 1 group 4 (<logfile name with full path>) size 1073741824, group 5(<logfile name with full path>) size 1073741824 ...

    Per le configurazioni ASM/OMF, il comando sopra riportato utilizza il gruppo di dischi anziché \<logfile name with full path>.

    alter database add standby logfile thread 1 group 4 (+RECO) size 1073741824, group 5(+RECO) size 1073741824 ...

    Suggerimento: le dimensioni di ORL e SRL devono essere dimensionate in modo che gli switch di log non si verifichino con maggiore frequenza ogni 10 minuti. Ciò richiede la conoscenza dell'applicazione e potrebbe essere necessario modificarla dopo la distribuzione. Per ulteriori informazioni, vedere Utilizzare i redo log in standby e configurare le dimensioni in modo appropriato.

  6. Verificare di aver creato il numero corretto di SRL.

    select group#, bytes from v$standby_log;
  7. Assicurarsi che il database sia in modalità ARCHIVELOG.

    archive log list
  8. Abilita FLASHBACK del database. Il valore minimo consigliato per db_flashback_retention_target è 120 minuti.

    alter database flashback on ;
    alter system set db_flashback_retention_target=120;
  9. Eseguire un redo log a switch singolo per attivare l'archiviazione se il database è stato appena creato. Almeno un log deve essere archiviato prima di eseguire il duplicato RMAN.

    alter system switch logfile;

Prepara database in standby

Prima di preparare il database in standby, assicurarsi che la home del database in standby sia la stessa versione del database primario. Se i database primario e in standby sono entrambi appena creati con la stessa versione del database, le home del database saranno uguali. In caso contrario, creare una home di database con la stessa versione. È possibile utilizzare i comandi Dbhome per verificare le versioni e creare una nuova home del database in base alle esigenze.

Per preparare il sistema DB in standby, dovrai configurare listener statici, aggiornare tnsnames.ora, configurare il wallet TDE, creare un password file temporaneo, verificare la connettività, eseguire RMAN DUPLICATE, abilitare FLASHBACK e quindi creare il servizio di database.

Configurazione dei listener statici

Crea listener statici da utilizzare da RMAN e Data Guard Broker.

  1. SSH al sistema DB in standby, eseguire il login come utente opc o root e sudo all'utente del sistema operativo Grid.

    sudo su - grid
  2. Aggiungere il seguente contenuto a /u01/app/<db_version>/grid/network/admin/listener.ora.

    Il primo listener statico visualizzato di seguito è obbligatorio per RMAN DUPLICATE. Il secondo listener statico DGMGRL è facoltativo per le versioni di database 12.2.0.1 e 12.1.0.2, ma è obbligatorio per la versione di database 11.2.0.4.

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <standby db_unique_name>.<standby db_domain>)
        (SID_NAME = <standby oracle_sid>)
        (ORACLE_HOME=<oracle home directory>)
        (ENVS="TNS_ADMIN=<oracle home directory>/network/admin")
        )
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <standby db_unique_name>_DGMGRL.<standby db_domain>)
        (SID_NAME = <standby oracle_sid>)
        (ORACLE_HOME=<oracle home directory>)
        (ENVS="TNS_ADMIN=<oracle home directory>/network/admin")
        )
      )
  3. Riavviare il listener.

    srvctl stop listener
    srvctl start listener
  4. Verificare che i listener statici siano disponibili. L'output di esempio riportato di seguito è relativo alla versione del database 12.1.0.2. Si noti che i messaggi ...status UNKNOWN sono previsti a questo punto.

    lsnrctl status

    Output:

    LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 29-SEP-2016 21:09:25
    
    Copyright (c) 1991, 2014, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
    Start Date                29-SEP-2016 21:09:19
    Uptime                    0 days 0 hr. 0 min. 5 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/12.1.0.2/grid/network/admin/listener.ora
    Listener Log File         /u01/app/grid/diag/tnslsnr/dg2/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.1.24)(PORT=1521)))
    Services Summary...
    Service "dg2_phx2hx.oratst.org" has 1 instance(s).
      Instance "dg2", status UNKNOWN, has 1 handler(s) for this service...
    Service "dg2_phx2hx_DGMGRL.oratst.org" has 1 instance(s).
      Instance "dg2", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully

Aggiunta dei nomi di servizi di rete a tnsnames.ora

Come utente oracle, aggiungere il nome del servizio di rete del database di standby a $ORACLE_HOME/network/admin/tnsnames.ora. $ORACLE_HOME è la home del database in cui è in esecuzione il database di standby.

<Primary db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <primary_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <primary db_unique_name).<primary db_domain>)
    )
  )

<Standby db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <standby_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <standby db_unique_name>.<db_domain>)
    )
  )

Copia dei wallet TDE nel sistema in standby

Copiare i file wallet TDE dal sistema DB primario al sistema DB in standby utilizzando SCP. Il comando di esempio riportato di seguito presume che il comando SCP venga eseguito dall'utente del sistema operativo oracle e che la chiave privata per oracle sia stata creata ed esista sull'host in cui viene eseguito SCP.

scp -i <private key> primary_server:/opt/oracle/dcs/commonstore/wallets/tde/<primary db_unique_name>/* standby_server:/opt/oracle/dcs/commonstore/wallets/tde/<standby db_unique_name>

Impostazione della configurazione del sistema in standby

Come utente oracle, creare la directory seguente per la versione del database 11.2.0.4. Questo passo è facoltativo per la versione 12.2.0.1 e la versione 12.1.0.2.

mkdir  -pv /u03/app/oracle/redo/<standby db_unique_name uppercase>/controlfile

Creazione della destinazione del file di audit

Come utente oracle, creare la directory seguente da utilizzare come destinazione del file di audit.

mkdir -p /u01/app/oracle/admin/<db_name>/adump

In caso contrario, il comando duplicato RMAN utilizzato in seguito non riuscirà.

Creazione di un file password temporaneo

Creare un password file temporaneo come utente oracle.

orapwd file=$ORACLE_HOME/dbs/orapw<standby oracle_sid>    password=<admin password for primary> entries=5

La password deve essere uguale alla password amministratore del database primario. In caso contrario, il passo duplicato RMAN riportato di seguito non riuscirà con: RMAN-05614: Passwords for target and auxiliary connections must be the same when using active duplicate.

Verifica della disponibilità del database di standby

  1. Impostare le variabili di ambiente come utente oracle.

    . oraenv
  2. Sostituire $ORACLE_HOME/dbs/init<standby sid_name>.ora con il seguente contenuto:

    db_name=<Primary db_name>
    db_unique_name=<standby db_unique_name>
    db_domain=<standby db_domain>
  3. Rimuovere lo spfile dallo standby.

    /u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile$ORACLE_SID.ora

    Il database deve essere avviato in modalità nomount senza spfile specificato, ma il file init originale contiene un parametro spfile che impedirà il funzionamento del passo duplicato RMAN.

  4. Impostare la variabile di ambiente ORACLE_UNQNAME in modo che punti a DB_UNIQUE_NAME.

    export ORACLE_UNQNAME =db_unique_name

    Nota: se non si esegue questo passo, il wallet non verrà aperto e l'esecuzione del comando RMAN DUPLICATE nel passo successivo non riuscirà.

  5. Il comando dbcli create-database --instanceonly utilizzato in precedenza apre il database di standby come primario in modalità di lettura/scrittura, quindi il database deve essere disattivato prima di procedere al passo di nomount riportato di seguito.

    sqlplus / as sysdba
    
    shutdown immediate
  6. Avvia il database in modalità NOMOUNT.

    startup nomount

Verifica delle connessioni al database

Verificare la connessione tra i database primari e in standby.

  1. Assicurarsi che la porta del listener 1521 sia aperta nelle liste di sicurezza utilizzate per i sistemi DB primario e in standby. Per ulteriori informazioni, vedere Aggiornare la lista di sicurezza per il sistema DB.
  2. Dal database primario, connettersi al database in standby.

    sqlplus sys/<password>@<standby net service name> as sysdba
  3. Dal database in standby, connettersi al database primario.

    sqlplus sys/<password>@<primary net service name> as sysdba

Esecuzione del comando DUPLICATE RMAN

Eseguire il comando RMAN DUPLICATE sul sistema DB in standby, come utente oracle.

Se il database primario è di grandi dimensioni, è possibile allocare canali aggiuntivi per migliorare le prestazioni. Per un database appena installato, in genere un canale esegue la duplicazione del database in un paio di minuti.

Assicurarsi che non vi siano errori generati dal comando RMAN DUPLICATE. Se si verificano errori, riavviare il database utilizzando il file init.ora (non spfile) nel caso in cui venga generato in $ORACLE_HOME/dbs come parte di RMAN DUPLICATE.

Negli esempi seguenti utilizzare le lettere minuscole per <Standby db_unique_name>, a meno che non sia specificato diversamente.

Per il layout di storage ACFS, eseguire i comandi seguenti.

rman target sys/<password>@<primary alias>  auxiliary sys/<password>@<standby alias> log=rman.out

run { allocate channel prim1 type disk;
    allocate auxiliary channel sby type disk;
    duplicate target database for standby from active database
    dorecover
    spfile
    parameter_value_convert '/<Primary db_unique_name>/','/<Standby db_unique_name>/','/<Primary db_unique_name uppercase>/','/<Standby db_unique_name uppercase >/'
    set db_unique_name='<Standby db_unique_name>'
    set db_create_file_dest='/u02/app/oracle/oradata/<Standby db_unique_name>'
    set dg_broker_config_file1='/u02/app/oracle/oradata/<Standby db_unique_name>/dbs/dr1<Standby db_unique_name>.dat'
    set dg_broker_config_file2='/u02/app/oracle/oradata/<Standby db_unique_name>/dbs/dr2<Standby db_unique_name>.dat'
    set dispatchers ='(PROTOCOL=TCP) (SERVICE=<Standby db_unique_name>XDB)'
    set instance_name='<Standby db_unique_name>'
    ;
}

Per il layout di memorizzazione ASM, eseguire i comandi riportati di seguito.

rman target sys/<password>@<primary alias>  auxiliary sys/<password>@<standby alias> log=rman.out

run {
    allocate channel prim1 type disk;
    allocate auxiliary channel sby type disk;
    duplicate target database for standby from active database
    dorecover
    spfile
    parameter_value_convert '/<Primary db_unique_name>/','/<Standby db_unique_name>/','/<Primary db_unique_name uppercase>/','/<Standby db_unique_name uppercase>/'
    set db_unique_name='<Standby db_unique_name>'
    set dg_broker_config_file1='+DATA/<Standby db_unique_name>/dr1<Standby db_unique_name>.dat'
    set dg_broker_config_file2='+DATA/<Standby db_unique_name>/dr2<Standby db_unique_name>.dat'
    set dispatchers ='(PROTOCOL=TCP) (SERVICE=<Standby db_unique_name>XDB)'
    set instance_name='<Standby db_unique_name>'
    ;
}

Abilitazione del database FLASHBACK

  1. Come best practice di Data Guard, abilita il flashback e imposta db_flashback_retention_target su almeno 120 minuti nei database primario e in standby.

    alter database flashback on;
    alter system set db_flashback_retention_target=120;
  2. Verificare che il database di standby sia stato creato correttamente.

    select FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE,SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE from v$database ;

Creazione di un servizio del database

Oracle consiglia di creare un servizio di database per il database di standby utilizzando srvctl.

Per il layout di storage ACFS.

  1. Creare una directory condivisa e copiarvi il file spfile.

    mkdir -pv /u02/app/oracle/oradata/<Standby db_unique_name>/dbs
    cp $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora /u02/app/oracle/oradata/<Standby db_unique_name>/dbs
  2. Arrestare e rimuovere il servizio di database esistente.

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl remove database
        -d <standby db_unique_name>
  3. Creare il servizio di database.

    srvctl add database
        -d <standby db_unique_name>
        -n <standby db_name>
        -o $ORACLE_HOME
        -c SINGLE
        -p '/u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile<standby db_name>.ora'
        -x <standby hostname>
        -s "READ ONLY"
        -r PHYSICAL_STANDBY
        -i <db_name>
    
    srvctl setenv database
        -d <standby db_unique_name>
        -t "ORACLE_UNQNAME=<standby db_unique_name>"
    
    srvctl config database
        -d <standby db_unique_name>
  4. Avviare il servizio di database.

    srvctl start database
        -d <standby db_unique_name>
  5. Cancellare i file da $ORACLE_HOME/dbs.

    rm $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora
    rm $ORACLE_HOME/dbs/init<standby oracle_sid>.ora
  6. Creare il file $ORACLE_HOME/dbs/init<standby oracle_sid>.ora per fare riferimento alla nuova posizione del file spfile.

    SPFILE='/u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile<standby db_name>.ora'
  7. Arrestare il database di standby, quindi avviarlo utilizzando srvctl.

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl start database
        -d <standby db_unique_name>

Per il layout di memorizzazione ASM.

  1. Si consideri la possibilità di generare il file spfile sotto +DATA.

    create pfile='init<standby oracle_sid>.ora' from spfile ;
    create spfile='+DATA' from pfile='init<standby oracle_sid>.ora' ;
  2. Arrestare e rimuovere il servizio di database esistente.

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl remove database
        -d <standby db_unique_name>
  3. Creare il servizio di database.

    srvctl add database
        -d <standby db_unique_name>
        -n <standby db_name>
        -o $ORACLE_HOME
        -c SINGLE
        -p '+DATA/<standby db_unique_name>/PARAMETERFILE/spfile.xxx.xxxxxx'
        -x <standby hostname>
        -s "READ ONLY"
        -r PHYSICAL_STANDBY
        -i <db_name>
    
    srvctl setenv database
        -d <standby db_unique_name>
        -t "ORACLE_UNQNAME=<standby db_unique_name>"
    
    srvctl config database
        -d <standby db_unique_name>
  4. Avviare il servizio di database.

    srvctl start database
        -d <standby db_unique_name>
  5. Cancellare i file da $ORACLE_HOME/dbs.

    rm $ORACLE_HOME/dbs/init<standby oracle_sid>.ora
    rm $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora
  6. Creare il file $ORACLE_HOME/dbs/init<standby oracle_sid>.ora per fare riferimento alla nuova posizione del file spfile.

    SPFILE='+DATA/<standby db_unique_name>/PARAMETERFILE/spfile.xxx.xxxxxx'
  7. Arrestare il database e avviare il database di standby utilizzando srvctl.

    srvctl start database -d <standby db_unique_name>

Configura Data Guard

Eseguire i passi riportati di seguito per completare la configurazione di Data Guard e abilitare il trasporto di redo dal database primario e l'applicazione di redo nel database di standby.

  1. Eseguire la utility della riga di comando dgmgrl dal sistema DB primario o in standby e connettersi al database primario utilizzando le credenziali sys.

    connect sys/<sys password>@<primary tns alias>
  2. Creare la configurazione Data Guard e identificarla per i database primari e in standby nella utility della riga di comando dgmgrl.

    create configuration mystby as primary database is <primary db_unique_name> connect identifier is <primary tns alias>;
    add database  <standby db_unique_name> as connect identifier is <standby tns alias>  maintained as physical;
  3. Abilitare la configurazione Data Guard nella utility della riga di comando dgmgrl.

    enable configuration;
  4. Verificare che l'impostazione di Data Guard sia stata eseguita correttamente. Eseguire l'istruzione SQL seguente in entrambi i database primario e in standby nel prompt SQL.

    select FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE from v$database;
  5. Verificare che i processi Data Guard siano avviati nel database di standby.

    select PROCESS,PID,DELAY_MINS from V$MANAGED_STANDBY;
  6. Verificare la configurazione dei parametri sul database primario e di standby.

    show parameter log_archive_dest_
    show parameter log_archive_config
    show parameter fal_server
    show parameter log_archive_format
  7. Verificare che la configurazione Data Guard funzioni nella utility della riga di comando dgmgrl. In particolare, assicurarsi che la spedizione dei redo e l'applicazione dei redo funzionino e che il standby non sia irragionevolmente in ritardo rispetto al database primario.

    show configuration verbose
    show database verbose <standby db_unique_name>
    show database verbose <primary db_unique_name>

    Eventuali discrepanze, errori o avvertenze devono essere risolte. Puoi anche eseguire una transazione sul database primario e verificare che sia visibile in standby.

  8. Verificare che la configurazione Data Guard funzioni come previsto eseguendo lo switchover e il failover in entrambe le direzioni. Eseguire show configuration dopo ogni operazione e assicurarsi che non vi siano errori o avvertenze nella utility della riga di comando dgmgrl.

    Attenzione: questo passo è facoltativo, in base alla tua discrezione. Se per qualsiasi motivo la configurazione non è valida, lo switchover e/o il failover non riusciranno e potrebbe essere difficile o impossibile avviare il database primario. Potrebbe essere necessario un recupero del primario, che influirà sulla disponibilità.

    switchover to <standby db_unique_name>
    switchover to <primary db_unique_name>
    #connect to standby before failover:
    
    connect sys/<sys password>@<standby db_unique_name>
    failover to <standby db_unique_name>
    reinstate database <primary db_unique_name>
    #connect to primary before failover:
    
    connect sys/<sys password>@<primary db_unique_name>
    failover to <primary db_unique_name>
    reinstate database <standby db_unique_name>

Configura osservatore (facoltativo)

La best practice per garantire alta disponibilità e durabilità prevede l'esecuzione del database primario, in standby e dell'osservatore in domini di disponibilità separati. L'observer determina se eseguire o meno il failover su un database di standby di destinazione specifico. Il server utilizzato per l'observer richiede il software Oracle Client Administrator, che include Oracle SQL NET e Broker. Eseguire i comandi seguenti nella utility della riga di comando dgmgrl.

  1. Configurare i nomi alias TNS per i database primario e in standby come descritto in precedenza e verificare la connessione a entrambi i database.
  2. Modificare la modalità di protezione in maxavailability o maxperformance (la protezione massima non è supportata per FSFO).

    Per abilitare la maxavailability:

    edit database <standby db_unique_name> set property 'logXptMode'='SYNC';
    edit database <primary db_unique_name> set property 'logXptMode'='SYNC';
    edit configuration set protection mode as maxavailability;

    Per abilitare maxperformance:

    edit configuration set protection mode as maxperformance;
    edit database <standby db_unique_name> set property 'logXptMode'='ASYNC';
    edit database <primary db_unique_name> set property 'logXptMode'='ASYNC';

    Per maxperformance, la proprietà FastStartFailoverLaglimit limita la quantità massima di perdita di dati consentita a 30 secondi per impostazione predefinita.

  3. Devono essere considerate anche le seguenti proprietà. Eseguire show configuration verbose per visualizzare i valori correnti.

    • FastStartFailoverFittizioChiusura
    • Soglia FastStartFailover
    • Destinazione FastStartFailover
    • FastStartFailoverReintegrazione automatica

    L'esecuzione di show configuration genererà il seguente errore fino all'avvio dell'observer: Warning : ORA-16819: fast-start failover observer not started.

  4. Abilitare Fast-Start Failover da Broker:

    Enable fast_start failover
  5. Verificare il Fast-Start Failover e le impostazioni associate.

    show fast_start failover
  6. Avviare l'osservatore da Broker (verrà eseguito in primo piano, ma può anche essere eseguito in background).

    start observer
  7. Verificare che Fast-Start Failover sia abilitato e senza errori o avvertenze.

    show configuration verbose
  8. Eseguire sempre il test del failover in entrambe le direzioni per assicurarsi che tutto funzioni come previsto. Verificare che FSFO sia in esecuzione correttamente eseguendo un'interruzione dell'arresto del database primario.

    L'observer deve avviare il failover al database di standby. Se la modalità di protezione è impostata su maxprotection, può verificarsi una perdita di dati, in base al valore FastStartFailoverLaglimit.