Linux Oracle 11g Dataguard配置详细步骤

一、tnsname.ora和listener.ora用法简介
二、规划
三、配置DataGuard
四、检验
五、参考文档

一、tnsname.oralistener.ora用法简介

    tnsname.ora中的service name应该分为两种,一种是网络服务名net service name,一种是实例服务名 instance service name,如下所示:

net_service_name =

  (DESCRIPTION =

     (ADDRESS_LIST =

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

     )

     (CONNECT_DATA =

        (SERVICE_NAME = instance_service_name)

     )

  )

 

    1

prime =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = pri)

    )

  )

这里网络服务名是prime,实例服务名是pri

 

    tnsnames.ora中的地址(ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))是监听器监听的地址。监听器进程一直在这个地址上监听,等待客户端的连接。

    sqlplus客户端或远程客户端(比如PL/SQL Developer)根据tnsname.ora中的SERVICE_NAME(实例服务名)和地址(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.199)(PORT = 1521)),到这个地址去访问监听器。然后监听器判断lisnter.ora文件中的GLOBAL_NAME是否和tnsname.ora文件中的SERVICE_NAME(实例服务名)相等。如果相等,则建立客户端到SID标识的服务端实例的连接。

    所以,tnsname.ora中的instance_service_name必须与listener.ora中的global_name必须完全一样。

    2listener.ora应该包含下面的信息

    (SID_DESC =

      (GLOBAL_DBNAME = pri)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = db1)

    )

 

    username/passwd@service_name的形式访问数据库,此时service_nametnsname.ora中的网络服务名,而不是实例服务名。同理,远程登录和tnsping都是用的网络服务名。简而言之,网络服务名对外使用,实例服务名对内使用。

3$ sqlplus sys/oracle@prime as sysdba(正确)

      $ sqlplus sys/oracle@pri as sysdba(错误)

4$ tnsping prime(正确)

      $ tnsping pri(错误)

 


 

二、规划

1 主库安装数据库软件并创建数据库实例,备库只安装数据库软件。

不用安装两个虚拟机,可等主库装完数据库软件后,克隆一个备库虚拟机。

 

2 数据库基目录$ORACLE_BASE=/u01/app/oracle/

  数据库家目录$ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1/

 

3 主备库配置信息

主库

主机名:dg1

IP地址:192.168.1.199

oracle_siddb1

db_unique_name: pri

service_name: prime

global_name: pri

 

备库

主机名:dg2

IP地址:192.168.1.200

oracle_siddb1

db_unique_name: std

service_name: stdby

global_name: std

 

注:service_nametnsname.ora中的网络服务名,global_nametnsname.ora中的实例服务名必须完全一样。

 

4 在主库和备库中都执行

# vi /etc/hosts

192.168.1.199   dg1

192.168.1.200   dg2

 

在两台主机上分别执行

ping -c 5 dg1

ping -c 5 dg2

 

5 为方便操作,每台主机各开两个终端,一个执行SQL命令,一个执行系统命令。


 

三、配置DataGuard

1 在主机dg1中用dbca创建数据库实例db1

创建过程中,EM不要选;选择启用归档日;快速闪回区不要选,但要在编辑日志位置中填上路径/u01/app/oracle/oradata/db1/archive

 

2 在主库中用$ netmgr命令创建监听和网络服务。

1

[oracle@dg1 ~]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin

[oracle@dg1 admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = pri)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = db1)

    )

  )

 

LISTENER =

  (DESCRIPTION =

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

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

[oracle@dg1 admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

PRIME =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = pri)

    )

  )

 

STDBY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = std)

    )

  )

 

2

在备库中用netmgr创建监听服务和网络服务

[oracle@dg2 ~]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin

[oracle@dg2 admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = std)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = db1)

    )

  )

 

LISTENER =

  (DESCRIPTION =

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

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

[oracle@dg2 admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

PRIME =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = pri)

    )

  )

 

STDBY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = std)

    )

  )

 

3)在主库和备库中分别执行tnsping primetnsping stdby命令

[oracle@dg1 ~] tnsping prime

[oracle@dg1 ~] tnsping stdby

[oracle@dg2 ~] tnsping prime

[oracle@dg2 ~] tnsping stdby

ping不通,重启监听服务试试

 

3 配置主库为归档模式

[oracle@dg1 ~]$ sqlplus / as sysdba

SQL> archive log list

数据库日志模式            存档模式

自动存档             启用

存档终点            /u01/app/oracle/oradata/archive

最早的联机日志序列     2

下一个存档日志序列   4

当前日志序列           4

 

4 更改主库为强制写日志

SQL> col force_logging format a15;

 

SQL> select force_logging from v$database;

FORCE_LOGGING

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

NO

 

SQL> alter database force logging;

数据库已更改。

 

SQL> select force_logging from v$database;

FORCE_LOGGING

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

