一台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、创建密码文件
[[email protected] dbs]$ orapwd file=orapwprimary password=oracle entries=10 force=y
[[email protected] 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 ; ··逻辑备--主