数据库之Oralce ADG 搭建使用(搭建流程、个人理解、出现问题、解决方案)

分享是一种美德

最近为了实现系统的高可用性,准备搭建oracle adg 主从实现技术,从最初连 shutdown immediate 是什么意思,mount、nomount是什么都不知道的情况下,历时5天终于初步搭建并实现了oracle adg技术并掌握了一些原理。是不是太菜? /哭笑
免费是最贵的,这句话可能是真的。
搭建过程中不断的查询搜索引擎,总是会出现一模一样的文章,文章质量参差不齐,有些命令还是错的。所以这段时间踩了不知道多少个坑,才逐渐在脑海中形成了一个清晰的adg知识架构。所以本章,本篇文章是大迈作者写的。所以本章就这次的搭建学习过程遇到的一些问题融合在整个搭建过程中,省去搜索各种方案的文档,以供有需要的人做个参考。
本篇将从oracle 开始,oracle adg是什么,有什么作用,怎样搭建adg,分为几个部分,每个部分有什么作用,在每个部分中出现了什么问题,我是怎样解决这个问题的等等,尽量阐述自己的一些理解和搭建过程,如果有描述不正确的地方,请您慎思然后寻找正确答案。
本篇篇幅可能较长,对于初次搭建者,如能耐心看完,可能会有一些不错的收获。
注意:本章ORACLE 版本为 Oracle 11g,虽然操作在windows 10环境下,但数据库原理是一致的。文章描述均为个人理解,如有错误请指正。

一、adg原理

1. 基本名称和概念

Oracle ADG 是一种数据库容灾方案,指的是多个数据库可以拥有相同的数据,一旦某个数据库发生故障,可快速切换到另一个数据库。同时也可以实现读写分离,主库写入,从库读取等等。Oracle adg可配置多个备库,可以是一主一从,或者一主多从的方式构成。
由于一般主库和备库在不同的应用主机上,所以备库的数据想要和主库一致,必须通过网络通信传输数据。因此网络配置是必不可少的。网络通信传输的数据是什么呢?Oracle Adg采用的日志作为储存介质,其原理就是主库的每一个操作都会被记录成日志存储在磁盘上,然后日志通过网络传送给备库,备库接收到该日志后,根据日志内容将数据恢复在备库上。大概的通信原理如下:
在这里插入图片描述
日志的传输解决了数据通信的实现方式,但是日志是一个文件,文件要达到多少容量的时候才传输呢?没生产1B就传输还是每生产到10G容量的才传输呢?

所以日志又分为两种:

联机重做日志
联机重做日志,称为log,主要作用是记录数据库的每一步操作,每个日志有初始大小,在Oracle 11g版本中,联机重做日志默认50M大小,共有三组联机日志文件。
查看命令:

select * from v$log

在这里插入图片描述
从上图可以看到,GROUP#是组的意思,一共有三组。STATUS代表当前联机重做日志的状态,CURRENT代表当前活跃的是哪一组。三组文件依次循环活跃,当某一组写满以后,联机重做日志文件会一直存在直到它在下一次重写时被覆盖。
归档日志
归档日志,是联机重做日志的归档文件,当某一组的联机重做日志满了以后,就会单独生成该组日志的归档文件。称为 archived_log。
查看命令:

select * from v$archived_log

查看部分字段:

select dest_id,creator, sequence#,applied from v$archived_log

在这里插入图片描述
归档日志是搭建完成后,生成了归档日志才会有的。最开始没搭建可能查询不到。

那么既然有联机重做日志,也有归档日志,那么它们是怎么运行的呢?这要取决于它们采用的什么方式。arch 还是 lgwr,同步sync 还是异步async两个维度来决定的。

2. ARCH方式

arch方式是指,主库在被操作过程中,操作记录不断写入联机重做日志文件中(redo日志中)直到该组日志容量被写满,触发归档进程生成归档日志,然后再将归档日志通过网络发送给备库。
图片部分源于网络
在这里插入图片描述
从上图可以看到,LGWR是一个用于将操作写入磁盘的进程,即使它不是LGWR方式,也存在这个进程。
ARCH方式是一种异步的方式,只有当发生日志组切换时,才会生成归档日志传输给备库,然后备库才能同步更新数据。它是一种延时的方式。
一般日志组切换有两种方式,自动和手动。
自动就是当日志组被写满了,需要切换下一个日志组时。
手动就是执行命令强制切换:

