Centos7 oracle 11G 搭建ADG

Centos7 oracle 11G R2 搭建ADG

复制代码
主节点 192.168.46.61 oracleMaster

备节点 192.168.46.62 oracleSlave

1、登录到sysdba 用户

如果不说明则下面的操作都是在此用户下进行操作

复制代码
sqlplus / as sysdba

2、检查数据库是否启动了强日志模式并且启动归档(主库)

sql 复制代码
SQL> select name, log_mode, force_logging from v$database;

NAME      LOG_MODE     FOR
--------- ------------ ---
ORCL      NOARCHIVELOG NO

如显示 NO 则当前未启动强日志模式,NOARCHIVELOG 表示当前日志模式未未归档模式

2.1、启动强日志模式(主库)

sql 复制代码
SQL> alter database force logging;

Database altered.

2.2、开启归档模式(主库)

需要重启实例至mount状态

sql 复制代码
## 关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2220200 bytes
Variable Size             318771032 bytes
Database Buffers          742391808 bytes
Redo Buffers                5554176 bytes
Database mounted.

## 开启归档模式
SQL> alter database archivelog;

Database altered.

## 打开数据库
SQL> alter database open;

Database altered.

## 检查一下归档是否已开启
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     9
Next log sequence to archive   11
Current log sequence           11

3、创建 standby redolog 日志组(主库)

3.1、首先查询下当前实例日志组个数

sql 复制代码
SQL> select thread#,group#,bytes/1024/1024 from v$log;

   THREAD#     GROUP# BYTES/1024/1024
---------- ---------- ---------------
         1          1              50
         1          2              50
         1          3              50

当前实例日志组个数为3,所以需要至少需要创建(3+1)* 1 = 4组 standby redolog,大小均为50M。

sql 复制代码
SQL> col member for a50
SQL> select group#,member from v$logfile;

    GROUP# MEMBER
---------- --------------------------------------------------
         3 /data/oracle/oradata/orcl/redo03.log
         2 /data/oracle/oradata/orcl/redo02.log
         1 /data/oracle/oradata/orcl/redo01.log

3.2、新建4个 standby redolog 日志组,编号从4开始:

路径根据上面的改写,因为每个人的安装位置不同

sql 复制代码
SQL> alter database add standby logfile group 4 '/data/oracle/oradata/orcl/standby_redo04.log' size 50M;
SQL> alter database add standby logfile group 5 '/data/oracle/oradata/orcl/standby_redo05.log' size 50M;
SQL> alter database add standby logfile group 6 '/data/oracle/oradata/orcl/standby_redo06.log' size 50M;
SQL> alter database add standby logfile group 7 '/data/oracle/oradata/orcl/standby_redo07.log' size 50M;

3.3、查看日志组成员情况

sql 复制代码
SQL> set pagesize 100
SQL> col member for a60
SQL> select group#,member from v$logfile order by group#;

    GROUP# MEMBER
---------- ------------------------------------------------------------
         1 /data/oracle/oradata/orcl/redo01.log
         2 /data/oracle/oradata/orcl/redo02.log
         3 /data/oracle/oradata/orcl/redo03.log
         4 /data/oracle/oradata/orcl/standby_redo04.log
         5 /data/oracle/oradata/orcl/standby_redo05.log
         6 /data/oracle/oradata/orcl/standby_redo06.log
         7 /data/oracle/oradata/orcl/standby_redo07.log

7 rows selected.

查询到的话则表示添加成功

4、⭐️修改 listener.ora 文件 ⭐️

4.1、修改主库的 listener.ora 文件

sql 复制代码
[oracle@oracleMaster dbs]$ cd $ORACLE_HOME/network/admin/
[oracle@oracleMaster admin]$ vim $ORACLE_HOME/network/admin/listener.ora
bash 复制代码
SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME= orcl.master)
      (ORACLE_HOME=/data/oracle/product/11.2.0/db_01)
      (SID_NAME=orcl)
    )
  )

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

ADR_BASE_LISTENER = /data/oracle

4.2、修改备库的listener.ora 文件

bash 复制代码
SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME= orcl.slave)
      (ORACLE_HOME=/data/oracle/product/11.2.0/db_01)
      (SID_NAME=orcl)
    )
  )


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

ADR_BASE_LISTENER = /data/oracle

由于我的主库和备库使用不同的 GLOBAL_DBNAME,所以此处和大多数的教程不同,需要根据你安装的 oracle 去修改对应的 GLOBAL_DBNAME、ORACLE_HOME、SID_NAME

