# Oracle ADG主从同步 dataguard(windows to linux )

# 前言

用户目前用的Windows两个Oracle实例500G左右的表空间大小。因性能和安全性方面的考虑,需要在目前基础上新增一个从库读写分离,分担分析报表和外部流向溯源系统、UDI、金税、监管接口等查询的性能压力,以及预防在主库异常(硬件故障/被攻击)时进行故障转移。 从库选择Linux安装Oracle 11g.(相同版本、字符集),如果是出事搭建,推荐使用一致的操作系统版本和一致的表空间数据文件存储路径,搭建更简单。 注意:主从同步不能替离线备份,因为基于日志归档的实时主从同步,在主库误操作无法回滚后,从库也实时做了同样的操作。此时部分数据还需要从离线备份中恢复。

# 环境准备

  • 查询主库版本和字符集
-- 查询版本
SELECT * FROM V$VERSION;
-- 查询字符集
select userenv('language') from dual;
--数据库名
select name from v$database;
  • 安装从库,字符集/数据库名,版本一致 参考静默安装Oracle,仅安装数据库,参考

  • 主库和从库HOSTS增加解析

10.11.11.241  erpora0
10.11.11.242  erpora1
  • linser和tns配置 1.1 通信准备(监听和tns配置) %ORACLE_HOME%/NETWORK/ADMIN目录下 listener.ora tnsnames.ora

# 创建主库

这是我主库的 ip和端口,主库取名为 MAIN,要连接的数据库名为 orcl:

WINORA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.11.241)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = ERP)
)
)

# 创建备库

# 这是要通信的备库IP 和端口,取名为 BACK,要连接的数据库名为 orcl

LINORA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.145)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = ERP)
)
)
  • 开启强制归档 shutdown immediate; startup mount; alter database force logging; alter database archivelog;
alter database add standby logfile group 4 ('D:\ERPORA\standby_log04.log') size 50M;
alter database add standby logfile group 5 ('D:\ERPORA\standby_log05.log') size 50M;
alter database add standby logfile group 6 ('D:\ERPORA\standby_log06.log') size 50M;
alter database add standby logfile group 7 ('D:\ERPORA\standby_log07.log') size 50M;

# 主库参数配置

create pfile = 'D:\app\Administrator\pfile' from spfile;

  • .db_unique_name='ERPORA'
  • .fal_client='ERPORA'
  • .fal_server='ERPORAB'
  • .log_archive_config='dg_config=(ERPORA,ERPORAB)'
  • .log_archive_dest_1='location=D:\ARCHIVELOG valid_for=(all_logfiles,all_roles) db_unique_name=ERPORA'
  • .log_archive_dest_2='service=ERPORAB lgwr async noaffirm valid_for=(online_logfiles,primary_role) db_unique_name=ERPORAB'
  • .log_archive_dest_state_1='enable'
  • .log_archive_dest_state_2='enable'
  • .log_archive_max_processes=4
  • .db_file_name_convert='/db/app/oracle/oradata/ERPORA','D:\ERPORA'
  • .log_file_name_convert='/db/app/oracle/oradata/ERPORA','D:\ERPORA'
  • .standby_file_management='auto'

--启动主库

shutdown immediate; startup mount pfile='D:\app\Administrator\pfile';

--nomount启动备库

startup nomount pfile='/db/app/oracle/oradata/pfile';

--配置密码文件

orapwd file=./orapwERPORA password=pass entries=2 force=y

--测试密码

sqlplus sys/pass@ERPORA as sysdba sqlplus sys/pass@ERPORAB as sysdba

登录rman

rman target sys/pass@ERPORA auxiliary sys/pass@ERPORAB

开始复制 duplicate target database for standby from active database nofilenamecheck;

主备库分别创建spfile

create spfile from pfile='D:\app\Administrator\pfile'; --主库 create spfile from pfile='/db/app/oracle/oradata/pfile'; --备库

  • 配置文件位置
--查询数据文件位置
select name from v$datafile;
-- 如果主库与备库数据文件位置不相同,则需要使用db_file_name_convert来转换。
alter system set db_file_name_convert='/data/oracle/oradata/chwit1','C:\APP\ADMINISTRATOR\ORADATA\SFXT' scope=spfile;
--log_file_name_convert 查看在线日志文件的位置:
select member from v$logfile;
--如果主库与备库在线日志文件位置不相同,则需要使用log_file_name_convert来转换。
alter system set log_file_name_convert='/data/oracle/oradata/chwit1','C:\APP\ADMINISTRATOR\ORADATA\SFXT' scope=spfile;
  • 配置 standby_file_management、fal_client、fal_server
alter system set standby_file_management=auto scope=spfile;
alter system set fal_client='tnssfx' scope=both;
alter system set fal_server='tnschwit1' scope=both;
  • 创建文件夹
mkdir C:\app\Administrator\product\11.2.0\dbhome_1\archivelog
  • 应用新参数文件
--一致性停库
shutdown immediate; 
--创建新的spfile
create spfile from pfile; 
startup;
  • 添加主库和备库的standby日志组

standby日志组个数:配置为redo日志组个数+1,在主库与备库都添加standby日志组。主库可以不添加,如果考虑备库要切成主库就需要一起添加。

--只查询standby日志组:
select * from v$standby_log ;
alter database add standby logfile group 4 ('C:\app\Administrator\oradata\chwit0\stredo04.log') size 50M;
alter database add standby logfile group 5 ('C:\app\Administrator\oradata\chwit0\stredo05.log') size 50M;
alter database add standby logfile group 6 ('C:\app\Administrator\oradata\chwit0\stredo06.log') size 50M;
alter database add standby logfile group 7 ('C:\app\Administrator\oradata\chwit0\stredo07.log') size 50M;
  • 主库静态监听配置

