RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154

    最近在从活动数据库进行异机克隆时碰到了ORA-17629,ORA-17627,ORA-12154的错误,起初以为是一个Bug呢。Oracle Bug着实太多了,已经成了习惯性思维了。汗!错误提示是无法连接到连接到远程数据库,连接字符串无法解析。咦,配置了从auxiliary DB到target DB的tnsnames,且都是连通的阿......

 

1、故障现象
    --下面的操作在auxiliary DB所在的机器上完成
    [oracle@linux4 ~]$ export ORACLE_SID=sybo3
    [oracle@linux4 ~]$ sqlplus / as sysdba
    SQL> startup nomount;
    [oracle@linux4 ~]$ rman target
sys/oracle@TAR auxiliary sys/oracle@AUX  

    Recovery Manager: Release 11.2.0.1.0 - Production on Wed Jul 31 16:00:59 2013

    Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

    connected to target database: SYBO3 (DBID=2347733014)
    connected to auxiliary database: SYBO3 (not mounted)

    RMAN> duplicate database to sybo3 from active database spfile nofilenamecheck;

    Starting Duplicate Db at 31-JUL-13
    using target database control file instead of recovery catalog
    allocated channel: ORA_AUX_DISK_1
    channel ORA_AUX_DISK_1: SID=125 device type=DISK

    contents of Memory Script:
    {
       backup as copy reuse
       targetfile  '/u01/oracle/db_1/dbs/spfilesybo3.ora' auxiliary format
     '/u01/oracle/db_1/dbs/spfilesybo3.ora'   ;
       sql clone "alter system set spfile= ''/u01/oracle/db_1/dbs/spfilesybo3.ora''";
    }
    executing Memory Script

    Starting backup at 31-JUL-13
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: SID=23 device type=DISK
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of Duplicate Db command at 07/31/2013 16:01:07
    RMAN-03015: error occurred in stored script Memory Script
    RMAN-03009: failure of backup command on ORA_DISK_1 channel at 07/31/2013 16:01:07
    ORA-17629: Cannot connect to the remote database server                       
    ORA-17627: ORA-12154: TNS:could not resolve the connect identifier specified
    ORA-17629: Cannot connect to the remote database server

 

2、故障分析与解决
    上面是一堆的RMAN与ORA相关错误号了
    在执行脚本backup as copy reuse时出现了错误,也就是说备份的时候出现错误RMAN-03009
    其次是ORA-17629,不能连接到远程数据库服务器,ORA-17627后跟着ORA-12154,说明是由于无法解析字符串
    下面来看看ORA-17629到底是什么问题
    [oracle@linux4 ~]$ oerr ora 17629
    17629, 00000, "Cannot connect to the remote database server"
    // *Cause:  Connecting to the remote server specified by database connect
    //          string for netowrk file transfer failed.
    // *Action: Check additional error messages

    重要的提示信息:for netowrk file transfer failed,网络文件传输失败。
    由于我们使用的是从活动数据库进行克隆,因此活动数据库的数据文件等等应当会通过网络复制到辅助数据库,更确切地是说是通过Oracle Net。
    也就是说尽管我们在辅助数据库端配置了到target DB以及到Auxiliary DB的tnsnames的连接是不够的,target DB端也要连接到Auxiliary DB传送文件。
    上面只是一个初步的推测,从Oracle Metalink找到了关于这个问题的描述。就是需要在两个服务器之间都配置到target DB与Auxiliary DB的tnsnames。

    检查一下两个主机的tnsnames.ora的配置
    [oracle@linux3 admin]$ more tnsnames.ora
    # tnsnames.ora Network Configuration File: /u01/oracle/db_1/network/admin/tnsnames.ora
    # Generated by Oracle configuration tools.

    TAR =                               #Target Server只有到Target DB的tnsnames.ora
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.25)(PORT = 1531))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = SYBO3.ORASRV.COM)
        )
      )
 
    [oracle@linux4 admin]$ more tnsnames.ora  #Auxiliary Server有到Target DB和Auxiliary DB的tnsnames.ora
    TAR =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.25)(PORT = 1531))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = SYBO3.ORASRV.COM)
        )
      )

    AUX =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.26)(PORT = 1531))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = SYBO3.ORASRV.COM)
        )
      )

    -- Author : Robinson Cheng
    -- Blog   :
