Skip to content

TNS-12571 TNS Packet Writer Failure - Network Write Error Resolution

Error Text: TNS-12571: TNS:packet writer failure

This error occurs when the Oracle TNS layer cannot write data packets to the network connection. It indicates a failure in the network communication layer during data transmission, often caused by network interruptions, connection drops, or underlying network infrastructure problems.

TNS Packet Components
├── Packet Header
│ ├── Packet Length
│ ├── Packet Checksum
│ └── Packet Type
├── Data Payload
│ ├── SQL Statements
│ ├── Result Sets
│ └── Control Information
└── Packet Trailer
Client → Network → Listener → Database
↓ ↓ ↓ ↓
Packet Network Process Response
Writer Layer Handler Generator
  • Network interface card (NIC) failures
  • Network cable disconnections
  • Switch or router problems
  • Network congestion and packet loss
  • MTU (Maximum Transmission Unit) mismatches
Terminal window
# Connection abnormally terminated
# Client application crashes
# Network timeout exceeded
# Firewall dropping packets
# TCP window size issues
  • Dedicated server process crashes
  • Shared server process problems
  • Memory allocation failures
  • Resource contention
  • Network buffer exhaustion
  • System memory shortage
  • CPU overload affecting network I/O
  • Disk I/O blocking network operations
