V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
victimsss
V2EX  ›  数据库

问一下大家的数据库备份方法

  •  
  •   victimsss · 2 天前 · 1813 次点击
    先说现状,目前有不同区域的服务器,深圳韩国德国等,涉及到的数据库都是 mysql 和 postgre ,数据库有 容器和二进制运行的(感觉无所谓)。
    目前想在后台(容器)加一个数据库备份(主动/定时, 开关)的功能,一开始想的是使用 Cron (定时) + 子进程 xx_dump (自带脚本)+ oss ( watch 相关目录,创建则上传到 oss 上)。
    现在有一个问题是,后台服务是容器,且后台所处的服务器上的数据库也是容器,现在如何执行 xx_dump 呢,或者有其他方法吗?
    25 条回复    2024-07-02 16:01:27 +08:00
    tool2dx
        1
    tool2dx  
       2 天前
    我们用的是 mysql ,每天凌晨三点,网络异地备份当天的差异化数据。
    buyerhou
        2
    buyerhou  
       2 天前
    使用 otter 开源的阿里云 mysql 数据库备份服务,可以实时备份。
    rekulas
        3
    rekulas  
       2 天前
    dump 跟你容器没啥关系吧,只要数据库正常提供服务就可以备份,支持远程主机,不过考虑速度和网络稳定性,最好在内网备份
    GoRoad
        4
    GoRoad  
       2 天前
    容器也可以 dump 啊,这无所谓的,无非多一条从容器内拷贝出来的命令
    victimsss
        5
    victimsss  
    OP
       2 天前
    @rekulas 因为我要在后台程序(容器)里面执行 dump ,执行不了, 而且 dump 工具本身也在另一个容器里面,大概是这样。如果继续之前的思路,我要的是在后台程序里面执行 docker exec 进入带有 dump 的容器,再在里面创建 .pgpass ,然后再去备份自己和其他服务器上的数据库。
    Rollie
        6
    Rollie  
       2 天前
    心情好的时候,导出一下 SQL 文件然后再备份一下服务端。存储到数据盘里~嘿嘿。
    guanzhangzhang
        7
    guanzhangzhang  
       2 天前
    看它是走 tcp 还是 data-dir 还是 sock 文件去操作的
    IvanLi127
        8
    IvanLi127  
       2 天前
    子进程里写个脚本,脚本里直接 ssh 连宿主机,然后再根据条件去备份?如果能 ssh ,我感觉这种方法比较独立且灵活
    kingchy
        9
    kingchy  
       2 天前 via iPad
    我使用的 pg ,最后通过 tailscale 内网,将服务器上的数据 replicate 一份到家里完事。正好家里那份用来做数据分析,不影响服务器性能,完美😊
    yeqizhang
        10
    yeqizhang  
       2 天前 via Android
    @GoRoad 挂载个目录,也不用拷贝
    zx900930
        11
    zx900930  
       2 天前
    k8s
    mysql 集群
    percona-xtrabackup 每天定时备份到 minio 的桶里
    要还原直接 xtrabackup --prepare 很方便。

    一个好的 operator 帮你解决大部分运维的问题。
    photon006
        12
    photon006  
       2 天前
    我司数据库也是 docker 跑,但备份不跟它打交道,宿主机 pve 添加网络磁盘,直接备份 vm 整机,通过 smb 传到局域网 nas ,就跟腾讯云、阿里云备份数据卷一样,但成本低很多。
    shiny
        13
    shiny  
       2 天前
    https://github.com/wal-g/wal-g 用的这个,能同步到 S3 ,postgres 能接近实时备份
    同时云服务器再开个自动快照策略,保留 7 -30 天的备份
    laminux29
        14
    laminux29  
       2 天前
    1.让开发或熟悉业务的 DBA ,先写个把数据库的数据,全部导出的脚本。把该脚本放入 crontab 定期执行,执行后把结果写日志。运维工具,实时监控日志,如果日志中发现 Error 、fail 、timeout 等字符,就告警。这种备份方式,只是用来兜底的,出故障后,运维千万不要直接用这种方式得到的备份,进行恢复。如果只剩下这种备份了,交给开发去恢复。

    2.把数据库做成多节点(多副本节点),形成一个 HA 集群,单个节点故障后,Client 自动访问别的节点,类似于 Oracle RAC 的工作模式。这种模式,单节点故障后,不需要开发介入,运维可以直接进行替换故障节点,类似于 raid 磁盘故障时的操作。银行级别的数据库,也是需要使用这种结构的。
    MRlaopeng
        15
    MRlaopeng  
       2 天前
    @tool2dx 请问大佬,怎么备份差异数据呢
    e2k
        16
    e2k  
       1 天前
    @tool2dx #1 请问大佬,怎么备份差异数据呢
    tool2dx
        17
    tool2dx  
       1 天前
    @MRlaopeng
    @e2k

    就是 mysql 增量备份,网上搜一下一大堆。

    我情况比较特殊,数据库里每条记录都有最后修改日期,查询一下当天所有被修改过的记录,通过普通 sql 查询来备份的。
    cslive
        18
    cslive  
       1 天前
    不是很简单吗,容器里安装 client,然受执行 pg_dump -h ip 这种命令就可以将不同容器里的数据库数据备份出来,如果你的网不好那就慢了
    vueli
        19
    vueli  
       1 天前
    我比较菜,宝塔每天定时把数据库和站点页面打包备份,并且也备份到七牛
    GoRoad
        20
    GoRoad  
       1 天前
    @yeqizhang 那也行 哈哈哈 挂载出来
    leon0903
        21
    leon0903  
       1 天前
    我也顺路请教个问题:mysql data 目录整个备份算是备份数据库吗? 拿到这些目录文件可以直接导入到另外一个 mysql 中恢复数据吗?
    victimsss
        22
    victimsss  
    OP
       1 天前



    已经完成了,说一下思路。
    victimsss
        23
    victimsss  
    OP
       1 天前
    @guanzhangzhang
    按照这个思路完成了。
    // admin_compose.yaml
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock // 挂载 sock, 使得容器内部可以和 docker 守护进程通信

    https://www.npmjs.com/package/dockerode
    victimsss
        24
    victimsss  
    OP
       1 天前
    @leon0903 属于,物理备份,优缺点搜一下。
    BeforeTooLate
        25
    BeforeTooLate  
       1 天前
    @Rollie
    >心情好的时候,导出一下 SQL 文件然后再备份一下服务端。存储到数据盘里~嘿嘿。
    哈哈,侥幸心里使不得,我是吃过一次亏。哈哈😅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1052 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:25 · PVG 06:25 · LAX 15:25 · JFK 18:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.