http://blog.youkuaiyun.com/robinson_0612

    解决方案
        在Target Server端添加到Auxiliary DB的tnsnames.ora,即与Auxiliary server端使用相同的tnsnames entry

    下面测试tnsnames的连通性
    [oracle@linux3 admin]$ tnsping aux 
    [oracle@linux3 admin]$ tnsping tar
    [oracle@linux4 admin]$ tnsping aux
    [oracle@linux4 admin]$ tnsping tar

    再次duplicate时,成功鸟,喝茶哟!

 

3、MetaLink的描述(Doc ID 1144273.1)
    Applies to:
    Oracle Database - Enterprise Edition - Version 11.2.0.1 and later
    Information in this document applies to any platform.

    Symptoms

    The duplicate database from active failed with the following errors :

    ORA-17629: Cannot connect to the remote database server
    ORA-17627: ORA-12154: TNS:could not resolve the connect identifier specified
    ORA-17629: Cannot connect to the remote database server

    Cause
        Cause 1:

        For Active Duplication you need to connect to the target and Auxiliary DB using net service name ,even if you are running RMAN at the Auxiliary DB.
        The net service name to connect to the Auxiliary DB should also be configured at the target Database.
  
        In the tnsnames.ora on the machine of the TARGET database, there are 2 services created to connect to auxiliary database that have the same "service name" but "different" configuration.

 

        Possible Cause 2:
  
        Mismatch of Parameters DEFAULT_DOMAIN and DB_DOMAIN
  
        db_domain=PROD.world         # init<SID>.ora
        default_domain=PROD.WORLD    # sqlnet.ora
  
        # DEFAULT_DOMAIN defined on sqlnet.ora is 'case' sensitive and when defined must match
           DB_DOMAIN initialization parameter

 

    Solution

        1. To be sure that the tnsnames.ora file of each machine (machine where is the source database and machine where is the auxiliary  database) has the service name to connect to auxiliary database.
  
        2. Verify that there are not duplicate service_name with different configuration in the tnsnames.ora file.
  
        As per the Step 2 of the below RMAN doc :
       
http://download.oracle.com/docs/cd/B28359_01/backup.111/b28270/rcmdupdb.htm#i1008564
  
          Step 2: Establish Oracle Net Connectivity to the Auxiliary Instance
  
        When duplicating from an active database, you must first have connected as SYSDBA to the auxiliary instance by means of a net service name. This net service name must also be available on the source database instance.
        The source database instance, to which RMAN is connected as TARGET, uses this net service name to connect directly to the auxiliary database instance.


      Double check using the following commands on the TARGET and AUXILIARY

        % tnsping <target_db>
        % tnsping <auxiliary_db>
      Once this is executed for the TARGET and AUXILIARY, it should return the same 'connect' information.

    Additional Note:

        If the listener is started from a different environment to rman client
        Then server processes will try to resolve the AUXILIARY service name using $TNS_ADMIN/tnsnames.ora where the value of TNS_ADMIN is as set in the 'listener runtime environment'.


Oracle&nbsp;牛鹏社

 

