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

数据库备份问题

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

    目前使用的有 MySql 、MongoDB 、Redis Mysql 和 Mongo 主要是存放业务数据使用,Redis 是作为一个中间缓存数据库使用 现在问题就是线上用户很少,但是有位同事不小心把测试环境的库干没了,领导很生气很重视这件事情,之前线上也一直没有上数据备份,现在准备把数据备份加上,想请教一下各位老哥,这几种数据库的数据备份大概需要做到哪种程度?需要一步到位还是一点一点来比较好

    PS:目前目前开发的软件和系统确实有点玩具的意思在,完全不抗造,只能尽量想到哪些去做哪些了...

    19 条回复    2023-12-27 17:25:53 +08:00
    AboPlus
        1
    AboPlus  
    OP
       336 天前
    备份各位大佬有什么比较主流的或者说比较抗造的方案没
    albertqcy
        2
    albertqcy  
       336 天前   ❤️ 1
    最简单高效的备份,直接定时调度加数据库导出命令加 ftp 就行了
    AboPlus
        3
    AboPlus  
    OP
       336 天前
    @albertqcy 有做热备份的必要性吗
    vopsoft
        4
    vopsoft  
       336 天前   ❤️ 1
    我们线上 mysql 是 5 台+2 台存储 ,其中 3 台做 mha ,1 台延迟库,1 台查询和备份导出
    每天全量备份到存储再同步到另一台存储
    RightHand
        5
    RightHand  
       336 天前 via Android   ❤️ 1
    SQLite 文件 copy ,无敌
    BQsummer
        6
    BQsummer  
       336 天前   ❤️ 1
    一般是每天晚上做全量备份, 出现事故需要恢复就拿昨天的全量然后回放当天 binlog
    Maboroshii
        7
    Maboroshii  
       336 天前 via Android   ❤️ 1
    上云,自动备份。
    另 binlog 这一套,恢复起来好像挺麻烦的,而且你恢复时要保证你的 mongo 和 mysql 数据的一致性,好像也挺难。
    但总归可以自动备份,还原也方便。
    AboPlus
        8
    AboPlus  
    OP
       336 天前
    @BQsummer 感觉这个是目前最适合我们的一个方案,毕竟没啥人用
    qiyilai
        9
    qiyilai  
       336 天前   ❤️ 1
    玩具就要用玩具的方案(手动斜眼):
    30 2 * * * /data/backup/database/mysql_backup.sh
    #mysql 备份 XXX 数据库脚本
    #保留最近 10 天备份
    #备份目录
    backupDir=/data/backup/database
    #mysqlDump
    mysqldump=mysqldump
    #ip
    host=***
    #用户名
    username=***
    #密码
    password=***
    #今天日期
    today=`date +%Y%m%d`
    #十 backupDir=天前的日期
    timeTenDayAgo=`date -d -10day +%Y%m%d`
    #备份的数据库
    database=***

    #如果文件夹不存在则创建
    if [ ! -d $backupDir ];
    then
    mkdir -p $backupDir;
    fi

    echo '开始备份'$database
    docker exec mysql $mysqldump -h$host -u$username -p$password $database | gzip > $backupDir/$database-$today.sql.gz
    echo '成功备份'$database'到'$backupDir/$database-$today.sql.gz
    if [ ! -f "$backupDir/$database-$timeTenDayAgo.sql.gz" ];
    then
    echo '10 天前备份不存在,无需删除'
    else
    rm -f $backupDir/$database-$timeTenDayAgo.sql.gz
    echo '删除 10 天前备份文件'$backupDir/$database-$timeTenDayAgo.sql.gz
    fi
    AboPlus
        10
    AboPlus  
    OP
       336 天前
    @Maboroshii 中层领导不愿意上云,想让我们自己搞,但是又根据目前的使用规模使用场景觉得好像也不用折腾太复杂(毕竟没人用),准备用上面老哥提的全量备份+binlog 的方式
    joyhub2140
        11
    joyhub2140  
       336 天前   ❤️ 1
    直接每天打个快照完事了。。。
    AboPlus
        12
    AboPlus  
    OP
       336 天前
    @qiyilai 好像真是目前阶段最合适的一个方案了
    AboPlus
        13
    AboPlus  
    OP
       336 天前
    @joyhub2140 谢谢佬~
    mylovesaber
        14
    mylovesaber  
       336 天前   ❤️ 1
    mysql 5.7 系列版本和 mariadb 的数据库我曾写过一个纯 shell 实现的小工具,你只需要往配置文件中按照提示填写必要的参数,然后命令行依次进行:
    1. 检查
    2. 检查没问题就运行
    3. 运行没问题就安装
    数据库就全自动备份了(全量),适合于对 linux 命令行操作没经验的产品类人员
    目前应用在好些省市的政府服务器上生产验证了的
    开源的暂时在 dev 分支,欢迎试用 : -)

    https://github.com/mylovesaber/Tools-Share/tree/dev/shell-tool/other/mysql-backup
    mylovesaber
        15
    mylovesaber  
       336 天前   ❤️ 1
    14 楼我发的那个工具是 9 楼的功能强化版本,看 9 楼可以简单理解工作原理,实际我这工具支持 root 和非 root 用户,涉密和非涉密系统
    laminux29
        16
    laminux29  
       336 天前   ❤️ 1
    金融级一致性要求,需要在应用上,进行业务性停机,应用停机完成后,再对数据库进行导出。

    能容忍不超过 24 小时的一致性,那么先准备冗余节点,该节点拥有全量数据,并且全量数据单次导入导出不能超过 24 小时。需要备份时,把冗余节点进行离线,然后从冗余节点导出数据进行备份。操作完成后,冗余节点重新上线,同步最新数据。

    能容忍超过 24 小时的一致性,只需要每晚备份一次,用数据库默认数据导出命令,导出全库即可。
    datocp
        17
    datocp  
       336 天前 via Android   ❤️ 1
    自己用的 mongodb 竟然因为 tar 释放被覆盖了。。。

    后来就写 shell cron 导出,tar 打包,只留最近的三天备份。备份要做的,不然后果很严重。
    datocp
        18
    datocp  
       336 天前   ❤️ 1
    #!/bin/sh
    cd /path/bak/wekan
    /path/mongodb/bin/mongodump -h 127.0.0.1:27018 -d wekan1 -o /path/bak/wekan
    #/path/mongodb/bin/mongorestore -h 127.0.0.1:27018 -d wekan1 /path/bak/wekan/wekan
    tar -czvf /path/bak/wekan/wekan$(date +%Y%m%d).tar.gz ./wekan
    now="`date +%s` - 259200" #72hour
    now=`expr $now`
    >/tmp/wekan.date;ls /path/bak/wekan/*.gz -lu| awk '{print $9}'>>/tmp/wekan.date
    for i in $(cat /tmp/wekan.date); do time=`date +%s -r $i`;
    if [ "$time" -lt "$now" ];then echo $i;
    rm -rf $i;
    fi;done
    rm -rf /path/bak/wekan/wekan
    albertqcy
        19
    albertqcy  
       331 天前
    @AboPlus 热备份其实就是主备嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.