切换日志组命令: 	alter system switch logfile;

3. LGWR方式

与ARCH不同的是,LGWR方式中,会在LGWR进程中再分出一个LNS线程,LNS可以是多个的,每一个LNS对应一个备库,当有多个备库时会有多个LNS线程。
LNS是LGWR的小弟。LGWR仍然负责将用户操作写入磁盘redo日志中,同时它会交给小弟LNS一个任务,让LNS负责将这步操作传输给它负责的备库中。因此它是一种实时的方式。
在这里插入图片描述

在LGWR中有同步和异步之分:

LGWR SYNC(LGWR + 同步):它的意思是指当用户操作主库时,LGWR写入磁盘 并且 LNS通知备库(有大神说至少一个备库)时,主库的操作才会commit该操作。
LGWR ASYNC (LGWR + 异步):它的意思相比较上面一种,主库只需要等到LGWR将redo日志写入成功即可提交事务,LNS变成了异步通知。

两种方式的对比差别,即LNS线程是同步的还是异步的。如果采用同步,对数据一致性要求非常高,延时要求性稍微低一些,并且备库的异常会影响主库。而异步则不会,但是数据一致性要求会稍低些。
具体要采用哪种方式由用户来决定,所以基于这些特点向用户提供了下面的三大模式。

三大模式

最大性能模式(Maximum Performance)

1)该模式是默认模式,可以保证主数据库的最高可用性;
2)保证主库运行过程中不受备库的影响,主库事务正常提交,不因备库的任何问题影响到主库的运行;
4)优点:避免了备库对主数据库的性能和可用性影响;
5)缺点:如果与主库提交的事务相关的恢复数据没有发送到备库,这些事务数据将被丢失,不能保证数据无损失;

如果不设置,数据库默认是最大性能模式,通常工作在LGWR ASYNC方式下 或 ARCH方式下,它是一种异步的,所以数据不能保证完全一致,一旦异步发送数据过程中异常,或者主库出现异常,备库会有一小部分数据损失。

最大可用模式(Maximum Availability)

1)该模式提供了仅次于“最大保护模式”的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库不会关闭,而是临时降低到“最大性能模式”模式,直到问题得到处理;

该模式只能工作在LGWR SYNC方式下。需要说明的是,即使设置了系统为最大可用模式,但是没有LGWR SYNC方式的配置支持,它会默认转为最大性能模式。

最大保护模式(Maximum Protection)
1)这种模式提供了最高级别的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库会自动关闭,防止未受保护的数据出现;
4)优点:该模式可以保证备库没有数据丢失;
5)缺点:主库的自动关闭会影响到主库的可用性,同时需要备库恢复后才能提交,对网络等客观条件要求非常的高,主库的性能会因此受到非常大的冲击。

该模式也只能工作在LGWR SYNC方式下。需要说明的是,即使设置了系统为最大保护模式,但是没有LGWR SYNC方式的配置支持,它会默认转为最大性能模式。

二、搭建流程

(O)硬件环境准备(主备)

确保操作系统一致,数据库版本一致,主机和备机都安装好软件和数据库。网络都正常。
本次示例采用的 windows 10 和 oracle 11.2.0.1.0版本
建议主、备机都将oracle装在同一个路径下,使其具有相同的路径名称,可以省去路径转换麻烦。

重要的alert_orcl日志文件
在搭建过程中,少不了有些报错。这些报错原因可在alert_orcl日志文件中寻找。
alert_orcl文件位于diag目录下,或者通过windows搜索功能可以找出来。

(一)日志模式准备(仅主库)

根据上面的ADG原理可以知道,其存储介质和核心是日志,所以在主库一端必须设置为强制日志模式和归档模式,才能开展Adg搭建。
但是在搭建之前,需要知道什么是数据库的mount、nomount、open状态、shutdown immediate命令’。

nomount:读参数文件,启动实例和后台进程,不装载数据库。
mount:打开控制文件,装载数据库但是不打开数据库。
open:在装载了数据库的前提下,打开数据库。
shutdown immediate:关闭数据库、卸载数据库、关闭操作例程。

…若干年后,(终于装好了oracle)

sqlplus 通过 sys as sysdba 账户登入,密码为空

oracle adg 搭建的第一步就是要求主库配置为日志和归档模式。若要对数据库进行配置,则要求装载数据库,并且处于未打开模式。即 mount模式。
刚刚登入后oracle 会为我们连接上一个例程,并打开了数据库。因此我们需要退出oracle 例程和数据库,重新通过mount模式打开。