相关参考
    RMAN 数据库克隆文件位置转换方法

    基于RMAN的异机数据库克隆(rman duplicate)

    基于 RMAN 的同机数据库克隆

    基于用户管理的同机数据库克隆

    Oracle 冷备份

    Oracle 热备份

    Oracle 备份恢复概念

    Oracle 实例恢复

    Oracle 基于用户管理恢复的处理

    SYSTEM 表空间管理及备份恢复

    SYSAUX表空间管理及恢复

    Oracle 基于备份控制文件的恢复(unsing backup controlfile)

    RMAN 概述及其体系结构

    RMAN 配置、监控与管理

    RMAN 备份详解

    RMAN 还原与恢复

    RMAN catalog 的创建和使用

    基于catalog 创建RMAN存储脚本

    基于catalog 的RMAN 备份与恢复

    RMAN 备份路径困惑

    自定义 RMAN 显示的日期时间格式

    只读表空间的备份与恢复

    Oracle 基于用户管理的不完全恢复

    理解 using backup controlfile

    使用RMAN实现异机备份恢复(WIN平台)

    使用RMAN迁移文件系统数据库到ASM

    基于Linux下 Oracle 备份策略(RMAN)

    Linux 下RMAN备份shell脚本

    使用RMAN迁移数据库到异机

    RMAN 提示符下执行SQL语句

    Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)

    rman 还原归档日志(restore archivelog)

<think>我们正在处理一个关于RMAN备份恢复的错误。用户遇到了RMAN-04006错误,该错误来自辅助数据库,具体是ORA-12504: TNS:listenerwas notgiven theSERVICE_NAMEin CONNECT_DATA。根据引用[3]和引用[4]的信息,这个错误通常与TNS连接配置有关。具体来说,ORA-12504错误表示在连接描述符中没有指定SERVICE_NAME。分析:1.引用[3]指出,在连接字符串中,CONNECT_DATA部分必须包含SERVICE_NAME(或SID,但推荐使用SERVICE_NAME)。2.引用[4]则说明,在配置监听器,SID_LIST_LISTENER部分需要正确配置SID_NAME和GLOBAL_DBNAME。因此,解决这个问题需要检查两个方面: a.检查RMAN连接字符串中是否指定了正确的SERVICE_NAME。 b.检查辅助数据库的监听器配置文件(listener.ora)中是否配置了正确的服务。步骤:第一步:检查连接字符串在RMAN命令中,连接辅助数据库,连接描述符必须包含SERVICE_NAME。例如:rmantarget sys/password@primary auxiliarysys/password@standby这里的“standby”是在tnsnames.ora中定义的服务名,而在tnsnames.ora中,该服务名的定义必须包含SERVICE_NAME。例如,在tnsnames.ora中应该有这样的条目:STANDBY =(DESCRIPTION=(ADDRESS =(PROTOCOL= TCP)(HOST =standby_host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME= standby_service_name)#这里必须是辅助数据库的服务名))第二步:检查监听器配置在辅助数据库服务器上,检查listener.ora文件,确保监听器配置中包含了辅助数据库实例的服务。例如,listener.ora中应该有这样的配置:SID_LIST_LISTENER=(SID_LIST=(SID_DESC =(SID_NAME =<sid_name>)(ORACLE_HOME= <oracle_home>)(GLOBAL_DBNAME =<service_name>)#这里应该是服务名))注意:如果数据库是单实例数据库,通常GLOBAL_DBNAME设置为数据库的服务名(即初始化参数service_names的值)。SID_NAME设置为实例名(即初始化参数instance_name的值)。第三步:重启监听器修改配置后,需要重启监听器使配置生效:lsnrctlstoplsnrctl start第四步:验证连接在辅助数据库服务器上,使用tnsping验证服务名:tnsping standby_service_name在客户端,使用sqlplus测试连接:sqlplus sys/password@standby assysdba如果以上测试通过,则RMAN连接应该也能成功。根据引用[4]中的例子,配置错误的情况是SID_NAME和GLOBAL_DBNAME配置不正确,需要确保它们与数据库的实际参数一致。另外,注意在Oracle12c及以上版本中,对于多租户环境,连接容器数据库(CDB)通常使用服务名指向CDB,而连接PDB则需要指定PDB的服务名。因此,如果辅助数据库是CDB,并且要复制到PDB,那么连接字符串中的SERVICE_NAME应该是CDB的服务名(或者如果是直接复制PDB,则需要使用PDB的服务名,具体取决于RMAN复制的命令)。总结解决方案:1.确保tnsnames.ora中辅助数据库的连接描述符包含正确的SERVICE_NAME。2.确保辅助数据库的listener.ora中正确配置了该SERVICE_NAME对应的实例。3.重启监听器。4.测试连接。如果问题仍然存在,可以检查监听器的状态,查看服务是否已经注册:lsnrctl status查看输出中是否有辅助数据库的服务名。注意:动态注册不需要在listener.ora中配置SID_LIST,但是需要数据库实例启动并正确注册到监听器。如果使用动态注册,确保数据库实例已经启动,并且参数local_listener设置正确(如果监听器不是默认的1521端口,则需要设置)。但是,根据错误信息“listener wasnot giventhe SERVICE_NAME”,通常是因为连接字符串中缺少SERVICE_NAME,所以重点检查连接字符串。</think>### RMAN-04006 ORA-12504 错误解决方案 #### 问题分析 当使用RMAN执行`DUPLICATE DATABASE`或`ACTIVE DUPLICATE`命令出现`RMAN-04006: error from auxiliary database: ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA`错误,表明**辅助数据库的连接描述符中缺少SERVICE_NAME参数**。以下是根本原因和解决方案: --- ### 解决步骤 #### 1. **检查TNS连接字符串**(关键步骤) 在辅助数据库的`tnsnames.ora`文件中,确保连接描述符包含`SERVICE_NAME`而非`SID`: ```tnsnames.ora # 错误配置(使用SID): STANDBY = (DESCRIPTION = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)) (CONNECT_DATA = (SID = ORCL)) # ← 此处错误 ) # 正确配置(使用SERVICE_NAME): STANDBY = (DESCRIPTION = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521)) (CONNECT_DATA = (SERVICE_NAME = ORCL_DG)) # ← 必须使用SERVICE_NAME ) ``` #### 2. **验证监听器配置** 在辅助数据库服务器的`listener.ora`中,确保已正确定义服务名: ```listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL_DG) # 与tnsnames中的SERVICE_NAME一致 (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (SID_NAME = ORCL) # 实际实例名 ) ) ``` 重启监听器生效: ```bash lsnrctl stop lsnrctl start ``` #### 3. **确认数据库注册状态** 在辅助数据库执行: ```sql SQL> ALTER SYSTEM REGISTER; -- 强制注册服务 SQL> SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE; -- 确认实例状态 ``` #### 4. **验证网络连接** 使用`tnsping`和`sqlplus`测试连通性: ```bash tnsping STANDBY # 测试TNS解析 sqlplus sys/password@STANDBY AS SYSDBA # 测试实际连接 ``` #### 5. **调整RMAN命令** 在RMAN连接字符串中显式指定服务名: ```bash rman TARGET sys/password@PRIMARY \ AUXILIARY sys/password@STANDBY # ← 确保STANDBY指向正确服务名 ``` --- ### 根本原因说明 - **ORA-12504**:表示连接请求未在`CONNECT_DATA`段中提供`SERVICE_NAME`参数[^3]。 - **RMAN-04006**:因辅助数据库连接失败导致RMAN操作中止[^4]。 - 动态监听注册(默认)要求使用`SERVICE_NAME`,静态监听配置需匹配`GLOBAL_DBNAME`[^2]。 --- ### 预防措施 1. **统一命名规范**:主备库的`SERVICE_NAME`和`GLOBAL_DBNAME`保持一致。 2. **多租户环境**:CDB/PDB架构中需使用PDB的服务名(如`SERVICE_NAME = pdb1`)。 3. **日志检查**:监听器日志(`$ORACLE_BASE/diag/tnslsnr/<hostname>/listener/trace/listener.log`)可捕获详细错误。 > 📌 **注意**:Oracle 12c+ 推荐使用`SERVICE_NAME`替代`SID`,尤其在Data Guard和RMAN场景中[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风智语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值