V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bthulu
V2EX  ›  程序员

有什么数据库扛断电能力最强吗?

  •  
  •   bthulu · 36 天前 · 13874 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

    服务器在客户厂里, 客户没有机房, 就放在厂子机器旁边.

    每天下班后, 客户员工从来不会去关闭电脑, 都是直接拉闸整厂断电.

    系统稳定运行了大半年后, 从最近开始, 每隔几个月, mysql 就报 redo 日志异常无法启动, 需手动删除日志后才能启动, 这有点恶心了.

    有没有在同样场景下, 试过 oracle, sqlserver, postgresql, sqlite 这些的同学, 这些数据库存不存在这个问题?

    第 1 条附言  ·  36 天前
    不可能加 UPS 的. 又不是就一家工厂, 靠的就是以量取胜. 卖的不贵, 但卖的够多, 每个厂都加 UPS, 老板说还不如倒闭算了
    第 2 条附言  ·  36 天前
    也不存在发函这个说法. 你发函把责任撇客户身上, 那问题还是没有解决. 这种厂子, 员工多是五六十岁的老人, 甚至大量聋哑工人, 你跟他们说按时关机? 他们普通话都听不懂.

    目前人工远程处理工作量也不大, 就是隔三岔五来一个让人烦.
    第 3 条附言  ·  36 天前
    目前业务, 数据丢失部分是无关紧要的.

    配的电脑几乎都是 SSD 固态硬盘, 频繁断电导致硬盘损坏的情况暂时还没碰到过.

    问题都出在 redo 日志损毁了, 把 redo 日志删掉了就行了.

    那么, 在硬盘没有损坏, 仅仅是个别文件写入出错的情况下, 有哪个数据库能自恢复, 不需要人手动介入的吗?
    第 4 条附言  ·  36 天前
    感谢大家提的各种各样的意见.

    最终跟老板拍板决定了, 添加一个脚本, 在系统启动时, 将#innodb_redo 文件夹里的内容删除掉.
    164 条回复    2024-11-19 15:38:56 +08:00
    1  2  
    Hookery
        1
    Hookery  
       36 天前   ❤️ 1
    断电影响的是硬盘吧
    iv8d
        2
    iv8d  
       36 天前
    oracle 吧,断电估计也比较好恢复
    ysq
        3
    ysq  
       36 天前
    加个 UPS,检测到断电后自动关闭
    adoal
        4
    adoal  
       36 天前   ❤️ 4
    加一个带串口控制的 UPS ,断电时靠 UPS 的电让服务器自主关机
    moefishtang
        5
    moefishtang  
       36 天前 via Android
    加装一套 ups ,在外部电源断电后软关机?
    hgert
        6
    hgert  
       36 天前
    突然掉电次数多了不会坏盘么
    hgert
        7
    hgert  
       36 天前
    @ysq 感觉客户不会出钱的 doge
    dode
        8
    dode  
       36 天前
    或单独线路供电?
    ysq
        9
    ysq  
       36 天前
    @hgert 买个便宜的就行,没多少钱
    newaccount
        10
    newaccount  
       36 天前   ❤️ 2
    我觉得现在应该查一下硬盘的 SMART
    kzfile
        11
    kzfile  
       36 天前
    曾经用 oracle ,有个机房在新疆,经常断电,需要频繁运维
    hiyyq3372
        12
    hiyyq3372  
       36 天前
    把 innodb_flush_log_at_trx_commit 设成 1 看看,redo log 直接落盘
    Plating
        13
    Plating  
       36 天前
    研发环境遇见过,一年断了两三次,oracle 也出现了启动问题,pg 倒是正常启动
    Lynntox
        14
    Lynntox  
       36 天前   ❤️ 2
    明确发函 之后出问题就不管了 这种业务流上的东西他们不去规范迟早出问题
    jixiangqd
        15
    jixiangqd  
       36 天前
    打开 double_write 试试
    wanguorui123
        16
    wanguorui123  
       36 天前
    sqlite 开启 SyncFull
    Vraw5
        17
    Vraw5  
       36 天前   ❤️ 5
    这都管嘛,明年合同里加一条,因甲方原因导致服务无法运行,提供恢复服务一次两万
    hiyyq3372
        18
    hiyyq3372  
       36 天前
    其实防不住的,什么地方都有可能出问题,下次可能就不是 mysql 了,还是要从规范操作上解决
    dynastysea
        19
    dynastysea  
       36 天前
    很多人对数据库真的是一知半解啊。。。断电恢复不都是数据库的基础能力么(还没听说过哪个数据库不支持断电的。。。),mysql 出问题只能说明你对数据库了解的不够深入。如果懒得了解,就去买厂商提供的数据库服务,出问题直接找赔钱就对了。。。
    EJW
        20
    EJW  
       36 天前
    直接断电,对硬盘也有影响吧。
    xtreme1
        21
    xtreme1  
       36 天前
    除了 ups 还得上企业级 ssd, 带断电保护的
    ShinichiYao
        22
    ShinichiYao  
       36 天前
    硬盘挂了什么数据库都没用
    jonsmith
        23
    jonsmith  
       36 天前   ❤️ 1
    这样搞,首先坏的是硬盘,跟数据库无关
    niubee1
        24
    niubee1  
       36 天前
    随便买个 UPS ,假设能在断电后支撑 15 分钟, 然后 crontab 加一个脚本,每分钟执行一次,内容就是 ping 网关,连续 10 次 ping 不通就执行关机指令。
    cheng6563
        25
    cheng6563  
       36 天前
    @dynastysea #19 断电恢复指的是手动找回恢复数据...断电都能把文件系统炸了
    la2la
        26
    la2la  
       36 天前   ❤️ 3
    这种强行断电的跟服务器设计容错理念都不一样
    现代机房机房都是追求极致稳定的,虽然工厂环境无法改变,但是还是得明确告知客户这个问题,单拉电线或者是用 ups
    这个场景 MySQL 解决不了的,不要指望其他数据库能避免这个问题
    huangsijun17
        27
    huangsijun17  
       36 天前
    这不是有哪个数据可经得起这么操作,而是没有服务器经得起这么操作。
    你这不是技术问题,而是公司的保修政策等等有问题。拉闸断电是错误操作。因为频繁拉闸断电导致的故障应该向公司反馈,让销售之类的和对方沟通。
    Felldeadbird
        28
    Felldeadbird  
       36 天前
    mysql 崩溃后,恢复确实容易出问题。

    楼主现在阶段不应该上 UPS 最划算吗?换数据库你也得重构业务代码。
    flmn
        29
    flmn  
       36 天前
    我猜 sqlite 可以,而且就你描述那个环境,sqlite 很适合啊。
    dynastysea
        30
    dynastysea  
       36 天前
    @cheng6563 所以我说很多人是外行啊,你认为会炸是因为你的数据不值钱,为了性能忽略了一些参数配置,对各方面的系统设计也不了解。。就这么说吧,市面上你见到的数据库厂商,断电恢复都是基础能力,你可以让他和你说他是怎么保证的,如果他说保证不了,直接让他滚,数据库不具备断电保护能力那也不叫数据库了
    shylockhg
        31
    shylockhg  
       36 天前   ❤️ 1
    @dynastysea 硬盘都不行了,什么备份恢复都 g
    Karte
        32
    Karte  
       36 天前
    UPS 断电通知, 然后实现软关机. 在关机过程中会将数据库在内存的所有数据回写硬盘.

    只要你的数据量不大, 且主机功耗不高, 只要能撑住 3 分钟的都可以了. 3 分钟数据库的所有修改无论怎么样都落盘了, 除非你的 InnoDB (MySQL) 中的 BUFFER POOL 设置的特别大, 而且有程序在 3 分钟内持续回写而没有退出时, 就可能会出现数据丢失在应用程序, 而非数据库中.
    zhhbstudio
        33
    zhhbstudio  
       36 天前
    数据库是用来存数据的,不是用来抗断电的!
    不想加钱加 UPS 就工人下班点前 5-10 分钟定时关机,通电自动开机
    QlanQ
        34
    QlanQ  
       36 天前
    和数据库没关系,加 UPS
    shyangs
        35
    shyangs  
       36 天前   ❤️ 1
    @dynastysea

    WAL 和 ACID 又不保證 HDD 和 SSD 不會故障,唸書唸傻了? 核電安全的書一樣保證核電廠安全,結果一樣有福島核災.
    webszy
        36
    webszy  
       36 天前
    这不是一个纯软件能解决的问题,还是要搭配 UPS ,甚至外部供电系统的支持
    goodryb
        37
    goodryb  
       36 天前
    这么强制断电,可能不是数据库出问题,反而硬盘出问题,丢数据的概率更大,加 ups 或者定时提前关机
    bthulu
        38
    bthulu  
    OP
       36 天前
    @Felldeadbird 重构业务代码几秒钟就行了. 全程都是 efcore 操作数据库的.
    jay_chiu
        39
    jay_chiu  
       36 天前
    ups 几个钱,直接能干倒闭?别管几个厂,每个厂的利润是一定的。你给报价的时候加上去就行了,或者让厂家出钱买。
    aiqinxuancai
        40
    aiqinxuancai  
       36 天前
    UPS 才几个钱,几百块搞定了
    datocp
        41
    datocp  
       36 天前
    你不要自己先做判断,为什么客户不能加 ups

    客户购买软件肯定是为提高生产效率,他们这种断电的行为肯定会影响它们的生产任务,停它个 2-3 小时试试。
    当然连机房都没有就。。。只要它们可以停得起。

    你要做的是言明可能造成的风险,无非就是无法查询影响业务开展甚至停工停产业务混乱,是 2 千块的 ups 重要,还是当天业务无法开展重要。

    以前用的一家 web erp ,财务每星期准备 5 千块,时刻等待业务被卡继费继续开展业务。员工不关闭电脑拉闸导致服务器挂掉该告知的是他们老板,或者收笔上门维护费吧,有些业务叫上了贼船下不来。
    joh
        42
    joh  
       36 天前 via Android   ❤️ 3
    设个定时关机,下班断电前几分钟自动关机
    bthulu
        43
    bthulu  
    OP
       36 天前
    @datocp 因为业务大头在硬件上面, 软件是附带的. 我们软件起不来的情况下, 客户还有其他解决方案, 虽然会麻烦很多.

    几百块的 UPS, 倒也不是用不起, 但是多了个设备, 采购发货接线配置断电重启, 都是麻烦事. 如果是核心业务, 这么做无可厚非, 但是边缘业务, 给客户锦上添花的, 肯定不能这么玩.
    datocp
        44
    datocp  
       36 天前
    公司 2010 年的一套 web 查询系统,是使用 freebsd zfs ,用的 postgresql ,确实强断电没问题,但是那个希捷的企业级硬盘坏道也非常厉害。目前还在一套不重要的系统上当系统盘。。。


    日期 SMART 10 SMART 12 SMART 5 SMART 187 SMART 188 SMART 197 SMART 198
    20210827 0 200 25769803783 0 0 0 0
    20210901 0 200 25769803783 0 0 0 0
    20211006 0 201 25769803783 0 0 0 0
    20211109 0 203 30064771080 0 0 0 0
    20211221 0 203 30064771080 0 0 0 0
    20220126 0 204 30064771080 0 0 0 0
    20231125 0 228 90194313238 5 0 0 0
    20240322 0 228 90194313238 5 0 0 0
    bthulu
        45
    bthulu  
    OP
       36 天前
    @joh 但是没人知道几点下班. 都是单子什么时候昨晚, 什么时候下班. 也可能单子做完了, 突然又来了急单就不下班了.
    fuis
        46
    fuis  
       36 天前
    SQLite 或者 Postgre
    yangxiaopeipei
        47
    yangxiaopeipei  
       36 天前
    到点执行关机。
    whathappen
        48
    whathappen  
       36 天前
    3 条路:
    培训员工。
    加 UPS 并设置联动。
    改一下厂房的电路。


    改独立 24 小时供电的电路应该是最优选。
    8355
        49
    8355  
       36 天前   ❤️ 1
    一定要用线上来解决线下的问题。。。。


    你非要这样的话我来提供一个解决方案更简单更适合他们
    系统逻辑代码层写死,到几点下班自动关闭写操作,只允许读不允许写操作,那么只要你能保证在可能关闭电源的时候就不会出现写操作 就不会产生 redo log 也不会产生相关异常。

    必要时可以加入计划任务直接把 mysql 服务关闭,通电开机时自动启动。
    cheng6563
        50
    cheng6563  
       36 天前
    @dynastysea #30 你怎么配置能解决 SSD 断电掉盘的问题?
    BeforeTooLate
        51
    BeforeTooLate  
       36 天前
    这是啥系统,要给每个客户整个服务器放他们厂里,当时不应该统一上云或者自管机房还是说是完全内部系统不能放在厂房以外的地方?
    dzdh
        52
    dzdh  
       36 天前
    postgres
    lloovve
        53
    lloovve  
       36 天前 via iPhone
    联网到无法断电的地方,这么折腾先坏的是硬盘,或者直接 4g 联网上云
    llxvs
        54
    llxvs  
       36 天前 via iPhone
    加一個在數據庫啟動前的腳本,刪除你說的那個日誌
    ccc008
        55
    ccc008  
       36 天前   ❤️ 11
    其实也简单。楼主说“数据丢失部分是无关紧要的”,那么楼主就在开机的时候做个脚本,自动检查并清除 redo 日志
    yufeng0681
        56
    yufeng0681  
       36 天前   ❤️ 2
    1 、工厂里加一根电线,单独供电
    2 、工厂侧放笔记本电脑,服务器放办公室
    joh
        57
    joh  
       36 天前 via Android
    @bthulu 软件层面怎么解决硬件问题…加个检测系统,到点且没有新单子就把核心业务系统关了等断电,有单子就启动系统读写数据库…不过这样硬件迟早要出问题
    tpopen
        58
    tpopen  
       36 天前
    实时备份算了
    MoYi123
        59
    MoYi123  
       36 天前
    @cheng6563 这个是指不管在哪个瞬间断电, 数据库只要对 insert 返回了成功, 就一定不丢数据, 如果中间出现了异常就返回失败, 由应用程序来决定之后的处理.
    cuicuiv5
        60
    cuicuiv5  
       36 天前
    写一个程序, 检测到你说的错误时就删除日志
    iPisces77
        61
    iPisces77  
       36 天前
    直接提多种解决方案,让领导做决策
    mosfet
        62
    mosfet  
       36 天前
    这啥草台工厂
    老这么直接断电,硬盘也抗不住
    raptor
        63
    raptor  
       36 天前
    钱能解决的问题都不是问题,不知道你们服务器是多大的,看上去你们这也不是什么大系统,如果是 PC 做服务器的话,搞个民用 UPS 也就几百块,加到软件价格里作为标配就好了。
    非要软件弄的话,ZFS 加 PGSQL 可能可以,ZFS 定时快照,每次生成新快照后就删除旧快照,PGSQL 启用 WAL ,重启时用一个脚本检测一下数据库是否正常,如果数据库失败就回滚到最新的 ZFS 快照,然后恢复 PGSQL 的 WAL 。
    hahahasnoopy
        64
    hahahasnoopy  
       36 天前
    能远程为什么不用在线数据库
    xdeng
        65
    xdeng  
       36 天前
    坚持到关完机的 ups 不贵吧,都开厂了。
    q958951326
        66
    q958951326  
       36 天前
    上班开机,下班关机。
    kemistep
        67
    kemistep  
       36 天前   ❤️ 1
    数据不重要,那就写个脚本程序呗,定时检测 mysql 有无启动,无启动,删日志,再拉起 mysql ,尝试个 3 次,再失败,发预警通知
    ily433664
        68
    ily433664  
       36 天前
    不如买个 ups ,几百块的事
    ala2008
        69
    ala2008  
       36 天前
    工厂的数据不应该要求更严格吗
    ellermister
        70
    ellermister  
       36 天前 via Android
    全楼都在指责楼主方案业务存在问题,劝人修改方案,没人来思考如何来解决技术问题。
    realpg
        71
    realpg  
       36 天前
    楼上没一个说的在点子上的
    整理几种常见故障,写个脚本智能判断,对应执行
    如果不是常规的,起不来就上报 逐渐增加这个脚本池子能处理的异常
    shyangs
        72
    shyangs  
       36 天前
    @ellermister

    因為樓主頭痛醫頭,腳痛醫腳,等到客戶 SSD 壞了,可以再賣一塊 SSD 給客戶賺一筆.
    cJ8SxGOWRH0LSelC
        73
    cJ8SxGOWRH0LSelC  
       36 天前   ❤️ 1
    不就是写个检测脚本的事情, 删日志, 重启 mysql , 这不是很好解决么。
    wx5923
        74
    wx5923  
       36 天前
    或者用笔记本做服务器?设置低电量自动关机
    bluearc
        75
    bluearc  
       36 天前
    写个开机运行的脚本吧,开机 5 分钟后检测 mysql 有没有运行,没有就先尝试拉起,拉起失败就去删日志,还失败就警告,可以多加一些情况判断,毕竟你这个问题是很固定的;当然最好还是不断电 24h 运行好
    RightHand
        76
    RightHand  
       36 天前 via Android
    SQLite 吧,文件存储,随时 copy
    xixiv5
        77
    xixiv5  
       36 天前
    来电自启 定时关机
    busier
        78
    busier  
       36 天前 via iPhone
    不要数据很简单啊。

    只要将系统固化就可以了。
    linux 用 overlayroot
    win 用 uwf
    硬盘底层不再有写入,系统工作时的硬盘写入全部由内存接着。
    fangpeishi
        79
    fangpeishi  
       36 天前
    1. 可以查下目前在用的 ssd 是否带断电保护。
    “进一步了解 SSD 断电保护 (PLP)”
    https://www.kingston.com/cn/blog/servers-and-data-centers/ssd-power-loss-protection

    2. 便宜 UPS ,大家都说了;
    3. 电箱单独拉一路电,或者和监控设备用同一路,厂子监控是不是一般不会断的吧;
    4. 看起来场景负载也不高,数据库换成 sqilite ,其实断电这个场景,在嵌入式领域是老问题,除了 sqlite ,还有特殊只读文件系统,例如 squashfs erofs ,我可能会想是否可以将 mysql 和系统等安装在单独的这些文件格式上,再对于数据分区叠加自动备份策略,当数据区出现异常的时候能让客户自助(或者自动)按照最近快照快速回滚。
    dynastysea
        80
    dynastysea  
       36 天前
    @shyangs 你这种连中文都看不懂的,来这瞎杠干啥? lz 说的是掉电安全问题,说是硬盘问题了吗?硬盘坏和掉电有啥关系?掉电硬盘就坏,连基本的题意都看不懂, 我真怀疑你的智商
    dynastysea
        81
    dynastysea  
       36 天前
    @cheng6563 哪家企业级的 ssd 掉电会丢数据?
    wuhunyu
        82
    wuhunyu  
       36 天前   ❤️ 1
    不在乎数据丢失的话,就写一个脚本,开机之后一段时间(比如 3 分钟内)监听 mysql 服务是否正常运行,如果未运行,就删除 redo log ,然后重启 mysql 服务,已运行就不管。话说工厂也不至于全厂都停电吧,像是一些监控设备,难道人走了也断电吗?要工厂单独拉一条不断电的线就行了,每天强制断电这不是折磨服务器吗,硬盘的寿命肯定长不了
    wuhunyu
        83
    wuhunyu  
       36 天前
    还有一个问题是,如果要切换数据库引擎,不知道题主的系统做新数据库的适配有多大的成本,这也是要考虑的,而且迁移到新的数据库引擎,旧数据是不是也要迁移过去,也是一个问题。所以我认为,换数据库引擎应该是最后应该考虑的,因为迁移的成本可能并不小
    AlexRoot
        84
    AlexRoot  
       36 天前
    @8355 我觉得你这个是靠谱的,定时关机,只要主动在下班前关机不就好了。
    villivateur
        85
    villivateur  
       36 天前
    换企业级 SSD 即可,加个带恢复的文件系统,跟数据库没关系
    shampoo
        86
    shampoo  
       36 天前
    不要多想抗震抗火灾抗断电啥的,多备份就完事了。
    netnr
        87
    netnr  
       36 天前
    支持 SQLite +1
    importmeta
        88
    importmeta  
       36 天前
    让工厂改电路, 确保机器永不断电, 加防灾装置.
    234ygg
        89
    234ygg  
       36 天前
    既然日志删掉就能启动,那就启动不起来的时候自动备份日志到别的地方,然后删了原来的日志不就完事儿了 ???
    lenmore
        90
    lenmore  
       36 天前
    在不增加硬件的情况下似乎无解,硬盘挂掉迟早的事。。记得做好备份。

    那么,有没有可能把这个服务部署到云上或者你们自己得机房?
    markgor
        91
    markgor  
       36 天前
    企业级 SSD 也不一定多能抗吧,只是相对消费级别的好点。
    我之前也有类似的场景,最终我们直接找一台云主机存数据,本地当代理转发,后来直接把本地的也干掉了
    yidev
        92
    yidev  
       36 天前
    对待这种原始的场景, 要用粗暴的解决方式, 让他们安排个人开关机
    loginv2
        93
    loginv2  
       36 天前
    上云,数据库放远程
    SimonOne
        94
    SimonOne  
       36 天前
    配个开机脚本把 redo 删了呗。
    fanersai
        95
    fanersai  
       36 天前
    ups+正常关机脚本
    mark2025
        96
    mark2025  
       36 天前
    如果没有 ups ,那么就用 pgsql ,并且把数据安全相关设置全部打开,比如 同步写入,页面全写入,降低检查点时间。
    mark2025
        97
    mark2025  
       36 天前
    @datocp pgsql 很抗造的。只要相关配置设定好,随便断电。
    mark2025
        98
    mark2025  
       36 天前
    pg , 然后磁盘分区建议 xfs 或者 zfs 。
    diagnostics
        99
    diagnostics  
       36 天前
    软件层面上,lightbend akka 搞的 akka edge 好像想解决工厂这种恶劣环境下的问题
    Karte
        100
    Karte  
       36 天前   ❤️ 1
    那干脆直接上影子系统算了, 这样怎么样都没问题.

    影子系统可以将系统在每次启动时恢复到预先设置的环境. 所有在系统的修改都会在第二次开机时删除.
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1175 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.