shutdown  immediate;

startup mount;

在这里插入图片描述
接着设置为强制日志模式和归档模式

alter database force logging;

alter database archivelog;

查看日志模式和归档模式是否生效;

archive log list;

在这里插入图片描述
日志模式和归档模式开启后,主库的操作都会记录在联机重做日志REDO LOG中。这里需要介绍两种REDO LOG日志:
(1)online redo log
(2)standby redo log
oracle安装好后,online redo log 是默认存在的,一共有三组,大小为50M,用于记录数据库的操作。
standby redo log是需要手动加上去的,其作用和online redo log 一样,但是只在数据库处于备库角色时才生效。当主库将日志数据传输过来后,备库会将这些信息存于standby redo log 中。
standby redo log 虽然是用于备库,但是如果在主库创建了,后面复制数据库过程中备库自然就会有了,同时当主库出现问题,主库和备库的角色也可以直接互换。
下面开始创建standby redo log 。
standby redo log 的创建组数,oracle 官方建议最好比主库的online redo log多一组。

所以这里我们创建4组standby redo log。命令中路径为自己本机需要保存standby redo log 的路径。

alter database add standby logfile group 4 ('D:\oracel\11g\install\oradata\orcl\standby_log04.log') size 50M;
alter database add standby logfile group 5 ('D:\oracel\11g\install\oradata\orcl\standby_log05.log') size 50M;
alter database add standby logfile group 6 ('D:\oracel\11g\install\oradata\orcl\standby_log06.log') size 50M;
alter database add standby logfile group 7 ('D:\oracel\11g\install\oradata\orcl\standby_log07.log') size 50M;

在这里插入图片描述
如果我们要看online redo log 的日志情况,可以通过下方命令:

	select * from v$log;

我们也可以通过下面命令查看standby redo log 的情况;

	select * from v$standby_log;

下面就是我本机上两种日志文件的实际位置。
在这里插入图片描述

小结

第一步就完成了,第一步需要弄懂的是那几个模式 mount 、 nomount 、 open 模式,在不同模式下shutdown immediate操作时,可能响应不一样。甚至会报错:ORA-01109: 数据库未打开等等,都是正常的。然后就是对 standby redo log 和 online redo log 的理解。
本结操作只需要在主库配置。

(二)tns通信准备(主备)

通过第一节,配置了主库的模式和standby日志准备,那么日志怎么准确的传输到备库呢?
这一节,就是建立主备机的网络通信。
两个不同的主机,拥有不同的ip地址,主库要想准确的将日志传输到备库,肯定需要一个备库主机的ip地址和端口号,不然如何进行端口到端口的数据通信呢!这个需要在什么地方配置呢?
路径:在 %ORACLE_HOME%/NETWORK/ADMIN 文件夹下,有三个文件:

		listener.ora
		tnsnames.ora
		sqlnet.ora

其中,listener.ora 是用于服务器角色的,tnsnames.ora是用于客户端角色的,sqlnet.ora 不做讨论。
本机相对于其他主机而言,既可能是服务器,也可能是客户端。所以listener.ora 和 tnsnames.ora都需要配置。
先看tnsnames.ora 文件:

# tnsnames.ora Network Configuration File: D:\oracel\11g\install\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
  (SID = CLRExtProc)
  (PRESENTATION = RO)
)
)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = orcl)
	)
 )

看最下面一个叫ORCL的,ADDRESS是它的通信协议、IP、端口号。SERVICE_NAME 是它要连接的数据库名称。而ORCL 就相当于一个别名,oracle 会通过这个别名找到它后面这一堆配置。
如果要使主库与备库通信,tns配置少不了。因此我们可以手动增加TNS内容,如下:

# 这是我主库的 ip和端口,主库取名为 MAIN,要连接的数据库名为 orcl
MAIN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.112)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = orcl)
)
)
# 这是要通信的备库IP 和端口,取名为 BACK,要连接的数据库名为 orcl
BACK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.145)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = orcl)
)
)

我们可以通过oracle查询数据库的名称是不是orcl

select name from v$database;

在这里插入图片描述
tnsnames.ora 配置完成了。下面看listener.ora。