YES

 

5 主库中创建initdb1.ora文件

[oracle@dg1 admin]$ cd /u01/app/oracle/product/11.2.0/db_1/dbs/

[oracle@dg1 dbs]$ ls

hc_db1.dat  hc_DBUA0.dat  init.ora  lkDB1  orapwdb1  spfiledb1.ora

 

SQL> create pfile from spfile;

文件已创建。

 

[oracle@dg1 dbs]$ ls

hc_db1.dat  hc_DBUA0.dat  initdb1.ora  init.ora  lkDB1  orapwdb1  spfiledb1.ora

 

6 编辑initdb1.ora中的参数

[oracle@dg1 dbs] $ vi initdb1.ora

1initdb1.ora中已有log_archive_dest_1,这个参数格式将有所改变,先注释起来,下面会重新添加

2)在initdb1.ora下方添加如下参数

*.DB_UNIQUE_NAME=pri

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(pri,std)'  #(启动db接受或发送redo data,包括所有库的db_unique_name

*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri'  #(主库归档目的地)

*.LOG_ARCHIVE_DEST_2='SERVICE=stdby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=std'  #(当该库充当主库角色时,设置物理备库redo data的传输目的地)

*.LOG_ARCHIVE_MAX_PROCESSES=5    #(最大ARCn进程数)

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE    #允许redo传输服务传输数据到目的地

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE  #允许redo传输服务传输数据到目的地

*.FAL_SERVER=stdby  #(配置网络服务名,假如转换为备库角色时,从这里获取丢失的归档文件)

*.FAL_CLIENT=prime   #(配置网络服务名,fal_server拷贝丢失的归档文件到这里)

#*.DB_FILE_NAME_CONVERT='/路径','路径'    (前为切换后的主库路径,后为切换后的备库路径,这里主备库目录结构完全一样,则无需设定)

#*.LOG_FILE_NAME_CONVERT='/路径','/路径'     # (同上,这两个名字转换参数是主备库的路径映射关系,可能会是路径全名,看情况而定)

*.STANDBY_FILE_MANAGEMENT=AUTO  #auto后当主库的datafiles增删时备库也同样自动操作,且会把日志传送到备库standby_archive_dest参数指定的目录下,确保该目录存在,如果你的存储采用文件系统没有问题,但是如果采用了裸设备,你就必须将该参数设置为manual

 

7 上一步中pfile的内容改变了,相应地要改变spfile的内容。方法是新建一个spfile

SQL> shutdown immediate

SQL> startup pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora'

SQL> create spfile from pfile;

 

8 在主库上创建备库需要的控制文件

SQL> shutdown immediate

SQL> startup mount 

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

SQL> shutdown immediate

 

9 备份生产数据库

1)在备库中创建oradata目录和admin目录

[oracle@dg2 ~] $

cd /u01/app/oracle

mkdir oradata

mkdir admin

 

2)将主库数据库文件拷贝到备库机器上

 [oracle@dg1 dbs] $

scp -rp /u01/app/oracle/oradata/db1 dg2:/u01/app/oracle/oradata

[oracle@dg1 dbs]$

scp -rp /u01/app/oracle/admin/db1 dg2:/u01/app/oracle/admin

 

3)将主库的密码文件和pfile文件拷贝到备库

[oracle@dg1 dbs] $

scp -rp /u01/app/oracle/product/11.2.0/db_1/dbs/orapwdb1 dg2:/u01/app/oracle/product/11.2.0/db_1/dbs/orapwdb1

[oracle@dg1 dbs] $

scp -rp /u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora dg2:/u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora

 

10 替换备库的控制文件

1)在备库上删掉数据库所有的控制文件

[oracle@dg2 oracle] $ rm -rf /u01/app/oracle/oradata/db1/control*.ctl

 

2)将主库备份的控制文件拷贝到备份机器上,并复制一个(要与pfile中的*.control_files参数一致)

[oracle@dg1 dbs] $

scp -rp /tmp/standby.ctl  dg2:/u01/app/oracle/oradata/db1/control01.ctl

[oracle@dg2 db1] $

cd /u01/app/oracle/oradata/db1/

cp control01.ctl  control02.ctl

 

11 修改备库pfile

[oracle@dg2 ~] $

cd /u01/app/oracle/product/11.2.0/db_1/dbs

vi initdb1.ora

 

*.DB_UNIQUE_NAME=std

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(pri,std)'  #(启动db接受或发送redo data,包括所有库的db_unique_name

*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std'  #(主库归档目的地)

*.LOG_ARCHIVE_DEST_2='SERVICE=prime LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=pri'  #(当该库充当主库角色时,设置物理备库redo data的传输目的地)

*.LOG_ARCHIVE_MAX_PROCESSES=5    #(最大ARCn进程数)

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE    #允许redo传输服务传输数据到目的地

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE  #允许redo传输服务传输数据到目的地

