首页 > 数据库 >【YashanDB数据库】VMware虚拟机使用默认安装,在掉电之后数据库无法启动

【YashanDB数据库】VMware虚拟机使用默认安装,在掉电之后数据库无法启动

时间:2024-08-06 14:38:36浏览次数:9  
标签:YashanDB lsn 掉电 数据库 写入 磁盘 虚拟机 VMware

问题现象

客户使用VMware虚拟机使用默认安装,部署YashanDB个人版,在掉电之后无法启动

操作系统:

Virtualization: VMware

Operating System: CentOS Linux 7 (Core)

CPE OS Name: cpe:/o:centos:centos:7

Kernel: Linux 3.10.0-1160.el7.x86_64

Architecture: x86-64

[yashan@localhost ~]$ nohup /home/yashan/yasdb_home/yashandb/23.1.1.100/bin/yasdb open -D /home/yashan/yasdb_data/db-1-1 &

[1] 6684

[yashan@localhost ~]$ nohup: ignoring input and appending output to ‘nohup.out’

[yashan@localhost ~]$ cat nohup.out

Starting instance nomount

Instance started

Starting instance open

[1]+ Segmentation fault (core dumped) nohup /home/yashan/yasdb_home/yashandb/23.1.1.100/bin/yasdb open -D /home/yashan/yasdb_data/db-1-1

问题单:客户测试库启动后很快就Segmentation fault

问题的风险及影响

客户为个人环境,掉电后无法拉起,手动拉起会出现coredump,影响个人使用

问题影响的版本

YashanDB版本:

YashanDB Server Personal Edition Release 23.1.1.100 x86_64 0e623bd

问题发生原因

VMware因为涉及虚拟化层,存在一些特有机制和考量。VMware使用缓存来提高磁盘操作速度,包括读缓存和写缓存。写操作可能先写入缓存,然后根据策略决定何时将数据落盘。

在默认安装模式下,数据不会实时落盘(实测方式:可以在虚拟机中新增文件,随机写入内容,观察虚拟机文件修改时间是否发生变化,可以确认文件没有实时写入物理磁盘)。

因为客户环境中的磁盘文件落盘不是实时,掉电过程出现异常,导致undo中的lsn比ctrl中的lsn大的情况,进而导致数据库无法启动。

解决方法及规避方式

因为是个人环境,没有真实数据,重新安装新版本的YashanDB。

问题分析和处理过程

1、客户反馈是掉电,DOUBLE_WRITE_ENABLED默认为TRUE,一线反馈客户没有修改该参数

2、分析出问题的堆栈位置setGroupBlocksLsn COD_PANIC,head->lsn是 undo block的lsn,而assist->lsn是系统全局的lsn自增得到的;

系统的lsn先写入ctrl文件,再写入undo文件,在db启动的时候系统全局的lsn从ctrl文件中读取,逻辑上确保undo的lsn比系统的lsn小;

3、发现VMware虚拟机默认安装为虚拟磁盘。在默认安装方式下,在虚拟机中新增文件,随机写入内容,观察虚拟机文件修改时间并未发生变化,可以确认文件没有实时写入物理磁盘。

在默认安装模式下,掉电之后,虚拟机出现磁盘文件损坏,无法进入虚拟机:

4、VMware因为涉及虚拟化层,存在一些特有机制和考量。 VMware使用缓存来提高磁盘操作速度,包括读缓存和写缓存。写操作可能先写入缓存,然后根据策略(如ESXi的磁盘调度器策略)决定何时将数据落盘。实测使用“强制写入”策略(VMware的“独立-永久”磁盘模式)可确保数据立即写入,以提高数据安全性。

5、因为客户环境中的磁盘文件落盘不是实时, 掉电过程出现异常, 导致undo中的lsn比ctrl中的lsn大的情况, 进而导致数据库无法启动。

官网参考说明:

更改虚拟硬盘节点和模式设置 (VMware.com)

在物理磁盘或未使用的分区上安装客户机操作系统 (VMware.com)

经验总结

1、VMware虚拟机,使用物理磁盘。

2、对虚拟磁盘需要设置独立-永久(创建虚拟机的时候才能修改, 启动之后不能修改):

