CentOS7配置Oracle主从同步

一、准备环境

默认都已经安装好oracle,主库dbca已经创建实例,从库需要dbca创建实例。

主库:192.168.1.51

从库:192.168.1.52

主从库其他都一样,最重要的sid要设置一样,而db_unique_name要不同!!!

二、配置listener.ora和tnsnames.ora文件(主库)

# 执行(oracle用户)
vi $ORACLE_HOME/network/admin/listener.ora

LISTENER =
(DESCRIPTION_LIST =
   (DESCRIPTION =
       (ADDRESS_LIST =
           (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.51)(PORT = 1521))
       )
    )
)
vi $ORACLE_HOME/network/admin/tnsnames.ora
DB1 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.51)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) # 下面是配置其他服务器上的oracle DB2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.52)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )

然后开启监听,并且查看状态。

lsnrctl start
lsnrctl status

 

 测试连通性。

tnsping db1 
tnsping db2

 

 三、查看同步配置(主库)

 

# 主库执行(检查数据库状态)
sqlplus / as sysdba
SELECT status FROM v$instance;

-- 查看归档模式(需开启)
ARCHIVE LOG LIST;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

-- 启用Force Logging
select force_logging from v$database;
ALTER DATABASE FORCE LOGGING;

select name, log_mode,force_logging from v$database;

-- 修改原本的logfiled大小
SELECT group#, bytes/1024/1024 AS size_mb, status FROM v$log;
select * from v$logfile;
ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/oracle/oradata/ORCL/redo04.log') SIZE 2G;
ALTER DATABASE ADD LOGFILE GROUP 5 ('/u01/app/oracle/oradata/ORCL/redo05.log') SIZE 2G;
ALTER DATABASE ADD LOGFILE GROUP 6 ('/u01/app/oracle/oradata/ORCL/redo06.log') SIZE 2G;
-- 切换日志
ALTER SYSTEM SWITCH LOGFILE;
-- 删除旧日志,若存在status为active的,重启数据再删除
ALTER DATABASE DROP LOGFILE GROUP 1;
ALTER DATABASE DROP LOGFILE GROUP 2;
ALTER DATABASE DROP LOGFILE GROUP 3;


 

四、DATA GUARD模式和standby从库需配置(主库)

 

-- DATA GUARD模式和standby从库需配置
--高可用模式(尽可能保证数据不丢失)
alter database set standby nologging for data availability; 
select log_mode,force_logging from v$database;
--性能模式(主要以性能为主)
alter database set standby nologging for load performance; 
select log_mode,force_logging from v$database;

-- 添加Standby日志组
-- 在主库上添加standby日志组,日志大小与online日志保持一致,数量要比online日志多一组。
set lines 200
col member for a80
--查看日志文件
select * from v$logfile;
--查看日志组数量及大小
select thread#, group#, bytes/1024/1024 size_mb, status from v$log;
select group#,status,type,member from V$logfile;
select log_mode,force_logging from v$database;

-- Data Guard配置相关
-- 根据上面SQL的结果可知当前实例有3个日志组,所以至少需要创建4个standby日志组。
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/ORCL/standby_redo07.log') SIZE 2G;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 ('/u01/app/oracle/oradata/ORCL/standby_redo08.log') SIZE 2G;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 9 ('/u01/app/oracle/oradata/ORCL/standby_redo09.log') SIZE 2G;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 ('/u01/app/oracle/oradata/ORCL/standby_redo10.log') SIZE 2G;

--配置DG主备库,DG_CONFIG配置的是DB_UNIQUE_NAME
alter system set log_archive_config='DG_CONFIG=(orcl,orcl2)' scope=both;

--配置本地归档路径(因为archive log list;命令显示的是这个路径)这个路径等开启归档后检查一下
--确定一下这个路径是不是足够大,这个目录会增长
alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl' scope=both;
--配置备库归档,SERVICE配置的tnsnames.ora的名称
alter system set log_archive_dest_2='SERVICE=db2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl2' scope=both;
--设置归档目录状态FAL_SERVER FAL_CLIENT这里配置的监听tnsnames.ora定义的名称
alter system set log_archive_dest_state_1=ENABLE scope=both;
alter system set log_archive_dest_state_2=ENABLE scope=both;
alter system set FAL_SERVER=db2 scope=both;
alter system set FAL_CLIENT=db1 scope=both;
alter system set standby_file_management=auto;

--配置主备库数据文件名称转换关系(为了切换主从库时,路径转换)
alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCL2/', '/u01/app/oracle/oradata/ORCL/' scope=spfile;
--配置主备库日志文件名称转换关系
alter system set log_file_name_convert='/u01/app/oracle/oradata/ORCL2/', '/u01/app/oracle/oradata/ORCL/' scope=spfile;

 
-- 生成参数文件和密码文件
create pfile='/u01/app/oracle/initorcl.ora' from spfile;
orapwd file=$ORACLE_HOME/dbs/orapworcl password="Ab123456!" force=y

  --重启
  shutdown immediate;
  startup;

  -- 将参数文件和密码文件拷贝到从库(从库要安装完,不需要创建dbca实例,传输)
  scp /u01/app/oracle/initorcl.ora oracle@192.168.1.52:$ORACLE_HOME/dbs/
  scp $ORACLE_HOME/dbs/orapworcl oracle@192.168.1.52:$ORACLE_HOME/dbs/

 