# listener.ora Network Configuration File: D:\oracel\11g\install\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
  (SID_NAME = CLRExtProc)
  (ORACLE_HOME = D:\oracel\11g\install\product\11.2.0\dbhome_1)
  (PROGRAM = extproc)
  (ENVS = "EXTPROC_DLLS=ONLY:D:\oracel\11g\install\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)

ADR_BASE_LISTENER = D:\oracel\11g\install

这个文件中,其中LISTENER是监听服务器的配置,DESCRIPTION_LIST是一个列表,可以用很多DESCRIPTION,在DESCRIPTION中第一个ADDRESS不做讨论,是oracle内部使用。
第二个ADDRESS中,HOST为localhost,localhost也是一个别名,它是通过本地hosts文件映射成一个ip地址,通常是127.0.0.1。而在tnsnames配置中,HOST的中的ip是一个局域网IP或者公网IP。如果LISTENER中不配置这个ip的监听,就可能会出现数据库监听不到,出现无监听程序等问题。
因此可以在ADDRESS下方继续添加:

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.112)(PORT = 1521))

这样就可以了 ? ?
最后一点,配置好后必须重启监听器!!!

退出oracle,回到cmd:
	停止命令:	 lsnrctl stop
	启动命令:	 lsnrctl start
	查看监听状态:  lsnrctl status

在这里插入图片描述
最后检验一下,主库的TNS是否配置正确。

	tnsping MAIN  
	(MAIN是我主库的命名,非命令语句!名称最后不能加其他符号,负责名称不能被正确解析)
	
	tnsping BACK  
	(MAIN是我备库的命名,同上)

在这里插入图片描述
从上面可以看到,主库已经能够连接了,备库出现了无监听程序。那是因为备库还没有配置。

备库的配置和主库一样,tnsnames.ora 都要配置主库和备库,并且保证取的名字和主库取名保持一致!
备库的listener.ora中,需要增加的监听应该是备库的主机IP地址。

…几秒钟后(两边配置完成)
两边配置完成后,再次检验TNS:

	tnsping MAIN  
	(MAIN是我主库的命名,非命令语句!名称最后不能加其他符号,负责名称不能被正确解析)
	
	tnsping BACK  
	(BACK是我备库的命名,同上)

确保两边都能tnsping 通,这一步就算完成了。
在这里插入图片描述

小结

这一结,主要理解 tnsnames.ora 和 listener.ora的作用以及配置信息的含义。然后出现了问题后要多思考。重要的一点,配置好了别忘了重启监听!

(三)ADG配置文件准备(主备)

当我们把第一、二步准备完成后,主库和备库的准备工作差不多搞定了!
现在可以真正的来配置oracle adg 了,回到本篇文章顶部,介绍了两种方式:LGWR 和 ARCH,
三种模式
Maximum Performance(最大性能,默认)
Maximum Availability(最大可用)
Maximum Protection(最大保护)
等等…
都可以开始配置了。
配置前,需要先了解 pfile 文件 和 spfile 文件。

spifle 与 pfile

pfile 文件 == spfile 文件。
是一个用于启动数据库及实例时,相关配置信息的文件。它定义了数据库叫什么名字、决定了数据库的物理结构、内存、数据库的限制及系统大量的默认值、数据库的各种物理属性、指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重要文件。

两者的不同在于,pfile可以通过文本打开,参数可以手动书写。spfile文件是二进制文件,只能由oracle读取,参数只能通过命令修改。

在第一节时,有三个状态 ,startup mount、startup open、startup nomount。
启动时默认加载的是数据库的spfile文件,spfile具体有什么内容,我们可以通过转换为pfile文件打开看看。

	路径是pfile生成后需要保存的位置:
	create pfile = 'D:\oracel\11g\install\pfile' from spfile;

打开pfile文本内容如下:

orcl.__db_cache_size=3238002688
orcl.__java_pool_size=16777216
orcl.__large_pool_size=16777216
orcl.__oracle_base='D:\oracel\11g\install'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=2734686208
orcl.__sga_target=4076863488
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=754974720
orcl.__streams_pool_size=0
*.audit_file_dest='D:\oracel\11g\install\admin\orcl\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='D:\oracel\11g\install\oradata\orcl\control01.ctl','D:\oracel\11g\install\flash_recovery_area\orcl\control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='D:\oracel\11g\install\flash_recovery_area'
*.db_recovery_file_dest_size=4102029312
*.diagnostic_dest='D:\oracel\11g\install'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.local_listener='LISTENER_ORCL'
*.memory_target=6807355392
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

