1. 首页 > 国产数据库教程 > OceanBase教程 > 正文

OceanBase教程FG059-OceanBase连接故障处理实战

本文档风哥主要介绍OceanBase数据库连接故障处理相关知识,包括OceanBase连接架构、OceanBase连接流程、OceanBase连接类型、OceanBase连接池配置、OceanBase网络连接故障、OceanBase认证连接故障、OceanBase资源连接故障等内容,风哥教程参考OceanBase官方文档连接管理、故障处理等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 OceanBase连接架构

OceanBase数据库支持多种连接方式,了解连接架构有助于快速定位连接故障。更多视频教程www.fgedu.net.cn

OceanBase连接架构:

  • 直连模式:客户端直接连接OBServer节点,端口2881
  • 代理模式:通过OBProxy连接,端口2883
  • JDBC连接:Java应用通过JDBC驱动连接
  • ODBC连接:通过ODBC驱动连接
  • 命令行连接:通过obclient命令行工具连接

1.2 OceanBase连接流程

# OceanBase连接流程

1. TCP三次握手
– 客户端发起连接请求
– 服务端响应
– 连接建立

2. 协议协商
– 客户端发送握手包
– 服务端返回握手包
– 协商协议版本和认证方式

3. 身份认证
– 客户端发送认证信息
– 服务端验证用户名密码
– 检查主机权限

4. 会话建立
– 分配会话资源
– 初始化会话状态
– 返回连接成功

5. 连接维护
– 心跳检测
– 超时处理
– 连接复用

1.3 OceanBase连接类型

# OceanBase连接类型

1. 系统租户连接
– 用户:root@sys
– 用途:集群管理
– 权限:全部权限

2. MySQL租户连接,风哥提示:。
– 用户:user@tenant_name
– 用途:业务访问
– 权限:根据授权

3. Oracle租户连接
– 用户:user@tenant_name
– 用途:Oracle兼容业务
– 权限:根据授权

4. 代理连接
– 通过OBProxy连接
– 自动路由到可用节点
– 支持连接池

风哥提示:连接故障排查需要了解连接流程,从网络层到应用层逐步排查。

Part02-生产环境规划与建议

2.1 OceanBase连接池配置

# 连接池配置

1. Druid连接池配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=10
spring.datasource.druid.min-idle=10,学习交流加群风哥微信: itpux-com。
spring.datasource.druid.max-active=100
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false

2. HikariCP连接池配置
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.connection-test-query=SELECT 1

3. 连接池监控
# 查看连接池状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
svr_ip,
svr_port,
active_session_num,
total_session_num
FROM oceanbase.__all_virtual_processlist;

2.2 OceanBase连接限制

# 连接限制配置

1. 全局连接限制
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 设置最大连接数
SET GLOBAL max_connections = 500;

— 设置每个用户最大连接数,学习交流加群风哥QQ113257174。
SET GLOBAL max_user_connections = 50;

— 查看当前连接限制
SHOW VARIABLES LIKE ‘max_connections’;
SHOW VARIABLES LIKE ‘max_user_connections’;

2. 租户级连接限制
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 创建租户时设置连接限制
CREATE TENANT IF NOT EXISTS fgedu_tenant
PRIMARY_ZONE=’zone1,zone2,zone3′,
RESOURCE_POOL_LIST=(‘fgedu_pool’)
SET ob_tcp_invited_nodes=’%’,
max_connections=200;

3. 用户级连接限制
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 创建用户时设置连接限制
CREATE USER ‘fgedu_app’@’192.168.1.%’ IDENTIFIED BY ‘Fgedu@App2024!’
WITH MAX_USER_CONNECTIONS 20;

2.3 OceanBase连接监控

# 连接监控

1. 查看当前连接
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SHOW PROCESSLIST;

