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一致
以上都成功后,后续可以插入数据,修改数据等操作,查看是否同步到从库。

浙公网安备 33010602011771号