本文是对启云数据库运维常见问题处理方法进行说明,主要包括启云数据库主备切换后应用连不上库处理方法、关键字导致备份失败处理方法、启云及达梦license到期更新步骤。
通过移动云订购达梦启云库后,应用使用达梦主备集群主的ip和端口建立JDBC连接,当网络发生抖动或者主节点有异常触发主备切换时,应用就连不上数据库。
原因分析:
通过ip连接方式,只连接了主库ip及端口,当发生主备切换时,原备库切换为主库,所以连接不上。
处理方式:
(1)主库能正常提供服务,则手动恢复主库服务,然后进行主备切换,恢复到原主库的服务,使应用可以正常使用,详细步骤如下文(一) 段所示。
(2)若主库崩溃,不能正常启动,则手动进行备库接管主库,并将故障主库重建,还原故障主库,重置故障主库为备库,详细步骤如下文(二)段所示。应用需要修改连接方式,如果待主库重建、恢复后,检查数据一致后,再进行手动主备切换,详细步骤如上段所述。
(3)尽快改造应用程序使用服务方式进行数据库连接,详细部署如下文(三)段所示。
(一)、云数据库进行手动主备切换步骤
1.查看数据库实例
### 查看达梦实例 dm82701868265493
sudo kubectl get pod -n dmcp-instance -o wide|grep dm82701868265493
2.进入monitor实例
### 进入监视器pod
sudo kubectl -n dmcp-instance exec -it dm82701868265493-66554d7bd5-lns2l bash
### 到数据库安装目录
cd /opt/dmdbms/
查看目录下文件,并查看dmmonitor.ini,检查是否存在MONDWCONFIRM=0配置。
3. 启动monitor
./dmmonitor /opt/dmdbms/dmmonitor.ini
4.登录监视器并检查状态
###窗口输入login回车
login
###输入数据库用户名SYSDBA
###输入数据库SYSDBA密码
5.查看集群
###查看集群,确认主备实例名
show
### tip 确认主备库LSN值一致
tip
6.验证备库可切换性
choose swithcover GRP1
### 输出示例 XXXX can be switched to PRIMARY
7.执行主备切换
switchover GRP1_RT_1
### 查看集群状态,确认新主库状态为PRIMARY,原主库为STANDY
show
### tip 检查个节点状态是否正常
tip
### 退出监视器
exit
(二)、主库崩溃, 备库接管主库, 故障主库重建、还原步骤(本节引用达梦知识库)
###在新主库执行联机备份(避免停业务)
BACKUP DATABASE FULL BACKUPSET '/bak/newprimarybak' WITHOUT LOG;
###将备份集拷贝至原主库服务器,原主库执行脱机还原
/dmrman CTLSTMT="RESTORE DATABASE '/data/DAMENG/dm.ini' FROM BACKUPSET '/bak/newprimarybak'"
### 更新magic # 关键步骤
./dmrman CTLSTMT="RECOVER DATABASE '/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
3.重置故障主库为备库
###MOUNT模式启动
./dmserver /data/DAMENG/dm.ini mount
###登录Disql执行
###开启配置修改模式
SP_SET_PARA_VALUE(1, 'ALTERMODE_STATUS', 1);
###切换为备库模式
ALTER DATABASE STANDBY;
###关闭配置修改模式
SP_SET_PARA_VALUE(1, 'ALTERMODE_STATUS', 0);
4.数据一致性验证
###核心业务表; -- 表数据校验
CHECK TABLE SYSDBA;
###系统表空间校验
SELECT COUNT(*) FROM V$TABLESPACE;
(三) 、应用程序通过服务连接达梦主备集群,服务连接几种方式:
dm_svc.conf
配置的服务连接方式配置步骤
(1)文件位置(需部署在应用服务器上):
Linux:`/etc/dm_svc.conf`
Windows:`C:\Windows\system32\dm_svc.conf` 或达梦安装目录的 `bin` 文件夹下
(2)配置示例:
```ini
TIME_ZONE=(480)
LANGUAGE=(cn)
DM=(192.168.1.101:5236,192.168.1.102:5236) # 主备集群所有节点IP和端口
LOGIN_MODE=(1) # 只连接主库
SWITCH_TIME=(3) # 连接超时切换时间(秒)
SWITCH_INTERVAL=(1000) # 重试间隔(毫秒)
(3)关键参数说明:
`LOGIN_MODE=1`:强制应用只连接主库节点。
`DM`:列出集群所有节点IP,驱动自动识别主库。
`SWITCH_TIME`:超时后自动尝试下一个节点(建议3-5秒)。
(4)应用连接串调整
Java (JDBC):
String url = "jdbc:dm://DM?schema=SYSDBA"; // 使用服务名"DM"
Python (pydm):
conn = pydm.connect(host="DM", user="SYSDBA", password="SYSDBA")
其他语言:连接串中主机名改为服务名(如DM
),避免直接写IP。
2.JDBC连接配置服务方式
无法修改`/etc/dm_svc.conf`时(如云环境)
在JDBC URL中直接指定服务名和节点列表:
###java连接示例
jdbc:dm://test?test=(192.168.1.10:5236,192.168.1.11:5236)&LOGIN_MODE=(1)
3.Docker容器环境配置方式
挂载配置文件到容器内:
docker run -v /宿主机路径/dmsvc.conf:/etc/dmsvc.conf 应用镜像
**注意事项:**
这个LOGIN_MODE参数一定要配置,不然连接报错。
LOGIN_MODE=(1) # 只连接主库
当从其他库迁移数据到达梦,比如Mysql,有可能会在表字段中使用到达梦的关键字,为了保证原程序、sql语句不用改,会在dm.ini中加EXCLUDE_RESERVED_WORDS配置,有可能将达梦的核心关键字配置到了EXCLUDE_RESERVED_WORDS中,这时备份就可能报错,本节对因配置了排除关键字导致备份失败的处理方法。
(一)、备份报错
-2007: 语法分析出错 [TYPE]附近出现错误
解决方法:
##步骤:
(1)检查当前屏蔽的关键字:
SELECT * FROM V$DM_INI WHERE PARA_NAME = 'EXCLUDE_RESERVED_WORDS';
TYPE
);dm.ini
文件,删除或调整EXCLUDE_RESERVED_WORDS
参数值:EXCLUDE_RESERVED_WORDS= TYPE,PERCENT,OTHER_KEYWORD # 移除TYPE
#重启数据库:
systemctl restart DmServiceXXX
BACKUP DATABASE FULL BACKUPSET '/bak/full_bak';
若成功,表明问题已解决。
(二)、关键注意事项
禁止屏蔽核心保留字:
`V$RESERVED_WORDS`视图中`RES_FIXED=Y`的保留字(如`ORDER`, `IDENTITY`)不可屏蔽,否则会导致系统功能异常。
可通过以下查询确认:
```sql
SELECT * FROM V$RESERVED_WORDS WHERE RES_FIXED = 'Y';
替代方案(若必须使用关键字):
方案一(推荐):SQL语句中为关键字添加双引号:
CREATE TABLE "SYSDBA"."TEST"("TYPE" VARCHAR(20)); -- 创建表示例
方案二:通过dm_svc.conf
客户端配置局部屏蔽(仅影响当前连接):
[DMHA]
KEYWORDS = PERCENT # 仅屏蔽非核心关键字
本章说明启云平台自身license到期更新方法、启云使用的元数据库license到期更新方法、启云发放的存量达梦实例license到期更新方法以及元数据库表CDB_PORTAL.CDB_LICENSE值更新方法。
(一)、获取达梦和启云license
1.获取达梦的key的值
cat dm.key|base64 -w0;
2.获取启云license的值
cat license.lic|base64 w0;
(二)、更新启云license
cd ecloud-yaml/dm-operator/yaml/
####执行删除secret
kubectl delete -f cdb-secret.yaml
###修改cdb-secret.yaml中license配置
###重新创建secret
kubectl apply -f cdb-secret.yaml
重启operator,重启cdb-controller-manager
###查看pod
kubectl -n cdb get pod
###删除pod,重新构建pod
sudo kubectl -n dmcp-system delete pod <podName>;
###查看pod
sudo kubelet get pods -n cdb
###查看pod日志
sudo kubelet -n cdb logs -f cdb-controller-manager**
(三)、更新metadata本身dm key
kubectl -n dmcp-system get dm
kubectl -n dmcp-system edit dm metadata
##### 修改spec.database.license为dm key值
spec.database.license
####退出保存
:wq!
##### 进行元数据库pod
sudo kubectl -n dmcp-system exec -it metadata-0 bash
###登录数据库,输入用户名及密码信息
cdb disql
####查看更新的key是否生效
select * from v$license
(四)、更新存量实例dm key
### 查看dm 实例
kubectl -n dmcp-instance get dm
### 修改实例配置文件
kubectl -n dmcp-instance edit dm ***
### 修改spec.database.license值为更新的key
###退出 保存
:wq
#####
sudo kubectl -n dmcp-instance exec -it **-0 bash
cd /opt/dmdbms/bin
./disql
SYSBDA
select * from v$license
(五)、更新元数据库表CDB_PORTAL.CDB_LICENSE的dm key
###查看 pod
sudo kubectl -n dmcp-system get pod
###进入容器
sudo kubectl -n dmcp-system exec -it metadata-0 bash
cd /opt/dmdbms/bin
###打开sql命令窗口
./disql 输入SYSDBA及密码
###执行update 语句,更新license
元数据库中"CDB_PORTAL"."CDB_LICENSE"表里的DATA字段内容值替换成转换的字符串。license模板数据替换后,新订购的实例是正常的,但存量数据还需处理。
###重启cdb-portal组件
###查看pod
sudo kubectl get pods -n dmcp-system
### 重启pod
sudo kubectl -n dmcp-system delete pod <podName>;
### 查看pod状态
sudo kubectl get pods -n dmcp-system
###查看pod日志
sudo kubectl -ndmcp-system logs -f cdb-portal**
文章
阅读量
获赞