4.3、配置说明

LISTENER:

  • 在安装完 oracle 启动监听程序时此配置自动生成

SID_LIST_LISTENER:

  • GLOBAL_DBNAME:对应文件 /home/oracle/response/dbca.rsp 中的 GDBNAME 配置项
  • ORACLE_HOME:为环境变量 /home/oracle/.bash_profile 文件中的 ORACLE_HOME 配置项
  • SID_NAME:对应文件 /home/oracle/response/dbca.rsp 中的SID配置项

也可以通过sql 查询出来

sql 复制代码
## 查询GLOBAL_NAME
SQL>  select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL.MASTER

## 查询SID
SQL> show parameter instance_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      orcl

4.4、glocal_name、service_name、oracle_sid区别

glocal_name

对一个数据库的唯一标识,在创建数据库的时候决定,缺省值为db_name.db_domain。在之后对参数文件中db_name 和 db_domain 参数的任何修改都不影响 global_name的值,如果要修改 glocal_name,只能

sql 复制代码
SQL> alter database rename global_name to <db_name,db_domain>

来进行修改,然后修改相应的参数

service_name

在 oracle 的并行环境中,一个数据库对应多个实例,就需要多个网络服务名,设置比较繁琐。service_name 参数就是为了解决这个问题,该参数对应一个数据库,而不是一个实例,缺省值为 db_name.db_domain,即等于global_name。一个数据库可以对应多个 service_name.

oracle_sid

oracle_sid这个参数是操作系统中用到的,他是描述默认连接的数据库实例。instance_name是数据库参数。而oracle_sid 是操作系统的环境变量,oracle_sid 必须与 instance_name 的值一致。

4.5、重启监听

4.5.1、重启主库
sql 复制代码
[oracle@oracleMaster admin]$ lsnrctl reload
4.5.2、重启备库
sql 复制代码
[oracle@oracleSlave admin]$ lsnrctl reload

5、⭐️tnsname.ora文件⭐️

5.1、修改主库tnsname.ora

bash 复制代码
vim $ORACLE_HOME/network/admin/tnsnames.ora

增加如下配置,原有配置删除修改为下面的配置

bash 复制代码
PRI =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.46.61)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.master)
    )
  )

STY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.46.62)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.slave)
    )
  )

配置解释

5.2、修改备库tnsname.ora

将主库的配置 copy 过去即可

bash 复制代码
scp $ORACLE_HOME/network/admin/tnsnames.ora oracle@oracleSlave:$ORACLE_HOME/network/admin/tnsnames.ora

5.3、测试连接

5.3.1、主库
bash 复制代码
## 测试连接
[oracle@oracleMaster admin]$  tnsping STY
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 17-JUL-2023 04:02:58

Copyright (c) 1997, 2009, Oracle.  All rights reserved.

Used parameter files:
/data/oracle/product/11.2.0/db_01/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracleSlave)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.slave) (SID = orcl)))
OK (0 msec)
5.3.2、备库
bash 复制代码
[oracle@oracleSlave admin]$ tnsping PRI

6、修改 primary pfile

6.1、创建 pfile 文件

sql 复制代码
## 查看主库 spfile 文件位置
SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /data/oracle/product/11.2.0/db
                                                 _01/dbs/spfileorcl.ora
## 创建 pfile 文件用于修改                                                
SQL> create pfile from spfile;

File created.

6.2、修改 pfile 文件

文件命名方式为initXX.ora XX 为数据库的 SID 通过下面的SQL 查询

具体的配置参数请参考博客 Oracle 11g Dataguard参数详解

sql 复制代码
show parameter instance_name;
bash 复制代码
[oracle@oracleMaster dbs]$ vim /$ORACLE_HOME/dbs/initorcl.ora

log_archive_dest_state_N

  • LOG_ARCHIVE_DEST_n配套使用的参数,默认值为enable

    bash 复制代码
    log_archive_dest_state_1=enable

log_archive_dest_1

  • 本地数据的配置

log_archive_dest_(2-N)

  • 备端数据库的配置,可以配置多个序号依次递增

DB_FILE_NAME_CONVERT

  • 在备库中,该参数允许你逻辑上将数据文件从主库迁移到备库上,如果你使用的是基于磁盘的存储结构并且存储路径在两个系统上并不相同,那么就有必要配置它。
  • 只有在备库切换为主库这期间,该转换才会执行。一旦进行主备切换或者故障切换到备库,这些值就会被写入到控制文件和数据文件头。通过简单的字符替换就可以实现功能。