这个文件包含了启动数据库的重要配置。我们需要配置adg的位置就是在pfile或者spfile文件里面。启动时,数据库就会按照adg配置来加载并执行。具体的配置内容有哪些呢?
大概有以下内容:

由于主备库的操作是一样,添加参数内容也是一样,不一样的是参数赋值。所以重点关注参数理解,切莫照搬! 下面为pfile文件中需要增加的部分,以主库配置来解释参数含义。

主库增加配置详解
*.db_unique_name='main'
  这个参数代表唯一名称,可以设置成刚刚tnsnames配置的本库名称

*.log_archive_config='dg_config=(main,back)'
 归档配置,参数里面需要填写两个库的db_unique_name。

*.log_archive_dest_1='location=D:\oracle\11g\install\archive valid_for=(all_logfiles,all_roles) db_unique_name=main'
 这里dest_1 代表本库,localtion 代表本库归档日志存放路径,需要确保它存在,archive是我手动创建的一个空文件夹, valid_for参数不需要改动。db_unique_name=main(本库db_unique_name)

*.log_archive_dest_2='service=back lgwr async affirm  valid_for=(online_logfiles,primary_role) db_unique_name=back'
 这里dest_2代表远端数据库,service代表远端数据库的 db_unique_name,
 lgwr 是配置adg的实施方式,上面有介绍,也可以配置成 arch。两者的区别在于有没有LNG实时传输服务。
 async 代表异步,也可以设置为sync.
 affirm 代表提交事务时,需要redo日志磁盘必须写完,还有noaffirm,代表不需要等到redo日志写完。
 valid_for参数不需要改动,db_unique_name=back(远端数据库db_unique_name)

*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.log_archive_max_processes=4
 这个参数是本库做归档日志时,需要配置的线程数。
 
*.fal_server='back'
 这个参数代表远端数据库。

*.fal_client='main'
 这个参数代表本库。

*.db_file_name_convert='D:\oracle\11g\install\oradata\orcl','D:\oracle\11g\install\oradata\orcl'
 路径转换:将远端数据库oradata文件夹的路径,匹配到本机数据库路径。前面是远端路径,后面是本机路径。如果两机安装路径一致,省去了转换的麻烦。

*.log_file_name_convert='D:\oracle\11g\install\oradata\orcl','D:\oracle\11g\install\oradata\orcl'
 路径转换:将远端日志路径,匹配本机日志路径。同上。如果两机安装路径一致,省去了转换的麻烦。

*.standby_file_management='auto'
 这个参数有auto 和 manual,oracle 11g一般设置为auto.
备库增加参数配置
*.db_unique_name='back'

*.log_archive_config='dg_config=(main,back)'

*.log_archive_dest_1='location='D:\oracle\11g\install\archive' valid_for=(all_logfiles,all_roles)  db_unique_name=back'

*.log_archive_dest_2='service=main lgwr async affirm  valid_for=(online_logfiles,primary_role) db_unique_name=main'

*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.log_archive_max_processes=4
 
*.fal_server='main'

*.fal_client='back'
*.db_file_name_convert='D:\oracle\11g\install\oradata\orcl','D:\oracle\11g\install\oradata\orcl'
*.log_file_name_convert='D:\oracle\11g\install\oradata\orcl','D:\oracle\11g\install\oradata\orcl'

*.standby_file_management='auto'

配置完成后,主库和备库都需要通过新配置的pfile来启动。其中主库需要启动在open模式下,备库需要启动在 nomount模式下(nomount不会装载数据库,以便将位置空出来接受主库的复制)。
主库

	shutdown immediate;
	startup  pfile='D:\oracle\11g\install\pfile';

备库

	shutdown immediate;
	startup nomount pfile='D:\oracle\11g\install\pfile';

小结

这一节是整个adg搭配的核心,需要了解不同设置方式的原理,以及每个重要参数的意义,才能达到掌握的目地。特别是 arch\lgwr、async\sync、affirm\noaffirm,了解不同的搭配有什么样的作用。

(四)密码口令准备(主备)

在第一节中,数据库刚刚安装好后,通过 sys as sysdba方式登录为OS登录,除了OS登录,oracle还提供了口令登录。

为什么需要密码口令呢?

