一台linux下oracle DG搭建


standby:

物理Standby  ····· 与primary 库结构一模一样,提供灾备,减少IO/CPU 占用  (灾难恢复高可用性)

逻辑standby  ·····  与primary 库结构不同(可以创建除primary库存在的索引..) (灾难恢复高可用性/业务需求#ddl/dml)

 

物理standby 特点

灾难恢复及高可用性:物理standby 提供了一个健全而且极高效的灾难恢复及高可用性的解决方案。更加易于管理的switchover/failover 角色转换及最更短的计划内或计划外停机时间。

数据保护:应用物理standby 数据库,Dg 能够确保即使面对无法预料的灾害也能够不丢失数据。前面也提到物理standby 是基于块对块的复制,因此对象、语句统统无关,primary 数据库上有什么,物理standby 也会有什么。

分担primary 数据库压力:通过将一些备份任务、仅查询的需求转移到物理standby,可以有效节省primary 数据库的cpu以及i/o 资源。

提升性能:物理standby 所使用的redo 应用技术使用最底层的恢复机制,这种机制能够绕过sql 级代码层,因此效率最高。

逻辑standby 的特点:

除了上述物理standby 中提到的类似灾难恢复,高可用性及数据保护等之外,还有下列一些特点:

有效的利用standby 的硬件资源:

除灾难恢复外,逻辑standby 数据库还可用于其它业务需求。比如通过在standby 数据库创建额外的索引、物化视图等提高查询性能并满足特定业务需要。又比如创建新的schema(primary 数据库并不存在)然后在这些schema 中执行ddl 或者dml 操作等。

分担primary 数据库压力:

逻辑standby 数据库可以在更新表的时候仍然保持打开状态,此时这些表可同时用于只读访问。这使得逻辑standby 数据库能够同时用于数据保护和报表操作,从而将主数据库从那些报表和查询任务中解脱出来,节约宝贵的CPU 和I/O 资源。

平滑升级:

比如跨版本升级啦,打小补丁啦等等,应该说应用的空间很大,而带来的风险却很小(前提是如果你拥有足够的技术实力。另外虽然物理standby 也能够实现一些升级操作,但如果跨平台的话恐怕就力不从心,所以此项就不做为物理standby 的特点列出了),我个人认为这是一种值的推荐

的在线的滚动的平滑的升级方式

 

Data Guard保护模式(Data Guard ProtectionModes)

1.最大保护模式:

1).这种模式提供了最高级别的数据保护能力

2).重做日志在至少一个物理从库数据库后,主库的事务才能够提交

3).主库找不到合适的从库写入时,主库会自动关闭,防止无保护的数据出现

4).优点:该模式可以保证从库没有数据丢失

5).缺点:主库的自动关闭会影响到主库的可用性,同时需要从库恢复后才能提交,对网络等客观条件要求非常的高,主库的性能会受到非常大的影响。

 

2.最大可用性模式:

1).这种模式提供了仅次于“最大保护模式”的数据保护能力

2).重做日志在至少一个物理从库数据库后,主库的事务才能够提交

3).主库找不到合适的从库写入时,主库不会关闭,而是临时降低到“最大性能模式”模式,直到问题得到处理

4).优点:该模式可以在没有问题出现的情况下保证从库没有数据丢失,是一种折中的方法

5).缺点:在正常运行的过程中缺点是主库的性能收到诸多因素的影响

 

3.最大性能模式:

1).默认模式,提供主数据库的最高可用性

2).保证主库运行过程中不受从库的影响,主库事务正常提交,不因从库的任何问题影响到主库的运行

4).优点:避免了从库对主数据库的性能和可用性影响

5).缺点:如果与主库提交的事务相关的恢复数据没有发送到从库,这些事务数据将被丢失,不能保证数据无损失

 

也可以理解为:

最大性能:standby库要是坏了或者网络问题与primary连接不好,primary会继续工作,俩者网络没有问候会自动的将redolog传到standby,执行应用redolog会将网络不正常期间的redolog应用

最大保护:standby 挂了,primary shutdown ,等着都修复好了  primary再用

