数据库版本:KingbaseES V008R006C008B0014
简介
sys_rman 是 KingbaseES 数据库中重要的物理备份还原工具,支持不同类型的全量备份、差异备份、增量备份,保证数据库在遇到故障时及时使用 sys_rman 来恢复到数据库先前状态。
文章目录如下
[1. 备份前准备](#1. 备份前准备)
[1.1. 修改数据库配置](#1.1. 修改数据库配置)
[1.2. 备份配置说明](#1.2. 备份配置说明)
[2. 非独立备份](#2. 非独立备份)
[2.1. 备份前准备](#2.1. 备份前准备)
[2.1.1. 配置备份参数](#2.1.1. 配置备份参数)
[2.1.2. 初始化备份](#2.1.2. 初始化备份)
[2.2. 手动备份方法](#2.2. 手动备份方法)
[2.2.1. 全量备份](#2.2.1. 全量备份)
[2.2.2. 增量备份](#2.2.2. 增量备份)
[2.2.3. 差异备份](#2.2.3. 差异备份)
[2.3. 自动备份方法](#2.3. 自动备份方法)
[2.3.1. 增加备份配置参数](#2.3.1. 增加备份配置参数)
[2.3.2. 运行自动备份](#2.3.2. 运行自动备份)
[2.3.3. 关闭自动备份](#2.3.3. 关闭自动备份)
[2.4. 管理备份](#2.4. 管理备份)
[2.4.1. 查看备份列表](#2.4.1. 查看备份列表)
[2.4.2. 按保留数清理备份](#2.4.2. 按保留数清理备份)
[2.4.3. 按备份集名称清理](#2.4.3. 按备份集名称清理)
[3. 非独立还原](#3. 非独立还原)
[3.1. 基于测试性质的还原](#3.1. 基于测试性质的还原)
[3.2. 基于最新备份的还原](#3.2. 基于最新备份的还原)
[3.3. 指定备份集还原](#3.3. 指定备份集还原)
[3.4. 指定事务ID还原](#3.4. 指定事务ID还原)
[3.5. 指定时间点还原](#3.5. 指定时间点还原)
1. 备份前准备
1.1. 修改数据库配置
保证数据库能够正常备份/还原,需要修改 data/kingbase.conf 以下几个参数后重启数据库生效
bash
archive_mode = on # 归档模式(on:表示在现有数据库节点上备份还原、always:表示在数据库节点外专门搭建一台用于备份的服务器)
archive_command = '/bin/cp -f %p /home/yt/archive/%f' # 未注释就行,初始化时自动修改
wal_level = logical # 决定多少信息写入wal中
重启数据库命令
bash
sys_ctl -D data restart
1.2. 备份配置说明
根据不同情况修改备份配置 share/sys_backup.conf,说明如下:
bash
# 备份的数据库模式: single/cluster/single-pro
_target_db_style="cluster"
# 主节点IP
_one_db_ip="192.168.28.37"
# 存储备份物理文件的IP
_repo_ip="192.168.28.37"
# 集群标签(不用修改)
_stanza_name="kingbase"
# 连接数据库的操作系统用户名
_os_user_name="yt"
# 操作系统存放的备份目录(需要一个不存在的目录,自动创建)
_repo_path="/home/yt/kbbr_repo"
# 保留备份数,超出后自动清理(例如配置未5,那么保留备份的文件达到第6份时自动清理1份)
_repo_retention_full_count=5
# 每隔几天执行1次全量备份
_crond_full_days=7
# 每隔几天执行1次差异备份
_crond_diff_days=0
# 每隔几天执行1次增量备份
_crond_incr_days=1
# 自动全量备份的备份时间(2表示凌晨2点执行)
_crond_full_hour=2
# 自动差异备份的备份时间(6表示早上6点执行)
_crond_diff_hour=6
# 自动增量备份的备份时间(17表示下午17点执行)
_crond_incr_hour=17
# 限制带宽(nMb/s),0表示不限制
_band_width=0
# 系统命令(不修改)
_os_ip_cmd="/sbin/ip"
_os_rm_cmd="/bin/rm"
_os_sed_cmd="/bin/sed"
_os_grep_cmd="/bin/grep"
#################### 单机配置 ####################
# 数据库data目录
_single_data_dir="/home/kingbase/ES/single/data"
# 数据库bin目录
_single_bin_dir="/home/kingbase/ES/single/Server/bin"
# 数据库用户名
_single_db_user="system"
# 数据库端口号
_single_db_port="54321"
# on表示sys_securecmd通信, off表示SSH通信
_use_scmd=on
# 快速执行sys_start_backup(y、n)
_start_fast=y
# 备份文件类型(none、gz)
_compress_type=none
# 如果未归档的WAL文件,超过此设置显示ERROR并破坏backup-init(128MB ~ 1024MB)
_non_archived_space=1024
#加密存储库的密码类型
#_repo_cipher_type="aes-256-cbc"
# 加密/解密存储库文件的密码
#_repo_cipher_pass="c3k5ODQyLg=="
# 禁用归档文件统计(n、y)
_archive_statistics=n
2. 非独立备份
- 独立备份:指在数据库节点外单独使用一台用于备份的服务器(配置 archive_mode = always)
- 非独立备份:指在现有数据库节点上进行备份还原(配置 archive_mode = on)
2.1. 备份前准备
2.1.1. 配置备份参数
示例:单机配置需要修改的文件 share/sys_backup.conf
bash
_target_db_style="single"
_repo_ip="备份IP"
_os_user_name="操作系统用户名"
_repo_path="备份目录"
_single_data_dir="数据库data目录"
_single_bin_dir="数据库bin目录"
_single_db_user="数据库用户名"
_single_db_port="数据库端口号"
2.1.2. 初始化备份
备份前需要初始化备份信息
bash
sys_backup.sh init
系统提示 securecmdd 没有工作。这是因为我使用单机举例,没有启动 securecmdd 导致的错误。如果集群是基于 securecmdd 通信,那么备份就配置修改为 _use_scmd = on;如果是基于 ssh 通信,那么备份配置修改为 _use_scmd = off。
修改 share/sys_backup.conf 参数:
bash
_use_scmd = off
初始化成功!
初始化完成后会自动修改数据库配置中 archive_command 参数:
并且会根据配置的备份目录生成一个文件夹(_repo_path=备份目录)。示例:
- archive:归档WAL日志的目标目录
- backup:保存各备份的目标目录
- sys_rman.conf:运行时的配置文件(自动生成)
参考官网流程图(https://help.kingbase.com.cn/)
sys_rman 通过wal文件和数据文件来进行备份,但备份REPO与数据库实例处于同一个物理主机,冗余度较低。
2.2. 手动备份方法
2.2.1. 全量备份
- 全量备份是对所有数据文件进行一次备份,产生的备份集可以单独地构成还原的基础。
手动执行全量备份命令如下:
bash
sys_rman
--config=/kbbr_repo/sys_rman.conf # 自动生成的配置文件
--stanza=kingbase
--archive-copy
--type=full # 类型为全量备份
backup
备份完成后会在备份目录生成相对对应的备份目录(名称格式:日期-时间)
bash
cd ./kbbr_repo/backup/kingbase
2.2.2. 增量备份
- 增量备份是依赖于上一次全量备份及中间变化的备份,针对上一个备份有变化的数据文件进行一次备份,产生的备份集配合依赖的全量备份集及串行依赖备份集构成还原的基础。
- 必须先执行全量备份才能操作增量备份。
增量备份又分为:
- 文件粒度:当某个数据文件的一个数据块发生变化后,增量备份将拷贝整个数据文件
- 块粒度:当某个数据文件的一个数据块发生变化后,块增量备份只拷贝变化的数据块
手动执行增量备份(文件粒度)命令如下:
bash
sys_rman
--config=/kbbr_repo/sys_rman.conf # 自动生成的配置文件
--stanza=kingbase
--archive-copy
--type=incr # 类型为全量备份
backup
手动执行增量备份(块粒度)命令如下:
bash
sys_rman
--config=/kbbr_repo/sys_rman.conf # 自动生成的配置文件
--stanza=kingbase
--archive-copy
--type=page # 类型为全量备份
backup
2.2.3. 差异备份
- 差异备份也是依赖于上一次全量备份,针对此全量备份有变化的数据文件进行一次备份,产生的备份集配合依赖的全量备份集构成还原的基础。
- 必须先执行全量备份才能操作差异备份。
手动执行差异备份命令如下:
bash
sys_rman
--config=/kbbr_repo/sys_rman.conf # 自动生成的配置文件
--stanza=kingbase
--archive-copy
--type=diff # 类型为全量备份
backup
2.3. 自动备份方法
2.3.1. 增加备份配置参数
在目录《2.1.1》的基础上增加备份的自动时间 share/sys_backup.conf
bash
# 保留备份数,超出后自动清理(例如配置未5,那么保留备份的文件达到第6份时自动清理1份)
_repo_retention_full_count=5
# 每隔几天执行1次全量备份
_crond_full_days=3
# 每隔几天执行1次差异备份
_crond_diff_days=2
# 每隔几天执行1次增量备份
_crond_incr_days=1
# 自动全量备份的备份时间(2表示凌晨2点执行)
_crond_full_hour=2
# 自动差异备份的备份时间(8表示早上8点执行)
_crond_diff_hour=8
# 自动增量备份的备份时间(17表示下午17点执行)
_crond_incr_hour=17
增加参数完成后不需要再次初始化,因为启动自动备份时间是读取 share/sys_backup.conf
2.3.2. 运行自动备份
初始化完成后直接运行
bash
sys_backup.sh start
自动备份方法是基于系统的定时任务来实现,通过Linux命令 crontab -l 可以查看
启动自动备份后,通过命令反馈的日志信息可以得知,备份日志存放到:
- log/sys_rman_backup_full.log
- log/sys_rman_backup_diff.log
- log/sys_rman_backup_incr.log
2.3.3. 关闭自动备份
关闭的方法也很简单,直接执行
bash
sys_backup.sh stop
2.4. 管理备份
2.4.1. 查看备份列表
bash
sys_rman
--config=/kbbr_repo/sys_rman.conf # 自动生成的备份配置
--stanza=kingbase
info
头部说明
- full backup:全量备份信息
- incr backup:增量备份信息
- diff backup:差异备份信息
信息说明
- timestamp start/stop:备份的开始/结束时间点
- wal start/stop:备份开始/结束时的WAL日志文件
- database size:数据库的运行时磁盘容量
- database backup size:数据库的备份容量
- backup set size:当前备份集的容量
- backup size:当前备份集的实际磁盘容量,包含压缩因素和依赖备份集冗余
2.4.2. 按保留数清理备份
这种方法通常是在备份配置文件 share/sys_backup.conf 中的这个参数
bash
_repo_retention_full_count=5 # 保留备份数量
初始化后会自动将参数配置到 kbbr_repo/sys_rman.conf 中,所以我们直接修改 kbbr_repo/sys_rman.conf 即可:例如只保留2份备份,那么修改为
bash
_repo_retention_full_count=2
【示例】
1、先查看全量备份数
bash
./bin/sys_rman --config=/home/yt/kbbr_repo/sys_rman.conf --stanza=kingbase info |grep 'full backup'
这里保留了4份
2、修改 kbbr_repo/sys_rman.conf
bash
_repo_retention_full_count=2
3、手动清理
bash
./bin/sys_rman --config=/home/yt/kbbr_repo/sys_rman.conf --stanza=kingbase expire
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf
--stanza=kingbase
expire
4、查询剩余备份集
bash
./bin/sys_rman --config=/home/yt/kbbr_repo/sys_rman.conf --stanza=kingbase info |grep 'full backup'
保留最新的2份
2.4.3. 按备份集名称清理
备份集名称就是查询备份列表时显示的名称:
bash
sys_rman
--config=/kbbr_repo/sys_rman.conf # 自动生成的备份配置
--stanza=kingbase
info
这里存在2份全量备份集,名称就是 full backup 后面的"20240526-060502F"
手动清理最后一份
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf
--stanza=kingbase
expire
--set=20240422-194416F
注意:可以清理最新的备份集,但是不能全部清理,必须保留1个
3. 非独立还原
非独立还原对应前面的非独立备份,基于前面备份集来还原数据。
3.1. 基于测试性质的还原
- 这种方式是指定新的 data 目录和临时禁止归档WAL文件
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf # 配置文件绝对路径
--stanza=kingbase
--kb1-path=/home/yt/data_new # 还原的新data路径
--archive-mode=off # 临时禁制归档wal文件
restore
还原后生成新的 data 目录,启动新 data 即可使用
3.2. 基于最新备份的还原
这种方法是将最新的备份集还原到数据库实例的 data 目录下(还原前需要关闭当前数据库实例),需要将原本 data 修改名称,还原自动生成 data 目录
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf # 配置文件绝对路径
--stanza=kingbase
restore
3.3. 指定备份集还原
如果不指定时间,工具将隐式地指定时间为备份集结束时间的后一秒
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf
--stanza=kingbase
--set='20200519-031336F'
restore
指定时间,工具将验证指定时间是否晚于备份集结束时间
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf
--stanza=kingbase
--set='20200519-031336F'
--type=time
--target='2020-05-19 16:28:17'
restore
3.4. 指定事务ID还原
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf
--stanza=kingbase
--type=xid
--target='445566'
--set='20210611-011416F_20210611-023050I'
restore
使用指定的xid还原到特定状态,必须同时指定该xid之前的备份集,才能够恢复到该xid
3.5. 指定时间点还原
bash
sys_rman
--config=/home/yt/kbbr_repo/sys_rman.conf
--stanza=kingbase
--type=time
--target='2020-05-07 16:28:17'
restore