因为主库和备库搭建adg过程中,需要将主库复制到备库。这个操作需要rman管理器来完成。创建密码口令是为了rman管理器能够通过密码口令来登录,从而获取两个数据库的操作权。

怎样创建密码口令?

在cmd窗口下,执行 orapwd 命令,会弹出创建oracle 密码口令的相关参数。
如果不指定位置,创建的密码口令文件在当前文件夹下生成。所以进入 %oracle_home%/database 文件夹下,里面有个PWDorcl.ora 文件,我们在这个窗口下创建密码口令文件,并覆盖掉原来的PWDorcl.ora,创建密码为123456.

	orapwd file=PWDorcl.ora password=123456 entries=2 force=y

注意cmd路径 !
在这里插入图片描述

检查口令是否生效
	进入系统:sqlplus /nolog
	
	连接实例: 
	SQL> conn sys/123456@main as sysdba
	ERROR:
	ORA-12518: TNS: 监听程序无法分发客户机连接

如果出现这种错误,证明还需要在listener.ora 文件中SID_LIST参数下,添加一个sid_name= orcl 的如下内容:

(SID_DESC =
  (SID_NAME = orcl)
  (ORACLE_HOME = D:\oracel\11g\install\product\11.2.0\dbhome_1)
  (ENVS = "EXTPROC_DLLS=ONLY:D:\oracel\11g\install\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)

然后再次重启监听器:(每次修改监听后都需要重启才能生效设置!!

	lsnrctl stop
	lsnrctl start

再次登录验证口令是否生效:

SQL> conn sys/123456@main as sysdba   **main是tns配置中的别名,代表本机的1521端口。
已连接。
SQL>

备库的操作和主库一致。
直到两机都可以通过密码口令登录为止!这一步就准备完成了。
在这里插入图片描述

小结

这一部分比较简单,需要注意的就是口令文件生成保存的位置。然后就是监听文件中的配置信息不能多加,不能少加,不能错加。否则就会出现各种错误,让人跌入无限寻找bug的深渊。

(五)RMAN复制(仅备库)

踏破bug终于来到这一步,千辛万苦只为这一步。这一步只需要在备库做!
从最开始的软件安装、主库日志配置、TNS配置、密码口令配置、pfile文件配置,为了啥?
就是为了这一步能执行成功。这一步过程中,将会通过rman管理器相当于一个中介,把主库的数据信息复制到从库。如果前面路径、网络这些没配对,中介找不到地址、路径,联不通信号,肯定就会出错。

首先把两个库的管理账号、登录密码交给它。

 rman target sys/oracle@main auxiliary sys/oracle@back


恢复管理器: Release 11.2.0.1.0 - Production on 星期五 4月 24 10:04:14 2020
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
连接到目标数据库: ORCL (DBID=1566263629)
已连接到辅助数据库: ORCL (未装载)

RMAN>

然后让rman开始复制!

duplicate target database for standby from active database nofilenamecheck; 
## 最好加上最后一个命令,nofilenamecheck,检查到文件名称重复时不会中断。

如果在执行过程中出现了错误,如下:

	输入数据文件: 文件号=00001 名称=D:\ORACEL\11G\INSTALL\ORADATA\ORCL\SYSTEM01.DBF
RMAN-03009: backup 命令 (ORA_DISK_1 通道上, 在 04/24/2020 10:06:56 上) 失败
ORA-17628: 远程 Oracle 服务器返回了 Oracle 错误 19505
继续执行其他作业步骤, 将不重新运行失败的作业
...

在这里插入图片描述

这个时候需要调试找原因了! 找到第一步最开始说的 alert.ora文件,看看它打印了一些什么信息:
在这里插入图片描述
这下明了了吧,在pfile文件中,路径配错了。仔细一看,原来是我的oracel 写成了 oracle.
重新检查了主备库的pfile配置文件后,主库重启到open模式,备库启动到nomount模式。再次重新交给rman中介,执行复制命令后成功!
在这里插入图片描述
rman管理器复制完成后,备库默认处于mount状态,即数据库装载了,但未打开,数据库打开后才能查询,所以手动开启备库。

alter database open;
数据库已更改。

启用备库日志文件

开启:
 	alter database recover managed standby database disconnect  from session;	


关闭:
	alter database recover managed standby database cancel;

小结

这一步操作命令不多,主要在于出现了错误如何排查。如果前面没有配置好,那么这一步肯定就会出错,在排查的时候也要顺着前面的配置来排查。

(六)数据验证

前面五步做完,基本上oracle adg 主从库配置操作步骤就搭建完成了。下面进一步验证一下归档日志序号是否一致:

	主备库都执行:
	
	archive log list

在这里插入图片描述
在主库手动切换online redo log ,使其归档,归档时会生成下一个归档序号。

 alter system switch logfile;

然后再查询日志序号:

archive log list

在这里插入图片描述
如果主从库的当前日志序号一致,证明备库在跟着主库改变。至此,oracle adg 搭建完成!

(七)主从数据实时同步

如果到了第六步就完了,那可能还会继续掉入深渊。
在主库创建一个test表,按理说,从库也会生成这个表。但是从库并没有!
在这里插入图片描述
这里继续分析oracle adg原理:
如果是arch方式,它是一种延时的方式,原理可以参考文章头部。
下图为lgwr方式,因为LNG进程实时发送数据。
在这里插入图片描述
在备库端,RFS进程负责接收主库传来的数据,并把它写入之前创建的standby redo log中,然后这时并不会触发归档,除非当前日志组写满。写满后才会归档,归档时,才会把日志数据交给MRP,然后由MRP进程创建对应的数据。所以需要开启一个real time apply 模式,意为:实时同步数据。
real time apply 实时应用
它在写入到standby redo log时,同时也会将数据立马交给MRP。不需要等当前日志写满才更新数据库。

 recover managed standby database using current logfile disconnect from session; 

如果仍然出现数据无法同步,就得仔细分析原因了,打开alert.ora 日志文件,我这边出现了一个内存错误。通过增加db_cache_size得到了解决。

Exception [type: ACCESS_VIOLATION, UNABLE_TO_READ] [ADDR:0x7FFFFFFF8] [PC:0xCA81986, 000000000CA81986

如果数据库还是pfile文件方式启动的,则需要将pfile转换为spfile。

create spfile from pfile='D:\oracel\11g\install\pfile'

修改后,需要重启spfile文件,

alter system set db_cache_size=350M scope=both;

shutdown immediate;

startup;

然后在主库进行插入数据操作:
插入操作必须进行commit,手动提交事务。否则操作只会写入一个叫redo buff的缓存空间,不会真正写入redo log。然后搜索从库,数据已经同步了!
在这里插入图片描述

小结

弄清原理很重要!各进程之间的关系,日志。

(八)alert.ora 日志分析

搭建和运营维护过程中,难免出现各种各样的问题,除了查询搜索引擎外,学会分析alert.ora日志也非常必要。
查看日志的前提是基本明白oracle adg 的执行原理,各进程的关系。
下面举个例子:
从数据库装载和启动开始:

	Starting up:   开启startup 
	
	下面加载了启动的spfile数据文件,以及各个参数,包括我们配置的adg参数
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options.
Using parameter settings in server-side spfile 	D:\ORACEL\11G\INSTALL\PRODUCT\11.2.0\DBHOME_1\DATABASE\SPFILEORCL.ORA
System parameters with non-default values:
 processes                = 150
 memory_target            = 6496M
 control_files            = "D:\ORACEL\11G\INSTALL\ORADATA\ORCL\CONTROL01.CTL"
....
log_archive_dest_1       = "location=D:\oracel\11g\install\archive valid_for=(all_logfiles,all_roles) db_unique_name=main"
log_archive_dest_2       = "service=back lgwr async affirm  valid_for=(online_logfiles,primary_role)  	db_unique_name=back"
log_archive_dest_state_1 = "enable"
log_archive_dest_state_2 = "enable"
fal_client               = "main"
fal_server               = "back"
log_archive_config       = "dg_config=(main,back)"
log_archive_max_processes= 4
....
....
## 开启数据库为mount模式
ALTER DATABASE   MOUNT				
Fri Apr 24 11:02:43 2020
DIA0 started with pid=8, OS id=12604 
Fri Apr 24 11:02:43 2020
PSP0 started with pid=7, OS id=8328 
Successful mount of redo thread 1, with mount id 1566387412
Database mounted in Exclusive Mode
Lost write protection disabled
Completed: ALTER DATABASE   MOUNT  
Fri Apr 24 11:02:48 2020

## 开启数据库为open模式,上面控制文件中配置了4个归档日志线程。分别对应下方 ARC0、ARC1、ARC2、ARC3
ALTER DATABASE OPEN
LGWR: STARTING ARCH PROCESSES
Fri Apr 24 11:02:48 2020
ARC0 started with pid=19, OS id=960 
ARC0: Archival started
LGWR: STARTING ARCH PROCESSES COMPLETE
ARC0: STARTING ARCH PROCESSES
Fri Apr 24 11:02:49 2020
ARC1 started with pid=21, OS id=6556 
Fri Apr 24 11:02:49 2020
ARC2 started with pid=22, OS id=11512 
Fri Apr 24 11:02:49 2020
ARC3 started with pid=23, OS id=2604 
ARC1: Archival started
ARC2: Archival started
ARC2: Becoming the 'no FAL' ARCH
ARC2: Becoming the 'no SRL' ARCH
ARC1: Becoming the heartbeat ARCH

## 当前日志序列号19,线程序号为1,redo日志被线程1打开。
Current log# 1 seq# 19 mem# 0: D:\ORACEL\11G\INSTALL\ORADATA\ORCL\REDO01.LOG
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Fri Apr 24 11:02:49 2020
NSA2 started with pid=24, OS id=2268 
SMON: enabling cache recovery
ARC3: Archival started
ARC0: STARTING ARCH PROCESSES COMPLETE
Thread 1 advanced to log sequence 20 (LGWR switch)
Current log# 2 seq# 20 mem# 0: D:\ORACEL\11G\INSTALL\ORADATA\ORCL\REDO02.LOG

## 出现了一个异常
******************************************************************
Exception [type: ACCESS_VIOLATION, UNABLE_TO_READ] [ADDR:0x7FFFFFFF8] 	[PC:0xCA81986, 000000000CA81986]
Errors in file d:\oracel\11g\install\diag\rdbms\main\orcl\trace\orcl_ora_9188.trc  (incident=6239):
ORA-07445: exception encountered: core dump [PC:0xCA81986] [ACCESS_VIOLATION] 	[ADDR:0x7FFFFFFF8] [PC:0xCA81986] [UNABLE_TO_READ] []

## 这个错误描述详情在下面这个文档中。
Incident details in: 	d:\oracel\11g\install\diag\rdbms\main\orcl\incident\incdir_6239\orcl_ora_9188_i6239.trc
....
db_recovery_file_dest_size of 3912 MB is 0.83% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
Trace dumping is performing id=[cdmp_20200424110305]
Fri Apr 24 11:03:48 2020	

小结

只有学会了分析日志,才能以不变应万变。

三、其他排坑案例

待补充。

总结

看了这么多,好好休息一下吧。

未经作者允许,请勿转载!

  • 58
    点赞
  • 168
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
要在Oracle 19c中搭建ADG(Active Data Guard),需要执行以下步骤: 1. 在主数据库上启用归档模式: ``` SQL> ALTER DATABASE ARCHIVELOG; ``` 2. 创建一个备用数据库的实例: ``` $ export ORACLE_SID=ORACLE_19C_ADG $ sqlplus / as sysdba SQL> CREATE SPFILE FROM PFILE; ``` 3. 将主数据库的备份复制到备用服务器上,并在备用服务器上还原备份: ``` $ scp /backup/maindb/* oracle@adg_server:/backup/adg/ $ cd /backup/adg/ $ unzip maindb_backup.zip $ export ORACLE_SID=ORACLE_19C_ADG $ rman target / RMAN> DUPLICATE DATABASE FOR STANDBY FROM ACTIVE DATABASE SPFILE SET db_unique_name='ORACLE_19C_ADG' SET LOG_ARCHIVE_DEST_2='SERVICE=ORACLE_19C ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORACLE_19C' SET fal_client='ORACLE_19C' SET fal_server='ORACLE_19C_ADG' NOFILENAMECHECK; ``` 4. 配置主数据库的tnsnames.ora文件和备用数据库的tnsnames.ora文件,以便它们互相访问。 5. 在主数据库上创建一个log shipping连接,并将日志传输到备用数据库: ``` SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ORACLE_19C_ADG ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORACLE_19C_ADG' SCOPE=BOTH; SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH; ``` 6. 在备用数据库上启用日志应用: ``` SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` 完成上述步骤后,ADG就已经搭建完成了。可以使用以下命令检查ADG的状态: ``` SQL> SELECT DATABASE_ROLE FROM V$DATABASE; ``` 如果返回的结果为“PHYSICAL STANDBY”,则表示ADG已经成功搭建
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值