Using DBCA to Create a Data Guard Standby
The Database Configuration Assistant (DBCA) can also be used as a simple command-line method to create an Oracle Data Guard physical standby database.
The DBCA command qualifier used to create the physical standby database is createDuplicateDB .
DBCA can only be used to create standby databases for non-multitenant primary databases. In addition, this capability creates only single instance standby databases,not Oracle Real Application Clusters (Oracle RAC) databases. If required, the standby can then be converted to an Oracle RAC standby database, either manually or using Oracle Enterprise Manager Cloud Control.
在 12cR2 ( 12.2.0.1 )之前创建物理备库的方法有:
1 、使用 RMAN 备份恢复方法;
2 、在 11g 时可以选择 duplicate 方式创建物理备库;通过这种方式直接在线从主库搭建物理备库。
到 12cR2 ( 12.2.0.1 )后, Oracle 又提供更简单的方式来创建物理备库,即使用 DBCA 方式直接建立物理备库。这个功能再次简化了创建备库的复杂度。
通过 DBCA 提供的参数 createDuplicateDB 可以很容易的搭建一个物理备库。其具体语法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
-------------- 12cR2
-createDuplicateDB - Command
to
Duplicate a
database
.
-gdbName <
Global
database
name
>
-primaryDBConnectionString <EZCONNECT string
to
connect
to
primary
database
for
example
"host:port/servicename"
>
-sid <
Database
system identifier>
[-createAsStandby <
Option
to
create
a standby
database
>]
[-dbUniqueName <db_unique_name
for
standby db>]
[-customScripts <A comma separated list
of
SQL scripts which needs
to
be run post db creation.The scripts are run
in
order
they are listed>]
[-datafileDestination <Destination directory
for
all
database
files>]
[-initParams <Comma separated list
of
name
=value pairs>]
[-initParamsEscapeChar <Specify
escape
character
for
comma
when
a specific initParam has multiple
values
.If the
escape
character
is
not
specified backslash
is
the
default
escape
character
>]
----------- 18c
-createDuplicateDB - Command
to
Duplicate a
database
.
-gdbName <
Global
database
name
>
-primaryDBConnectionString <EZCONNECT string
to
connect
to
primary
database
for
example
"host:port/servicename"
>
-sid <
Database
system identifier>
[-initParams <Comma separated list
of
name
=value pairs>]
[-initParamsEscapeChar <Specify
escape
character
for
comma
when
a specific initParam has multiple
values
.If the
escape
character
is
not
specified backslash
is
the
default
escape
character
>]
[-policyManaged | -adminManaged]
[-policyManaged <Policy managed
database
,
default
option
is
Admin managed
database
>]
-serverPoolName <Specify the single server pool
name
in
case
of
create
server pool
or
comma separated list
in
case
of
existing server pools>
[-pqPoolName <value>]
[-createServerPool <
Create
a new server pool, which will be used
by
the
database
>]
[-pqPoolName <value>]
[-forceServerPoolCreation <
To
create
server pool
by
force
when
adequate
free
servers are
not
available. This may affect the
database
which
is
already
in
running mode>]
[-pqCardinality <value>]
[-cardinality <Specify the cardinality
of
the new server pool that
is
to
be created,
default
is
the number
of
qualified nodes>]
[-adminManaged <Admin managed
database
, this
is
default
option
>]
[-datafileDestination <Destination directory
for
all
database
files>]
[-nodelist <Node names separated
by
comma
for
the
database
>]
[-databaseConfigType <SINGLE | RAC | RACONENODE>]
[-RACOneNodeServiceName <Service
name
for
the service
to
be created
for
RAC One Node
database
. This
option
is
mandatory
when
the databaseConfigType
is
RACONENODE>]
[-createAsStandby <
Option
to
create
a standby
database
>]
[-dbUniqueName <db_unique_name
for
standby db>]
[-customScripts <A comma separated list
of
SQL scripts which needs
to
be run post db creation.The scripts are run
in
order
they are listed>]
----------- 19c
-createDuplicateDB - Command
to
Duplicate a
database
.
-gdbName <
Global
database
name
>
-primaryDBConnectionString <EZCONNECT string
to
connect
to
primary
database
for
example
"host:port/servicename"
>
-sid <
Database
system identifier>
[-useWalletForDBCredentials <
true
|
false
> Specify
true
to
load
database
credentials
from
wallet]
-dbCredentialsWalletLocation <Path
of
the directory containing the wallet files>
[-dbCredentialsWalletPassword <
Password
to
open
wallet
with
auto login disabled>]
[-initParams <Comma separated list
of
name
=value pairs>]
[-initParamsEscapeChar <Specify
escape
character
for
comma
when
a specific initParam has multiple
values
.If the
escape
character
is
not
specified backslash
is
the
default
escape
character
>]
[-policyManaged | -adminManaged]
[-policyManaged <Policy managed
database
,
default
option
is
Admin managed
database
>]
-serverPoolName <Specify the single server pool
name
in
case
of
create
server pool
or
comma separated list
in
case
of
existing server pools>
[-pqPoolName <value>]
[-createServerPool <
Create
a new server pool, which will be used
by
the
database
>]
[-pqPoolName <value>]
[-forceServerPoolCreation <
To
create
server pool
by
force
when
adequate
free
servers are
not
available. This may affect the
database
which
is
already
in
running mode>]
[-pqCardinality <value>]
[-cardinality <Specify the cardinality
of
the new server pool that
is
to
be created,
default
is
the number
of
qualified nodes>]
[-adminManaged <Admin managed
database
, this
is
default
option
>]
[-datafileDestination <Destination directory
for
all
database
files>]
[-nodelist <Node names separated
by
comma
for
the
database
>]
[-databaseConfigType <SINGLE | RAC | RACONENODE>]
[-RACOneNodeServiceName <Service
name
for
the service
to
be created
for
RAC One Node
database
. This
option
is
mandatory
when
the databaseConfigType
is
RACONENODE>]
[-createAsStandby <
Option
to
create
a standby
database
>]
[-dbUniqueName <db_unique_name
for
standby db>]
[-customScripts <A comma separated list
of
SQL scripts which needs
to
be run post db creation.The scripts are run
in
order
they are listed>]
|
虽然通过 DBCA 能非常简单的创建一个物理备库,但是要使用这个功能,必须满足以下条件:
① 主库必须是单机环境,非 RAC 数据库;
② 主库必须是非 CDB 环境;
如果不满足以上条件, 那么 在使用 DBCA 创建备库的时候,会提示如下错误:
若 主库是 CDB 环境,错误如下:
1
2
|
[FATAL] [DBT-16057] Specified
primary
database
is
a container
database
(CDB).
CAUSE: Duplicate
database
operation
is
supported
only
for
non container databases.
|
若 主库是 RAC 数据库,错误如下:
1
2
|
[FATAL] [DBT-16056] Specified
primary
database
is
not
a Single Instance (SI)
database
.
CAUSE: Duplicate
database
operation
is
supported
only
for
SI databases.
|
也就说通过 DBCA 搭建出来的备库也是一个单机非 CDB 的备库。
需要注意的是,在 12cR2 ( 12.2.0.1 )中,通过 DBCA 创建物理需要保证主库是单机非 CDB 的库,但是从 Oracle 18c ( 12.2.0.2 )开始,这些限制条件已经取消了,即主库是 CDB 或 rac 环境都可以通过 dbca 来创建物理备库。
以下命令为 18c 中创建 rac 类型的 dg :
1
2
3
4
5
6
7
8
9
10
11
|
dbca -silent -createDuplicateDB \
-gdbName lhrdb \
-sid lhrdbdg \
-sysPassword oracle \
-primaryDBConnectionString 192.168.20.10:1521/lhrdb \
-nodelist rac18c-n1,rac18c-n2 \
-adminManaged \
-databaseConfigType RAC \
-createAsStandby -dbUniqueName lhrdbdg \
-datafileDestination
'+DATA'
\
-initParams db_create_file_dest=+DATA, db_create_online_log_dest_1=+DATA,local_listener=
"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.20.10)(PORT=1521)))"
|
基于同一个主机搭建 单实例的物理 DG ( 19c ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
SELECT
CDB
FROM
V$
DATABASE
;
alter
database
force
logging;
alter
database
open
;
alter
database
archivelog;
alter
pluggable
database
all
open
;
alter
pluggable
database
all
save state;
select
thread#,
group
#,bytes/1024/1024 SIZE_MB, status,members
from
v$log;
select
member
from
v$logfile;
alter
database
add
standby logfile thread 1
group
4
'/u01/app/oracle/oradata/LHR19C/standby_redo04.log'
size
50M ;
alter
database
add
standby logfile thread 1
group
5
'/u01/app/oracle/oradata/LHR19C/standby_redo05.log'
size
50M ;
alter
database
add
standby logfile thread 1
group
6
'/u01/app/oracle/oradata/LHR19C/standby_redo06.log'
size
50M ;
alter
database
add
standby logfile thread 1
group
7
'/u01/app/oracle/oradata/LHR19C/standby_redo07.log'
size
50M ;
--------配置tns
lhr19c =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.52)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = lhr19c)
)
)
lhr19cdg =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.52)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = lhr19cdg)
)
)
--------配置监听
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.52)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = lhr19c)
(ORACLE_HOME = /u01/app/oracle/product/19.2.0/dbhome_1)
(SID_NAME = lhr19c)
)
(SID_DESC =
(GLOBAL_DBNAME = lhr19cdg)
(ORACLE_HOME = /u01/app/oracle/product/19.2.0/dbhome_1)
(SID_NAME = lhr19cdg)
)
)
LISTENER_DG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.52)(PORT = 1522))
)
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = lhr19c)
(ORACLE_HOME = /u01/app/oracle/product/19.2.0/dbhome_1)
(SID_NAME = lhr19c)
)
(SID_DESC =
(GLOBAL_DBNAME = lhr19cdg)
(ORACLE_HOME = /u01/app/oracle/product/19.2.0/dbhome_1)
(SID_NAME = lhr19cdg)
)
)
lsnrctl start LISTENER_DG
dbca -silent -createDuplicateDB \
-gdbName lhr19c \
-sid lhr19cdg \
-sysPassword lhr \
-primaryDBConnectionString 192.168.59.52:1522/lhr19c \
-nodelist raclhr-18c-n1 \
-databaseConfigType SINGLE \
-createAsStandby -dbUniqueName lhr19cdg \
-datafileDestination
'/u01/app/oracle/oradata/lhr19cdg/'
\
-initParams db_create_file_dest=/u01/app/oracle/oradata/lhr19cdg/, db_create_online_log_dest_1=/u01/app/oracle/oradata/lhr19cdg/,local_listener=
"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.52)(PORT=1522)))"
--主库修改参数
alter
system
set
LOG_ARCHIVE_DEST_1=
'LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=lhr19c'
;
alter
system
set
LOG_ARCHIVE_DEST_2=
'service=lhr19cdg VALID_FOR=(online_logfiles,primary_role) DB_UNIQUE_NAME=lhr19cdg'
;
alter
system
set
log_archive_config=
'dg_config=(lhr19c,lhr19cdg)'
;
alter
system
set
db_file_name_convert=
'/u01/app/oracle/oradata/LHR19CDG/'
,
'/u01/app/oracle/oradata/LHR19C/'
scope=spfile;
alter
system
set
log_file_name_convert=
'/u01/app/oracle/oradata/LHR19CDG/'
,
'/u01/app/oracle/oradata/LHR19C/'
scope=spfile;
alter
system
set
standby_file_management=auto scope=spfile;
alter
system
set
fal_client=
'lhr19c'
;
alter
system
set
fal_server=
'lhr19cdg'
sid=
'*'
;
alter
system
set
local_listener=
'(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.52)(PORT=1522)))'
,
'(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.52)(PORT=1521)))'
;
shutdown immediate
startup
--备库修改参数
alter
system
set
LOG_ARCHIVE_DEST_1=
'LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=lhr19cdg'
scope=spfile;
alter
system
set
log_archive_config=
'dg_config=(lhr19c,lhr19cdg)'
;
alter
system
set
db_file_name_convert=
'/u01/app/oracle/oradata/LHR19C/'
,
'/u01/app/oracle/oradata/LHR19CDG/'
scope=spfile;
alter
system
set
log_file_name_convert=
'/u01/app/oracle/oradata/LHR19C/'
,
'/u01/app/oracle/oradata/LHR19CDG/'
scope=spfile;
alter
system
set
standby_file_management=auto scope=spfile;
alter
system
set
fal_client=
'lhr19cdg'
;
alter
system
set
fal_server=
'lhr19c'
sid=
'*'
;
alter
system
set
local_listener=
'(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.52)(PORT=1522)))'
,
'(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.52)(PORT=1521)))'
;
shutdown immediate
startup
alter
system register;
--备库查询实时应用
alter
database
recover managed standby
database
cancel;
alter
database
recover managed standby
database
using
current
logfile disconnect;
! ps -ef|grep ora_mrp
select
INST_ID, dbid,
name
,DB_UNIQUE_NAME,current_scn,protection_mode,database_role,force_logging,open_mode,switchover_status
from
gv$
database
;
COL
NAME
FOR
A100
SET
LINESIZE 9999 PAGESIZE 9999
COL NEXT_CHANGE#
FOR
999999999999999
SELECT
THREAD#,
NAME
,
SEQUENCE
#, ARCHIVED, APPLIED, A.NEXT_CHANGE#
FROM
V$ARCHIVED_LOG A
WHERE
A.
SEQUENCE
# >= (
SELECT
MAX
(B.
SEQUENCE
#) - 3
FROM
V$ARCHIVED_LOG B
WHERE
B.THREAD# = A.THREAD#
AND
B.RESETLOGS_CHANGE# = A.RESETLOGS_CHANGE#
AND
B.RESETLOGS_CHANGE# =
(
SELECT
D.RESETLOGS_CHANGE#
FROM
V$
DATABASE
D)
AND
B.APPLIED =
'YES'
GROUP
BY
B.THREAD#)
ORDER
BY
A.THREAD#, A.
SEQUENCE
#;
|