OceanBase教程FG059-OceanBase连接故障处理实战
本文档风哥主要介绍OceanBase数据库连接故障处理相关知识,包括OceanBase连接架构、OceanBase连接流程、OceanBase连接类型、OceanBase连接池配置、OceanBase网络连接故障、OceanBase认证连接故障、OceanBase资源连接故障等内容,风哥教程参考OceanBase官方文档连接管理、故障处理等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 OceanBase连接架构
OceanBase数据库支持多种连接方式,了解连接架构有助于快速定位连接故障。更多视频教程www.fgedu.net.cn
- 直连模式:客户端直接连接OBServer节点,端口2881
- 代理模式:通过OBProxy连接,端口2883
- JDBC连接:Java应用通过JDBC驱动连接
- ODBC连接:通过ODBC驱动连接
- 命令行连接:通过obclient命令行工具连接
1.2 OceanBase连接流程
1. TCP三次握手
– 客户端发起连接请求
– 服务端响应
– 连接建立
2. 协议协商
– 客户端发送握手包
– 服务端返回握手包
– 协商协议版本和认证方式
3. 身份认证
– 客户端发送认证信息
– 服务端验证用户名密码
– 检查主机权限
4. 会话建立
– 分配会话资源
– 初始化会话状态
– 返回连接成功
5. 连接维护
– 心跳检测
– 超时处理
– 连接复用
1.3 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。
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’);
”
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
Part05-风哥经验总结与分享
5.1 OceanBase连接故障处理最佳实践
1. 故障排查流程
– 检查网络连通性
– 检查端口可访问性
– 检查防火墙配置
– 检查认证信息
– 检查资源限制
2. 预防措施
– 配置连接池
– 设置连接超时
– 监控连接使用
– 定期检查配置
3. 监控告警
– 监控连接数
– 监控连接错误率
– 监控连接响应时间
– 设置告警阈值
4. 应急响应
– 准备故障处理手册
– 建立快速恢复流程
– 定期演练故障恢复
– 记录故障处理经验
5. 持续改进
– 分析故障原因
– 优化配置参数
– 完善监控体系
– 更新应急预案
5.2 OceanBase连接问题排查方法
1. 网络层排查
# 检查网络连通性
ping
# 检查端口连通性
telnet
# 检查路由
traceroute
# 检查防火墙
iptables -L -n | grep 2881
firewall-cmd –list-all
2. 认证层排查
# 测试连接
obclient -h
# 检查用户
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: 合理配置连接池,监控连接使用,定期检查配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