配置成功, 在首页即可看到对应的标志:

标签:YashanDB,lsn,掉电,数据库,写入,磁盘,虚拟机,VMware
From: https://www.cnblogs.com/YashanDB/p/18345103

相关文章

  • 【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo block
    问题现象客户将一个100G的表的数据插入到另一个表中,使用insertintoselect插入数据。从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕。由于需要实施下一步操作,客户kill重启了数据库,之后数据库一直回滚中,导致后续执行其他操作都报错YAS-02016nofreeundoblocks问题......
  • Navicat 连接瀚高数据库(炒鸡简单)
    刚接到的项目领导让我去数据库建几张表,打开配置文件一看用的是国产的瀚高数据库:url:jdbc:highgo://192.168.8.4:5866/sdss_ns_bussiness?currentSchema=sdss_base这下就慌了,没用过啊!!用什么连接工具都不知道!!打开百度,csdn一阵搜索,不是不管用,让下载JDBC驱动,就是要......
  • 数据库复习
    绪论1、数据库(DB):长期存储在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储,具有娇小的冗余度、交稿的数据独立性和易扩展性,并可为各种用户共享。2、数据库管理系统(DBMS):位于用户和操作系统间的数据管理系统的一层数据管理软件......
  • 后端MyBatis连接Mysql数据库时常见报错
     目录报错情况报错情况一:​编辑报错情况二:解决步骤一、解决命名问题1.mapper层的id是否和Dao层的方法名字相同2.检查namespace与Dao层的文件地址相同二、解决注解问题1.检查Controller层的注解是否正确和完整2.Dao层或者Mapper层的注解3.pojo层:实体类层Data注解(用......
  • openEuler虚拟机安装与简介
    openEuler安装步骤与问题解决1. openEuler镜像下载1.1直接访问openEuler官网:https://www.openeuler.org/zh/1.2找到下载1.3根据需要,选择合适的镜像2.虚拟机创建2.1新建虚拟机2.2选择典型2.3镜像光盘2.4版本选择2.5名称和位置2.6磁盘大小2.7完成2.......
  • A087-基于SpringBoot+Vue实现的超市管理系统(源码+数据库+部署文档+部署演示视频)
    (======查看博主个人介绍,有源码获取联系方式========)这里提供的系统介绍和演示视频,展示了一个基于SpringBoot和Vue实现的超市管理系统,采用了前后端分离的架构方式。系统设计包括管理员和员工两种角色,涵盖了销售管理、人事管理、个人中心、库存管理、会员管理、系统管理和商品管......
  • SqlDbx客户端连接服务器Oracle数据库
    查了很多文章,介绍的不对,走了好多弯路,最后整理一下,供参考一、下载Oracle客户端1、SqlDbx如果是32位的,客户端也要下载32位的2、Oracle客户端版本要和服务端版本一致(本例用的是12.1.0.2.0)3、32位客户端下载地址:https://www.oracle.com/database/technologies/instant-client/mic......
  • 【YashanDB数据库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发
    问题现象某客户使用jdbc接口向yashandb的表A插入数据。表A上有一个语句级触发器,其内容为在触发时执行altersequence操作;另外还有一个insert时的行级触发器,其内容为将每行的部分列赋给新值,这些新值要么来自sequence.nextval,要么来自于current_timestamp。客户向表A插入90万条数......
  • Python Telegram Bot 从数据库获取数据时出错
    我正在开发用于管理企业用途任务的电报机器人。团队负责人注册他的公司并获得唯一的ID,然后可以分配任务。问题是,当团队负责人分配任务时,他可以使用/viewtasks访问它们。但是,当员工尝试查看任务时,它会打印出“错误。您尚未注册”。似乎无法检索与用户关联的company_id,即使......
  • 【YashanDB数据库】自关联外键插入数据时报错:YAS-02033 foreign key constraint viola
    问题现象使用如下的sql语句创建自关联外键表:droptableself_f_key;createtableself_f_key(t1numberprimarykeynotnull,t2number);createindexi_s_1onself_f_key(t2);altertableself_f_keyaddconstraintc_0001foreignkey(t2)referencesself_f_key(t1);......