*.FAL_SERVER=prime  #(配置网络服务名,假如转换为备库角色时,从这里获取丢失的归档文件)

*.FAL_CLIENT=stdby  #(配置网络服务名,fal_server拷贝丢失的归档文件到这里)

#*.DB_FILE_NAME_CONVERT='/路径','路径'    (前为切换后的主库路径,后为切换后的备库路径,这里主备库目录结构完全一样,则无需设定)

#*.LOG_FILE_NAME_CONVERT='/路径','/路径'      (同上,这两个名字转换参数是主备库的路径映射关系,可能会是路径全名,看情况而定)

*.STANDBY_FILE_MANAGEMENT=AUTO  #auto后当主库的datafiles增删时备库也同样自动操作,且会把日志传送到备库standby_archive_dest参数指定的目录下,确保该目录存在,如果你的存储采用文件系统没有问题,但是如果采用了裸设备,你就必须将该参数设置为manual

 

12在备库上创建spfile  

[oracle@dg2 dbs] $ sqlplus / as sysdba

创建备库spfile

SQL> startup pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora'

SQL> create spfile from pfile;

 

13 配置standby redolog

(最佳性能模式可以忽略,如果要转为其它两种模式则要建立)

 

分别在dg1dg2上建立standby文件夹,用于standby Redo log

[oracle@dg1 dbs] $ mkdir /u01/app/oracle/oradata/db1/standby

[oracle@dg2 dbs] $ mkdir /u01/app/oracle/oradata/db1/standby

 

在主库查看日志组的数量和每个日志文件的大小

SQL> SELECT GROUP#, BYTES FROM V$LOG;

在备库查看日志组的数量和每个日志文件的大小

SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;

 

在主库和备库中创建日志组和redo log文件

SQL> ALTER DATABASE ADD STANDBY LOGFILE group 4 ('/u01/app/oracle/oradata/db1/standby/slog1.rdo') SIZE 50M;

 SQL> ALTER DATABASE ADD STANDBY LOGFILE group 5 ('/u01/app/oracle/oradata/db1/standby/slog2.rdo') SIZE 50M;

SQL> ALTER DATABASE ADD STANDBY LOGFILE group 6 ('/u01/app/oracle/oradata/db1/standby/slog3.rdo') SIZE 50M;

SQL> ALTER DATABASE ADD STANDBY LOGFILE group 7 ('/u01/app/oracle/oradata/db1/standby/slog4.rdo') SIZE 50M;

 

注:standby redolog的组数参考公式:(online redolog组数 + 1) * 数据库线程数;单机线程数为1RAC一般为2

standby redolog的组成员数和大小也尽量和online redolog一样。

 

14 在备库上执行备库恢复模式

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS

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

db1               OPEN

 

SQL> alter database recover managed standby database disconnect from session;

数据库已更改

 

结束这个恢复进程:

SQL> alter database recover managed standby database cancel;

 

15 将备库启动到open read only的状态

SQL> shutdown immediate

SQL> startup mount

SQL> alter database open read only;

 

16 查看主库和备库的日志同步情况,确保已经同步

主库:

SQL> archive log list

数据库日志模式            存档模式

自动存档             启用

存档终点            /u01/app/oracle/oradata/archive

最早的联机日志序列     14

下一个存档日志序列   16

当前日志序列           16

 

备库:

SQL> archive log list

数据库日志模式            存档模式

自动存档             启用

存档终点            /u01/app/oracle/oradata/archive

最早的联机日志序列     14

下一个存档日志序列   0

当前日志序列           16

 


 

四、检验

检验方法:在主库中创建一张表,看在备库中是否可以查到。

 

1 在主库中创建一张表

SQL> create table test_table(id number);

表已创建

 

看备库上是否可以查到

SQL> desc test_table;

ERROR:

ORA-04043: 对象 test_table 不存在

 

2备库上接收数据,并自动同步:

SQL> alter database recover managed standby database using current logfile disconnect from session;

数据库已更改

 

SQL> desc test_table;

 名称                                      是否为空? 类型

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

 ID                                                 NUMBER

 

3 再次验证数据是否同步。

主库:

SQL> insert into test_table values(1);

已创建 1 行。

SQL> commit;

提交完成。

 

备库:

SQL> select * from test_table;

        ID

----------

         1

 

这里数据实现了同步,说明dataguard配置成功了。

五、参考文档

http://wenku.baidu.com/link?url=2qd_nptFo0Anw-_7AUx0uKknZWvJp1AOatf_zIO7RsWwBuMJuEN0DTCbYHV_eLYQVhyJe4hxEGwxNKR2q50jWTYaZVdLYHMu0ZTj1gakkZe

 

http://blog.itpub.net/29107230/viewspace-1063628/

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29485627/viewspace-1583688/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29485627/viewspace-1583688/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值