LOG_FILE_NAME_CONVERT

  • 它的功能和DB_FILE_NAME_CONVERT参数相同,只不过这里转换的是日志文件,包括ORL文件和任何SRL文件。

FAL_SERVER

  • 向主库或者任意备库的TNS标识符列表

  • 多个主库或者备库使用逗号间隔

    bash 复制代码
    fal_server='PRI,PRI1'

FAL_CLIENT

  • 发起间隔请求的数据库的TNS名称,当前机器的TNS名称

    bash 复制代码
    fal_client='PRI'

STANDBY_FILE_MANAGEMENT

  • 这个简单的参数只用于物理备库。该参数设置成AUTO的时候,主库中添加和删除数据文件的同时,备库中也会自动的进行相应的更改。

  • 默认情况下,这个参数的值为MANUAL,这意味着备库上的应用进程不会创建新的数据文件,你需要手动创建它们

  • standby_file_management='AUTO'

*.undo_tablespace='UNDOTBS1' 下面增加如下参数,文件中不能使用中文等特殊字符不然启动不了

bash 复制代码
*.db_unique_name='PRI'
*.log_archive_config='DG_CONFIG=(PRI,STY)'
*.log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(ALL_LOGFILES,ALL_ROLES) db_unique_name=PRI'
*.log_archive_dest_2='service=STY SYNC REOPEN=15 NET_TIMEOUT=15 valid_for=(ALL_LOGFILES,ALL_ROLES) db_unique_name=STY'
*.standby_file_management='AUTO' 
*.fal_client='PRI' 
*.fal_server='STY' 

6.3、将pfile文件和密码文件传输到 standby端

bash 复制代码
scp initorcl.ora oracle@oracleSlave:/data/oracle/product/11.2.0/db_01/dbs

重新指定密码

bash 复制代码
orapwd file=orapworcl password=123456 force=y

将密码传输到 standby 端

bash 复制代码
scp orapworcl oracle@oracleSlave:$ORACLE_HOME/dbs/orapworcl

6.4、primary 设置数据库以 pfile启动

bash 复制代码
[oracle@oracleMaster dbs]$ sqlplus / as sysdba
sql 复制代码
## 先停掉数据库
SQL> shutdown immediate

## 从刚才修改的 pfile 创建 spfile并重启数据库
SQL> create spfile from  pfile='/data/oracle/product/11.2.0/db_01/dbs/initorcl.ora';

File created.

## 启动数据库,检查对pfile的修改已经生效:
SQL> startup
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2220200 bytes
Variable Size             318771032 bytes
Database Buffers          742391808 bytes
Redo Buffers                5554176 bytes
Database mounted.
Database opened.

## 查看归档日志
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /data/oracle/oradata/orcl/archive
Oldest online log sequence     11
Next log sequence to archive   13
Current log sequence           13

上面的 Archive destination 的参数值 /data/oracle/oradata/orcl/archive 可以看出 pfile 已经生效

## 查看数据库是否用spfile启动
SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /data/oracle/product/11.2.0/db
                                                 _01/dbs/spfileorcl.ora

7、修改 standby pfile

7.1、修改 standby 端初始化参数文件

bash 复制代码
vim /$ORACLE_HOME/dbs/initorcl.ora

*.undo_tablespace='UNDOTBS1' 下面替换成如下参数

bash 复制代码
*.db_unique_name='STY'
*.log_archive_config='DG_CONFIG=(STY,PRI)'
*.log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(ALL_LOGFILES,ALL_ROLES) db_unique_name=STY'
*.log_archive_dest_2='service=PRI SYNC REOPEN=15 NET_TIMEOUT=15 valid_for=(ALL_LOGFILES,ALL_ROLES) db_unique_name=PRI'
*.standby_file_management='AUTO'
*.fal_client='STY'
*.fal_server='PRI'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable

7.2、设置数据库以 pfile启动

sql 复制代码
## 先停掉数据库
SQL>  shutdown immediate

## 从刚才修改的 pfile 创建 spfile并重启数据库
SQL> create spfile from  pfile='/data/oracle/product/11.2.0/db_01/dbs/initorcl.ora';

File created.

## 以 nomount 状态启动数据库
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  830930944 bytes
Fixed Size            2217912 bytes
Variable Size          641730632 bytes
Database Buffers      180355072 bytes
Redo Buffers            6627328 bytes

7.3、利用RMAN在备库上恢复主库。

