linux下10goracle datagard(stand…

来源:互联网 发布:mysql异地容灾方案 编辑:程序博客网 时间:2024/05/17 07:11

DataGard(搭建版)

分类: DG/RAC 2011-08-27 00:06 244人阅读 评论(0) 收藏 举报

 

物理DataGard搭建、主备switchover、物理DataGard转逻辑DataGard

 

第一大步:基本信息配置:

配置主机名:

hostname dg01.cluster.com

vim /etc/hosts

10.1.1.36 dg01.cluster.com

10.1.1.37 dg02.cluster.com

vim /etc/sysconfig/network

主库操作:

SQL> alter database force logging;

DG两个库还会分为一些情况:

两个库的实例名是否一致?

两个库的db_name,instance_name,sid都可以一致

但是 db_unique_name 需要不一致

SQL> alter system set db_unique_name=priscope=spfile;

--因为这个是静态参数,所以只能改到spfile里,然后再重启数据库,那就违背了不关库的原则,那么你可以在这里不改,就用orcl,只改备库就好了;

--此实验为了方便,还是在这里改了一下,并重启生效

SQL> show parameter db_unique_name

NAME                                TYPE       VALUE

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

db_unique_name                      string     PRI

 

SQL> alter system setlog_archive_config='dg_config=(pri,std)';

SQL> ho mkdir /u01/oracle/arch

SQL> alter system setlog_archive_dest_1='location=/u01/oracle/arch/valid_for=(all_logfiles,all_roles) db_unique_name=pri';

 

SQL> alter system setlog_archive_dest_2='service=std lgwr asyncvalid_for=(online_logfiles,primary_role) db_unique_name=std';

SQL> show parameter log_archive_dest_state_1

SQL> show parameterlog_archive_dest_state_2  --确认这两个参数为enable的

SQL> show parameter log_archive_format

NAME                                TYPE       VALUE

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

log_archive_format                  string     %t_%s_%r.dbf   --格式默认就好

 

SQL> alter system set fal_server=std;

SQL> alter system setfal_client=pri;  --注意这里反着写的,表示切换后的主和备

=================================================

DB_FILE_NAME_CONVERT='boston','chicago'

LOG_FILE_NAME_CONVERT=

 '/arch1/boston/','/arch1/chicago/','/arch2/boston/','/arch2/chicago/'

--上面两个参数是官档上定义不同路径转换时用的,(也就是两个库路径不同,需要这样定义来转换)

--我们这里为了方便,做的两个库,路径是相同的,所以就不需要上面的两个参数

==============================================

SQL> alter system setstandby_file_management=auto;

SQL> alter database add standby logfile group 5'/u01/oracle/oradata/orcl/stredo5.log' size 50m;

SQL> alter database add standby logfile group 6'/u01/oracle/oradata/orcl/stredo6.log' size 50m;

SQL> alter database add standby logfile group 7'/u01/oracle/oradata/orcl/stredo7.log' size 50m;

SQL> alter database add standby logfile group 8'/u01/oracle/oradata/orcl/stredo8.log' size 50m;

--至此,参数修改完毕,然后由修改后的spfile创建一个pfile文件,以便拷到备库修改使用

SQL> create pfile from spfile;

第二大步:

[oracle@dg01 ~]$ mkdir /u01/oracle/bak

RMAN> backup format '/u01/oracle/bak/full_%U'database plus archivelog;

  --全备,注意加归档  

RMAN> backup format '/u01/oracle/bak/con_%U'current controlfile for standby;

   --注意控制文件要加一个forstandby,因为主库两边是不同的

第三大步:

考虑拷贝什么到备库

nomount   spfile

mount   controlfile

open    dbf

密码文件

所以要拷pfile (拷过去再修改),controlfile的备份(con_%U),全备(full_%U),密码文件

对备库的软件安装需求:

装oracle软件(路径保持一致),不需要装库

mkdir /u01/oracle/oradata/orcl

mkdir /u01/oracle/admin/orcl/{a,b,u,dp,c}dump -p

mkdir /u01/oracle/arch

mkdir /u01/oracle/bak

--创建这些目录,注意使用oracle用户去创建

[oracle@dg01 ~]$ scp /u01/oracle/10g/dbs/initorcl.oradg02.cluster.com:/u01/oracle/10g/dbs/

  --拷参数文件

[oracle@dg01 ~]$ scp /u01/oracle/bak/*dg02.cluster.com:/u01/oracle/bak/

  --拷控制文件和全备的rman备份

[oracle@dg02 ~]$ orapwd file=/u01/oracle/10g/dbs/orapworclpassword=oracle force=y

  --在备库重新密码文件,或者从主库scp过来也是一样

--注意,scp拷的时候请用oracle用户,否则用root用户拷过来,要修改权限

第四大步:

监听的配置

--主库上的监听配置

[oracle@dg01 ~]$ vim/u01/oracle/10g/network/admin/listener.ora

--注意要为dg01的主机名,或者ip,端口1521

[oracle@dg01 ~]$ vim/u01/oracle/10g/network/admin/tnsnames.ora

ORCL =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.36)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl)

    )

  )

--这一段是本来就有的,下面两段是加的

pri =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.36)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = pri)

    )

  )

std =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.37)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = std)

    )

  )

--备库上的监听配置

[oracle@dg02 ~]$ vim/u01/oracle/10g/network/admin/listener.ora

--要为备库的主机名或者IP,端口也为1521

 

[oracle@dg02 ~]$ vim/u01/oracle/10g/network/admin/tnsnames.ora

ORCL =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.37)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl)

    )

  )

--这一段默认就有,下面两段是加的

pri =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.36)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = pri)

    )

  )

std =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.37)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = std)

    )

  )

两边配置好监听后使用lsnrctl start命令启动监听

然后两边互相tnsping orcl

   tnsping pri

   tnsping std

--上面都互相能tnsping通,最好在备库上远程连接一下主库,要求成功,才说明监听没问题

[oracle@dg02 ~]$ uniread sqlplus sys/oracle@pri as sysdba

 

第五大步:恢复备库,使之和主库同步

--先修改主库上拷过来的pfile,把std和pri互换,注意手动去做,不要去替换

[oracle@dg02 ~]$ vim /u01/oracle/10g/dbs/initorcl.ora

orcl.__db_cache_size=83886080

orcl.__java_pool_size=4194304

orcl.__large_pool_size=4194304

orcl.__shared_pool_size=71303168

orcl.__streams_pool_size=0

*.audit_file_dest='/u01/oracle/admin/orcl/adump'

*.background_dump_dest='/u01/oracle/admin/orcl/bdump'

*.compatible='10.2.0.1.0'

*.control_files='/u01/oracle/oradata/orcl/control01.ctl','/u01/oracle/oradata/orcl/control02.ctl','/u01/oracle/oradata/orcl/control03.ctl'

*.core_dump_dest='/u01/oracle/admin/orcl/cdump'

*.db_block_size=8192

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_name='orcl'

*.db_recovery_file_dest='/u01/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=2147483648

*.db_unique_name='std'  --换

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

*.fal_client='std'   --换

*.fal_server='pri'   --换

*.job_queue_processes=10

*.log_archive_config='dg_config=(std,pri)' --可换可不换,这里我还是换了

*.log_archive_dest_1='location=/u01/oracle/arch/valid_for=(all_logfiles,all_roles)db_unique_name=std'  --换

*.log_archive_dest_2='service=pri lgwr asyncvalid_for=(online_logfiles,primary_role) db_unique_name=pri'--换,但是primary这是个单词不要换成stdmary

*.open_cursors=300

*.pga_aggregate_target=16777216

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=167772160

*.standby_file_management='AUTO'

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='/u01/oracle/admin/orcl/udump'

 

[oracle@standby oracle]$ mkdir -pflash_recovery_area/OAR10G/onlinelog/ 创建此目录,默认是没有的,而且如果没有的话是启动不到nomount状态的

[oracle@dg02 ~]$ uniread sqlplus / as sysdba

Connected to an idle instance.

SQL> create spfile from pfile;--备库是空闲实例状态时也可以创建spfile

SQL> startup nomount --启动到mount状态

 

--在备库上进行操作

[oracle@dg02 ~]$ uniread rman target sys/oracle@pri auxiliary/

connected to target database: ORCL (DBID=1271897179)

connected to auxiliary database (not mounted)

--可以从连接信息看到是同时连到主和备(注意此时主库为open状态,备库为nomount状态)

RMAN> duplicate target database for standbynofilenamecheck;

--把拷过来的备份(全备和控制文件备份)进行恢复,如果两个库路径一致,就可以加上nofilenamecheck

 

[oracle@dg02 ~]$ uniread sqlplus / as sysdba

--恢复完成后,备库自动会由nomount状态到mount状态;现在退出rman,连接sqlplus

 

SQL> recover managed standby database disconnectfrom session;

Media recovery complete.

--这句话是打开日志传递应用功能

--至此,dg搭建完成;现在可以进行验证

 

验证方法:

主库上alter system switch logfile;

然后去备库archive log list;查看当前的归档日志序列号是否跟着变动,并且和主库一致;如果是,表明成功

也可以创建一个小表空间,再切换日志,在备库的物理上能看到这个dbf也表明成功

==============================================================================

关闭DG

先关主,再关备

开启DG

先开备,再开主

关闭的方法:

SQL> shutdown immediate

备:

SQL> recover managed standby database cancel;--取消日志应用功能

SQL> shutdown immediate

然后关闭监听

 

启动的方法:

先启监听

备:

SQL> startup nomount

SQL> alter database mount standby database;

SQL> recover managed standby database disconnectfrom session;

主:

SQL> startup

===========================================

 

备库现在是mount状态,不能查询数据

物理DG

那么可以把它open read only;如果read only,备库就只能查询,这种读写分离比较变相;

因为备库open后,就不应用日志,那么你这种查询或者做备份都是只能查和备open以前的数据

物理DG

    

主  

 mount  可以应用日志

       open read only  不可以应用日志

 

备库操作:

SQL> recover managed standby database cancel;

SQL> alter database open readonly;  --以只读方式打开

  

--open readonly后,可以在主库建一个表,并切换日志;备库进行查询,发现查不到,说明只要open了就不可以应用日志

--那么想要备库能查询这个刚建的表,需要切回到mount状态去应用日志,再关闭应用日志,打开到open readonly状态

主库:

SQL> create table dcw(id number,namevarchar2(10));

 

Table created.

 

SQL> insert into dcw values(01,'dcw');

 

1 row created.

 

SQL> select * from dcw;

 

        ID NAME

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

         1 dcw

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> select * from dcw;

 

        ID NAME

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

         1 dcw

 

备库:

SQL> select * from dcw;

select * from dcw

             *

ERROR at line 1:

ORA-00942: table or view does notexist     

 

SQL> alter databaseclose;  必须有此不,否则只可以看见表但是查不到表里的数据

(SQL> select * from dcw;

no rows selected)

SQL> recover managed standby database disconnectfrom session;

SQL> recover managed standby database cancel;

SQL> alter database open read only;--再一次readonly后,就可以查询到这张表了

SQL> select * from dcw;

 

        ID NAME

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

         1 dcw

 

--最好是不要把备库open read write;因为备库能写那么写的改变不能传回主库,就会造成两边不一致;

  此时只能把备库闪回到以前的状态,再应用日志;或者是恢复到以前的状态再应用日志

==================================================================================

 

主备切换:

切换顺序,把主切换成从;再把从切换成主

--原来的主库上切成备的操作:

SQL> select database_role,switchover_status fromv$database;

DATABASE_ROLE   SWITCHOVER_STATUS

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

PRIMARY         SESSIONS ACTIVE

SQL> alter database commit to switchover tophysical standby with session shutdown;

SQL> shutdown immediate

SQL> startup nomount

SQL> alter database mount standby database;

SQL> recover managed standby database disconnectfrom session;

SQL> select database_role,switchover_status fromv$database;

DATABASE_ROLE   SWITCHOVER_STATUS

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

PHYSICAL STANDBY TO PRIMARY

--原来的备库切成主库的操作:

SQL> select database_role,switchover_status fromv$database;

DATABASE_ROLE   SWITCHOVER_STATUS

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

PHYSICAL STANDBY TO PRIMARY

SQL> alter database commit to switchover toprimary with session shutdown;

=============================================================

--切的时候报了下面错误;发现是上面的实验把备库open read only了,所以提示需要介质恢复;那么(alterdatabase close),

再应用日志(recover managed standby database disconnect fromsession;),再来切换就可以了

SQL> alter database commit to switchover toprimary with session shutdown;

alter database commit to switchover to primary with sessionshutdown

*

ERROR at line 1:

ORA-16139: media recovery required

=============================================================

SQL> shutdown immediate

SQL> startup

SQL> select database_role,switchover_status fromv$database;

DATABASE_ROLE   SWITCHOVER_STATUS

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

PRIMARY         SESSIONS ACTIVE

 

--按照上面的步骤再切换回来,也是OK的

 

v$database Switchover_Status值的含义

NOT ALLOWED

当前的数据库不是带有备用数据库的主数据库

PREPARING DICTIONARY

该逻辑备用数据库正在向一个主数据库和其他备用数据库发送它的重做数据,以便为切换做准备

PREPARING SWITCHOVER

接受用于切换的重做数据时,逻辑备用配置会使用它

RECOVERY NEEDED

备用数据库还没有接收到切换请求

SESSIONS ACTIVE

在主数据库中存在活动的SQL会话;在继续执行之前必须断开这些会话

SWITCHOVER PENDING

适用于那些已收到主数据库切换请求但是还没有处理该请求的备用数据库

SWITCHOVER LATENT

切换没有完成并返回到主数据库

TO LOGICAL STANDBY

主数据库已经收到了来自逻辑备用数据库的完整的字典

TO PRIMARY

该备用数据库可以转换为主数据库

TO STANDBY

该主数据库可以转换为备用数据库

 

================================================================================

逻辑DG:

物理DG:通过redo apply来恢复进行同步 

逻辑DG:通过sql apply来恢复进行同步(因为有些sql操作是有限制的,不能实现100%的容灾)

逻辑DG可以在open状态下完成数据同步(物理DGopen状态下不能应用日志)它的物理结构可以不一致(因为物理DG的恢复原理是需要物理上结构一致的,

位置要相同,而逻辑DG的sql应用,只关心逻辑上是否是同一个名称,物理结构可以不一致)

逻辑DG可以应用于读写分离的架构,或者是抽样查询等

逻辑DG的实现:通过物理DG转换成逻辑DG

1,备库关闭日志应用:

SQL> recover managed standby database cancel;

2,主库运行dbms_logstby.build 

SQL> exec dbms_logstdby.build

SQL> alter system archive logcurrent; 

3,再来备库操作:

SQL> alter database recover to logical standbyorcl;

SQL> shutdown immediate

SQL> startup mount

SQL> alter database open resetlogs;

SQL> alter database start logical standby apply[immediate]; 

SQL> select database_role from v$database;

DATABASE_ROLE

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

LOGICAL STANDBY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DataGard维护版 2011-08-27 01:12:07

标签:DG 创建备库 DataGard

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。http://gldbhome.blog.51cto.com/1552935/649864

创建data guard , 利用rman duplicate 命令创建physicalstandby 

创建备库前准备工作,备库参数文件,同时连接主数据库和备数据库,启动到nomount状态,

备库必须工作recover managed模式下才能应用主库的redo数据;

 

整体系统结构包含三部分:

1,oracle 服务器: 作为主节点,承担用户连接和数据库服务 ;

2,oracle备用服务器:承担针对主节点数据跟踪,时时备份责任,在系统遭难情况下直接转移到这台服务器,实现几分钟内的灾难恢复

3,专用网络:连接数据库服务器和备用数据库服务器之间的专用网络,避免公用网络出现故障时主库于备库之间无法通信

主库:实时工作的数据库

备库:接受主库日志及时应用日志(归档日志或联机日志,默认传递的是联机日志)的一种备份数据库;

它会把从主库传过来的日志进行日志恢复操作(前滚),这就是日志应用

 

维护时容易出问题的三个地方:1、主库是否传了日志 2、备库是否接受了日志 3、备库是否对传过来的日志做了recover

 

开始前的准备:

 

1、修改/etc/hosts文件,将两台oracle服务器的hostname和对应的IP地址一一对应。

 

环境变量配置:

两边oracle_sid=  各自配置各自的,这里做成不一样

 

---库名叫:db   主库名:pdb    备库名:sdb

 

数据库结构:                     主                                      

    数据文件:            /opt/oracle/oradata/db

    控制文件              /opt/oracle/oradata/db

    参数文件              /opt/oracle/product/10g/dbs

    日志文件              /opt/oracle/oradata/db

    警告文件                admin

    跟踪文件

    闪回区

                          /opt/oracle/bak  备份集在备库中存放位置

--###################################################################################################

--RMAN在线DG做法(数据库不关闭的情况下)

--###################################################################################################

--第一步;  primary 的修改 10.1.1.53

oracle 连接主库,启动的mount状态

修改数据库强制记录日志:

SQL> startup  mount

SQL> alter database forcelogging;  ---->强制启用日志文件。

SQL> alter database archivelog;-----> 启用归档。

SQL> create pfile='$ORACLE_HOME/dbs/initpdb.ora'from spfile;  --->用spfile文件创建pfile文件。

File created.

SQL> shutdown immediate---->日志,归档,pfile文件 都准本好后,关闭数据库。

--修改刚刚创建的pfile文件,在最后面加上下列内容:opt/oracle/product/10g/dbs/initpdb.ora

pdb.__db_cache_size=96468992

pdb.__java_pool_size=4194304

pdb.__large_pool_size=4194304

pdb.__shared_pool_size=58720256

pdb.__streams_pool_size=0

*.audit_file_dest='/opt/oracle/admin/db/adump'

*.background_dump_dest='/opt/oracle/admin/db/bdump'

*.compatible='10.2.0.1.0'

*.control_files='/opt/oracle/oradata/db/control01.ctl','/opt/oracle/oradata/db/control02.ctl','/opt/oracle/oradata/db/control03.ctl'

*.core_dump_dest='/opt/oracle/admin/db/cdump'

*.db_block_size=8192

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_name='db'

*.db_recovery_file_dest='/opt/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=2147483648

*.dispatchers='(PROTOCOL=TCP) (SERVICE=pdbXDB)'

*.job_queue_processes=10

*.open_cursors=300

*.pga_aggregate_target=16777216

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=167772160

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='/opt/oracle/admin/db/udump'

*.db_unique_name='pdb' ---->主库的实例名

log_archive_config='dg_config=(pdb,sdb)' --->主库和备库的实例名。

fal_server=sdb ----->备库服务器的实例名。

fal_client=pdb  ----->主库服务器的实例名。

log_archive_dest_1='location=/opt/oracle/archivelog/' ------>主库的归档日志存放路径。

log_archive_dest_2='service=sdb lgwr syncaffirm  valid_for=(online_logfiles,primary_role)db_unique_name=sdb'

---->备库通过lgwr进程,用sync的方式进行日志传递给备库。

log_archive_dest_state_1=ENABLE

log_archive_dest_state_2=ENABLE

standby_file_management=AUTO

--###################################################################################################

--pfile 文件修改完毕后启动数据库,启动到nomount 状态,指定 initpdb.ora 文件来启动。

mkdir /opt/oracle/archivelog  创建此目录,默认是不存在的

SQL> startup nomountpfile='$ORACLE_HOME/dbs/initpdb.ora';

ORACLE instance started.

 

Total System Global Area  603979776 bytes

FixedSize                 1268872 bytes

VariableSize            163578744 bytes

DatabaseBuffers         432013312 bytes

RedoBuffers               7118848 bytes

 

SQL> alter database mount;

SQL> alter database open;

 

--OK!在数据库open状态下,接下来用RMAN备份工具备份主库的控制文件和数据文件。

 

--第2步,rman 备份数据库,先建立一个 bak 目录,然后再备份:

RMAN> backup format '/opt/oracle/bak/bk_%U'current controlfile for standby ;

RMAN> backup format '/opt/oracle/bak/backup_%U'database plus archivelog; 

 

--复制pfile文件,密码文件,RMAN备份文件到备库:(在复制之前,确保备库有/opt/oracle/bak该目录,没有先建立)

--[oracle@li dbs]$ scp initpdb.oraoracle@10.1.1.110:$ORACLE_HOME/dbs/initsdb.ora

 

--(重点注意的是密码文件CP过去后记得要改成orapw备库的SID,否则用主库远程登录备库的话会报权限不足的错误)

 

The authenticity of host '10.1.1.110 (10.1.1.110)' can't beestablished.

RSA key fingerprint is42:bd:f2:c6:1f:6f:f0:af:0e:14:7e:69:e8:1c:af:93.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.1.1.110' (RSA) to the list ofknown hosts.

oracle@10.1.1.110's password: 

initpdb.ora                                  100%1316    1.3KB/s  00:00   

--[oracle@li dbs]$ scp orapwpdboracle@10.1.1.110:$ORACLE_HOME/dbs/orapwsdb  

oracle@10.1.1.110's password:

orapwpdb                                     100%1536    1.5KB/s   00:00

--[oracle@li dbs]$ scp /opt/oracle/bak/*  10.1.1.94:/opt/oracle/bak/

 

--###################################################################################################

--第二步:再修改备库

--编辑刚刚从主库上SCP过来的pfile文件:initpdb.ora 并且先要修改文件名为initsdb.ora.

vim /opt/oracle/product/10g/dbs/initsdb.ora

sdb.__db_cache_size=96468992----->注意:SCP过来的文件前五行都是pdb开头的,这是备库,前五行要修改为sdb,否则会不成功。

sdb.__java_pool_size=4194304

sdb.__large_pool_size=4194304

sdb.__shared_pool_size=58720256

sdb.__streams_pool_size=0

*.audit_file_dest='/opt/oracle/admin/db/adump'

*.background_dump_dest='/opt/oracle/admin/db/bdump'

*.compatible='10.2.0.1.0'

*.control_files='/opt/oracle/oradata/db/control01.ctl','/opt/oracle/oradata/db/control02.ctl','/opt/oracle/oradata/db/control03.ctl'

*.core_dump_dest='/opt/oracle/admin/db/cdump'

*.db_block_size=8192

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_name='db'

*.db_recovery_file_dest='/opt/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=2147483648

*.dispatchers='(PROTOCOL=TCP) (SERVICE=pdbXDB)'

*.job_queue_processes=10

*.open_cursors=300

*.pga_aggregate_target=16777216

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=167772160

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='/opt/oracle/admin/db/udump'

*.db_unique_name='sdb' ---->备库的实例名。

log_archive_config='dg_config=(sdb,pdb)'---->主备实例名。

fal_server=pdb  ---->和主库相反

fal_client=sdb  ---->和主库相反

log_archive_dest_1='location=/opt/oracle/archivelog/'

log_archive_dest_2='service=pdb lgwr syncaffirm  valid_for=(online_logfiles,primary_role)db_unique_name=pdb'    ----->修改实例名。

log_archive_dest_state_1=ENABLE

log_archive_dest_state_2=ENABLE

standby_file_management=AUTO

 

--###################################################################################################

--第三步:主库和备库上分别配监听服务:

 

----------------------------主库配置 tnsnames.ora文件的配置:--------------------

--------/opt/oracle/product/10g/network/admin/tnsnames.ora

PDB =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.53)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = pdb)

    )

  )

 

PDB =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.53)(PORT = 1521))

    )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = pdb)

    )

  )

 

SDB =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.94)(PORT = 1521))

    )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = sdb)

    )

  )

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

---------------------备库的配置 tnsnames.ora 文件配置:-------------

--------/opt/oracle/product/10g/network/admin/tnsnames.ora

SDB =

  (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = 10.1.1.94)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = sdb)

    )

  )

 

PDB =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.53)(PORT = 1521))

    )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = pdb)

    )

  )

 

SDB =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.94)(PORT = 1521))

    )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = sdb)

    )

  )

 

启监听lsnrct start

再两边tnsping pdb

 tnsping sdb

 测试都能通

--###################################################################################################

sdb: (备库)

--在备机上创建目录/opt/oracle/oradata/db db库目录是没有的,否则在恢复数据文件的时候会报错。

--在备机上做rman恢复数据之前现建立目录:/opt/oracle/admin/db/{a,b,c,u,dp}dump 目录,否则在恢复控制文件的时候会报错误信息。

--上面的目录用oracle用户来建确保是目录属主是oracle:oinstall

 

[oracle@node110 ~]$ rman target sys/oracle@pdb auxiliary /--用这个命令就是主备一起连,这时的主一直都是开的状态

 

Recovery Manager: Release 10.2.0.4.0 - Production on Tue Nov 1712:10:03 2009

 

Copyright (c) 1982, 2007, Oracle.  All rightsreserved.

 

connected to target database: DB (DBID=1466977278)

connected to auxiliary database: DB (notmounted)  --这里可以看到主是open状态,备是nomount状态

 

RMAN> duplicate target database for standbynofilenamecheck; --用这个命令把拷过来的归档日志恢复成和主库同步的备库

       --恢复完成后直接备库启到了mount 状态,相当是alter database mount standbydatabase;

--nofilenamecheck是主库和备库路径名一致的情况下不检测路径名,如果路径名不一致的话要用下面的参数来转换路径

db_file_convert='/opt/oracle/oradata/pdb/','/opt/oracle/oradata/sdb/'

log_file_convert='   ' ,'  '

--退出RMAN,登录sqlplus ,然后运行命令:

---SQL> alter database recover managed standbydatabase disconnect from session; --这句命令是在备库上启用日志传递功能

--查看备用数据库的日志应用情况:

SQL> selectsequence#,first_time,next_time,applied from v$archived_log order bysequence#;

 

 SEQUENCE# FIRST_TIM NEXT_TIME APP

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

        1 18-NOV-09 18-NOV-09 NO

        2 18-NOV-09 18-NOV-09 NO

        3 18-NOV-09 18-NOV-09 NO

        4 18-NOV-09 18-NOV-09 YES

        5 18-NOV-09 18-NOV-09 YES

        6 18-NOV-09 18-NOV-09 YES

        7 18-NOV-09 18-NOV-09 YES

        8 18-NOV-09 18-NOV-09 YES

        9 18-NOV-09 18-NOV-09 YES

       10 18-NOV-09 18-NOV-09 YES

       11 18-NOV-09 18-NOV-09 YES

 

 SEQUENCE# FIRST_TIM NEXT_TIME APP

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

       12 18-NOV-09 18-NOV-09 YES

       13 18-NOV-09 18-NOV-09 YES

       14 18-NOV-09 18-NOV-09 YES

 

14 rows selected.

 

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

--在主上切换日志,同时在备库上产看日志状态:

SQL> alter system switch logfile;

 

System altered.

 

SQL> selectsequence#,first_time,next_time,applied from v$archived_log order bys

 

 SEQUENCE# FIRST_TIM NEXT_TIME APP

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

        1 18-NOV-09 18-NOV-09 NO

        2 18-NOV-09 18-NOV-09 NO

        3 18-NOV-09 18-NOV-09 NO

        4 18-NOV-09 18-NOV-09 YES

        5 18-NOV-09 18-NOV-09 YES

        6 18-NOV-09 18-NOV-09 YES

        7 18-NOV-09 18-NOV-09 YES

        8 18-NOV-09 18-NOV-09 YES

        9 18-NOV-09 18-NOV-09 YES

       10 18-NOV-09 18-NOV-09 YES

       11 18-NOV-09 18-NOV-09 YES

 

 SEQUENCE# FIRST_TIM NEXT_TIME APP

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

       12 18-NOV-09 18-NOV-09 YES

       13 18-NOV-09 18-NOV-09 YES

       14 18-NOV-09 18-NOV-09 YES

       15 18-NOV-09 18-NOV-09 NO

 

15 rows selected.

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

在这里就会看到,主库上切换一次,在备库上查的时候就会多出一行记录。这说明DG已经可以数据同步了。

 

---SQL> recover database managed standby databasecancel; --这一句是关闭日志传递功能

 

--##################################################################################################

DG启动方式: 

先启动备库,并启用日志恢复,然后启动主库

 

备:lsnrctl start

tnsping pri

tnsping orcl

sqlplus "/as sysdba"

startup mount

alter database recover database managed standby databasedisconnect from session;

 

主:

lsnrcrl start

tnsping orcl

tnsping pri

tnsping std

sqlplus "/as sysdba"

startup

 

验证:主库切日志,备库看是否变化

 

DG关闭方式:

先主库关闭:shutdown

然后备库:停止日志应用,recover database managed standby databasecancel;

然后备库是否要shutdown看自己  无所谓

 

--##############################################################################################

 

--关闭数据库的DG做法(数据库关闭后把主库同步到备库)

 

--###############################################################################################

DG

1、物理硬件结构一致 (主库有存储,备库也最好挂一个,因为主库挂了,failover过去,如果备库IO不够,一跑就挂)

2、操作系统尽量一致(10gR2版本后,X86的linux平台可以和windows平台做DG,但是有很多bug,不建议)

3、oracle产品版本尽量一致  (备库的版本号允许高于主库的版本号,比如备库10.2.0.4,主库10.2.0.1。但不能切换,一切换就出问题)

4、强制日志记录 forcelogging

5、主库相关参数定义

SQL> show parameter log_archive_dest

 

NAME                                TYPE       VALUE

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

log_archive_dest                    string

log_archive_dest_1                  string

log_archive_dest_10                 string

log_archive_dest_2                  string               1是本地日志 2到10是远程   最多只能9个备库

log_archive_dest_3                  string

log_archive_dest_4                  string

log_archive_dest_5                  string

log_archive_dest_6                  string

log_archive_dest_7                  string

log_archive_dest_8                  string

log_archive_dest_9                  string

还有采用哪一种进程传递 (lgwr,arcn)

6、在主库得到备库控制文件

7、定义切换参数,备库日志(不做切换的话就不用定义)

8、关闭,备份  用rman的话就不用关

9、配置网络监听,网络服务NET8  (net8就是oracle里的特殊网络,就是要配tnsname)

 

备库:

1、在备库中安装与主库一致的oracle

2、把主库的备份拷到备库

3、定义一个pfile,修改参数

4、用主库得到控制文件启到到nomount 然后alter database mount standby;(能到mount就表示是备库)

5、配置网络

6、在备库启动日志恢复

7、测试日志传递是否正常  备库打开警告日志 主库alter system switch logfile切日志 备库看

 

实际操作:

主库:

1。SQL>select force_logging from v$database; --看是否为强制日志归档

   SQL>alter database forcelogging;  --改为强制日志归档

2。archive log list --看是否归档模式   不是改为归档模式,最好去归档一次查看序列号是否变动

定义参数

SQL>alter system set db_unique_name='pri'scope=spfile; 改db_unique_name --这里与库名不一样(老师这样做,防切换后不能用)  可以一样(文档上一样)

   重启让这个初始化参数生效

    showparameter db_unique_name可以查看db_unique_name

SQL>alter system set log_archive_config='dg_config=(pri,std)';--定义哪些电脑可以进行电脑的读写,远程接收 pri,std为定义的主备名

    mkdir/opt/oracle/oradata/orcl/arch --建一个日志目录

 

SQL>alter system setlog_archive_dest_1='location=/opt/oracle/oradata/orcl/arch/ lgwrsync valid_for=(all_logfiles,all_roles) db_unique_name=pri';

   -- 指定了进程与同步lgwrsync  这两个可以不写 默认就是这两个 all_logfiles是指允许传递的日志包括联机和归档all_role是指用什么样的role去传  本地只能同步写  (同步写速度慢点 异步吞吐量大)

 

SQL>alter system set log_archive_dest_2='service=std lgwr asyncvalid_for=(online_logfiles,primary_role)db_unique_name=std';--这里的2也可以用别的3-9,但不能用1,因为前面用过了

 lgwr是指传递日志的方式(也可以用arch的那个归档进程)async是定义同步传还是异步传,这里用async online_logfiles是接受方式为联机日志 primary_role是指是从主库传过来的

 

SQL> alter system setlog_archive_config='dg_config=(pri,std)' --这个参数默认值就是可以传递也可以接受

 

SQL> show parameterlog_archive_dest_state_1  --确认它的值为enable

SQL> show parameterlog_archive_dest_state_2  --确认它的值为enable

 

SQL>show parameter log_archive_format--看日志格式参数是否定义 %t_%s_%r.dbf 必须包含%t,%s,%r,不区分大小写

 

--再定义以后可以让这台主库切换成备库的参数

SQL> show parameter fal_

 

NAME                                TYPE       VALUE

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

 

fal_client                          string              --这个表示自己

fal_server                          string   -- 这个表示远程

 

SQL>alter system set fal_client=pri;

SQL>alter system set fal_server=std;

SQL> show parameter standby

 

NAME                                TYPE       VALUE

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

standby_archive_dest                string     ?/dbs/arch

standby_file_management             string     MANUAL   --把这个改为AUTO,备库在和主库同步表空间时有用

SQL>alter system set standby_file_management=auto;

 

--##########################################################################

--再在主库上定义切换成备库后用的日志组

SQL> select group# from v$logfile;

 

   GROUP#

----------

              --看主库日志有几个组  要多定义一个组 备库的日志比主库至少多一个组

        2

        1

SQL> select group#,thread# from v$log;

 

   GROUP#   THREAD#

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

                1--看日志组的线程,定义备库日志组(线程数+1)x最大线程数  在这里=6但实际用不了那么多,比主库多一组就行

                1

                1

 

 

SQL>alter database add standby logfile group 5'/opt/oracle/oradata/orcl/sredo01.log'size 50m;--定义备库日志组  这里组编号为5到8 4留给主库扩展日志组

SQL>alter database add standby logfile group 6'/opt/oracle/oradata/orcl/sredo02.log'size 50m;

SQL>alter database add standby logfile group 7'/opt/oracle/oradata/orcl/sredo03.log'size 50m;

SQL>alter database add standby logfile group 8'/opt/oracle/oradata/orcl/sredo04.log'size 50m;

--上面在主库加的日志组,现在主库用不到,但是当切换后,主库变成备库的时候就要用到了

 

 

 

--在主库中创建备库控制文件

SQL>alter database create standby controlfile as'/opt/oracle/oradata/orcl/scon.ctl';

--这里加了standby关键字,库的状态是主还是备,就是在控制文件中定义出来的,所以这个控制文件只能用来做备库的控制文件;这里创建到数据文件目录下方便后面拷到备库

 

SQL> createpfile='/opt/oracle/oradata/orcl/initorcl.ora' fromspfile;--创建一个pfile文件,这里创建到了数据文件目录里去了,只是为了拷的时候方便而已

 

File created.

 

SQL>shutdown immediate --关闭然后备份  最后先启动一下 改了这么多参数要确定一下能否启

SQL>startup  --能启再关,确认库没问题

SQL>shutdown immediate

 

--再配置网络服务

cd $ORACLE_HOME/network/admin

   vilistener.ora 

   vi tnsname.ora 改

   加两段  一个pri  IP为主库自己的IPservice_name = orcl --pri的实例名

          一个std  IP为备库IP  service_name =orcl --std的实例名,因为这里相同都是orcl

  --这里如果是不相同的实例名的话,就写不同的;不确定的话就直接写db_unique_name (这里分别是pri,std)

lsnrctl start  启动监听  tnspingpri 测试  能通就OK  tnsping std这时候不能用  因为还没配

 

--再注意的是密码文件

因为日志传递与应用是以sys用户来验证的,所以密码文件很重要,如果知道sys用户密码的话可以重建一个,如果不知道的话直接cp一个。

--注意的是如果两边的实例名不相同,cp的密码文件记得改下名

 

如果是虚机的话  直接拷一个新虚机

下面是不是拷虚机的步骤  如果拷虚机 要改的也是一样的

 

--备份并拷到备份

rsync -avlR -e ssh备库的ip:/opt/oracle/oradata/orcl  /--同步数据文件,日志组文件,还有刚才创建的备库控制文件和pfile文件,还有密码文件

 

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

下面是在备库上开始操作了

 

首先,因为主库上的相关文件都同步到备库的/opt/oracle/oradata/orcl 下了(--先确定一下权限,不是的话改成oracle.oinstall)

 

cd /opt/oracle/oradata/orcl

 vi initorcl.ora改

--做pri和std的对换(注意手工去改,替换的话第一次替换就都是一个值了,分不清了,log_archive_config='dg_config=(pri,std)'这个参数里两个改不改无所谓)保存

cp initorcl.ora /opt/oracle/product/10g/dbs     --把pifle拷到参数文件目录

 

cp orapworcl/opt/oracle/product/10g/dbs  --把密码文件拷到密码文件目录,注意如果实例名不同的话,要改名

 

cp scon.ctl control01.ctl

cp scon.ctl control02.ctl

cp scon.ctl control02.ctl --把备库的控制文件改名成那三个镜像的名字

 

--改监听

cd /opt/oracle/10g/network/admin

vi tnsname.ora 

-- 可以直接到主库配好的拷过来  一样的 改三段 pristd  还有一段是主库自己IP监听的那一段,因为主库自己有,所以在主库那里只加了两段,在备库这里要加三段

 

加的三段参考下面的,主库上也和这里一样

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

orcl =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.249)(PORT = 1521))--这段就是主库监听自己的一段,备库也要加上

    )

   (CONNECT_DATA =

     (SERVICE_NAME = orcl)

    )

  )

 

pri =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.254)(PORT = 1521))

    )

   (CONNECT_DATA =

     (SERVICE_NAME = pri)

    )

  )

 

 

std =

  (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.249)(PORT = 1521))

    )

   (CONNECT_DATA =

     (SERVICE_NAME = std)

    )

  )

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

vi listener.ora  也看一下

lsnrctl start  tnsping orcl|std|pri--测试

 

在备库建立目录 mkdir /opt/oracle/admin/orcl/{a,b,c,u,dp}dump

     (--注意新建目录的属主 要改为oracle:oinstall,用oracle用户建立就没大问题)

 

vi ~/.bash_profile

 

export ORACLE_BASE=/opt/oracle

export ORACLE_HOME=/opt/oracle/product/10g

export ORACLE_SID=orcl

export PATH=$ORACLE_HOME/bin:$PATH --修改好环境变量

 

source .bash_profile  --source一下使它生效

 

 

--启到数据库到mount状态

sqlplus "/as sydba"

startup nomount

create spfile from pfile; --因为备库是改的pfile文件,这里创建spfile

startup force nomount;  --重启一下,让数据库使用spfile

alter database mount standby database; --让它做为备库,要这样打开到mount状态(有关键字standby,如果这里不成功报错,那就要再去主库整一个备库控制文件过来)上面rman恢复后直接这样打

开了

 

alter database recover managed standby database disconnect fromsession; --打开日志应用功能

 

--测试

tail -f /opt/oracle/admin/orcl/bdump/alert_orcl....

   --备库做完后再启主库 主库切日志  备库能看到变化

 

去主库alter system switch logfile;--备库看警告日志变化,看到序列号变化,表示日志可以同步过来

 

去主库建表空间,建表,备库也能同步过来

 

--#########################################################################################################

 

 

--.备库查询

 

在备库中启动到mount状态,先退出日志应用,然后只读打开数据库,可以查询数据库的数据,可作报表查询,测试只用

 

 

在standby备库上

1.alter database recover managed statndby database cancel;--关闭日志应用

 

2.alter database open read only; --只读打开 可以查询,但不能做其它操作

 

 

 

--oracle同步软件

 

 

如果三台库,都是同步的,只有一台是可读可写,另外两台都是只能查询的

要实现这种架构就可以用dg来实现,如果是11g的话能open状态同步,还有就是用stream流技术来做,但是相当麻烦,并且很多bug;所以就造成做这种同步的第三方软件非常多,

最出名的就是query公司的产品(淘宝网里的同步就是query公司的软件,按cpu收费,一个cpu就要20多W一年;很贵,现在玩不起了,换mysql了)

 

--DG环境的连接问题:

 

 

写脚本,写一个查看主库是否为open状态,再写一个查询主库一个表中的一行记录,如果能查到表示主库正常

 再判断如果主库不正常就进行failover切换

 

关于主备切换后,程序端(例如jsp,php,asp等)访问数据库的IP地址问题

 

1.程序可以写成动态的,当主备切换后,程序可以动态连接open状态的,不过这对程序端比较痛苦

2.或者在主备库两个服务器上再加上一个网段,把另一个网段做成VIP的方式,对其进行IP切换,程序那边就写着连接这个VIP就可以了

3.或者直接做一个 HA, 但有风险,从库有可能启不启不来,要进行介质恢复,能不能恢复还不一定;

 

原因有 1.主库没来得及归档就断电,

     2.主库在传送日志的过程中断电

有个好的解决方法就是:主和库备同时挂一台存储(这个存储放的就是日志文件)

     

--主备切换:

switchover:

 无损切换:手动触发或者有计划的其他自动触发,比如硬件升级,软件升级

一:primary数据库转换为standby角色。

二:standby 数据库转换为primary角色。

 

注意:切换时,先把主切换成从,在把从切换为主。

 

1,主

SQL> select database_role from v$database;

 

primary  ------>确认是主

 

SQL>  alter database  commit to switchover to  physical  standby  with session  shutdown;

SQL>  shutdown immediate

SQL>  startup nomount;

SQL>  alter database  mount standby  database;

 

 

standby

SQL>  select database_role fromv$databae;

 physical standby  ------>确认是从

 

SQL>  alter database  commit to switchover to  primary with  session  shutdown;

报错:

SQL>  recover database  managed standby  database disconnect  from  session;

SQL>  shutdown immediate;

SQL>  startup;

 

 

验证角色:

SQL> select  database_role  from v$database;

SQL>  select switchover_status  from v$database; ------>session active

 

 

二:failover

一般情况下,failover 都表示primary数据库瘫痪,最起码是起不来的,这种类型操作基本上需要primary作什么操作。

 

1,检查归档文件是否连续

查询standby数据库的v$archive_gap 视图,确认归档文件是否连续

SQL>  select thread#,low_sequence#,high_sequence# from v$archive_gap;

 

如果返回记录为空,OK

如果有记录,按照列出的记录好复制对应的归档文件到代转换的standby服务器上,必须确所有声称的归档文件均已经在standby服务器上

 

alter  database register  physical  logfile;

 

3,启动failover

 

SQL>  alter database recovermanaged  standbty finish  force;

-----force   关键字将停止当前活动的rfs进程,以便立即执行failover

 

 

开关机顺序:

 

正确开关机顺序

关机:先关主 后关备

开机:现开备 在开主

 

 

 

--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

--逻辑DG的实现:

 

logicalstandby:可以实现在open状态下完成同步数据,这时只能同步数据,不能实现完整的备份。100%的容灾实现不了。

逻辑的备库是挖掘主库传递过来的日志为sql语句。然后执行sql语句达到同步的目地,所以它是逻辑结构一致,物理结构不一致。

作用在于实现只读的服务,如读写分离的架构的应用,测试,决策做数据抽样查询。

 

没有一套完整的逻辑DG的实现办法,只能从物理的备库转到逻辑备库。

1。--备库停止日志应用。

alter database recover database managed standby databasecancel;

2。--主库转成逻辑备库的支持。

exec dbms_logstdby.build  让当前主库支持逻辑备库的功能。

PL/SQL procedure successfully completed.

 

alter system archive log current; 进行归档

3。--备库转化到逻辑的。

alter database recover to logical standby orcl;这里如果报错,把数据库起到mount状态,起动日志应用,再关闭就好了。

shutdown immediate;

startup mount;

alter database openresetlogs;   很慢的

4。--逻辑备库与主库同步数据。

alter database start logical standby apply [immediate];开始日志应用。

alter database stop logical standby apply[immediate];  停止日志应用。

alter database start logical standby applyimmediate;  没有redologs,直接同步的会失败

SQL> alter database start logical standby applyimmediate;

alter database start logical standby apply immediate

*

ERROR at line 1:

ORA-16239: IMMEDIATE option not available without standby redologs

创建standby redologs:

alter database add standby logfile group 4'/opt/oracle/oradata/ora10G/standbyredo01.log' size 50M;

alter database add standby logfile group 5'/opt/oracle/oradata/ora10G/standbyredo02.log' size 50M;

alter database add standby logfile group 6'/opt/oracle/oradata/ora10G/standbyredo03.log' size 50M;

重新执行redo应用命令

alter database stop logical standby apply;

alter database start logical standby apply immediate;

5、验证环境

主库:

 

备库:

5。--要特别注意的:主库的变化可以到备库,而备库的变化不能到主库。

6。--逻辑备库的switchover

--先主到备,再备到主。

--主:

alter database prepare to switchover to logical standby;

--备:

alter database prepare to switchover to primary;

--同步数据在原来的主库上做:

alter database start logical standby apply;

7。--逻辑备库的failover。

alter database activate logical standby database finishapply;

--原来的主库就不能用了。

 

 

物理备库:有两种方式传(sync,async)。同步日志,进行日志应用,

逻辑备库:归档日志LogMiner挖掘-->sql语句-->sqlapply  有些语句不支持挖掘,所以并不是所有的语句都能同步到逻辑备库中。

 

 

sync:有了日志就传。

async:在联机日志归档前才会传,如果一直不归档我就一直不传。 可以加个delay=30 (分)

 

ARCH:传归档日志到备库。这个速度慢了,但性能是最好的。

LGWR:这个是默认的,传联机日志到备库,放到备库的联机日志中,备库才会归档。 

LGWR不旦要进行本地日志归档,还要进行往备库传联机日志,所以LGWR进程的个数要增多,就先去增加归档进程的个数,LGWR的个数就自动增加了。

 

 

从物理备库可以到逻辑备库,但从逻辑备库不能再到物理备库了。

 

 

DG的三种保护模式。

最大保护模式:不充许丢日志。

最大可用模式:会先工作在最大保护模式下,当日志出了问题,就会切到最大可用模式。

上面两个在局域网上用的多些。

 

最大性能模式:充许丢日志。多用在于互联网上。

 

 

DG作为高可用的解决方案,其主要目标是 oracle 数据库层面的数据保护与容灾计划。主库与备库通过日志同步来保证

数据的同步。备库可以做为备份或查询用并能实现快速切换或灾难恢复。

 

 

 

作为高可用的解决方案,其主要目标是 oracle 数据库层面的数据保护与容灾计划。主库与备库通过日志同步来保证

数据的同步。备库可以做为备份或查询用并能实现快速切换或灾难恢复。

 

 

DG 的搭建方式有很多种方式,下面我用到的 4 种经典方案:

 本地切换: 本地搭建备库与主库一样,随时提供切换服务

 远程切换:远程搭建备库与主库一样,实现远程容灾切换

 备份:只提供本地或远程容灾,不提供切换

 读写分离:LG 备库,或 11g 以后的物理备库。主库写,备库读的方式。

 

 

2.DG 原理

物理备库其实是采用备份与恢复的原理实现的。只不过被 oracle 处理成自动化而已。可以这样说:standby 是一个一

直在应用日志不停 recovery 的数据库。要么在应用日志,要么在等待下一个日志来应用。

而 日志的传递可以是归档日志也可以是联机日志。归档一般用 arch 进程负责传递。联机是 lgwr 负责传递或是

LNSn<10g 以后>进程传递。 日志接收由 RFS进程处理。

 

DataGuard 是一个集合,由一个 primary 数据库(生产数据库)及一个或多个 standby 数据库(最多 9个)组成。

组成 Data Guard 的数据库通过 Oracle Net连接,并且有可能分布于不同地域。只要各库之间可以相互通信,它们

的物理位置并没有什么限制,至于操作系统就更无所谓了(某些情况下),只要支持 oracle 就行了。

 

 

 

物理 standby 特点

灾难恢复及高可用性

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

数据保护

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

物理 standby 也会有什么。

分担 primary 数据库压力

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

提升性能

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

 

 

逻辑 standby 是通过接收 primary 数据库的 redo log 并转换成 sql 语句,然后在 standby数据库上执行 SQL 语句(SQL

Apply)实现同步,物理 standby 是通过接收并应用 primary 数据库的 redo log以介质恢复的方式(Redo Apply)实现同步。

逻辑 standby 是逻辑上与 primary 数据库相同,结构可以不一致。逻辑 standby 通过 sql 应用与primary 数据库保

持一致,也正因如此,逻辑 standby 可以以 read-write 模式打开,你可以在任何时候访问逻辑 standby数据库。同

样有利也有弊,逻辑 standby 对于某些数据类型以及一些 ddl,dml 会有操作上的限制。

 

 

 

 

逻辑 standby 的特点:

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

有效的利用 standby 的硬件资源

除灾难恢复外,逻辑 standby 数据库还可用于其它业务需求。比如通过在 standby数据库创建额外的索引、物化视图等提高查询性能并满足特定业务需要。又比如创建新的 schema(primary 数据库并不

存在)然后在这些 schema 中执行 ddl 或者 dml 操作等。

分担 primary 数据库压力

逻辑 standby 数据库可以在更新表的时候仍然保持打开状态, 此时这些表可同时用于只读访问。 这使得逻辑standby数据库能够同时用于数据保护和报表操作,从而将主数据库从那些报表和查询任务中

解脱出来,节约宝贵的CPU和I/O 资源。

平滑升级

比如跨版本升级啦,打小补丁啦等等,应该说应用的空间很大,而带来的风险却很小(前提是如果你拥有足够的技术实力。另外虽然物理standby 也能够实现一些升级操作,但如果跨平台的话恐怕就力不从

心),这是一种值的推荐的在线的滚动的平滑的升级方式。

 

switchover:转换 primary 数据库与 standby 数据库。switchover可以确保不会丢失数据。

failover:当 primary 数据库出现故障并且不能被及时恢复时,会调用 failover 将一个 standby数据库转换为新的 primary 数据库。在最大保护模式或最高可用性模式下,failover 可以保证不会丢失数据。

 

 

Data Guard 优点

    灾难恢复及高可用性

    全面的数据保护

    有效利用系统资源

    在高可用及高性能之间更加灵活的平衡机制

    故障自动检查及解决方案

    集中的易用的管理模式

    自动化的角色转换

 

Data Guard 的软硬件需求

    1、 硬件及操作系统需求

    同一个 Data Gurid 配置中的所有 oracle 数据库必须运行于相同的平台。比如 inter 架构下的 32 位

linux 系统可以与 inter 架构下的 32 位 linux 系统组成一组 Data Guard。另外,如果服务器都运行于32 位的

话,64 位 HP-UX 也可以与 32 位 HP-UX 组成一组 Data Guard。

    不同服务器的硬件配置可以不同,比如 cpu 啦,内存啦,存储设备啦,但是必须确保 standby 数据库

服务器有足够的磁盘空间用来接收及应用 redo 数据。

    primary 数据库和 standby数据库的操作系统必须一致,    不过操作系统版本可以略有差异,   比如(linux

as4&linux as5),primary 数据库和 standby数据库的目录路径也可以不同。

2、 软件需求

    Data Guard 是 Oracle 企业版的一个特性,标准版是不支持的。

    通过 Data Guard 的 SQL 应用,可以实现滚动升级服务器数据库版本

    同一个 Data Guard 配置中所有数据库初始化参数:COMPATIBLE 的值必须相同。

    Primary 数据库必须运行于归档模式 ,并且务必确保在 primary 数据库上打开 FORCE LOGGING,以避

免用户通过 nologging 等方式避免写 redo 造成对应的操作无法传输到 standby 数据库。

    Primary 和 standby 数据库均可应用于单实例或 RAC 架构下 ,并且同一个 data guard配置可以混合

使用逻辑 standby 和物理 standby 。

    Primary 和 standby 数据库可以在同一台服务器,但需要注意各自的数据文件存放目录,避免重写或

覆盖。

    使用具有 sysdba 系统权限的用户管理 primary 和 standby 数据库。

    建议数据库必须采用相同的存储架构。比如存储采用 ASM/OMF 的话,那不分 primarty 或是 standby

也都需要采用 ASM/OMF。

 

 

Redologs 分 Online Redo Logs, Archived Redo Logs, Standby RedoLogs.

REDO:中文直译是重做,重做是 oracle 对操作的处理机制,我们操作数据(DML)并非直接反映到数据文件,而是先

被记录(就是 online redo log 保留的内容了),等时机合适的时候,再由相应的进程操作提交到数据文件

把所有的 online redo logs都保存下来,      相当于拥有了数据库做过的所有操作,               默认数据库没有对 online redo logs

保留的功能,必须借助归档数据库模式才能完成日志的保留,归档模式下保留的日志就是 archived redo logs简称

archive log 即归档日志。

由于 standby 数据库的数据通常都来自于 primary 数据库的,RFS 进程接收 primary 数据库的redo,保存在本地,

这就是 Standby redo logs, 然后 standby 数据库的 ARCn再将其写入归档,        就是 standby 服务器的 archived redo logs。

数据文件又是怎么生成的呢,物理 standby 通过 redo 应用,逻辑 standby 通过 sql应用,不管是哪种应用,应用的

是 redo log 中的内容(默认情况下应用 archived redo logs,如果打开了实时应用,则直接从standby redo logs

中读取),至于如何应用,那就是 redo 应用和 sql 应用机制的事情了。

 

 

SQL>alter database force loging;

强制日志记录,要完整恢复,必须依赖可靠可用的日志。所以需要强制日志记录方式与归档模式

想必大家知道有一些 DDL 语句可以通过指定 NOLOGGING 子句的方式避免写 redolog(目的是提高速度,某些时候确

实有效),指定数据库为 FORCE LOGGING 模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作而忽略类

似 NOLOGGING 之类的指定参数。如果在执行 force logging 时有 nologging 之类的语句在执行,则force logging

会等待直到这类语句全部执行。FORCE LOGGING 是做为固定参数保存在控制文件中,因此其不受重启之类操作的影

响(只执行一次即可),如果想取消,可以通过 alter database no force logging语句关闭强制记录。

 

SQL>alter database archivelog;

 

如果是 flashbak database 模式请关闭:

SQL>alter database flashback off;

SQL>shutdown immediate;

SQL>startup

SQL>archive log list;

SQL>alter system switch logfile;

SQL>alter system setlog_archive_dest_1=’location=/opt/oracle/oradata/orcl/archivevalid_for=(all_logfiles,all_roles)

db_unique_name=pri’;

SQL>alter system set db_uniuqe_name=’pri’scope=spfile;

SQL>alter system set standby_file_management=autoscope=spfile;

SQL>alter system setlog_archive_dest_state_1=enable scope=spfile;

SQL>alter system setlog_archive_dest_state_2=enable scope=spfile;

SQL>alter system setlog_archive_config=’dg_config=(pri,std)’;

SQL>alter   system    set  log_archive_dest_2=’service=std     lgwr    async     valid_for=(online_logfiles,primary_role)

db_unique_name=std’ scope=spfile;

SQL>alter system setlog_archive_dest_state_2=enable scope=spfile;

SQL>alter system setlog_archive_format=’log%t%s%r.arc’ scope=spfile;

SQL>alter system set fal_server=’std’scope=spfile;

SQL>alter system set fal_client=’pri’scope=spfile;

SQL>alter database add standby logfile group 5‘/opt/oracle/oradata/orcl/stredo5.log’ size 50m;

SQL>alter database add standby logfile group 6‘/opt/oracle/oradata/orcl/stredo6.log’ size 50m;

…….

添加 standbylogfile 成员个数比 onlinelogfile 多 1 个即可,但大小与onlinelogfiles 一致

对于最大保护和最高可用性模式,Standby 数据库必须配置 standby redo log,并且 oracle推荐所有数据库都使用

LGWR ASYNC 模式传输

一般而言,standby redo 日志文件组数要比 primary 数据库的 online redo日志文件组数至少多一个。推荐 standby

redo 日志组数量基于 primary 数据库的线程数

有一个推荐的公式可以做参考:(每线程的日志组数+1)*最大线程数

例如 primary 数据库有 3 个线程,每个线程分配 2 组日志,则 standby 日志组数建议为 9组,使用这个公式可以降

低 primary 数据库实例 LGWR 进程锁住的可能性。

SQL>create pfile from spfile;

SQL>alter database create standby controlfile as‘/opt/oracle/oradata/orcl/sccon.ctl’;

SQL>shutdown immediate;

SQL>exit

[foway~uplooking.com ]$cd $ORACLE_HOME/dbs

[foway~uplooking.com ]$orapwd file=orapw+sid password=pswd

如果不存在的话,需要创建密码文件,同一个 Data Guard 配置中所有数据库必须都拥有独立的密码文件,并且必须

保证同一个 Data Guard 配置中所有数据库服务器的 SYS 用户拥有相同密码以保证 redo 数据的顺利传输,因为redo

传输服务通过认证的网络会话来传输 redo 数据,而会话使用包含在密码文件中的 SYS 用户密码来认证。

主库配置暂时到这里。

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

然后在备库操作:

复制主库的数据文件后修改参数。

主要修改 initorcl.ora 中的内容:将 pri,std 互相对换。然后配置网络监听与远程密码。

并测试网络连通性。

启动步骤;从库:

#su – oracle

$sqlplus “/as sysdba”

SQL>startup nomount

SQL>alter database mount standby database;

SQL>recover managed standby database disconnectfrom session;

主库:

#su – oracle

$sqlplus “/as sysdba”

SQL>startup

 

 

保护模式转换:

提供了三种数据保护的模式,我们又亲切的叫它:有三模:

   最大保护(Maximum protection):

   这种模式能够确保绝无数据丢失。要实现这一步当然是有代价的,它要求所有的事务在提交前其 redo 不仅被写

入到本地的 online redo log,还要同时提交到 standby 数据库的 standby redo log,并确认redo 数据至少在一个 standby

数据库可用(如果有多个的话),然后才会在 primary 数据库上提交。如果出现了什么故障导致 standby数据库不可用

的话,primary 数据库会被 shutdown。

   最高性能(Maximum performance):

   这种模式提供在不影响 primary 数据库性能前提下最高级别的数据保护策略。事务可以随时提交,当前 primary

数据库的 redo 数据也需要至少写入一个 standby 数据库,不过这种写入可以是不同步的。

   如果网络条件理想的话,这种模式能够提供类似最高可用性的数据保护而仅对 primary 数据库有轻微的性能影

响。

   最高可用性(Maximum availability):

   这种模式提供在不影响 primary 数据库可用前提下最高级别的数据保护策略。其实现方式与最大保护模式类似,

也是要求所有事务在提交前必须保障 redo 数据至少在一个 standby 数据库可用,不过与之不同的是,如果出现故障

导入无法同时写入 standby 数据库 redolog,     primary 数据库并不会 shutdown,而是自动转为最高性能模式, standby等

数据库恢复正常之后,它又会再自动转换成最高可用性模式。

    最 大 保 护 及最 高 可 用 性 需 要 至 少 一 个 standby 数 据 库 redo 数 据 被 同 步 写 入 。 三 种 模 式 都需 要 指 定

LOG_ARCHIVE_DEST_n 初始化参数。

maximize performance 默认保护级别

maximize availability 默 认运行在 maximize protection 备库出现问题转到maximize performance 备库恢复转到

maximize protection

 

maximize protection maximize availability

该两中模式下不能先关闭备库。否则抱如下错误:

SQL> shutdown immediate;

ORA-01154: database busy. Open, close, mount, and dismount notallowed now

 

网络问题

在一些关键领域如果 DG 不是在 lan 中很多时候都利用 vpn 专线来保证网络的可靠,高速与安全。如果有一天需要

在南北线路上做 DG,那么你要测试好线路了。如果网络太差,应该采用 open-vpn 或商业 vpn。实在没有 vpn你可

以采用不要验证日志传递的可达性,用 ftp,scp,rsync,sshfs 等方式把日志复制到备库。

 

 

备库查询:

alter database recover managed standby database cancel;

ALTER DATABASE OPEN READ ONLY;

使用 std 数据库,使用完后

alter database recover managed standby database disconnect fromsession;

关机顺序:

正确的开关机顺序是:

关机:先关主机,后关备机

开机:先开备机,后开主机

Switchover 过程

注意:Swithover 时只能先从 Primary 切到 Standby,再从 Standby 切到 Primary.

 

Failover 过程

可以在网络监听中配置对方的 ip 地址,这样在切换就不会出现问题了。

不可预知原因导致 primary 数据库故障并且短期内不能恢复就需要 failover

在执行 failover 之前,尽可能将原 primary 数据库的可用 redo 都复制到 standby 数据库。 转换standby 数据库到

MAXIMIZE PERFORMANCE

SQL> ALTER DATABASE SET STANDBY DATABASE TOMAXIMIZE PERFORMANCE;

等 standby 切换为新的 primary 之后,你可以再更改到修改前的保护模式。

执行下列语句:

SQL> alter database recover managed standbydatabase finish force;

或 alter database recover managed standby database finish skipstandby logfile;

    FORCE关键字将会停止当前活动的 RFS 进程,以便立刻执行 failover。

SQL> alter database commit to switchover toprimary;

shutdown immediate,然后再直接 startup。就完成了 failover 了。

原来的主库已经不是 DG 的成员了,所以需要对备库重建。

 

 

不过在以后的管理中要特别注意是否 resetlogs:

Standby数据库状态                     Standby服务器操作         解决方案

没有应用 resetlog 之前的 redo数据         自动应用新的 redo数据        无须手工介入

应用了 resetlog 之 后 的 redo数         可以应用,不过需要 dba 手工介入  1. 手工 flashback 到应用之前

据, 不过 standby 打开了 flashback。 

                                                           2. 重启 redo 应用,  以重新接收新

                                                                  的 redo 数据。

应用了 resetlog 之 后 的 redo数         完全无法应用               重建物理 standby 是唯一的选择

据,而且没有 flashback

 

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

 

--相关问题总结

 

问题1:ORA-16416: 切换目标与主目标不同步

Dataguard的主备机间日志不同步,发生了ORA-16416错误  Oracle10.2.0.1下新建的Dataguard的主备机间日志不同步,发生了“ORA-16416:

切换目标与主目标不同步”错误,且v$archived_log表里没有数据,通过在主库上重建一份standbycontrolfile,拷贝到备机替换原先的controlfile,重启即解决问题。

 

主库上操作:

 

SQL> selectdatabase_role,open_mode,protection_mode,protection_level,switchover_statusfrom v$database;

 

DATABASE_ROLE   OPEN_MODEPROTECTION_MODE     PROTECTION_LEVEL    SWITCHOVER_STATUS

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

PRIMARY         READ WRITE MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE SESSIONSACTIVE

 

--尝试切换:

 

SQL> alter database commit to switchover tophysical standby with session shutdown;

alter database commit to switchover to physical standby withsession shutdown

*

第 1 行出现错误:

ORA-16416: 切换目标与主目标不同步

 

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORACLE 例程已经启动。

 

Total System Global Area 243269632 bytes

FixedSize                 1218748 bytes

VariableSize             75499332 bytes

DatabaseBuffers         163577856 bytes

RedoBuffers               2973696 bytes

数据库装载完毕。

SQL> alter database create standby controlfile as'/backup/sdtby_control01.ctl';

 

数据库已更改。

 

SQL> alter database open;

 

数据库已更改。

 

先停止备库,再把生成的sdtby_control01.ctl文件拷贝到备机,替换掉原先备机的控制文件。

 

然后在备库上操作:

 

SQL> startup mount;

ORACLE 例程已经启动。

 

Total System Global Area 243269632 bytes

FixedSize                 1218748 bytes

VariableSize             75499332 bytes

DatabaseBuffers         163577856 bytes

RedoBuffers               2973696 bytes

数据库装载完毕。

SQL> alter database recover managed standbydatabase disconnect from session;

 

数据库已更改。

 

SQL> selectdatabase_role,open_mode,protection_mode,protection_level,switchover_statusfrom v$database;

 

DATABASE_ROLE   OPEN_MODEPROTECTION_MODE     PROTECTION_LEVEL    SWITCHOVER_STATUS

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

PHYSICAL STANDBYMOUNTED   MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE TO PRIMARY

 

SQL> select max(SEQUENCE#) fromv$archived_log;

 

MAX(SEQUENCE#)

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

           49

 

SQL> archive log list;

数据库日志模式           存档模式

自动存档            启用

存档终点           /orahome/arch

最早的联机日志序列    45

下一个存档日志序列   0

当前日志序列          50

 

现在v$archived_log表里有数据了。

 

 

问题2.ORA-16416: Switchover target is not synchronized with theprimary

主数据库上查询:

SQL> select max(sequence#) fromv$archived_log;

MAX(SEQUENCE#)

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

  94

从数据库上查询:

SQL> select max(sequence#) fromv$archived_log;

MAX(SEQUENCE#)

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

  94

 

但是在主数据库上执行下面的语句时:

SQL> alter database commit to switchover tophysical standby;

alter database commit to switchover to physical standby

*

ERROR at line 1:

ORA-16416: Switchover target is not synchronized with theprimary

 

分析:主从数据库的日志最大值都相等,并且都应用了,为什么不允许主从切换呢?

解决方法:

在从数据库上:

SQL> shutdown immediate

ORA-01109: database not open

 

Database dismounted.

ORACLE instance shut down.

SQL> startup nomountpfile='/opt/oracle/admin/ge/pfile/init.ora.10182008214357';

ORACLE instance started.

 

Total System Global Area 167772160 bytes

Fixed Size 1218316 bytes

Variable Size 62916852 bytes

Database Buffers 100663296 bytes

Redo Buffers 2973696 bytes

SQL> alter database mount standby database;

Database altered.

 

然后重新还原从数据库以及日志:

RMAN> restore database;

RMAN> restore archivelog all;

 

此时查询从数据库的日志应用情况:

SQL> select max(sequence#) fromv$archived_log;

MAX(SEQUENCE#)

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

  95

  

此时查询主数据库的日志最大值:

SQL> select max(sequence#) fromv$archived_log;

MAX(SEQUENCE#)

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

  95

 

然后在主数据库重新切换:

SQL> alter database commit to switchover tophysical standby;

Database altered.

执行成功!!

 

问题3:

SQL> alter database commit to switchover toprimary;

alter database commit to switchover to primary

*

ERROR at line 1:

ORA-16139: media recovery required

解决方法:

SQL> alter database recover managed standbydatabase disconnect from session;

Database altered.

 

 

 

 

 

 

原创粉丝点击