最大可用:standby 挂了,primary 不shutdown 但是等着standby 修复好了再用

 

搭建的大体思路

1、Primary 开归档,force logging强制生成日志;
2、配置standby的口令文件,拷贝到standby;
3、配置tns、listener参数文件;
4、关闭主库 ,拷贝数据文件到standby;
5、在primary 创建standby  .ctl文件到standby;
6、创建primary库的pfile文件,配置pfile文件,并拷贝到standby库,修改standby的pfile;
7、standby启动到mount/alter database mount standby database,应用redo log ,physics standby 在read only时(这面先取消应用redo log ,在open read only)

步骤流程:

 

(SID)test ········· primary   主库

(SID)standby ········· standby   备库

SQL> set sqlprompt primary>

primary>archive log list;  查看归档

1、开启primary归档

primary>shutdown immediate

primary>Startup mount

primary>Alter database (no)archivelog;

primary>archive log list;

primary>archive log list

Database log mode        Archive Mode
Automatic archival        Enabled
Archive destination        /data/ora_test_bak
Oldest online log sequence     15
Next log sequence to archive   17
Current log sequence        17

 

2、开启primary的force logging


primary>Alter database (no) force logging;

primary> select force_logging from v$database;

FOR
---
YES

3、配置监听tnsname.ora和listener.ora

------------配置tnsnames.ora

# tnsnames.ora Network Configuration File: /data/app/oracle/product/10.1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

TEST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = s_1_35)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test)
    )
  )

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

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )


------------配置listener.ora

# listener.ora Network Configuration File: /data/app/oracle/product/10.1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /data/app/oracle/product/10.1)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = s_1_35)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

------关闭,重启监听

lsnrctl stop       关闭监听

lsnrctl start      开启监听

------验证解析情况:

tnsping orcl1    

tnsping orcl2

4、修改primary的pfile文件

test.__db_cache_size=411041792
test.__java_pool_size=4194304
test.__large_pool_size=4194304
test.__shared_pool_size=180355072
test.__streams_pool_size=0
*.audit_file_dest='/data/app/oracle/admin/test/adump'
*.background_dump_dest='/data/app/oracle/admin/test/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/data/app/oracle/oradata/test/control01.ctl','/data/app/oracle/oradata/test/control02.ctl','/
data/app/oracle/oradata/test/control03.ctl'
*.core_dump_dest='/data/app/oracle/admin/test/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='test'
*.db_recovery_file_dest='/data/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=201326592
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=605028352
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/data/app/oracle/admin/test/udump'
############增加以下内容
*.db_file_name_convert='/data/app/oracle/oradata/test','/data/app/oracle/oradata/standby'
*.fal_client='TEST' ---tnsname 中的服务名
*.fal_server='STANDBY'
-----主、备库unique_name 一致(使用unique_name)
*.log_archive_config='dg_config=(test,standby)'
*.log_archive_dest_1='location=/data/ora_test_bak valid_for=(all_logfiles,all_roles db_unique_name=test'
-----------SERVICE= 指的是service服务名 ,
*.log_archive_dest_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stand
by'
*.log_file_name_convert='/data/ora_test_bak','/data/app/oracle/oradata/standby/archive'


5、拷贝primary的pfile文件到standby,修改standby的pfile,

standby.__db_cache_size=411041792 ----修改test为standby
standby.__java_pool_size=4194304
standby.__large_pool_size=4194304
standby.__shared_pool_size=180355072
standby.__streams_pool_size=0
*.audit_file_dest='/data/app/oracle/oradata/standby/adump'
*.background_dump_dest='/data/app/oracle/oradata/standby/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/data/app/oracle/oradata/standby/control02.ctl'
*.core_dump_dest='/data/app/oracle/oradata/standby/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_recovery_file_dest='/data/app/oracle/oradata/standby/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=201326592
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=605028352
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/data/app/oracle/oradata/standby/udump'
--------增加修改下面的内容
db_unique_name='standby'
*.db_name='test' --必须与主库一致
*.db_file_name_convert='/data/app/oracle/oradata/standby','/data/app/oracle/oradata/test'
*.fal_client='standby'
*.fal_server='test'
*.log_archive_config='dg_config=(test,standby)'
*.log_archive_dest_1='location=/data/app/oracle/oradata/standby/archive valid_for=(all_logfiles,all_roles db_u
nique_name=standby'
*.log_archive_dest_2='SERVICE=test LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'
*.log_file_name_convert='/data/app/oracle/oradata/standby/archive','/data/ora_test_bak'

 