五、配置listener.ora和tnsnames.ora文件(从库)

# 执行(oracle用户)
vi $ORACLE_HOME/network/admin/listener.ora

LISTENER_STATIC =
(DESCRIPTION_LIST =
   (DESCRIPTION =
       (ADDRESS_LIST =
           (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.52)(PORT = 1521))
       )
    )
)

SID_LIST_LISTENER_STATIC =
(SID_LIST =
     (SID_DESC =
           (GLOBAL_DBNAME = orcl_static)
           (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
           (SID_NAME = orcl)
      )
)
# 配置$ORACLE_HOME/network/admin/tnsnames.ora
vi $ORACLE_HOME/network/admin/tnsnames.ora
DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.51)(PORT = 1521))
    )
  (CONNECT_DATA =
    (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
# 静态监听要加上(UR=A)强行访问
DB2 = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.52)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_static)
      (UR=A)
    )
  )

六、根据主库配置进行从库配置(从库)

等待主库传输initorcl.ora和orapworcl文件,创建以下相关目录。

mkdir -p /u01/flashback/recovery_area
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/oradata/ORCL
mkdir -p /u01/app/oracle/oradata/ORCL2
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
-- 创建pfile文件
export ORACLE_SID=orcl
-- 修改initorcl.ora
将*.db_unique_name='orcl2'加上
将*.standby_file_management='AUTO'改为*.standby_file_management='MANUAL',这里主要是后续传输日志时,会涉及到命名问题。
sqlplus / as sysdba
create spfile from pfile='/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initorcl.ora';
--启动备库至nomount
startup nomount;
-- 启动监听
lsnrctl start  LISTENER_STATIC
lsnrctl status LISTENER_STATIC
-- 若发现orcl服务下面存在
Services orcl ...
orcl_static ... UNKNOWN ... 这个是静态监听
orcl ... BLOCKED ... 这个是动态监听

-- 这个时候需要重新将静态监听配置listener.ora文件将,GLOBAL_DBNAME=db1改成db2或者其它,重启监听器
Services orcl ...
orcl_static ... UNKNOWN ... 这个是静态监听
Services db1 ...
orcl ... BLOCKED ... 这个是动态监听
-- 然后修改 主库和从库 的 tnsnames.ora将从库监听指向db2服务,后面测试tnsping db2 测试连通性,可以看到(UR=A)就是监听静态
DB2 = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.52)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_static)
      (UR=A)
    )
  )
  
-- 测试连通性
sqlplus sys/"Ab123456!"@DB1 as sysdba
sqlplus sys/"Ab123456!"@DB2 as sysdba

 

七、开始传输日志文件(主库)

-- 主库,连接RMAN并duplicate主库到从库
rman target sys/"Ab123456!"@DB1 auxiliary sys/"Ab123456!"@DB2 nocatalog
duplicate target database for standby from active database nofilenamecheck;

八、配置日志连接(从库)

-- 归档模式已打开
archive log list;
-- 数据库角色应为PHYSICAL STANDBY,打开模式为MOUNTED
select database_role, protection_mode, protection_level, open_mode from v$database;
 
-- 开启日志应用进程:
alter database recover managed standby database using current logfile disconnect from session;
-- 查看进度
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence#;
-- 查看日志情况
select process,block#,blocks ,status ,sequence# from v$managed_standby;
-- 取消(若STATUS=APPLYING_LOG为正常,否则可以尝试取消重启)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 
-- 开启只读模式
ALTER DATABASE OPEN READ ONLY;    
-- 应返回 "READ ONLY"
SELECT OPEN_MODE FROM V$DATABASE;  
-- 开启日志
alter database recover managed standby database using current logfile disconnect from session; 

-- 查看日志情况
select process,block#,blocks ,status ,sequence# from v$managed_standby;

--主库的ARCH进程负责向备库发送日志;
--备库的RFS进程负责接收日志,没有此进程则备库无法接收,说明dataguard没有搭建成功;
--MRP0是将接收到的日志应用到数据库中的进程。主库切换日志后,MRP0的序列号会变
--主库的LNS进程序列号与备库的MRP0一致  


--将管理从MANUAL改回AUTO
ALTER SYSTEM SET standby_file_management = AUTO SCOPE=BOTH;
SHOW PARAMETER standby_file_management;
-- 或
SELECT name, value FROM v$parameter WHERE name = 'standby_file_management';

 

九、测试同步日志和数据

-- 主库,切换日志logfile
alter system switch logfile;

-- 主库,查看日志
Current log sequence 会变化,与备库MRP0一致(也会变化)

-- 从库
-- 查看日志情况
select process,block#,blocks ,status ,sequence# from v$managed_standby;

--主库的ARCH进程负责向备库发送日志;
--备库的RFS进程负责接收日志,没有此进程则备库无法接收,说明dataguard没有搭建成功;
--MRP0是将接收到的日志应用到数据库中的进程。主库切换日志后,MRP0的序列号会变
--主库的LNS进程序列号与备库的MRP0一致  

以上都成功后,后续可以插入数据,修改数据等操作,查看是否同步到从库。

 

posted @ 2025-05-26 21:26  Auler  阅读(169)  评论(0)    收藏  举报