【 使用环境 】测试环境
【 OB 】
【 使用版本 】5.7.25-OceanBase-v3.2.3.3
【问题描述】golang 连接 oceanbase 3.2.3 一直报access denied
【复现路径】相关代码如下:
gorm 1.25.12
mysql 1.5.1
package main
import (
“fmt”
“gorm.io/driver/mysql”
“gorm.io/gorm”
“log”
“time”
)
func main() {
encodedUser := "xxx"
encodedPassword := "xxx"
host := "127.0.0.1"
port := "2881"
dbname := "test_xxx"
// 构造DSN
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true", encodedUser, encodedPassword, host, port, dbname)
fmt.Println(dsn)
gormConfig := &gorm.Config{
SkipDefaultTransaction: true,
PrepareStmt: true,
}
// 尝试连接数据库,最多重试3次
var db *gorm.DB
var err error
maxRetries := 3
for i := 0; i < maxRetries; i++ {
db, err = gorm.Open(mysql.Open(dsn), gormConfig)
if err == nil {
break
}
log.Printf("第 %d 次连接失败: %v,将在 5 秒后重试...", i+1, err)
time.Sleep(5 * time.Second)
}
if err != nil {
log.Fatalf("多次尝试后仍连接失败: %v", err)
}
fmt.Println("连接成功!")
// 获取通用数据库对象(用于连接池配置)
sqlDB, err := db.DB()
if err != nil {
log.Fatalf("获取数据库对象失败: %v", err)
}
defer sqlDB.Close()
// 配置连接池
sqlDB.SetMaxOpenConns(25) // 最大连接数
sqlDB.SetMaxIdleConns(10) // 空闲连接数
sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大存活时间
// 示例:查询 OceanBase 版本
var version string
result := db.Raw("SELECT version()").Scan(&version)
if result.Error != nil {
log.Fatalf("查询 OceanBase 版本失败: %v", result.Error)
}
fmt.Printf("OceanBase 版本: %s\n", version)
}
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!