搭建物理DG
选择Oracle版本号
select * from v$version;
备库需要和主库的版本号一致。从11G开始第四位就是版本号,所以不能支持。
主备库的SID_name一致。
select name from v$database;
同时保证主备库系统时间一致。
操作系统:Window server 2008 R2(主备库)
主库ip:192.168.30.174 实例名:orcl
备库ip:192.168.30.113 实例名:orcl(备库实例可带可不带)
主库操作
修改主库的listener.ora文件
(D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
#添加部分
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.174)(PORT = 1521)) #修改部分
)
)
ADR_BASE_LISTENER = D:\app\Administrator
修改主库tnsnames.ora文件
(D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora)
#LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.174)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
STY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.113)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
PRI =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.174)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
测试tnsping PRI和tnsping STY()
注:TNS-12535 操作超时,可能原因为监听未启动。
注:TNS-01192错误,listener起不来了,可能原因是监听配置文件中文档格式错误。
修改主库初始化参数化文件
创建主库的参数文件
SQL>Create pfile from spfile;
文件位置:(D:\app\Administrator\product\11.2.0\dbhome_1\database\INITSID_NAME.ORA),把此文件复制到非数据库文件中。
主备库创建文件夹E:\backup\ARCHIVELOG ———归档日志文件夹
主库在sqlplus下执行以下语句(cmd命令)
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database force logging;
SQL>alter database open;
SQL>alter system set db_unique_name='pri' scope=spfile;
SQL>alter system set log_archive_config = 'DG_CONFIG=(pri,sty)' scope=spfile;
SQL>alter system set log_archive_dest_1 = 'LOCATION=E:\backup\ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri' scope=spfile;
SQL>alter system set log_archive_dest_2 = 'SERVICE=sty LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sty' scope=spfile;
SQL>alter system set log_archive_dest_state_1 = ENABLE;
SQL>alter system set log_archive_dest_state_2 = ENABLE;
SQL>alter system set fal_server=sty scope=spfile;
SQL>alter system set fal_client=pri scope=spfile;
SQL>alter system set standby_file_management=AUTO scope=spfile;
Pg:
1.db_unique_name由于主库和备库使用的库名一样,所以使用db_unique_name来区分主备库
2.log_archive_config 列出主备库上的DB_UNIQUE_NAME,保证数据库能发送和接受redo log
3.log_archive_dest_1 LOCATION指定当前的归档路径。
4.log_archive_dest_2 SERVICE指定的是接受方的服务名(tnsnames.ora中定义的)
5.fal_server 指定为接受方的服务名
6.fal_client 指定本地的服务名
7.standby_file_management 设置为AUTO,主库添加数据文件时备库自动添加。
添加standby日志(注意文件大小和redolog大小一致)主备库都要创建standby redolog,文件夹在(E:\app\Administrator\oradata\orcl\)下
alter database add standby logfile group 4 ('E:\app\Administrator\oradata\orcl\redolog\styredo04.log') size 50m;
alter database add standby logfile group 5 ('E:\app\Administrator\oradata\orcl\redolog\styredo05.log') size 50m;
alter database add standby logfile group 6 ('E:\app\Administrator\oradata\orcl\redolog\styredo06.log') size 50m;
alter database add standby logfile group 7 ('E:\app\Administrator\oradata\orcl\redolog\styredo07.log') size 50m;
建立的standby redolog要比onlineredo至少多一个。
备库操作
安装完数据库后。
首先把主库的密码文件复制到备库上(D:\app\Administrator\product\11.2.0\dbhome_1\database\PWDsid_name.ora)然后重启装载和启动数据库。
同样的修改和设置listener.ora、tnsnames.ora、参数文件,把主库的密码文件复制到备库。
Listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = “EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll”)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.113)(PORT = 1521))
)
)
ADR_BASE_LISTENER = D:\app\Administrator
Tnsnames.ora(和主库添加内容一样)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
STY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.113)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
PRI =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.174)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
参数文件(如果主库之前设置过参数,可以把主库的参数文件(pfile)复制过来。使用pfile启动数据库后,用pfile建立spfile文件,再修改参数文件)
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database open;
SQL>alter system set db_unique_name='sty' scope=spfile;
SQL>alter system set log_archive_config='DG_CONFIG=(pri,sty)' scope=spfile;
SQL>alter system set log_archive_dest_1 = 'LOCATION=E:\backup\ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sty' scope=spfile;
SQL>alter system set log_archive_dest_2 = 'SERVICE=pri LGWR aSYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=pri' scope=spfile;
SQL>alter system set fal_server=pri scope=spfile;
SQL>alter system set fal_client=sty scope=spfile;
SQL>alter system set standby_file_management=AUTO scope=spfile;
设置完成后将备库数据库启动到nomount阶段。
SQL>shutdown immediate;
SQL>startup nomount;
在primary端(主库)通过Rman Duplicate创建备库
需要在主备库端对sys用户设置密码后,使用rman链接主备库。
rman target sys/oracle@pri auxiliary sys/oracle@sty nocatalog;
链接上之后执行以下语句搭建备库数据库:
duplicate target database for standby from active database nofilenamecheck;
执行语句后可能出现以下错误,该错误是配置文件中的数据文件路径有问题,需将主备库的文件路径保持一致。
调整完路径后再次执行语句显示以下错误,此时需将备库启动到nomount状态,再执行语句。
显示完成。
此时备库已经是mount阶段(select status from v$instance;select open_mode from v$database;)。
在standby端开启实时日志应用
SQL>recover managed standby database using current logfile disconnect from session;
搭建验证
在主库端执行归档日志切换alter system switch logfile;
查看归档日志列表archive log list;
备库中查看归档日志列表archive log list;
使用select sequence#,first_time from v$archived_log order by sequence#;查看序列号是否同步完成
同时可以主备库中的D:\backup\ARCHIVELOG中查看归档日志时间
查看standby启动的DG进程
select process,client_process,sequence#,status,thread# from v$managed_standby;
Select process,client_process,sequence#,status from v$managed_standby;
备库启动到open阶段
SQL>shutdown immediate;
SQL>startup nomount ;
SQL> alter database mount standby database;
SQL> alter database open read only; —只读方式打开,主库添加表空间是,备库不能添加
SQL> alter database recover managed standby database using current logfile disconnect from session;
验证数据是否能同步
在主库建立一个用户名为a密码为a的用户。
备库中使用conn a/a;看是否登录成功。
或者是直接使用以前的用户名和密码登录查询数据,查询最新记录是否相同。
ADG三种模式切换及介绍
A. maxmize protection,最大保护模式,没有数据丢失,没有数据分歧。LGWR/LNSn将同时传送到备用节点,在主节点事务提交之前,备用节点也必须收到全部日志数据。如果网络不好,没有传送到将会引起严重的性能问题,导致主节点宕机。
B. maxmize availability,最大可用模式,没有数据丢失,允许数据分歧,允许异步传送。正常情况一般运行在该模式下,主节点与被节点由于网络原因不能够通信时候,将自动切换到最大性能模式运行,主节点的操作继续。
C. maxmize performance,最大性能模式。异步传送日志,无数据同步检查,可能丢失数据,但是能够获得主节点的最佳性能。9i起的默认模式。
查看模式select database_role,protection_mode,protection_level from v$database;
切换模式alter database set standby database to maximize availability;
ADG做(switchover)切换
Switchover是主数据库与其中一个standby数据库的转换,switchover能确保没有数据丢失,这是在有计划的系统维护时的典型做法。
Failover:在主数据库不活动的时候,Failover可将Standby数据库转换为主数据库角色,Failover可能会导致数据出现丢失的情况。Failover只在主数据发生失败的情况下才使用。而且使用此方式之后就不能在切回主库了。需要重新做DG后,需要时使用switchover切换。
—primary 做如下操作
SQL> alter database commit to switchover to physical standby WITH SESSION SHUTDOWN;
Database altered.
SQL> shutdown immediate;
ORA-01012: not logged on
SQL> conn / as sysdba;
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1188511744 bytes
Fixed Size 1364228 bytes
Variable Size 754978556 bytes
Database Buffers 419430400 bytes
Redo Buffers 12738560 bytes
Database mounted.
Database opened.
SQL> alter database recover managed standby database disconnect from session;
Database altered.
SQL> select database_role,switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
———————— ——————————
PHYSICAL STANDBY TO PRIMARY
SQL>
—standby 端做如下操作
SQL> alter database commit to switchover to primary WITH SESSION SHUTDOWN;
Database altered.
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1188511744 bytes
Fixed Size 1364228 bytes
Variable Size 754978556 bytes
Database Buffers 419430400 bytes
Redo Buffers 12738560 bytes
Database mounted.
Database opened.
SQL> alter system switch logfile;
System altered.
SQL> select database_role,switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
———————— ——————————
PRIMARY SESSIONS ACTIVE
ADG做(failover)切换
是主库故障无法连接,强制把备库换位主库。注意使用此方法不能在切换为主库。
停止日志应用
alter database recover managed standby database cancel;
关闭standby日志传输
alter database recover managed standby database finish;
切换到primary
alter database commit to switchover to primary with session shutdown;
做这一步的时候,若存在gap,则会报ORA-16139 :Switchover: Media recovery required - standby not in limbo 错误。做测试的时候,若先起主库再起备库,且未等待备库相关日志传输完毕,就会出现这个问题。此时需要强制切换
alter database activate physical standby database;
重启数据库到open阶段即可。
备库没有及时引用主库的归档日志
select a.sequence#,a.name,to_char(a.FIRST_time,’yyyy-mm-dd hh24:mi:ss’) first_time,
to_char(a.next_time,’yyyy-mm-dd hh24:mi:ss’) next_time,
to_char(a.completion_time,’yyyy-mm-dd hh24:mi:ss’) completion_time,a.applied
from V$ARCHIVED_LOG a where a.applied = ‘NO’;
—APPLIED:是否被应用,Data Guard环境下适用。在备库中查看是否应用(NO表示没有应用)
—STATUS列标识该条记录的状态,有下列几个值:
A:指正常归档状态。
D:指该记录指向的归档文件已被删除。
U:指该记录指向的归档已不存用。
X:指该条记录失效,通常是当你在RMAN中执行了CROSSCHECK ARCHIVELOG后有可能出现。
还要看ADG的三种模式,是否是最大性能,如果为最大性能则是异步传输。所以会慢。
备库不能及时应用主库记录
方法一、
select process,status,thread#,sequence#,client_pid from v$managed_standby;
PROCESS STATUS THREAD# SEQUENCE# CLIENT_PID
ARCH CONNECTED 0 0 240
ARCH CONNECTED 0 0 196
ARCH CONNECTED 0 0 1944
ARCH CONNECTED 0 0 3956
MRP0 WAIT_FOR_LOG 1 30843 N/A
RFS RECEIVING 1 30838 2620
RFS RECEIVING 1 30837 2612
RFS RECEIVING 1 30833 2652
备库MRP进程STATUS是 APPLYING_LOG 是实时应用, 或者主库LNS 进程是WRITING是实时应用;
这种方式必须Standby Redo Log,每当日志被写入Standby Redo Log时,就会触发恢复,使用这种方式的好处在与可以减少数据库切换(Switchover 或者Failover)的时间,因为切换时间主要用在剩余日志的恢复上。
以下使用及时应用日志的方式图:
备库MRP进程STATUS是 WAIT_FOR_LOG 是非实时应用, 或者主库LGWR 或者归档 进程是WRITING是非实时引用;(实时应用是用LNS进程发送日志,非实时应用是用LGWR或者ARCH进程发送日志),这种方式在Primary Database发生日志切换,触发Standby Database 归档操作,归档完成后触发恢复。 这也是默认的恢复方式。
方法二、
select DEST_NAME , STATUS , RECOVERY_MODE from v$archive_dest_status;
DEST_NAME STATUS RECOVERY_MODE
LOG_ARCHIVE_DEST_1 VALID IDLE
LOG_ARCHIVE_DEST_2 VALID MANAGED REAL TIME APPLY
总结:不管是主库还是备库:
recover_mode是 MANAGED REAL TIME APPLY是实时应用;MANAGED是非实时应用。
如果使用前者都没有解决:
看主备库的redolog日志大小:
select group#,bytes/1024/1024 from v$log;
select group#,bytes/1024/1024 from v$standby_log;
如果看到两个log文件大小不一致,删除之前建立的Standby Redo Log,重建。
—取消日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
—启用或禁用自动备用文件管理。启用自动备用文件管理时,将在备用数据库上复制主数据库上的操作系统文件添加
—和删除。
alter system set standby_file_management=manual;
删除standby logfile
alter database drop standby logfile group 6;
alter database drop standby logfile group 7;
alter database drop standby logfile group 8;
alter database drop standby logfile group 9;
alter database drop standby logfile group 10;
alter database drop standby logfile group 11;
添加standby logfile
alter database add standby logfile group 6 (‘D:\app\Administrator\oradata\oracle\redo\STYREDO06.log’) size 600M;
alter database add standby logfile group 7 (‘D:\app\Administrator\oradata\oracle\redo\STYREDO07.log’) size 600M;
alter database add standby logfile group 8 (‘D:\app\Administrator\oradata\oracle\redo\STYREDO08.log’) size 600M;
alter database add standby logfile group 9 (‘D:\app\Administrator\oradata\oracle\redo\STYREDO09.log’) size 600M;
alter database add standby logfile group 10 (‘D:\app\Administrator\oradata\oracle\redo\STYREDO010.log’) size 600M;
alter database add standby logfile group 11 (‘D:\app\Administrator\oradata\oracle\redo\STYREDO011.log’) size 600M;
—改为备库天添加和删除主库的数据文件
alter system set standby_file_management=auto;
—启动日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
—查看数据库主备库状态
select database_role,switchover_status from v$database;
综上, 建议从备库上进行查看,毕竟是不是实时应用,是备库的事情。
主备库数据文件和redolog文件不在相同位置的时候
在设置的时候注意看主库有多少个日志和数据文件的路径
备库参数文件(主库在前,备库在后)
alter system set log_file_name_convert=’D:\testdg\oradata\testdg’,’E:\testdg\oradata\testdg’ scope=spfile sid=’‘;
alter system set db_file_name_convert=’D:\testdg\oradata\testdg’,’E:\testdg\oradata\testdg’ scope=spfile sid=’‘;
主库参数文件(备库在前,主库在后)
alter system set log_file_name_convert=’E:\testdg\oradata\testdg’,’D:\testdg\oradata\testdg’
scope=spfile sid=’‘;
alter system set db_file_name_convert=’E:\testdg\oradata\testdg’,’D:\testdg\oradata\testdg’
scope=spfile sid=’‘;
解决备库不能同步主库建立的数据文件的问题。
查看备库的参数。
show parameter STANDBY_FILE_MANAGEMENT;
如果为manual为手动模式,此时改为自动模式(auto)。