一、tnsname.ora和listener.ora用法简介
二、规划
三、配置DataGuard
四、检验
五、参考文档
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必须完全一样。
例2:listener.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_name是tnsname.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_sid:db1
db_unique_name: pri
service_name: prime
global_name: pri
备库
主机名:dg2
IP地址:192.168.1.200
oracle_sid:db1
db_unique_name: std
service_name: stdby
global_name: std
注:service_name为tnsname.ora中的网络服务名,global_name与tnsname.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命令,一个执行系统命令。
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 prime和tnsping 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
(1)initdb1.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
(最佳性能模式可以忽略,如果要转为其它两种模式则要建立)
分别在dg1和dg2上建立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) * 数据库线程数;单机线程数为1,RAC一般为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/