/data/oracle/product/11.2.0/db_1/network/admin/listener.ora


LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = primarynode)(PORT = 1521))
)
)
)

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

ADR_BASE_LISTENER = /u01/oracle
  • 主库tnsnames.ora文件配置

/data/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

tnschwit0 =
(DESCRIPTION =
 (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.186.132)(PORT = 1521))
 )
 (CONNECT_DATA =
   (SERVICE_NAME = chwit0)
 )
)

tnschwit1 =
(DESCRIPTION =
 (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.186.131)(PORT = 1521))
 )
 (CONNECT_DATA =
   (SERVICE_NAME = chwit0)
 )
)

# 备库配置

  • 设置一个密码文件
# 指定standby database的ORACLE_SID
export ORACLE_SID=stddb
# 跳转到dbs文件夹下
cd $ORACLE_HOME/dbs
# 创建密码文件
orapwd file=orapwchwit1 password=sys123
  • 初始化参数文件
--在主库生成初始化参数文件
SQL> create pfile from spfile;

复制主库的参数文件到备库并重命名后修改备库的参数文件内容


chwit0.__java_pool_size=4194304
chwit0.__large_pool_size=4194304
chwit0.__oracle_base='/data/oracle'#ORACLE_BASE set from environment
chwit0.__pga_aggregate_target=343932928
chwit0.__sga_target=515899392
chwit0.__shared_io_pool_size=0
chwit0.__shared_pool_size=192937984
chwit0.__streams_pool_size=0
*.audit_file_dest='/data/oracle/admin/chwit1/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/data/oracle/oradata/chwit1/control01.ctl','/data/oracle/flash_recovery_area/chwit1/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='chwit0'
*.db_recovery_file_dest='/data/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4102029312
*.diagnostic_dest='/data/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=chwit0XDB)'
*.local_listener='LISTENER_SFXT'
*.memory_target=858783744
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
db_unique_name=chwit1
log_archive_config='dg_config=(chwit0,chwit1)'
log_archive_dest_1=''LOCATION=/data/oracle/product/11.2.0/db_1/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=chwit1'
log_archive_dest_2='SERVICE=tnschwit0 LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=chwit0'
log_archive_dest_state_1=enable
log_archive_dest_state_2=enable
db_file_name_convert='C:\APP\ADMINISTRATOR\ORADATA\SFXT','/data/oracle/oradata/chwit1'
log_file_name_convert='C:\APP\ADMINISTRATOR\ORADATA\SFXT','/data/oracle/oradata/chwit1'
fal_client='tnschwit1'
fal_server='tnschwit0'
standby_file_management='AUTO'
  • 新建需要的目录
mkdir -p /data/oracle/admin/chwit1/adump
mkdir -p /data/oracle/oradata/chwit1
mkdir -p  /data/oracle/flash_recovery_area/chwit1
  • 复制控制文件过来

注意控制文件一般有两个

cp C:\app\Administrator\oradata\chwit0\CONTROL01.CTL
cp C:\app\Administrator\flash_recovery_area\chwit0\CONTROL02.CTL
  • 使用pfile文件创建spfile文件
--登陆到idle数据库
sqlplus / as sysdba
--创建spfile
create spfile from pfile
--启动数据库到nomount状态
startup nomount
  • 配置静态监听
[oracle@standbynode admin]$ vim listener.ora
# listener.ora Network Configuration File: /data/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = standbynode)(PORT = 1521))
)
)
)

SID_LIST_LISTENER = 
(SID_LIST = 
(SID_DESC = 
(GLOBAL_DBNAME=chwit0)
(SID_NAME = chwit1)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)       
) 
) 

ADR_BASE_LISTENER = /data/oracle
  • 配置tnsnames.ora文件,直接复制主库的

  • 测试网络连通性

主库与备库都测试执行确认可以正常访问

tnsping tnschwit0
tnsping tnschwit1
  • 在主库测试连接备库
sqlplus sys/sys123@tnschwit0 as sysdba
sqlplus sys/sys123@tnschwit1 as sysdba

# 参数检查

参数 说明
db_unique_name 2个节点需要不一样
compatible 主库与备库兼容性需一致
log_archive_config 配置主库与备库的db_unique_name
log_archive_dest_1 归档日志的路径
log_archive_dest_2 归档日志的路径
log_archive_dest_state_2 enable:启用,defer:禁用
db_file_name_convert 数据文件转换路径
log_file_name_convert 日志文件转换路径
standby_file_management 设置为auto
log_archive_format 日志文件格式,两边需一致

# 使用duplicate创建物理standby

  • 备库端执行
#: 一定要加nocatalog,否则在执行duplicate时会报错
[oracle@primarynode ~]$ rman target sys/sys123@chwit0 auxiliary sys/sys123@chwit1 nocatalog
  • 使用duplicate复制数据库
RMAN> duplicate target database for standby from active database nofilenamecheck;
-- 开始同步数据库(备库执行)
alter database open;  
--开启实时同步
alter database recover managed standby database using current logfile disconnect from session;
--方式二:开启同步(日志切换时才同步)
alter database recover managed standby database disconnect from session;

# 检查是否执行成功

  • 主库状态查看
select    open_mode,      --数据库打开模式,如果实时同步,则为:read only with apply,取消同步则为:read only
          database_role,       --数据库角色,是主库还是备库
          protection_mode,     --保护模式
          protection_level     --保护级别
from  v$database;  

# 主库

OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

# 备库

OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE