Oracle 11gR2默认valid_for引起ora-16009

本文介绍了在Oracle 11gR2中遇到ORA-16009错误的情况,该错误出现在备库的v$archive_dest视图中,原因是LOG_ARCHIVE_DEST_2参数设置不规范。通过分析日志和问题排查,发现默认的valid_for属性导致了问题。解决方案是在主库和备库上分别执行ALTER SYSTEM命令,补充完整valid_for参数,设置为'(online_logfiles, primary_role)',从而解决了错误,使Data Guard体系结构恢复正常。" 119317731,10537834,在CentOS 7上使用KVM安装Windows Server 2012 R2,"['服务器虚拟化', 'KVM', 'CentOS', 'Windows Server']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

alter日志路径:/u01/app/oracle/diag/rdbms/orcl1234_dg/orcl1234/trace/


配置完成dataguard后通过命令在主库和备库上查询:

SQL> select max(sequence#) from v$archived_log;

是一致没有错误的

通过命令

SQL> select dest_name,error,status,process from v$archive_dest where rownum<3;

在主库查询也是没有错误的

但是在备库查询:

SQL> select dest_name,error,status,process from v$archive_dest where rownum<3;

DEST_NAME
--------------------------------------------------------------------------------
ERROR
-----------------------------------------------------------------
STATUS           PROCESS
------------------ --------------------
LOG_ARCHIVE_DEST_1

VALID           ARCH

LOG_ARCHIVE_DEST_2
ORA-16009: invalid redo transport destination
ERROR           LGWR

DEST_NAME
--------------------------------------------------------------------------------
ERROR
-----------------------------------------------------------------
STATUS           PROCESS
------------------ --------------------
可以看出出现错误。


通过查看alter日志出现:

Errors in file /u01/app/oracle/diag/rdbms/orcl1234_dg/orcl1234/trace/orcl1234_arc1_3065.trc:
ORA-16009: invalid redo transport destination
PING[ARC1]: Heartbeat failed to connect to standby 'orcl1234_pre'. Error is 1600

通过查询是因为我的log_archive_dest_2参数设置默认参数引起的,我设置值为:

*.LOG_ARCHIVE_DEST_2='service=orcl1234_dg DB_UNIQUE_NAME=orcl1234_dg'

需要这里说明的是11g这个ora-16009 invalid redo transport destination并没有影响dg体系结构的运行,而这个错误也是反映在备库的v$archive_dest下,这个因为log_archive_dest_2参数不规范引起的,默认不设置valid_for属性oracle认为是 :

LGWR VALID_FOR=(ALL_LOGFILES, ALL_ROLES)。

修改参数将其补全,在主库上执行:

SQL> alter system set log_archive_dest_2='service=orcl1234_dg arch valid_for=(online_logfiles,primary_role) db_unique_name=orcl1234_dg';

System altered.

备库上执行:

SQL> alter system set log_archive_dest_2='service=orcl1234_pre arch valid_for=(online_logfiles,primary_role) db_unique_name=orcl1234_pre';

最后再在备库上通过命令查看
SQL> select dest_name,error,status,process from v$archive_dest where rownum<3;

DEST_NAME
--------------------------------------------------------------------------------
ERROR
-----------------------------------------------------------------
STATUS           PROCESS
------------------ --------------------
LOG_ARCHIVE_DEST_1

VALID           ARCH

LOG_ARCHIVE_DEST_2

VALID           ARCH

DEST_NAME
--------------------------------------------------------------------------------
ERROR
-----------------------------------------------------------------
STATUS           PROCESS
------------------ --------------------
恢复正常。alter日志也正常。


参考:http://www.dbaxiaoyu.com/archives/812

<think>好的,我需要解决用户在使用ThinkPHP6连接Oracle时遇到的ORA-12547错误。首先,我得回忆一下这个错误的具体含义。ORA-12547通常表示客户端与Oracle服务器之间的连接在建立过程中突然中断,可能是由于网络问题、客户端配置错误或服务器端服务未正确启动。 根据用户提供的引用信息,之前的错误如ORA-12514和ORA-12154更多涉及TNS监听器配置或连接描述符的问题,但ORA-12547有所不同。现在需要结合这些引用中的线索,找出可能的解决方案。首先,用户提到的引用[4]中提到了检查tnsnames.ora文件,确保连接串正确。虽然ORA-12547可能不直接是TNS配置问题,但检查网络连接和配置总是第一步。接下来,引用[3]提到PHP环境需要正确配置Oracle客户端和字符集,这可能涉及到PDO_OCI驱动的问题,比如驱动未正确安装或权限不足。另外,用户使用的是ThinkPHP6,框架本身可能对PDO_OCI有特定的配置要求。需要确认数据库配置是否正确,包括服务名、主机名、端口等是否正确填写。同时,Oracle客户端版本与服务器版本是否兼容也是一个需要考虑的因素,比如使用Oracle11g客户端连接11g服务器时是否匹配。 还有可能的问题包括防火墙或安全组阻止了连接,或者Oracle监听器服务未启动。服务器端的监听日志可能包含更多信息,因此建议用户检查服务器端的日志以确定具体中断原因。此外,PHP的环境配置是否正确,比如是否安装了必要的Oracle InstantClient,并且环境变量如PATH、LD_LIBRARY_PATH是否正确设置。引用[3]提到需要检查字符集和NLS设置,这可能导致驱动初始化失败,从而引发ORA-12547错误。 总结下来,可能的解决步骤包括:检查网络连通性,验证Oracle客户端安装和配置,确认数据库连接参数正确,检查服务器端监听器状态,查看日志文件获取更多错误信息,以及确保PHP环境和权限设置正确。需要逐一排查这些方面,找到导致连接中断的具体原因。</think>针对ThinkPHP6连接Oracle时出现`ORA-12547: TNS lost contact`错误的问题,以下是分步解决方案: --- ### **1. 检查Oracle客户端配置** - **安装Oracle Instant Client** 确保服务器已安装与Oracle数据库版本匹配的`Instant Client Basic`和`Instant Client SDK`,并配置环境变量: ```bash # Linux示例(路径根据实际安装位置调整) export LD_LIBRARY_PATH=/usr/lib/oracle/21/client64/lib:$LD_LIBRARY_PATH export PATH=$PATH:/usr/lib/oracle/21/client64/bin ``` - Windows需将Instant Client目录添加到`PATH`环境变量[^3]。 - **验证客户端连通性** 使用`tnsping`测试TNS连接: ```bash tnsping YOUR_SERVICE_NAME ``` 若返回`OK`但仍有错误,需检查防火墙是否开放1521端口[^4]。 --- ### **2. 检查PHP环境与PDO_OCI驱动** - **确认PDO_OCI扩展已启用** 在`php.ini`中确保以下配置: ```ini extension=oci8 extension=pdo_oci ``` 执行`php -m`查看是否加载了`oci8`和`pdo_oci`模块[^3]。 - **检查权限与依赖库** - Linux下确保PHP进程对Oracle库文件有读取权限(如`libclntsh.so`)。 - 运行`ldd /path/to/php-pdo_oci.so`验证依赖库是否完整。 --- ### **3. 核对ThinkPHP6数据库配置** 在`.env`或`config/database.php`中填写正确的Oracle连接信息: ```php 'connections' => [ 'oracle' => [ 'type' => 'oracle', 'hostname' => 'hostname:port/service_name', // 格式:IP:PORT/SERVICE_NAME 'database' => 'service_name', 'username' => 'username', 'password' => 'password', 'charset' => 'AL32UTF8', // 与数据库字符集一致 ], ], ``` - **注意**:若使用SID而非服务名,需将`hostname`改为`hostname:port:SID`[^4]。 --- ### **4. 排查服务器端问题** - **检查监听器状态** 在Oracle服务器执行: ```bash lsnrctl status ``` 确认监听器是否正常启动,且服务名已注册[^4]。 - **查看日志定位问题** 检查服务器端日志: - `$ORACLE_HOME/network/log/listener.log` - `$ORACLE_HOME/rdbms/log/alert_[SID].log` 查找`ORA-12547`的具体触发原因(如权限不足或协议不匹配)[^1]。 --- ### **5. 其他常见原因** - **Oracle用户权限问题** 确保数据库用户未被锁定,且具有`CREATE SESSION`权限。 - **SELinux/Linux安全策略** 临时关闭SELinux测试是否影响连接: ```bash setenforce 0 ``` --- ### **验证解决方案** 通过PHP脚本直接测试PDO连接: ```php try { $pdo = new PDO('oci:dbname=//hostname:port/service_name', 'username', 'password'); echo "连接成功!"; } catch (PDOException $e) { echo "错误信息: " . $e->getMessage(); } ``` 若仍报错,根据输出调整配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值