+——+—————–+——————+——–+———+——+———-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——+—————–+——————+——–+———+——+———-+——————+
| 1 | root@sys | 192.168.1.100:xxx| NULL | Sleep | 10 | | NULL |
| 2 | fgedu_app@app | 192.168.1.10:xxx | fgedudb| Query | 0 | executing| SELECT * FROM… |,更多视频教程www.fgedu.net.cn。
+——+—————–+——————+——–+———+——+———-+——————+

2. 查看连接统计
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
user,
db,
host,
command,
COUNT(*) as conn_count
FROM information_schema.processlist
GROUP BY user, db, host, command;

3. 连接监控脚本
#!/bin/bash
# connection_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

echo “=== OceanBase Connection Monitor ===”
echo “Date: $(date)”

# 获取连接数
CONN_COUNT=$(obclient -e “SHOW STATUS LIKE ‘Threads_connected'” | awk ‘NR==2{print $2}’)
MAX_CONN=$(obclient -e “SHOW VARIABLES LIKE ‘max_connections'” | awk ‘NR==2{print $2}’)

# 计算连接使用率
USAGE=$((CONN_COUNT * 100 / MAX_CONN))

echo “Current Connections: $CONN_COUNT”
echo “Max Connections: $MAX_CONN”
echo “Usage: ${USAGE}%”

if [ $USAGE -gt 80 ]; then
echo “Warning: Connection usage is high!”
# 发送告警
echo “High connection usage: ${USAGE}%” | mail -s “Connection Alert” dba@fgedu.net.cn
fi,更多学习教程公众号风哥教程itpux_com。

生产环境建议:合理配置连接池参数,监控连接使用情况,避免连接数耗尽。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 OceanBase网络连接故障

3.1.1 网络连通性检查

# 网络连通性检查

1. 检查网络连通性
$ ping 192.168.1.101
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=0.5 ms
64 bytes from 192.168.1.101: icmp_seq=2 ttl=64 time=0.4 ms

2. 检查端口连通性
$ telnet 192.168.1.101 2881
Trying 192.168.1.101…
Connected to 192.168.1.101.
Escape character is ‘^]’.

3. 检查路由
$ traceroute 192.168.1.101
traceroute to 192.168.1.101 (192.168.1.101), 30 hops max, 60 byte packets
1 192.168.1.101 (192.168.1.101) 0.5 ms 0.4 ms 0.4 ms,from DB视频:www.itpux.com。

4. 检查防火墙
$ iptables -L -n | grep 2881
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:2881

5. 检查SELinux
$ getenforce
Disabled

$ sestatus
SELinux status: disabled

3.1.2 网络连接故障处理

# 网络连接故障处理

1. 防火墙阻止连接
故障现象:
$ telnet 192.168.1.101 2881
Trying 192.168.1.101…
telnet: connect to address 192.168.1.101: Connection refused

解决方法:
# 开放防火墙端口
$ firewall-cmd –permanent –add-port=2881/tcp
$ firewall-cmd –permanent –add-port=2882/tcp
$ firewall-cmd –reload

# 或关闭防火墙(测试环境)
$ systemctl stop firewalld

2. 安全组阻止连接
故障现象:
连接超时,无响应

解决方法:
# 云平台安全组配置
# 添加入站规则允许2881、2882端口

3. 网络不通
故障现象:
$ ping 192.168.1.101
ping: sendmsg: Network is unreachable

解决方法:
# 检查网络配置
$ ip addr
$ ip route

# 检查网卡状态
$ ethtool eth0

# 重启网络服务
$ systemctl restart network

3.2 OceanBase认证连接故障

# 认证连接故障

1. 密码错误
故障现象:
$ obclient -h192.168.1.101 -P2881 -ufgedu@fgedu_tenant -p
Enter password:
ERROR 1045 (42000): Access denied for user ‘fgedu’@’192.168.1.100’ (using password: YES)

解决方法:
# 重置密码
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
ALTER USER ‘fgedu’@’192.168.1.%’ IDENTIFIED BY ‘NewPass@2024!’;

2. 用户不存在
故障现象:
ERROR 1045 (42000): Access denied for user ‘fgedu’@’192.168.1.100’

解决方法:
# 创建用户
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
CREATE USER ‘fgedu’@’192.168.1.%’ IDENTIFIED BY ‘Fgedu@Pass2024!’;
GRANT ALL PRIVILEGES ON fgedudb.* TO ‘fgedu’@’192.168.1.%’;

3. 主机限制
故障现象:
ERROR 1045 (42000): Access denied for user ‘fgedu’@’192.168.2.100′

解决方法:
# 修改用户主机限制
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 查看用户主机限制
SELECT user, host FROM mysql.user WHERE user=’fgedu’;

— 修改主机限制
RENAME USER ‘fgedu’@’192.168.1.%’ TO ‘fgedu’@’192.168.2.%’;
— 或创建新用户
CREATE USER ‘fgedu’@’192.168.2.%’ IDENTIFIED BY ‘Fgedu@Pass2024!’;

4. 租户不存在
故障现象:
ERROR 4624 (HY000): Tenant not exist

解决方法:
# 检查租户是否存在
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT tenant_name FROM oceanbase.__all_tenant;

# 创建租户
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
CREATE TENANT IF NOT EXISTS fgedu_tenant
PRIMARY_ZONE=’zone1,zone2,zone3′,
RESOURCE_POOL_LIST=(‘fgedu_pool’);

3.3 OceanBase资源连接故障

# 资源连接故障

1. 连接数满
故障现象:
ERROR 1040 (08004): Too many connections

解决方法:
# 查看当前连接数
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SHOW STATUS LIKE ‘Threads_connected’;
SHOW STATUS LIKE ‘Max_used_connections’;

# 增加最大连接数
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SET GLOBAL max_connections = 1000;

# 清理空闲连接
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SHOW PROCESSLIST;
— KILL空闲连接
KILL ;

2. 内存不足
故障现象:
ERROR 4013 (HY000): No memory or reach tenant memory limit

解决方法:
# 查看内存使用
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT * FROM oceanbase.__all_virtual_memory_info;

# 增加租户内存
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
ALTER TENANT fgedu_tenant SET VARIABLES ob_sql_work_area_percentage=10;

3. 资源池不足
故障现象:
ERROR 4626 (HY000): Resource pool not exist or unit config not exist

解决方法:
# 检查资源池
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT * FROM oceanbase.__all_resource_pool;
SELECT * FROM oceanbase.__all_unit_config;

# 创建资源池
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
CREATE RESOURCE POOL fgedu_pool
UNIT=’fgedu_unit’,
UNIT_NUM=1,
ZONE_LIST=(‘zone1′,’zone2′,’zone3’);

风哥提示:连接故障通常涉及多个层面,需要系统性地排查网络、认证、资源等方面的问题。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 OceanBase防火墙连接失败案例

# 故障现象
应用无法连接OceanBase,连接超时

# 排查过程

1. 检查应用错误日志
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

2. 检查网络连通性
$ ping 192.168.1.101
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=0.5 ms

# 网络层正常

3. 检查端口连通性
$ telnet 192.168.1.101 2881
Trying 192.168.1.101…
telnet: connect to address 192.168.1.101: Connection timed out

# 端口不通

4. 检查防火墙
$ systemctl status firewalld
● firewalld.service – firewalld – dynamic firewall daemon
Active: active (running) since Mon 2024-01-20 09:00:00 CST

$ firewall-cmd –list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:

# 发现2881端口未开放

5. 解决方法
# 开放OceanBase端口
$ firewall-cmd –permanent –add-port=2881/tcp
$ firewall-cmd –permanent –add-port=2882/tcp
$ firewall-cmd –reload

# 验证
$ firewall-cmd –list-all
public (active)
ports: 2881/tcp 2882/tcp

$ telnet 192.168.1.101 2881
Trying 192.168.1.101…
Connected to 192.168.1.101.

# 应用重新连接成功

# 预防措施
#!/bin/bash
# firewall_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

# 检查防火墙状态
if systemctl is-active firewalld >/dev/null 2>&1; then
echo “Firewalld is active”
# 检查端口
if ! firewall-cmd –list-ports | grep -q “2881/tcp”; then
echo “Warning: Port 2881 is not open”
fi
else
echo “Firewalld is not running”
fi

4.2 OceanBase密码错误连接失败案例

# 故障现象
应用连接OceanBase报错,认证失败

# 排查过程

1. 检查应用错误日志
Caused by: java.sql.SQLException: Access denied for user ‘fgedu_app’@’192.168.1.10’ (using password: YES)
at com.oceanbase.jdbc.internal.protocol.AbstractConnectProtocol.checkErrorMessage(AbstractConnectProtocol.java:1234)

2. 手动测试连接
$ obclient -h192.168.1.101 -P2881 -ufgedu_app@fgedu_tenant -p
Enter password:
ERROR 1045 (42000): Access denied for user ‘fgedu_app’@’192.168.1.10′ (using password: YES)

3. 检查用户是否存在
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT user, host FROM mysql.user WHERE user=’fgedu_app’;

+———–+—————+
| user | host |
+———–+—————+
| fgedu_app | 192.168.1.% |
+———–+—————+

# 用户存在

4. 检查密码
# 应用配置文件中密码可能错误
# 检查应用配置
$ cat /app/config/db.properties | grep password
jdbc.password=WrongPassword

# 发现密码错误

5. 解决方法
# 重置密码
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
ALTER USER ‘fgedu_app’@’192.168.1.%’ IDENTIFIED BY ‘Correct@Pass2024!’;

# 更新应用配置
$ vi /app/config/db.properties
jdbc.password=Correct@Pass2024!

# 重启应用
$ systemctl restart app

# 连接成功

# 预防措施
#!/bin/bash
# password_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

# 测试连接
if ! obclient -h192.168.1.101 -P2881 -ufgedu_app@fgedu_tenant -pCorrect@Pass2024! -e “SELECT 1” >/dev/null 2>&1; then
echo “Warning: Database connection test failed”
# 发送告警
echo “Database connection test failed” | mail -s “DB Alert” dba@fgedu.net.cn
fi

4.3 OceanBase连接数满失败案例

# 故障现象
应用连接OceanBase报错,连接数满

# 排查过程

1. 检查应用错误日志
Caused by: java.sql.SQLException: Too many connections
at com.oceanbase.jdbc.internal.protocol.AbstractConnectProtocol.checkErrorMessage(AbstractConnectProtocol.java:1234)

2. 检查当前连接数
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SHOW STATUS LIKE ‘Threads_connected’;
SHOW STATUS LIKE ‘Max_used_connections’;
SHOW VARIABLES LIKE ‘max_connections’;

+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| Threads_connected | 100 |
| Max_used_connections | 100 |
| max_connections | 100 |
+——————-+——-+

# 连接数已满

3. 查看连接详情
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
user,
host,
db,
command,
time,
state,
COUNT(*) as count
FROM information_schema.processlist
GROUP BY user, host, db, command, time, state
ORDER BY count DESC;

+—————-+——————+——–+———+——+——-+——-+
| user | host | db | command | time | state | count |
+—————-+——————+——–+———+——+——-+——-+
| fgedu_app@app| 192.168.1.10:xxx | fgedudb| Sleep | 3600 | | 80 |
| fgedu_app@app| 192.168.1.10:xxx | fgedudb| Query | 0 |executing| 10 |
+—————-+——————+——–+———+——+——-+——-+

# 发现大量空闲连接

4. 解决方法
# 方法1:增加最大连接数
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SET GLOBAL max_connections = 500;

# 方法2:清理空闲连接
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 查看空闲连接
SELECT id, user, host, time
FROM information_schema.processlist
WHERE command=’Sleep’ AND time > 3600;

— 关闭空闲连接
SELECT CONCAT(‘KILL ‘, id, ‘;’)
FROM information_schema.processlist
WHERE command=’Sleep’ AND time > 3600;

# 方法3:优化应用连接池
# 减少连接池最大连接数
# 减少连接空闲时间
# 启用连接验证

5. 长期解决方案
# 配置连接池参数
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000

# 监控连接使用
#!/bin/bash
# connection_alert.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

CONN_COUNT=$(obclient -e “SHOW STATUS LIKE ‘Threads_connected'” | awk ‘NR==2{print $2}’)
MAX_CONN=$(obclient -e “SHOW VARIABLES LIKE ‘max_connections'” | awk ‘NR==2{print $2}’)
USAGE=$((CONN_COUNT * 100 / MAX_CONN))

if [ $USAGE -gt 80 ]; then
echo “High connection usage: ${USAGE}%” | mail -s “Connection Alert” dba@fgedu.net.cn
fi

生产环境建议:合理配置连接池参数,监控连接使用情况,设置连接数告警阈值。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 OceanBase连接故障处理最佳实践

# 连接故障处理最佳实践

1. 故障排查流程
– 检查网络连通性
– 检查端口可访问性
– 检查防火墙配置
– 检查认证信息
– 检查资源限制

2. 预防措施
– 配置连接池
– 设置连接超时
– 监控连接使用
– 定期检查配置

3. 监控告警
– 监控连接数
– 监控连接错误率
– 监控连接响应时间
– 设置告警阈值

4. 应急响应
– 准备故障处理手册
– 建立快速恢复流程
– 定期演练故障恢复
– 记录故障处理经验

5. 持续改进
– 分析故障原因
– 优化配置参数
– 完善监控体系
– 更新应急预案

5.2 OceanBase连接问题排查方法

# 连接问题排查方法

1. 网络层排查
# 检查网络连通性
ping

# 检查端口连通性
telnet 2881

# 检查路由
traceroute

# 检查防火墙
iptables -L -n | grep 2881
firewall-cmd –list-all

2. 认证层排查
# 测试连接
obclient -h -P2881 -u@ -p

# 检查用户
SELECT user, host FROM mysql.user WHERE user=’‘;

# 检查权限
SHOW GRANTS FOR ‘‘@’‘;

3. 资源层排查
# 检查连接数
SHOW STATUS LIKE ‘Threads_connected’;
SHOW VARIABLES LIKE ‘max_connections’;

# 检查内存
SHOW STATUS LIKE ‘%memory%’;

# 检查资源池
SELECT * FROM oceanbase.__all_resource_pool;

4. 应用层排查
# 检查连接字符串
# 检查连接池配置
# 检查应用日志
# 检查JDBC驱动版本

5.3 OceanBase连接故障常见问题

# 连接故障常见问题及解决

Q1: 连接超时如何处理?
A1: 检查网络连通性,检查防火墙配置,增加连接超时时间

Q2: 认证失败如何处理?
A2: 检查用户名密码,检查主机限制,检查租户是否存在

Q3: 连接数满如何处理?
A3: 增加max_connections,清理空闲连接,优化连接池配置

Q4: 如何测试数据库连接?
A4: 使用obclient命令行工具测试,使用telnet测试端口

Q5: 如何查看当前连接?
A5: 使用SHOW PROCESSLIST命令查看

Q6: 如何关闭指定连接?
A6: 使用KILL命令关闭指定连接ID

Q7: 连接池如何配置?
A7: 根据业务并发量配置,一般设置为并发数的1-2倍

Q8: 连接泄漏如何处理?
A8: 检查应用代码,确保连接正确关闭,启用连接池监控

Q9: 如何监控连接使用?
A9: 使用SHOW STATUS命令,配置监控脚本,设置告警

Q10: 如何避免连接故障?
A10: 合理配置连接池,监控连接使用,定期检查配置

风哥提示:连接故障是常见的数据库问题,建立完善的监控和告警机制可以提前发现问题,避免影响业务。from OceanBase视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息