代码改变世界

20200303 Oracle 19c DataGuard 初实验部署实践

2020-03-03 16:13  旋风小王子  阅读(1744)  评论(0编辑  收藏  举报

Oracle DataGuard是Oracle自带的数据同步功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的高可用性方案。 

DataGuard可以提供Oracle数据库的冗灾、数据保护、故障恢复等,实现数据库快速切换与灾难性恢复。在生产数据库的保证"事务一致性"时,使用生产库的物理全备份创建备库,备库会通过生产库传输过来的归档日志或重做条目自动维护备用数据库。

DataGuard数据同步技术有以下优势:  

1) Oracle数据库自身内置的功能,与每个Oracle新版本的新特性都完全兼容,且不需要另外付费。 

2) 配置管理较简单,不需要熟悉其他第三方的软件产品。

3) 物理Standby数据库支持任何类型的数据对象和数据类型;  

4) 逻辑Standby数据库处于打开状态,可以在保持数据同步的同时执行查询等操作。

5) 在最大保护模式下,可确保数据的零丢失。 

一、架构 

Oracle DataGuard由一个primary数据库(生产数据库)及一个或多个standby数据库(最多9个)组成。组成Data Guard的数据库通过Oracle Net连接,并且有可以分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制,不受操作系统的限制。

1.Primary 数据库  

DataGuard包含一个primary数据库即被大部分应用访问的生产数据库,该库既可以是 单实例数据库,也可以是RAC。 

2.Standby 数据库  

Standby数据库是primary数据库的复制(事务上一致)。在同一个Data Guard中可以最多创建9个standby数据库。一旦创建完成,Data Guard通过应用primary数据库的redo自动维护每一个standby数据库。Standby数据库同样即可以是单实例数据库,也可以是RAC结构。 

 二、服务

重做传输服务(Redo Transport Services)  

控制redo数据的传输到一个或多个归档目的地。  日志应用服务(Log Apply Services)  

应用redo数据到standby数据库,以保持与primary数据库的事务一致。redo数据即可以从standby数据库的归档文件读取,也可直接应用备用日志文件读取。  角色转换服务(Role Transitions)  

DataGuard中有两种角色:primary和standby。角色转换就是让数据库在这两个角色中切换, 切换分两种:switchover和failover  

  1)switchover:转换primary数据库与standby数据库。switchover可以确保不会丢失数据。  

  2)failover:当primary数据库出现故障并且不能被及时恢复时,会调用failover将一个standby数据库转换为新的primary数据库。在最大保护模式或最高可用性模式下,failover可以保证不会丢失数据。 

三、保护模式

1.最大保护

2.最大可用性

3.最大性能

这部分还未研究。

四、部署安装步骤

1.主库准备

a. Ensure that the database is in archivelog mode .

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

b. Enable force logging

SQL> ALTER DATABASE FORCE LOGGING;

c. Create standby redologs

alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo01.log' size 200m reuse;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo02.log' size 200m reuse;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo03.log' size 200m reuse;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo04.log' size 200m reuse;

d. Modify the primary initialization parameter for dataguard on primary,

alter system set log_archive_config='dg_config=(oradb,oradb_stby)' scope=both;
alter system set log_archive_dest_2='service=oradb_stby async valid_for=(online_logfile,primary_role) db_unique_name=oradb_stby';
alter system set standby_file_management=auto;

alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;
alter system set FAL_SERVER=oradb;
alter system set FAL_CLIENT=oradb_stby;
alter system set DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/oradb','/u01/app/oracle/oradata/oradb' scope=spfile;
alter system set LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/oradb','/u01/app/oracle/oradata/oradb' scope=spfile;
e.

编辑listener.ora文件
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = oradb)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
(SID_NAME = oradb)
)
(SID_DESC =
(GLOBAL_DBNAME = oradb_stby)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
(SID_NAME = oradb)
(UR=A)
)
)

f.
编辑tnsnames.ora
$ vi tnsnames.ora
ORADB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.135.245.202)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oradb)
)
)

ORADB_STBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.135.245.203)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oradb)
(UR=A)
)
)

2.备库准备

g.将主库中的网络文件和口令文件传输到备库;

scp listener.ora tnsnames.ora oracle@10.135.245.203:$ORACLE_HOME/network/admin/

scp orapworadb oracle@10.135.245.203:$ORACLE_HOME/dbs

h.创建备库参数文件

cd /u01/app/oracle/product/19.3.0/dbhome_1/dbs/

echo
DB_NAME=oradb
DB_UNIQUE_NAME=oradb_stby
db_block_size=8192' >>initoradb.ora

i.直接复制主库的密码文件到备库相应目录。

scp orapworadb oracle@10.135.245.203:$ORACLE_HOME/dbs/

j.启动辅助实例

startup nomount pfile=$ORACLE_HOME/dbs/initoradb.ora

k.在线创建备库

这里直接使用duplicate方式在线创建备库,在rman中运行下面的脚本:
主机:
[oracle@db01 ~]$ rman target / auxiliary sys/****@oradb_stby
run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate auxiliary channel stby type disk;
duplicate target database for standby from active database nofilenamecheck
spfile
set db_unique_name='oradb_stby'
set fal_client='oradb_stby'
set fal_server='oradb'
set standby_file_management='AUTO'
set log_file_name_convert='/oradb/','/oradb_stby/'
set db_file_name_convert='/oradb/','/oradb_stby/'
set log_archive_config='dg_config=(oradb,oradb_stby)'
set log_archive_dest_2='service=oradb ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=oradb';
}

l.必要时启动和停止redo

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
停止redo应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
开启redo应用

m.验证

SQL> select database_role from v$database;

 DATABASE_ROLE

---------------- ------- -------

PHYSICAL STANDBY

n.在备库启动recover 过程,应用主库传过来的日志(默认已经是real-time apply模式,因此省略using current logfile);

SQL>  recover managed standby database disconnect from session;

o.查询v$dataguard_process 视图,验证来自主库传输过来的日志过程和备库应用日志的情况(v$dataguard_process视图在12.2版本出现,取代了v$managed_standby);

SQL> select role,thread#,sequence#,action from v$dataguard_process;

p.查询 v$archived_log 视图,验证来自主库传输过来的日志变化情况,下面输出可以看到主库传输过来的日志在增加;

 select sequence#,applied from v$archived_log;

主库;alter system switch logfile;

select sequence#,applied from v$archived_log;

日志增加。

q.建表插入数据验证。

r. 主备切换

主备库先查看switchover_status状态
select switchover_status from v$database;

主库先操作:
alter database commit to switchover to physical standby with session shutdown; --切换数据库成物理备库并且关闭会话,11g数据库这时候已经关闭了,10g的话,需要进行
select switchover_status from v$database; --查看switchover_status 状态
shutdown immediate;
startup nomount;
alter database mount standby database;
alter database open read only;
recover managed standby database using current logfile disconnect from session; --开启实时应用mrp进程


备库后操作:
alter database commit to switchover to primary; --修改数据库切换为主库
shutdown immediate; --关库
startup --开库