当前位置:首页 > 问答 > 正文

Linux环境下搞定DB2数据库备份恢复那些事儿,怎么操作比较靠谱

说到在Linux环境下搞定DB2数据库的备份和恢复,这事儿听起来好像挺专业,但其实只要理清了步骤,别瞎搞,还是挺靠谱的,咱今天就捞干的说,怎么操作才能心里有底,主要参考了IBM官方知识中心和一些有经验的DBA(数据库管理员)的实践分享。

第一部分:备份——留好“后悔药”

备份是啥?就是给数据库拍个快照,存个档,万一哪天数据库出问题了,比如有人误删了数据、服务器硬盘坏了,或者中了勒索病毒,就能把这个存档拿出来,让数据库恢复到拍照时的样子,这是最最重要的“后悔药”。

备份前,先搞清楚几个关键点:

  • 备份类型: 主要有两种,你得根据情况选。
    • 离线备份(冷备份): 在备份的时候,数据库不能干活儿,所有用户都得断开连接,这种备份最简单,最保险,因为数据库是静止的,不会有人中途改数据,适合在半夜没啥人用系统的时候干,根据IBM官方文档,这是最基础的备份方式。
    • 在线备份(热备份): 在备份的时候,数据库照样运行,用户可以正常访问和修改数据,这个就更高级了,适合7x24小时不能停的系统,但要注意,想做在线备份,你必须事先把数据库设置成支持“归档日志”模式(ARCHIVELOG mode),这个后面会说到。
  • 备份放哪儿: 备份出来的文件叫备份映像,你不能傻乎乎地只放在数据库服务器本地硬盘上,万一这块硬盘一起坏了不就全完了?靠谱的做法是:
    • 本地磁盘+异地: 先备份到服务器上另一个独立的硬盘或存储上,然后再想办法把这个备份文件拷贝到另一台不同的机器上,或者上传到云存储,有经验的DBA常强调“3-2-1”备份原则(3个副本,2种介质,1个异地)就是这个道理。
    • 磁带库或网络路径: 如果公司有专门的备份设备,可以直接备份到磁带库或者网络共享目录(NFS)里。

动手备份:

DB2备份主要用命令行工具db2,你得用一个有权限的账号(比如实例所有者)来操作。

  • 来个简单的离线备份:

    # 先连上数据库
    db2 connect to 你的数据库名
    # 执行离线备份,备份文件叫 mydb.0.db2inst1.NODE0000.CATN0000.20241024090100.001
    db2 backup database 你的数据库名 to /home/db2backup/

    这个命令会在/home/db2backup/目录下生成一个备份文件,路径你自己定。

  • 来个更稳妥的在线备份: 确保数据库已经启用了归档日志(这是个关键前提,具体设置方法可以查IBM官方手册,大概就是改个配置参数的事儿)。

    db2 backup database 你的数据库名 online to /home/db2backup/ include logs

    注意这里的online关键字表示在线备份,include logs表示把备份期间产生的日志也一起打包进去,这对后续恢复至关重要。

第二部分:恢复——关键时刻的“救命稻草”

恢复就是把备份的“存档”读出来,覆盖掉现在出问题的数据库。

恢复前要想清楚:

  • 恢复到哪一步?
    • 完整恢复: 就用那个备份文件,把数据库恢复到当初备份的那个时间点,备份之后的数据就全没了。
    • 前滚恢复: 这个就厉害了,如果你做的是在线备份,并且备份后产生的日志文件都还完好无损地保存着,你就可以先恢复到备份的那个时间点,然后告诉DB2:“你接着读备份之后产生的日志,一直恢复到某个时间点(比如出错前5分钟)或者恢复到最新。”这样数据丢失的量能降到最小,这就是为啥在线备份要求归档日志的原因。

动手恢复:

假设数据库彻底崩了,或者数据文件被删了,我们需要从备份还原。

  • 还原基础数据

    # 如果数据库还存在,可以先删掉(危险操作,确保备份没错!)
    # db2 drop database 你的数据库名
    # 从备份文件还原数据库
    db2 restore database 你的数据库名 from /home/db2backup/ taken at 20241024090100

    这里的taken at后面跟的是备份文件时间戳,就是你备份时生成的文件名里那串长数字。

  • 步骤二(可选,但很重要):前滚恢复 如果你想要恢复备份之后的数据,接着执行:

    db2 rollforward database 你的数据库名 to end of logs and complete

    这个命令会让数据库自动应用所有可用的日志文件,一直恢复到最后一个完整的日志记录,如果你只想恢复到某个特定时间,比如今天上午10点,可以把to end of logs换成to timestamp('2024-10-24-10.00.00')

第三部分:怎么才算“比较靠谱”?

光会敲命令不行,得有一套方法才叫靠谱。

  1. 定期备份,形成习惯: 比如每天夜里做一次在线全量备份,不能想起来了才做。
  2. 验证备份文件不是空的: 定期抽查一下,把备份文件拿到一个测试环境恢复一下,看看能不能成功,这是很多血泪教训总结出来的,不然真到用时发现备份是坏的,哭都来不及。
  3. 日志文件是宝贝,要单独妥善保管: 在线备份的威力全靠日志,一定要确保日志文件有专门的、安全的地方存放,并且有足够的空间,别被撑满了导致数据库挂起。
  4. 文档化你的流程: 把备份策略(什么时候备、备到哪里)、恢复步骤清清楚楚地写下来,万一不是你本人操作,别人也能按图索骥,避免慌乱中出错。
  5. 权限管理要严格: 备份恢复的命令权限不能随便给,恢复命令尤其危险,一不小心就把新数据全覆盖了。

在Linux下搞DB2备份恢复,核心就是:选对备份类型(离线求稳,在线求连续),保管好备份文件和日志,并定期做恢复演练。 这样真遇到事儿了,你才能不慌不忙地把“后悔药”吃下去,把数据库救回来。

Linux环境下搞定DB2数据库备份恢复那些事儿,怎么操作比较靠谱