sqlplus / as sysdba <<< "startup nomount pfile='$ORACLE_BASE/admin/<db_unique_name>/pfile/init<SID>_duplicate.ora'" read -rs ORADB_STANDBY_SYS_PASSWORD; export ORADB_STANDBY_SYS_PASSWORD $ORACLE_BASE/admin/<db_unique_name>/pfile/duplicate_<db_unique_name>.sh
Standby Databases
|
Important
|
Standby databases are experimental in ansible-oracle
(Issue #65).Implemented: inventory structure with asserts, creation of a physical standby database and of the Data Guard Broker configuration (role oradb_standby).
See Open Points and TODOs for missing features. Variable names and attributes may change.
|
The inventory structure is shared by different standby technologies:
-
Oracle Data Guard (
type: dataguard) -
Dbvisit StandbyMP (
type: dbvisit) - reserved, not planned for the first implementation
Attributes that apply to every technology are defined at the top level.
Attributes for one technology are placed in a sub-dictionary named after it
(dg for Data Guard, dbvisit for Dbvisit).
No additional variables are needed when a new technology is added.
Only Oracle Database 19c and newer are supported.
1. Overview
| Variable | Location | Description |
|---|---|---|
|
|
Standby configurations with technology, members and topology |
|
|
Reference from a database to an entry in |
|
|
|
|
|
TNS aliases for redo transport, broker and RMAN duplicate |
|
|
Listener with static entries for the instances |
db_standby_config must be identical on all members of a configuration.
Each member needs the complete topology, e.g. for log_archive_config, fal_server
or ADD DATABASE in the broker.
The topology is never collected from hostvars of other hosts.
Only the current role of the other members (database_role from oradb_facts) is read from hostvars.
2. db_standby_config
List of standby configurations.
| Attribute | Mandatory | Description |
|---|---|---|
|
yes |
Name of the configuration. Referenced by |
|
yes |
|
|
yes |
List of members, see below. |
|
|
Data Guard attributes of the configuration. Only allowed with |
|
no |
Dbvisit attributes of the configuration. Only allowed with |
| Attribute | Mandatory | Description |
|---|---|---|
|
yes |
List of |
|
|
|
|
yes |
|
|
no |
Data Guard attributes of the member. Only allowed with |
|
no |
Dbvisit attributes of the member. Only allowed with |
2.1. Data Guard attributes (dg)
| Attribute | Default | Description |
|---|---|---|
|
|
|
|
|
Default method for the creation of the standby databases, see Creation of a standby database |
|
- |
Tasks file for |
|
- (mandatory here or in each member) |
RMAN |
| Attribute | Default | Description |
|---|---|---|
|
- |
TNS alias from |
|
|
Broker property |
|
|
Broker property |
|
|
Broker property |
|
|
Method for the creation of this standby database |
|
|
Tasks file for |
|
|
RMAN |
|
Note
|
MaxAvailability and MaxProtection need SYNC or FASTSYNC for at least one standby member.
|
2.2. Dbvisit attributes (dbvisit)
Reserved for a later implementation.
3. oracle_databases
A database becomes a member of a standby configuration with the attribute standby_config.
| Attribute | Description |
|---|---|
|
|
|
Mandatory for |
|
Mandatory |
|
Must not be |
|
Mandatory for |
All technology specific attributes of a database are defined in its member in db_standby_config
(e.g. members[].dg.connect_identifier), not in oracle_databases.
4. Assignment of a database to a member
The member of a database is found by the following rules:
-
Search all members of the referenced configuration with
inventory_hostnameinhosts. -
When more than 1 member matches (e.g. primary and standby on the same host), the member with
db_unique_name=oracle_db_unique_nameis used. -
Exactly 1 member must match. Otherwise the play fails.
| Setup | Unique by |
|---|---|
Data Guard, different hosts |
host |
Data Guard, same host |
host + |
Dbvisit (same |
host |
RAC |
host (more than 1 entry in |
5. initial_role
initial_role is only used when a member is created:
-
primary: the database is created withdbca. -
physical_standby: the database is created as standby of the primary.
The role is never enforced afterwards.
After a switchover or failover the inventory is not changed and ansible-oracle does not switch back.
All decisions at runtime are based on database_role from v$database.
oradb_manage_db does not execute oracle_db (dbca) for a database of a standby configuration, when
-
the instance is running and
database_roleis notPRIMARY, or -
the instance is not running/mounted and
initial_roleof the member isphysical_standby.
Listener, tnsnames.ora, oratab and the systemd units are configured for all members.
Before dbca, oradb_manage_db creates the missing directories of a database with standby_config
(orasw_meta/tasks/standby_prepare.yml): file destinations, audit_file_dest, diagnostic_dest
and the directories of dg_broker_config_file1/2 from init_parameters.
oradb_manage_parameters sets dg_broker_start=TRUE on the primary before oradb_standby is executed,
the broker configuration files must be accessible at this time.
Existing directories are not changed (owner, group and mode are kept).
The systemd unit of a database with standby_config uses ORACLE_START_MODE=auto:
the database is started in MOUNT and only a PRIMARY database is opened.
A physical standby database is never opened read only by the autostart (no Active Data Guard).
|
Important
|
Standby databases are supported with the systemd units of The |
oradb_facts stores database_role in oracledb_facts[<db_unique_name>].
state is present for a PRIMARY database only and standby for all other roles.
All roles which check state == 'present' (e.g. oradb_manage_pdb, oradb_manage_redo,
oradb_manage_users) skip a standby database.
oradb_manage_parameters changes the init_parameters of oracle_databases on a standby database too
(state: standby), but not the parameters of PDBs and without a restart for scope: spfile.
A database of a standby configuration that is not reachable (e.g. not created yet) gets state: unreachable
without a failure of oradb_facts.
6. Creation of a standby database
The role oradb_standby (playbook manage_db.yml, after oradb_manage_parameters, only when db_standby_config is not empty) creates a missing standby database:
a member with initial_role: physical_standby without an SPFile of the instance.
An existing database is never changed by oradb_standby.
| Method | Description |
|---|---|
|
RMAN |
|
The standby database is created outside of |
|
The tasks file |
The SPFile of the standby database is created by rman_duplicate_active only.
With external and custom the SPFile is the responsibility of the DBA.
Steps for rman_duplicate_active and custom:
-
The primary database is searched in the facts of the other members:
hostvars[<host>].oracledb_facts[<db_unique_name>].database_role=PRIMARY(oradb_facts). The hosts of the primary database must be part of the play. -
The primary database is prepared over its
connect_identifier(idempotent):FORCE LOGGINGand standby redo logs (number of online redo log groups + 1 per thread, OMF is needed).log_archive_config,fal_serverandlog_archive_dest_nare set by the Data Guard Broker (dgmgrl). -
The standby database is created with the method.
-
The result is checked: SPFile exists and
database_role=PHYSICAL STANDBY.
Details of rman_duplicate_active:
-
Password file in
orabaseconfig/dbs, PFile in$ORACLE_BASE/admin/<db_unique_name>/pfile/init<SID>_duplicate.ora(an existing PFile indbsis not overwritten), instance inNOMOUNT. The PFile containsdb_nameandaudit_file_dest,diagnostic_destfrominit_parameters(when defined). Without them the instance uses the defaults (e.g.$ORACLE_BASE/admin/<db_name>/adump) and the start fails, when these directories cannot be written. The PFile is kept afterDUPLICATEfor a manual repeat of RMANDUPLICATEon the host. -
target:connect_identifierof the primary,auxiliary://<host>:<port>/<db_unique_name>_DGMGRL(host and port fromoracle_tnsnames_configof theconnect_identifierof the standby) -
The SPFile of the primary is cloned (
SPFILE PARAMETER_VALUE_CONVERT '<primary db_unique_name>','<standby db_unique_name>'). Different or additional parameters of the standby are read frominit_parametersof the standby database inoracle_databases(state: present,scopenotmemory,sid*) and set withSET. The role sets in addition:-
db_unique_nameof the member (always) -
control_files:<db_create_file_dest>/<db_unique_name>/controlfile/control01.ctl, unless defined ininit_parameters -
local_listener: empty, unless defined ininit_parameters. The value of the primary is usually a TNS alias (e.g.LISTENER_<SID>fromdbca), which does not exist on the standby host. An emptylocal_listenerregisters the instance at the default listener (local host, port 1521).
-
-
Missing directories of
db_create_file_dest,db_create_online_log_dest_n,db_recovery_file_dest,audit_file_dest,diagnostic_dest,dg_broker_config_file1/2frominit_parametersare created beforeNOMOUNT. Existing directories are not changed (owner, group and mode are kept). Parameters of the cloned SPFile that are not defined ininit_parameterskeep the value of the primary (afterPARAMETER_VALUE_CONVERT): their directories must exist on the standby host. -
A failed
DUPLICATEstops the auxiliary instance and removes the SPFile created byDUPLICATE. The next run starts a newDUPLICATE. -
RMAN script
duplicate_<db_unique_name>.rmanand shell scriptduplicate_<db_unique_name>.shin$ORACLE_BASE/admin/<db_unique_name>/pfile, without passwords. The shell script reads the SYS password from the environment variableORADB_STANDBY_SYS_PASSWORD(or from stdin, when the variable is not set and stdin is not a terminal) and passes the connections with stdin to RMAN (not visible in the process list,connect target *in the logfile). Ansible uses the same scripts and passes the password with stdin, because the environment of a task withbecomeis visible in the process list. Both files are kept for a manual repeat on the host:The logfile is in `oradb_standby_rman_logdir`. - Redo Apply is started after `DUPLICATE` (`oradb_standby_start_apply`).
|
Important
|
local_listener of the standby database is empty after DUPLICATE, unless it is defined in init_parameters
of the standby database in oracle_databases.The DBA is responsible for the inventory: a listener with a different address or port than the default (local host, port 1521) needs local_listener in init_parameters of the standby database.
Otherwise the instance is not registered at the listener and the dynamic services (e.g. <db_unique_name>) are missing.
|
|
Tip
|
Define local_listener with EZConnect in init_parameters of all members, e.g.
- {name: local_listener, value: '//dbhost1:1521', scope: both, state: present}.The primary gets a clean value instead of the alias LISTENER_<SID> from dbca (set by oradb_manage_parameters),
the standby gets its own value with SET in RMAN DUPLICATE.
|
The SYS password is read from dbpasswords[<oracle_db_name>]['sys'] or default_dbpass, like dbca in oradb_manage_db.
7. Archivelog deletion policy
archivelog_deletion_policy is mandatory for type: dataguard:
in dg of the configuration (all members) or in dg of each member.
The policy decides, when RMAN and the Fast Recovery Area may delete an archive log,
e.g. not before it is applied on all standby databases.
It belongs to the Data Guard configuration and must be defined consciously for every member.
oradb_standby executes RMAN on every member, primary and physical standby,
because the policy is stored in the controlfile of each member:
show archivelog deletion policy; configure archivelog deletion policy to <archivelog_deletion_policy>;
-
CONFIGUREis only executed when the current policy differs (idempotent).SHOWprintsTO DISKinstead ofTO DEVICE TYPE DISK, both are compared normalized. -
The instance must be mounted. A missing standby database (e.g.
create_method: external) is skipped. -
The controlfile of a new standby database from RMAN
DUPLICATEcontains the policy of the primary, the policy of the member is configured afterwards. -
The warning
RMAN-08591: warning: invalid archived log deletion policy(e.g. no standby destination yet) is no error.
| Value | Description |
|---|---|
|
RMAN default: no deletion policy |
|
Eligible after the archive log is applied on (all) standby databases |
|
Eligible after the archive log is shipped to (all) standby databases |
|
Eligible after |
|
Combination: |
|
Important
|
BACKED UP needs an RMAN catalog in a Data Guard configuration:
without catalog the controlfile of a member knows only its own backups,
e.g. the archive logs of a standby database are never eligible for deletion, when the backups run on the primary.
|
db_standby_config:
- name: DG1
type: dataguard
dg:
archivelog_deletion_policy: APPLIED ON ALL STANDBY
db_standby_config:
- name: DG1
type: dataguard
dg:
archivelog_deletion_policy: APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO DEVICE TYPE DISK
8. Data Guard Broker configuration file
oradb_standby creates a dgmgrl script for each database with type: dataguard:
$ORACLE_BASE/admin/<db_unique_name>/pfile/dgmgrl.cfg.
Each member gets its own file with the local database as primary database.
The file is valid on the host where the database is the PRIMARY at execution time
(e.g. after a switchover the file on the new primary is used).
The content depends on the inventory only, not on the current role ⇒ it is identical on every run.
-
CREATE CONFIGURATION '<name>' AS PRIMARY DATABASE IS '<local db_unique_name>' CONNECT IDENTIFIER IS '<connect_identifier>' -
ADD DATABASE … MAINTAINED AS PHYSICALfor all other members -
EDIT DATABASE … SET PROPERTYLogXptMode(log_xpt_mode),DelayMins(delay_mins) andReopenSecs(reopen_secs) for all members -
ENABLE CONFIGURATION -
EDIT CONFIGURATION SET PROTECTION MODE(only whenprotection_modeis notMaxPerformance) -
SHOW CONFIGURATION
dgmgrl / "@$ORACLE_BASE/admin/<db_unique_name>/pfile/dgmgrl.cfg"
Requirements: dg_broker_start=TRUE on all members and no existing broker configuration.
For an existing broker configuration oradb_standby compares the properties LogXptMode, DelayMins
and ReopenSecs of all members on the host of the primary database (SHOW DATABASE … '<property>')
and changes only the differing properties (EDIT DATABASE … SET PROPERTY).
|
Important
|
dg_broker_config_file1, dg_broker_config_file2, dg_broker_start and standby_file_management
must be defined in init_parameters of all members (state: present, sid: '*').
orasw_meta checks this with an assert at the start of every play (before oradb_manage_parameters):
|
init_parameters:
# before dg_broker_start: the files cannot be changed while the broker is running
# read-only ORACLE_HOME: ORACLE_BASE/dbs (location of SPFile and password file)
- {name: dg_broker_config_file1, value: '/u01/app/oracle/dbs/dr1<db_unique_name>.dat', scope: both, state: present, dbca: false}
- {name: dg_broker_config_file2, value: '/u01/app/oracle/dbs/dr2<db_unique_name>.dat', scope: both, state: present, dbca: false}
- {name: dg_broker_start, value: 'TRUE', scope: both, state: present, dbca: false}
- {name: standby_file_management, value: 'AUTO', scope: both, state: present}
-
dg_broker_config_file1/2must be different and must not be below theORACLE_HOME: the default ($ORACLE_HOME/dbs) is lost with Out-of-Place Patching. Recommendation:-
read-only
ORACLE_HOME:$ORACLE_BASE/dbs(orabaseconfig, location of SPFile and password file) -
read-write
ORACLE_HOME:$ORACLE_BASE/admin/<db_unique_name>/dgbroker(dbsis below theORACLE_HOME)The directories are created by `oradb_standby`. - `dg_broker_start` must be `TRUE`, the value of `standby_file_management` is not checked (e.g. `MANUAL` is allowed).
-
|
Warning
|
dg_broker_config_file1/2 can only be changed while the broker is stopped (dg_broker_start=FALSE),
otherwise ORA-16573: attempt to change or access configuration file for an enabled broker configuration.oradb_manage_parameters changes the parameters in the order of init_parameters
⇒ dg_broker_start must always be defined below dg_broker_config_file1 and dg_broker_config_file2
(checked by the assert in orasw_meta).When the parameters are added to an existing environment with a running broker, the DBA must stop the broker on each member before the next run of ansible-oracle (alter system set dg_broker_start=FALSE)
and copy the existing broker configuration files to the new location, if the configuration should be kept.
The value is set by oradb_manage_parameters on the primary and on a mounted standby database
(state: standby), a new standby database gets it with SET in RMAN DUPLICATE.
oradb_standby executes the file once on the host of the primary database
(oradb_standby_broker_create: true, default), after the creation of the standby databases, when
|
-
the local database is the
PRIMARY(oradb_facts), -
no broker configuration exists (
show configurationreturnsORA-16532) and -
all other members are
PHYSICAL STANDBYdatabases (oradb_factsof the hosts of the members). Otherwise a warning is shown, e.g. for a standby database withcreate_method: externalthat does not exist yet.
An existing broker configuration is never changed.
Errors in the output of dgmgrl (Error:, ORA-, Syntax error, … was not found) fail the task,
all members must be part of the configuration afterwards.
A warning is shown, when the broker is not available (e.g. dg_broker_start not TRUE).
9. Role transitions outside of ansible-oracle
|
Important
|
This section describes the planned behavior. Only the current behavior is implemented. |
Switchover, failover and Fast-Start Failover are usually executed outside of ansible-oracle
(DBA, broker observer). ansible-oracle must handle the result of a role transition on the next run.
-
The old primary database needs a reinstatement (
ORA-16661in the broker configuration). -
oradb_standbydoes nothing: the database of the old primary has an SPFile andinitial_role: primary. -
oradb_manage_dbskipsoracle_dbwhile the instance of the old primary is running with a role other thanPRIMARY. -
oradb_manage_dbdoes not start the systemd unit of a database that is skipped as standby database (it may not exist yet or be damaged), a warning is shown when the instance is not running.WarningWhen the instance of the old primary is not running, its role is unknown and initial_roleisprimary⇒oracle_dbinoradb_manage_dbwould start and open the database (split brain).oradb_manage_dbmust check the facts of the other members beforeoracle_db, see Open Points and TODOs.
9.1. Case 1: Reinstate (automatic, not destructive)
The broker reports ORA-16661 for a member ⇒ REINSTATE DATABASE '<member>' on the current primary.
-
Requires Flashback Database on the old primary (
flashback: trueinoracle_databases). -
Typical case after a failover, no RMAN
DUPLICATEneeded. -
Planned switch:
oradb_standby_reinstate.
9.2. Case 2: Missing member (automatic, not destructive)
The database of a member does not exist (e.g. a reinstalled server of the old primary)
and another member is the PRIMARY (oradb_facts) ⇒ the member is created as standby database,
independent of initial_role. initial_role is only used for the initial setup (no member is PRIMARY).
-
ENABLE DATABASE '<member>'(orADD DATABASE) in the broker after the creation. -
oradb_manage_dbmust use the same rule to skipdbca.
9.3. Case 3: Rebuild of an existing standby database (on request only, destructive)
Most frequent case in practice: a reinstatement is not possible (no Flashback Database) or the standby database is damaged.
The rebuild is never executed automatically. It is requested at runtime with the db_unique_name of the member,
never in the inventory (otherwise every run would rebuild the standby database):
ansible-playbook -i <inventory> playbooks/standby_rebuild.yml -e '{"oradb_standby_rebuild": ["DB1_SITE1"]}'
The rebuild uses the current creation of a standby database (create_method: rman_duplicate_active).
create_method: custom is not supported for a rebuild at the moment.
| Step | Description |
|---|---|
Checks |
The member is not the |
Broker |
|
Autostart |
|
Drop |
|
Creation |
The SPFile does not exist ⇒ creation with |
Broker |
|
The playbook standby_rebuild.yml executes oradb_facts and oradb_standby on all hosts of the configuration only:
oradb_manage_db is not executed (see the warning above), the hosts of the primary database must be part of the play.
10. Validation
The rules are checked by the role orasw_meta (roles/orasw_meta/tasks/assert_standby.yml).
The asserts can be disabled with orasw_meta_assert_db_standby_config: false.
db_standby_config:
-
db_standby_configis a list. -
nameis defined and unique indb_standby_config. -
typeis defined and has an allowed value. -
Only the sub-dictionary matching
typeis defined (dgordbvisit) in the configuration and its members. -
membersis a non empty list. -
hostsis a non empty list for each member. Each host exists in the inventory. -
initial_roleisprimaryorphysical_standby. Exactly 1 member hasinitial_role: primary. -
When the current host is part of a member, at least 1 database in
oracle_databasesreferences the configuration.
type: dataguard:
-
db_unique_nameis defined for each member and unique in the configuration (case insensitive). -
protection_modeisMaxPerformance,MaxAvailabilityorMaxProtection(case sensitive). -
log_xpt_modeisASYNC,SYNCorFASTSYNC. -
delay_minsandreopen_secsare integers >= 0. -
MaxAvailabilityandMaxProtectionneedSYNCorFASTSYNCfor at least 1 member withinitial_role: physical_standby. -
connect_identifieris defined for each member and exists inoracle_tnsnames_config. -
create_methodisrman_duplicate_active,externalorcustom.customneedscreate_tasks_filein the member or in the configuration. -
archivelog_deletion_policyis defined for each member (in the member or in the configuration) and is a valid policy, see Archivelog deletion policy.
oracle_databases with standby_config:
-
dganddbvisitare not defined. -
standby_configreferences an existing entry. -
Exactly 1 member matches the database, see Assignment of a database to a member.
-
type: dataguard:oracle_db_unique_nameandlistener_nameare defined. -
type: dataguard:archivelog: true,force_loggingis notfalse. -
oracle_db_unique_namematchesdb_unique_nameof the member (case insensitive). Both default tooracle_db_name. -
type: dataguard:init_parameterscontaindg_broker_config_file1/2(different, not belowORACLE_HOME),dg_broker_start=TRUEbelow both file parameters andstandby_file_management.
11. Example: Data Guard with 2 hosts
|
Tip
|
A complete example with 2 VMs is the Data Guard Guide (example/dataguard).
|
Hosts dbhost1 (primary) and dbhost2 (standby) are members of the group dg_db1.
all:
children:
dg_db1:
hosts:
dbhost1:
dbhost2:
db_standby_config:
- name: DG1
type: dataguard
dg:
protection_mode: MaxPerformance
archivelog_deletion_policy: APPLIED ON ALL STANDBY
members:
- hosts: [dbhost1]
db_unique_name: DB1_SITE1
initial_role: primary
dg:
connect_identifier: DB1_SITE1
log_xpt_mode: ASYNC
- hosts: [dbhost2]
db_unique_name: DB1_SITE2
initial_role: physical_standby
dg:
connect_identifier: DB1_SITE2
log_xpt_mode: ASYNC
delay_mins: 0
oracle_tnsnames_config:
DB1_SITE1:
connect:
service_name: DB1_SITE1
address:
- host: dbhost1
port: 1521
DB1_SITE2:
connect:
service_name: DB1_SITE2
address:
- host: dbhost2
port: 1521
tnsnames_installed:
- tnsname: DB1_SITE1
home: db19-si-ee
state: present
- tnsname: DB1_SITE2
home: db19-si-ee
state: present
oracle_databases:
- home: db19-si-ee
oracle_db_name: DB1
oracle_db_unique_name: DB1_SITE1
listener_name: LISTENER
standby_config: DG1
init_parameters:
- {name: local_listener, value: '//dbhost1:1521', scope: both, state: present}
- {name: dg_broker_config_file1, value: '/u01/app/oracle/dbs/dr1DB1_SITE1.dat', scope: both, state: present, dbca: false}
- {name: dg_broker_config_file2, value: '/u01/app/oracle/dbs/dr2DB1_SITE1.dat', scope: both, state: present, dbca: false}
- {name: dg_broker_start, value: 'TRUE', scope: both, state: present, dbca: false}
- {name: standby_file_management, value: 'AUTO', scope: both, state: present}
# ... other attributes of oracle_databases
oracle_databases:
- home: db19-si-ee
oracle_db_name: DB1
oracle_db_unique_name: DB1_SITE2
listener_name: LISTENER
standby_config: DG1
init_parameters:
- {name: local_listener, value: '//dbhost2:1521', scope: both, state: present}
- {name: dg_broker_config_file1, value: '/u01/app/oracle/dbs/dr1DB1_SITE2.dat', scope: both, state: present, dbca: false}
- {name: dg_broker_config_file2, value: '/u01/app/oracle/dbs/dr2DB1_SITE2.dat', scope: both, state: present, dbca: false}
- {name: dg_broker_start, value: 'TRUE', scope: both, state: present, dbca: false}
- {name: standby_file_management, value: 'AUTO', scope: both, state: present}
# ... other attributes of oracle_databases
listener_name adds a static entry for the instance to listener.ora
(see LISTENER.md).
The static entry is needed for RMAN duplicate, because the auxiliary instance is in NOMOUNT.
12. Open Points and TODOs
12.1. Open Points
The following points are not decided yet:
| Topic | Description |
|---|---|
|
|
List vs. dictionary |
|
12.2. TODO
-
❏ Standby redo logs with
oradb_manage_redo
The standby redo logs are created byoradb_standbyon the primary database beforeDUPLICATE(number of online redo log groups + 1 per thread, size of the largest online redo log). They should be managed byoradb_manage_redoon all members (primary and standby), based onredolog_sizeandredolog_groupsinoracle_databases.oradb_manage_redoskips a standby database at the moment. -
❏ RMAN backups with
oradb_rman
Backups depending on the current role of the database (e.g. backups on the standby database only), archivelog deletion policyAPPLIED ON ALL STANDBY/SHIPPED TO ALL STANDBY, RMAN configuration (db_unique_namein the RMAN catalog). -
❏ Support for Oracle Restart
srvctl add database -role PHYSICAL_STANDBY -startoption MOUNTfor the standby database, SPFile and password file in ASM, no systemd units oforadb_manage_db.standby_state.ymlandrman_duplicate_activesupport databases on filesystem without Oracle Restart only. -
❏ Management of database services
Role based services withoradb_manage_services: services for the rolePRIMARYorPHYSICAL_STANDBY(srvctl -rolewith Oracle Restart, a trigger or the broker for databases on filesystem), e.g. a service for the application on the primary database only. -
❏ Split brain protection in
oradb_manage_db
oracle_dbmust not be executed for a member, when another member is thePRIMARY(oradb_facts), see Role transitions outside of ansible-oracle. -
❏ Reinstate after a failover (case 1 in Role transitions outside of ansible-oracle),
flashback: truein the molecule scenario. -
❏ Creation of a missing member independent of
initial_role(case 2 in Role transitions outside of ansible-oracle). -
❏ Rebuild of a standby database on request (case 3 in Role transitions outside of ansible-oracle):
oradb_standby_rebuild,playbooks/standby_rebuild.yml, molecule test: failover, rebuild, switchover back. -
❏ Changes of an existing broker configuration
dgmgrl.cfgis executed only when no broker configuration exists. Changes of properties, protection mode or new members are not applied to an existing configuration. -
❏ Out-of-Place Patching
switch_home.ymlinoradb_manage_dbstarts the database withstartup⇒ opens a standby database read only. Datapatch must run on the primary database only. -
❏ RAC
Members with more than 1 host (hosts) are allowed by the inventory structure, but not supported byoradb_standby.