目录
一、环境信息
|------|--------------------------|
| 名称 | 值 |
| CPU | x86 |
| 操作系统 | KylinV10 |
| DM版本 | DM Database Server 64 V8 |
二、介绍
客户新上线了一套一主多备,应用验证发现报错:Server Mode invalid。我们来记录一下这个文档的解决方法。
三、排查过程
1、检查/etc/dm_svc.conf
(1)自验证
我第一反应就是/etc/dm_svc.conf文件中的LOGIN_MODE参数配置不正确。下面是一个正确的例子我们看一下,DW_P只连接主机,DW_P只连接备机,客户有相关的需求,所以我们这么测试验证。

(2)LOGIN_MODE参数介绍
|------------|-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数名 | 默认值 | 描述 |
| LOGIN_MODE | 4 | 指定优先登录的服务器模式。 0:优先连接 Primary 模式的库,Normal 模式次之,最后选择 Stantby 模式; 1:只连接主库; 2:只连接备库; 3:优先连接 Standby 模式的库,Primary 模式次之,最后选择 Normal 模式; 4:优先连接 Normal 模式的库,Primary模式次之,最后选择 Standby 模式; |
(3)客户反馈
客户表示没有用/etc/dm_svc.conf文件,是JDBC连接串中配置的,那我们需要转换思路。
2、编写JDBC连接DEMO
(1)源码
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class jdbc_conn {
static Connection con = null;
static String cname = "dm.jdbc.driver.DmDriver";
static String url = "jdbc:dm://writemaster?writemaster=(XX.XX.XX.XX0:5236,XX.XX.XX.XX1:5236,XX.XX.XX.XX2:5236,XX.XX.XX.XX3:5236,XX.XX.XX.XX4:5236)&schema=CRMCLOUD&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&loginMode=1&rwSeparate=0";
static String userid = "SYSDBA";
static String pwd = "XXXXX";
public static void main(String[] args) {
try {
Class.forName(cname);
con = DriverManager.getConnection(url, userid, pwd);
con.setAutoCommit(true);
System.out.println("[SUCCESS]conn database");
} catch (Exception e) {
System.out.println("[FAIL]conn database:" + e.getMessage());
}
}
public void disConn(Connection con) throws SQLException {
if (con != null) {
con.close();
}
}
}
(2)编译
java
javac -cp ".:/dm/dmdbms/drivers/jdbc/DmJdbcDriver8.jar" jdbc_conn.java
(3)运行
bash
java -cp ".:/dm/dmdbms/drivers/jdbc/DmJdbcDriver8.jar" jdbc_conn
(4)生产模拟验证

连接正常。
3、用户侧验证
业务老师将应用部署在docker中,docker与准生产环境主机连通,备机均不通,导致接口找不到符合的模式出现报错。