ORACLE DG 单实例-单实例

环境说明:

主库:primary 192.168.21.142            instance_name:adg     db_name:adg       service_name:pri     db_unique_name:pri
备库:standby 192.168.21.141          instance_name: adg        db_name:adg      service_name:std     db_unique_name:std

备库不需要创建实例,只需要安装数据库软件,因为这点,有人就会问,没有创建实例为什么会有实例名称呢,

这个实例名称是指在和主库保持一致而在参数文件中需要写入的实例名称
这里要注意区分:
主机名 实例名 服务名
etc/hosts 监听和参数文件中会用到 监听和连接实例时需要用到
监听中需要用到

oracle中:
1、查询数据库名:select name,dbid from v$database;或者show parameter db_name;
2、查询实例名:select instance_name from v$instance;或者show parameter instance_name;
3、查询数据库域名:select value from v$parameter where name='db_domain';或者show parameter domain;
4、查询数据库服务器:select value from v$parameter where name='service_name';或者show parameter service;或者show parameter names;
5、数据库服务名:此参数是数据库标识类参数,用service_name表示。数据库如果有域,则数据库服务名就是全局数据库名;
如果没有,则数据库服务名就是数据库名。查询:show parameter service_name;

主备库都需要添加ip地址和主机名称的对应,是为了在监听中的host 作为连接

/etc/hosts
192.168.2.31 primary
192.168.2.101 standby

一、监听和服务的配置
1、主库listener.ora

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = adg)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/)
(SID_NAME = adg)
)
)

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

ADR_BASE_LISTENER = /u01/app/oracle

注意这里的pri和dg(pri是指一个数据库对外提供的服务,dg是指实例的名称,这里提供了一个名为pri的服务该服务下有dg这个实例)
连接时就可以使用sqlplus sys/abc123@pri as sysdba 表示连接到了dg这个实例上。
主库:tnsnames.ora         备库(tnsnames和主库一样)

std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = std)
)
)

pri =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pri)
)
)

备库listener.ora

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = std)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/)
(SID_NAME = adg)
)
)

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

ADR_BASE_LISTENER = /u01/app/oracle

配置完成之后重启监听。
并使用下面的语句验证:
(1)tnsnames配置完之后tnsping pri 和tnsping std应该成功
(2)lisenter.ora配置完之后使用sqlplus sys/abc123@pri as sysdba
sqlplus sys/abc123@std as sysdba
测试是否可以连接,如果没有联通,一般是因为没有将密码文件传输到备库。

3、生成密码文件并将密码文件复制到对应的目录:(使用dbca会自动生成密码文件)

创建口令文件 orapwd file='/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwprimary' password=letoula entries=10
密码为sys用户的密码 
scp /u01/app/oracle/product/11.2.0/dbs/orapwdg oracle/@192.168.8.131:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/

因为我们的主库和备库的实例名称一致所以口令文件也应该完全一致。就是用主库的口令文件,这样才能保证
使用sqlplus连接时用户名和密码的正确性。


二、前期的准备:

(1)设置强制写日志

[oracle@Oracle11g2 admin]$ sqlplus / as sysdba 
SQL> select FORCE_LOGGING from v$database; 
NO 
SQL> alter database force logging;

SQL> select FORCE_LOGGING from v$database;
YES

(2)修改数据库运行在归档模式下

archive log list
sql>SHUTDOWN IMMEDIATE; 
sql>STARTUP MOUNT; 
sql>ALTER DATABASE ARCHIVELOG; 
sql> ALTER DATABASE OPEN; 
修改归档的路径:
alter system set log_archive_dest_1='location=/u01/app/arch/dg';

(3)添加standby redolog
主库、从库上都配置standby redo log 

在主库查看日志组的数量和每个日志文件的大小??
SQL>select * from v$log;

在备库库查看日志组的数量和每个日志文件的大小??
SQL>select * from v$log;