bash 复制代码
[oracle@oracleSlave orcl]$ rman target sys/123456@PRI auxiliary sys/123456@STY

Recovery Manager: Release 11.2.0.1.0 - Production on Mon Jul 17 02:17:16 2023

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1669896784)
connected to auxiliary database: ORCL (not mounted)

执行恢复:这个命令可以直接恢复数据文件、standby日志文件和控制文件。

bash 复制代码
RMAN> duplicate target database for standby from active database nofilenamecheck;

退出

bash 复制代码
RMAN> quit

7.4、Open Read Only standby数据库并且开启实时日志应用

sql 复制代码
## 停止数据库
shutdown immediate

## 启动数据库,此时opne_mode 为READ ONLY WITH APPLY
startup

## 查看当前 openmode
select database_role,protection_mode,protection_level,open_mode from v$database;

## 查看归档日志进程
select process,client_process,sequence#,status from v$managed_standby;

## 开启实时日志应用
recover managed standby database using current logfile disconnect from session;

## 查看归档日志进程,此时多了一个进程 MRP0      N/A              20 APPLYING_LOG
select process,client_process,sequence#,status from v$managed_standby;

8、检查主库和备库的归档序列号是否一致

归档,当有部分日志还没有被应用,主要是因为日志还没归档,可以执行

sql 复制代码
alter system switch logfile;

查看当前序列号

sql 复制代码
archive log list;

9、验证数据是否同步

sql 复制代码
create table test_sync(id varchar2(100));

select count(*) from test_sync;

begin
  for i in 1..10000 loop
  insert into test_sync values ('ww');
  end loop;
  end;
    /
    
commit;

从库查看数据是否同步过来

sql 复制代码
SQL> select count(*) from test_sync;

  COUNT(*)
----------
     10000

当前ADG配置完成

10、adg 打开关闭步骤

10.1、关闭ADG

sql 复制代码
主库shutdown------>备库取消应用归档日志------>关闭备库------>关闭主库和备库的lsnrctl监听。

1:主库上:SQL> shutdown immediate

2:备库上:SQL> alter database recover managed standby database cancel;

3:备库上:SQL> shutdown immediate

4:主库和备库:

[oracle@oracleMaster ~]$ lsnrctl stop

[oracle@oracleSlave ~]$ lsnrctl stop

10.2、启动adg

sql 复制代码
启动主库和备库lsnrctl监听------>启动备库------>启动主库------>切换主库日志

1:主库和备库:
[oracle@oracleMaster ~]$ lsnrctl start

[oracle@oracleSlave ~]$ lsnrctl start

2:启动备库:
SQL> startup nomount
SQL> alter database mount standby database;
SQL> alter database open read write;
SQL> alter database recover managed standby database using current logfile disconnect 

3:启动主库:
SQL> startup

4:切换主库日志
SQL> alter system switch logfile;
备库将开始应用主库传输过来的归档日志。

10、相关操作

10.1、查看保护模式

sql 复制代码
select database_role,protection_mode,protection_level,open_mode from v$database;

10.2、查看当前进程

sql 复制代码
select process,client_process,sequence#,status from v$managed_standby;

10.3、查看控制日志同步的参数检查

sql 复制代码
select process,client_process,sequence#,status from v$managed_standby;

10.4、查看日志归档参数

sql 复制代码
show parameter log_archive_dest_2

10.5、查看当前序列号

sql 复制代码
archive log list;

10.6、开启实时日志应用

sql 复制代码
SQL> recover managed standby database using current logfile disconnect from session;
相关推荐
言德斐12 小时前
SQL性能优化的思路及策略
数据库·sql·性能优化
码界奇点12 小时前
Django视图从基础到高级的全面解析
数据库·django·sqlite·web·python3.11
Allan_202512 小时前
数据库学习
数据库·学习
fen_fen12 小时前
人大金仓数据库kingbase8创建表示例
数据库·oracle
一勺菠萝丶12 小时前
「您的连接不是私密连接」详解:为什么 HTTPS 证书会报错,以及如何正确配置子域名证书
数据库·网络协议·https
²º²²এ松13 小时前
蓝牙低功耗(BLE)通信的中心设备/外围设备(连接角色)、主机/从机(时序角色)、客户端/服务器(数据交互角色)的理解
运维·服务器·数据库
百锦再13 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
数据库知识分享者小北14 小时前
云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
数据库·人工智能·云原生
_Johnny_14 小时前
Redis 升级操作指南:单机与主从模式
数据库·redis·缓存