Terminal window
# Check network interface status
ifconfig -a # Linux/Unix
ipconfig /all # Windows
# Check network statistics
netstat -i # Interface statistics
netstat -s # Protocol statistics
# Check for packet drops
cat /proc/net/dev # Linux
# Look for errors, dropped packets
# Check network connectivity
ping -c 10 database_server
ping -s 1500 -c 10 database_server # Large packet test
Terminal window
# Enable TNS tracing
# Add to sqlnet.ora:
TRACE_LEVEL_CLIENT = 16
TRACE_DIRECTORY_CLIENT = /tmp/trace
TRACE_FILE_CLIENT = sqlnet_client
# Test connection with tracing
sqlplus username/password@service_name
# Analyze trace files
ls -la /tmp/trace/
grep -i "packet\|write\|error" /tmp/trace/sqlnet_client*.trc
Terminal window
# Monitor system resources during connection attempts
top -p $(pgrep oracle) # Monitor Oracle processes
# Check memory usage
free -m
cat /proc/meminfo
# Monitor network I/O
sar -n DEV 1 10 # Network device statistics
iostat -n 1 10 # Network I/O statistics
# Check for system errors
dmesg | grep -i "network\|ethernet\|tcp"
-- Check for network-related wait events
SELECT
event,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE '%TCP%'
OR event LIKE '%send%'
OR event LIKE '%receive%'
ORDER BY time_waited DESC;
-- Check current sessions with network issues
SELECT
sid,
serial#,
username,
machine,
program,
event,
wait_class,
seconds_in_wait
FROM v$session
WHERE event LIKE '%TCP%'
OR event LIKE '%send%'
OR event LIKE '%receive%'
ORDER BY seconds_in_wait DESC;
-- Check listener connections
SELECT
server,
status,
COUNT(*) as connection_count
FROM v$session
GROUP BY server, status
ORDER BY connection_count DESC;
Terminal window
# Test basic connectivity with different packet sizes
ping -s 64 database_server # Small packets
ping -s 1472 database_server # Large packets (standard MTU)
ping -s 8972 database_server # Very large packets
# Test TCP connectivity
telnet database_server 1521
nc -v database_server 1521
# Check route and network path
traceroute database_server
mtr database_server # Better traceroute
Terminal window
# Check current network settings
ethtool eth0 # Linux - network interface info
# Optimize network buffer sizes
# Add to /etc/sysctl.conf
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.ipv4.tcp_rmem = 4096 65536 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304
net.ipv4.tcp_no_metrics_save = 1
# Apply changes
sysctl -p
Terminal window
# Test MTU sizes
ping -M do -s 1472 database_server # Test standard MTU
ping -M do -s 1500 database_server # Test larger MTU
# Set optimal MTU if needed
ifconfig eth0 mtu 1500 # Temporary
# Or permanently in network configuration
# Oracle-specific MTU settings in sqlnet.ora
SQLNET.RECV_BUF_SIZE = 65536
SQLNET.SEND_BUF_SIZE = 65536
Terminal window
# Update sqlnet.ora on both client and server
SQLNET.RECV_TIMEOUT = 600
SQLNET.SEND_TIMEOUT = 600
SQLNET.EXPIRE_TIME = 10
TCP.CONNECT_TIMEOUT = 60
TCP.NODELAY = yes
# Connection retry settings
SQLNET.RETRY_COUNT = 3
SQLNET.RETRY_DELAY = 3
Terminal window
# Update listener.ora
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server_name)(PORT = 1521))
)
# Connection management settings
RATE_LIMIT_LISTENER = ON
CONNECTION_RATE_LISTENER = 50
VALID_NODE_CHECKING_REGISTRATION_LISTENER = SUBNET
# Restart listener
lsnrctl stop
lsnrctl start
-- Optimize network-related database parameters
ALTER SYSTEM SET processes = 500 SCOPE=BOTH;
ALTER SYSTEM SET sessions = 555 SCOPE=BOTH;
-- Connection and memory settings
ALTER SYSTEM SET shared_servers = 5 SCOPE=BOTH; -- If using shared servers
ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(DISPATCHERS=3)' SCOPE=BOTH;
-- Network optimization
ALTER SYSTEM SET db_writer_processes = 4 SCOPE=SPFILE; -- Restart required
Terminal window
# Capture Oracle traffic
tcpdump -i any -w oracle_packets.pcap port 1521
# Capture with detailed info
tcpdump -i any -s 0 -A port 1521
# Analyze with Wireshark or tshark
tshark -r oracle_packets.pcap -Y "tcp.port==1521"
# Look for retransmissions and errors
tshark -r oracle_packets.pcap -Y "tcp.analysis.flags"
Terminal window
# Test network throughput
iperf3 -c database_server # Client mode
iperf3 -s # Server mode (on database server)
# Test with Oracle-like traffic patterns
dd if=/dev/zero bs=8192 count=10000 | nc database_server 1521
// Java connection pool configuration
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@database_server:1521:ORCL");
// Network timeout settings
config.setConnectionTimeout(30000);
config.setSocketTimeout(60000);
config.setValidationTimeout(5000);
// Connection lifecycle management
config.setIdleTimeout(300000); // 5 minutes
config.setMaxLifetime(1800000); // 30 minutes
config.setLeakDetectionThreshold(60000); // 60 seconds
// Pool sizing
config.setMinimumIdle(5);
config.setMaximumPoolSize(20);
// Additional Oracle-specific properties
Properties props = new Properties();
props.setProperty("oracle.net.CONNECT_TIMEOUT", "60000");
props.setProperty("oracle.jdbc.ReadTimeout", "60000");
config.setDataSourceProperties(props);
# Python example with retry and error handling
import cx_Oracle
import time
import logging
def robust_oracle_connection(retries=3, delay=1):
for attempt in range(retries):
try:
connection = cx_Oracle.connect(
user="username",
password="password",
dsn="database_server:1521/service_name",
# Network settings
tcp_connect_timeout=60,
retry_count=3,
retry_delay=1
)
return connection
except cx_Oracle.DatabaseError as e:
error_code = e.args[0].code if e.args and hasattr(e.args[0], 'code') else 0
if error_code == 12571: # TNS packet writer failure
if attempt < retries - 1:
wait_time = delay * (2 ** attempt) # Exponential backoff
logging.warning(f"TNS packet writer failure, retrying in {wait_time}s (attempt {attempt + 1})")
time.sleep(wait_time)
continue
raise
raise Exception("Failed to establish connection after all retries")
# Usage with proper cleanup
def execute_query(sql):
connection = None
try:
connection = robust_oracle_connection()
cursor = connection.cursor()
cursor.execute(sql)
return cursor.fetchall()
finally:
if connection:
connection.close()
// Java connection health check
public class ConnectionHealthMonitor {
private static final String HEALTH_CHECK_SQL = "SELECT 1 FROM DUAL";
public boolean isConnectionHealthy(Connection conn) {
try (PreparedStatement stmt = conn.prepareStatement(HEALTH_CHECK_SQL)) {
stmt.setQueryTimeout(5); // 5 second timeout
ResultSet rs = stmt.executeQuery();
return rs.next() && rs.getInt(1) == 1;
} catch (SQLException e) {
if (e.getErrorCode() == 12571) { // TNS packet writer failure
logNetworkError("Packet writer failure detected", e);
}
return false;
}
}
private void logNetworkError(String message, SQLException e) {
logger.error("{}: Error code={}, SQL state={}",
message, e.getErrorCode(), e.getSQLState(), e);
}
}
#!/bin/bash
# Network health monitoring for Oracle
LOG_FILE="/var/log/oracle_network_health.log"
DB_HOST="database_server"
DB_PORT=1521
monitor_network_health() {
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# Test basic connectivity
if ! nc -z -w5 $DB_HOST $DB_PORT; then
echo "$timestamp: ERROR - Cannot connect to $DB_HOST:$DB_PORT" >> $LOG_FILE
return 1
fi
# Test packet transmission with different sizes
for size in 64 1472 8192; do
if ! ping -c 1 -s $size -W 5 $DB_HOST > /dev/null 2>&1; then
echo "$timestamp: WARNING - Packet size $size failed to $DB_HOST" >> $LOG_FILE
fi
done
# Check network interface statistics
rx_errors=$(cat /sys/class/net/eth0/statistics/rx_errors)
tx_errors=$(cat /sys/class/net/eth0/statistics/tx_errors)
if [ $rx_errors -gt 0 ] || [ $tx_errors -gt 0 ]; then
echo "$timestamp: WARNING - Network errors detected: RX=$rx_errors TX=$tx_errors" >> $LOG_FILE
fi
echo "$timestamp: Network health check completed" >> $LOG_FILE
}
# Run every 5 minutes
while true; do
monitor_network_health
sleep 300
done
-- Create monitoring procedure for network issues
CREATE OR REPLACE PROCEDURE monitor_network_sessions AS
BEGIN
-- Log sessions with network wait events
INSERT INTO network_session_log
SELECT
SYSDATE,
sid,
serial#,
username,
machine,
event,
wait_class,
seconds_in_wait
FROM v$session
WHERE event LIKE '%TCP%'
OR event LIKE '%send%'
OR event LIKE '%receive%'
OR event LIKE '%packet%';
-- Alert for long-waiting network sessions
FOR rec IN (
SELECT sid, serial#, username, event, seconds_in_wait
FROM v$session
WHERE (event LIKE '%TCP%' OR event LIKE '%send%' OR event LIKE '%receive%')
AND seconds_in_wait > 300 -- 5 minutes
) LOOP
DBMS_OUTPUT.PUT_LINE('ALERT: Long network wait - SID: ' || rec.sid ||
', Event: ' || rec.event ||
', Wait: ' || rec.seconds_in_wait || 's');
END LOOP;
COMMIT;
END;
/
-- Schedule to run every minute
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'NETWORK_MONITOR_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN monitor_network_sessions; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
enabled => TRUE
);
END;
/
#!/bin/bash
# Automated recovery for network issues
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_HOME
detect_network_issues() {
# Check for TNS-12571 errors in alert log
ERROR_COUNT=$(tail -1000 $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log | \
grep -c "TNS-12571")
if [ $ERROR_COUNT -gt 5 ]; then
echo "High TNS-12571 error count detected: $ERROR_COUNT"
return 1
fi
return 0
}
recovery_actions() {
echo "Performing network recovery actions..."
# Restart network interface (if allowed)
# sudo ifdown eth0 && sudo ifup eth0
# Clear network buffers
echo 3 > /proc/sys/vm/drop_caches
# Restart listener
lsnrctl stop
sleep 5
lsnrctl start
# Force service registration
$ORACLE_HOME/bin/sqlplus -s / as sysdba << EOF
ALTER SYSTEM REGISTER;
EXIT;
EOF
echo "Recovery actions completed"
}
# Main monitoring loop
if ! detect_network_issues; then
recovery_actions
# Send notification
echo "Oracle network recovery performed due to TNS-12571 errors" | \
mail -s "Oracle Network Recovery Alert" [email protected]
fi
Terminal window
# System-level network optimization
# Add to /etc/sysctl.conf
# Increase network buffer sizes
net.core.rmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_default = 1048576
net.core.wmem_max = 16777216
# TCP buffer sizes
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216
# Reduce TCP TIME_WAIT sockets
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# Apply settings
sysctl -p
-- Database network optimization
ALTER SYSTEM SET shared_pool_size = 256M SCOPE=BOTH;
ALTER SYSTEM SET large_pool_size = 64M SCOPE=BOTH;
-- Connection management
ALTER SYSTEM SET processes = 1000 SCOPE=SPFILE; -- Restart required
ALTER SYSTEM SET sessions = 1105 SCOPE=SPFILE; -- Restart required
-- Network-specific parameters
ALTER SYSTEM SET tcp_invited_nodes = 'ALL' SCOPE=BOTH;
ALTER SYSTEM SET sql_trace = FALSE SCOPE=BOTH; -- Reduce overhead if enabled
  • TNS-12150: TNS unable to send data
  • TNS-12152: TNS unable to send break message
  • TNS-12535: TNS operation timed out
  • ORA-03113: End-of-file on communication channel
  1. Implement robust connection retry logic
  2. Monitor network health continuously
  3. Optimize network buffer sizes
  4. Use connection pooling effectively
  5. Regular network infrastructure maintenance
  6. Implement proper timeout settings
  • Test basic network connectivity
  • Check network interface statistics
  • Verify MTU settings and packet sizes
  • Analyze TNS trace files
  • Monitor system resources
  • Check Oracle listener status
  • Implement connection retry logic
  • Optimize network buffer settings