6.创建standby 库对应的目录(根据pfile指定的目录)

mkdir -p /data/app/oracle/oradata/standby

mkdir -p /data/app/oracle/oradata/standby/flash_recovery_area

mkdir -p /data/app/oracle/oradata/standby/udump

mkdir  -p /data/app/oracle/oradata/standby/adump

mkdir -p /data/app/oracle/oradata/standby/bdump

mkdir -p /data/app/oracle/oradata/standby/cdump

mkdir -p /data/app/oracle/oradata/standby/archive

7、创建密码文件

[oracle@primary dbs]$ orapwd file=orapwprimary password=oracle entries=10 force=y

[oracle@primary dbs]$ cp orapwtest orapwstandby

8、创建standby控制文件,控制文件路径与standby的参数文件中指定的控制文件路径一致

alter database create standby controlfile as 'E:\app\Administrator\oradata\orcl2\CONSTB. CTL';

9、关闭primary库,拷贝数据文件到standby

primary> shutdown immediate

primary> cp /data/app/oracle/oradata/test/*.dbf /data/app/oracle/oradata/standby


10、启动standby到mount状态

standby> startup mount pfile=‘/data/app/oracle/product/10.1/dbs/initstandby.ora';


11、Primary 库 启动到mount 看下参数文件是否生效

primary> Select DBID,NAME,DATABASE_ROLE,DB_UNIQUE_NAME, OPEN_MODE,LOG_MODE,SWITCHOVER_STATUS,CURRENT_SCN  from v$database;

      DBID NAME      DATABASE_ROLE    DB_UNIQUE_NAME       OPEN_MODE
---------- --------- ---------------- ------------------------------ ----------
LOG_MODE     SWITCHOVER_STATUS   CURRENT_SCN
------------ -------------------- -----------
2145798395 TEST      PRIMARY       test        READ WRITE
ARCHIVELOG   SESSIONS ACTIVE    2.3995E+10

 
standby> Select DBID,NAME,DATABASE_ROLE,DB_UNIQUE_NAME, OPEN_MODE,LOG_MODE,SWITCHOVER_STATUS,CURRENT_SCN  from v$database;

      DBID NAME      DATABASE_ROLE    DB_UNIQUE_NAME       OPEN_MODE
---------- --------- ---------------- ------------------------------ ----------
LOG_MODE     SWITCHOVER_STATUS   CURRENT_SCN
------------ -------------------- -----------
2145798395 TEST      PHYSICAL STANDBY standby        MOUNTED
ARCHIVELOG   RECOVERY NEEDED    2.3995E+10


注:unique_name/archivelog路径都正确,switchover_status=not allowed (当前数据库不是带有备用数据库的主数据库)
TO STANDBY 正确

开始Standby 库  应用redo log、

在改成应用之前注意下~  standby现在的数据文件是primary的,控制文件还没有改位置,

如果没改.dbf文件位置的话,standby 库应用redo log的时候归档是能传输的,但是不应用(相当于standby read only)

Standby 应用redo log  primary 切换,switchover_status è recovery needed 就是说明归档传输但没有应用(没改位置)

12、控制文件记录primary的数据文件和日志文件路径,更改为standby的文件路径


standby> alter database rename file '/data/app/oracle/oradata/test/SYSAUX01.DBF' to '/data/app/oracle/oradata/test/SYSAUX01.DBF';                ·····所有文件

standby> alter database recover managed standby database disconnect from session;   ··应用redo log

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; -----取消日志应用


standby> select DBID,NAME,DATABASE_ROLE,DB_UNIQUE_NAME, OPEN_MODE,LOG_MODE,SWITCHOVER_STATUS,CURRENT_SCN  from v$database;看下状态      ····to primary    应该成功(也证明了可以切换到primary库中)

standby> alter system set standby_file_management=manual/auto;       ------配置standby模式为手动/自动管理


13、测试  primary 归档的传输:

Alter system switch logfile;  切换归档测试

14、测试primary数据更改同步

primary>create table test.test(id number(1));

primary>insert into test.test values(1);commit;

primary>alter system switch logfile;


这个时候在standby 备库上查看数据同步没有

首先关闭应用redo log,这时primary归档还是传到standby,但不应用,再起startup 在应用redo log 的时候才去应用

Standby> alter database recover managed standby database finish force ;    ···关闭应用redo log

Standby> alter database open read only;只读形式打开

看下test.test表数据

 

测试能实时同步之后,standby 库要重启开启应用redo log;  保证standby库应用redo log

创建切归档日志组

alter  database add standby logfile('/u01/oradata/steve/standlog01.tdo' ) size 10m;

 

----主库上切到最大可用模式(看需求)
sq>alter database set standby database to maximize  availability

 

主备切换:

先将主库切换成备库,将原主库启动到物理库的状态,之后在备库切换到主库(要是单一的只切换备库到主库的话,主库要是正在用的情况下,切完,马上就停用了)

主—备—物理备

select switchover_status from v$database;    ···TO STANDBY

Alter database commit to switchover to physical standby with session shutdown;  ··主—备

shutdown immediate

startup nomount

alter database mount standby database;

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;   ··备—物理备库

 

Standby 切换到primary库

Standby>  SELECT SWITCHOVER_STATUS FROM V$DATABASE;           ····TO PRIMARY/ NOT ALLOWED

Standby > archive log list;

数据库日志模式            存档模式

自动存档             启用

存档终点            E:\app\ARC_ORCL2\

最早的联机日志序列     82

下一个存档日志序列   0

当前日志序列           84

Standby > alter database commit to switchover to primary;    ··· 切换命令

Standby > archive log list;

数据库日志模式            存档模式

自动存档             启用

存档终点            E:\app\ARC_ORCL2\

最早的联机日志序列     1

下一个存档日志序列   1

当前日志序列           1    ···归档是1

Standby > select DATABASE_ROLE from v$database;

DATABASE_ROLE

----------------

PRIMARY                 ······为主库

Standby > alter database open;····查看数据

数据库已更改。

Standby > conn test/test

已连接。

Standby >  select OPEN_MODE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;

OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL          SWITCHOVER_STATUS

-------------------- -------------------- ------------------------------------------

READ WRITE           MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE       RESOLVABLE GAP

Standby > select * from test.test;

1

Standby > insert into test.test values(5);

已创建 1 行。

Standby > commit;

提交完成。

Standby > alter system switch logfile;

系统已更改。

Standby > archive log list;

数据库日志模式            存档模式

自动存档             启用

存档终点            E:\app\ARC_ORCL2\

最早的联机日志序列     1

下一个存档日志序列   1

当前日志序列           2

 

备库查看RFS接收日志情况和MRP应用日志同步主库情况

SQL>select PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS from v$managed_standby

 

保护模式:

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;   最大保护

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;  最大性能

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY; 最高可用

从最大性能--- 最高可用性

1、首先查看当前的保护模式---primary 数据库操作

SQL> select protection_mode,protection_level from v$database;

PROTECTION_MODE PROTECTION_LEVEL

-------------------- --------------------

MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

2、修改初始化参数--primary 数据库操作

SQL> alter system set log_archive_dest_2='SERVICE=orcl2

2 OPTIONAL LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

3 DB_UNIQUE_NAME=orcl2;

系统已更改。

3、设置新的数据保护模式并重启数据库--primary 数据库操作

SQL> alter database set standby database to maximize availability;

 

各个库间的切换

Alter database commit to switchover to physical standby with session shutdown; ··主—物理备

ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;                        ··主--逻辑备

alter database commit to switchover to physical standby;                       ··主--物理备

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;       ··备—物理备

alter database recover to logical standby orcl2;                               ··物理备—逻

alter database commit to switchover to primary;                                ··物理备--主

ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY ;                              ··逻辑备--主