创建日志组和redolog文件
ALTER DATABASE ADD STANDBY LOGFILE group11('/u01/app/oracle/oradata/dg/redo11.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE group12('/u01/app/oracle/oradata/dg/redo12.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE group13('/u01/app/oracle/oradata/dg/redo13.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE group14('/u01/app/oracle/oradata/dg/redo14.log') SIZE 50M;

standby redolog的组数参考公式:(online redolog组数+1)*数据库线程数;

单机线程数为1,RAC一般为2。standby redolog的组成员数和大小也尽量和online redolog一样。


(4) 在主库上创建备份库需要的控制文件 (注意要启动到nomount状态,否则控制文件不一致)
创建控制文件:

sql>ALTER  DATABASE  CREATE  STANDBY  CONTROLFILE  AS  '/tmp/standby.ctl';  
scp 到备库

(5) 备份生产数据库 将主库数据库文件拷贝到备份机器上(注意目录也需要一致,如果没有该目录这需要创建文件)
包括主库的所有的
数据文件
密码文件
参数文件
在线日志和standby 日志文件
控制文件(注意这里的控制文件名称为standby.ctl拷贝过去之后,要将名称修改为原来的名称也就是pfile文件中对应的名
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl')
并且两个目录都要有,第二个控制文件是从第一地复并重命名的。

在备库复制两份控制文件

scp /u01/app/oracle/oradata/dg/* oracle/@192.168.2.101:/u01/app/oracle/oradata/dg/
cp standby.ctl /u01/app/oracle/oradata/dg/control01.ctl
cp /u01/app/oracle/oradata/dg/control01.ctl /u01/app/oracle/fast_recovery_area/dg/control02.ctl

二、(主库)参数文件
(1)生成pfile文件并添加DG需要的配置
启动主库 startup

create pfile='/home/oracle/spfile/initdg.ora' from spfile;

(2)修改pfile文件

dg.__db_cache_size=587202560
dg.__java_pool_size=16777216
dg.__large_pool_size=33554432
dg.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dg.__pga_aggregate_target=587202560
dg.__sga_target=855638016
dg.__shared_io_pool_size=0
dg.__shared_pool_size=201326592
dg.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='dg'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dgXDB)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=1435500544
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

以下是添加的内容:
*.db_unique_name='pri'
*.log_archive_config='DG_CONFIG=(pri,std)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri'
*.log_archive_dest_2='SERVICE=std LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=std'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_server='std'
*.fal_client='pri'
#*.db_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
#*.log_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
*.standby_file_management='AUTO'
#*.standby_archive_dest='/u01/app/arch/primary'



alter system set db_unique_name='RAC' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(RAC,DG)' scope=both sid='*';
alter system set log_archive_dest_1='LOCATION=+DATADG/rac/ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RAC' scope=both sid='*';
alter system set log_archive_dest_2='SERVICE=DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DG' scope=both sid='*';


alter system set db_file_name_convert='/u01/app/oracle/data/orcl/datafile','+DATADG/RAC/DATAFILE' scope=spfile sid='*';
alter system set log_file_name_convert='/u01/app/oracle/data/orcl/onlinelog','+DATADG/rac/ONLINELOG' scope=spfile sid='*';


alter system set standby_file_management=AUTO scope=both sid='*';
alter system set fal_server='DG' scope=both sid='*';

 

(3)修改完成之后,使用修改后的pfile创建spfile ,也就是运用当前的参数
主库:
shutdown immediate

创建主库spfile
sql>startup pfile='/home/oralce/spfile/initdg.ora';
sql > create spfile from pfile;

再次关闭数据库并使用后当前的spfile启动数据库:
sql >shutdown immediate
sql >startup

 

四、备库参数文件的修改:
(1)复制一份主库使用的pfile文件到备库的/home/oracle/spfile这个文件是自己创建的,
方便对pfile文件修改:
scp initdg.ora oracle@192.168.2.101:/home/oracle/spfile/

(2)修改备库的pfile文件,因为备库的实例名称和主库的一致,所有前面的所有有关实例的参数都不休要修改。
只需要修改dg的相关配置参数:

dg.__db_cache_size=587202560
dg.__java_pool_size=16777216
dg.__large_pool_size=33554432
dg.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dg.__pga_aggregate_target=587202560
dg.__sga_target=855638016
dg.__shared_io_pool_size=0
dg.__shared_pool_size=201326592
dg.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='dg'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dgXDB)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=1435500544
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

以下是修改的内容
*.db_unique_name='std'
*.log_archive_config='DG_CONFIG=(pri,std)'
*.log_archive_dest_1='LOCATION=/u01/app/arch/dg VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std'
*.log_archive_dest_2='SERVICE=pri LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=pri'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_server='pri'
*.fal_client='std'
#*.db_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
#*.log_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
*.standby_file_management='AUTO'
#*.standby_archive_dest='/u01/app/arch/primary'
注:文件的转换只需要在备库修改即可,主库可以不用修改(只考虑主备切换的情况)

ALTER SYSTEM SET db_file_name_convert=('+DATADG/yymh/datafile','/data/yymh/datafile','+DATADG/yymh/tempfile','/data/yymh/tempfile/')

 


这里注释的内容
#*.db_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
#*.log_file_name_convert='/u01/app/oracle/oradata/dg','/u01/app/oracle/oradata/dg'
可以查看相关参数说明,因为主备实例一致,目录结构也一致,所以不需要配置

(3)创建备库需要的目录:(主要对照pfile文件的内容)需要
创建归档目录:*.log_archive_dest_1='LOCATION=/u01/app/arch/dg'
审计目录:*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
控制文件和数据文件目录:
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
数据文件目录:/u01/app/oracle/oradata/dg/


(4)修改好pfile文件,创建了目录,并且将所有的控制文件,数据文件,redolog文件、密码文件上传之后,我们就可以启动备库了;
以pfile文件启动数据库为nomount状态。

sql>startup nomount pfile='/home/oralce/spfile/initdg.ora'
sql>alter database mount standby database;

创建spfile文件
sql>create spfile from pfile='/u01/app/backup/initstandby.ora';
(创建好spfile文件之后我们可以使用spfiel文件启动数据库了)

下面就是然数据同步了,这是可以测试,现在主库上插入数据,再到备库上执行下面的恢复语句,将数据恢复到备库上。
修改数据库处于应用归档状态
alter database recover managed standby database disconnect from session;


通过下列语句暂停redo应用。
不关闭这个状态的话那么备库数据库会自动和主库保持一致,主库的所有操作都会和备库一致。
否则需要手动执行日志切换才能保证主备库的状态的一致:alter system switch logfile;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

只读模式打开数据库
alter database open read only;

配置完成
----------------------------------------------------------
----------------------------------------------------------
判断配置是否成功,主要通过查看主数据库归档日志的sequence是否一致 查看方法
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
55
通过在主库执行alter system switch logfile; 切换日志,可以观察到备库会自动应用通过主库传过来的日志
SQL> alter system switch logfile;
查询数据库状态 SQL> select status from v$instance;
查询归档日志是否应用(应用需要点时间)SQL> select sequence#,applied from v$archived_log where applied='YES' order by sequence#;
查看主库DG状态:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
日志测试:
在primary库上执行

五、Start Redo Apply
下面的语句可以所有的主库的数据运用到备库:

sql>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

 

 

2.启动到只读方式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database open read only;
3如果在管理恢复模式下到只读模式
SQL> recover managed standby database cancel;
SQL> alter database open read only;



查看dg主备库同步情况

蓝小山 2020-05-19 14:49:59 334 收藏 1
分类专栏: ORACLE
版权
使用sys用户登录备库数据库,查看数据库状态
select open_mode,database_role from v$database;
1
查看备库进程情况
select process,status,sequence# from v$managed_standby;

RFS进程:负责日志的传输
MRP进程:负责日志的应用
针对RAC环境的dg环境,RFS和MRP是只存在一个节点中的。
如果登录一个节点发现没有这两个进程,要在另一个节点上再次验证。

 

查看备库数据库同步情况:
select thread#,sequence#,applied from v$archived_log;
查看applied的结果,如果是YES 最后为IN-MEMORY 表示数据已经应用。
如果 结果中出现NO,表示数据同步已经出现延迟,要明确是未来得及应用还是同步中断。

posted @ 2020-11-03 10:03  数据库小白(专注)  阅读(579)  评论(0编辑  收藏  举报