暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

电科金仓热备份(联机备份)

原创 二两烧麦 2025-10-25
396

电科金仓热备份(联机备份)的核心是在数据库不中断服务的前提下,通过WAL(预写日志)归档保证数据一致性,适用于生产环境的全量备份场景。下面从原理、完整操作命令、恢复流程到最小权限,进行全流程详细拆解。

一、热备份核心原理

热备份依赖“数据文件复制 + WAL日志归档”的组合:

  1. 备份开始时,数据库会创建一个检查点,确保已提交的事务写入数据文件,未提交的事务记录到WAL日志。
  2. 备份过程中,数据库正常处理读写请求,新产生的事务会实时写入WAL日志,并通过归档命令同步到归档目录。
  3. 备份结束时,数据库会归档当前WAL日志,并生成备份历史文件(记录备份起止信息),确保备份文件与WAL日志的完整性。
  4. 恢复时,先恢复备份的全量数据文件,再通过归档的WAL日志“重演”备份后的事务,最终恢复到一致状态。

二、热备份前置准备(必须完成)

热备份的前提是开启WAL归档模式,否则无法保证数据一致性,这是核心前提,步骤如下:

1. 修改数据库配置文件

需修改两个核心配置文件(默认路径:$KINGBASE_DATA,即数据库数据目录):

  • 文件1:kingbase.conf(核心参数)

    # 1. 开启归档模式 archive_mode = on # 2. 指定归档命令(将WAL日志复制到归档目录,%p=当前WAL文件路径,%f=WAL文件名) archive_command = 'cp %p /archive/kingbase/wal/%f' # 替换为你的归档目录 # 3. 可选:设置WAL日志段大小(默认16MB,大业务建议设为64MB) wal_segment_size = 64MB # 4. 可选:开启归档超时(避免归档卡住) archive_timeout = 300 # 单位:秒,5分钟未归档则强制切换WAL
  • 文件2:pg_hba.conf(允许备份用户连接)
    新增一行,允许备份用户从本地或指定IP连接(避免权限拒绝):

    # 格式:host 数据库名 备份用户名 允许的IP段 认证方式 host kingbase backup_user 127.0.0.1/32 trust # 本地连接用trust,远程建议用md5

2. 创建归档目录并授权

归档目录需独立于数据目录,且数据库运行用户(默认kingbase)有读写权限:

# 1. 创建归档目录(示例路径,可自定义) mkdir -p /archive/kingbase/wal # 2. 授权给kingbase用户(避免权限不足) chown -R kingbase:kingbase /archive/kingbase chmod -R 700 /archive/kingbase # 仅数据库用户可访问,保证安全

3. 重启数据库使配置生效

# 切换到kingbase用户(避免用root操作) su - kingbase # 停止数据库 sys_ctl stop -D $KINGBASE_DATA # 启动数据库 sys_ctl start -D $KINGBASE_DATA # 验证归档模式是否开启(返回on即成功) ksql -U sysdba -d kingbase -c "show archive_mode;"

三、热备份完整操作命令(分3步)

所有操作建议在备份专用服务器或本地执行,避免直接在数据库服务器大量复制文件影响性能。

步骤1:启动备份(数据库层面)

通过pg_start_backup函数标记备份开始,生成备份标签文件(backup_label),记录备份元信息:

# 1. 登录数据库(用备份用户或sysdba) ksql -U backup_user -d kingbase # backup_user是后续创建的最小权限用户 # 2. 启动备份(参数1:备份标识,自定义;参数2:true=强制检查点,建议开启) SELECT pg_start_backup('hotbackup_20241024', true); # 执行成功返回: # pg_start_backup # ---------------- # 0/12345678 # (1 row) # 记录返回的LSN值(如0/12345678),恢复时可用于校验

步骤2:复制数据文件(文件系统层面)

复制数据库数据目录的核心文件到备份目录,需排除无需备份的临时/日志目录,推荐用rsync(增量复制,速度快):

# 1. 退出数据库命令行(按Ctrl+D) # 2. 创建备份目录(示例:/backup/kingbase/hotbackup_20241024) mkdir -p /backup/kingbase/hotbackup_20241024 # 3. 复制数据文件(排除非必要目录,关键!) rsync -av \ --exclude='pg_xlog/*' # 排除未归档的WAL日志(归档目录已有) --exclude='pg_waldump' # 排除WAL分析工具目录 --exclude='backup_label.old' # 排除旧备份标签 --exclude='postmaster.pid' # 排除进程PID文件(恢复时需重新生成) $KINGBASE_DATA/ # 源:数据库数据目录 /backup/kingbase/hotbackup_20241024/ # 目标:备份目录 # 说明:rsync -av 会保留文件权限和属性,确保恢复时一致性

步骤3:停止备份(数据库层面)

通过pg_stop_backup函数标记备份结束,自动归档当前WAL日志,并生成备份历史文件(pg_backup_start_time.backup):

# 1. 重新登录数据库 ksql -U backup_user -d kingbase # 2. 停止备份(自动归档当前WAL,生成历史文件) SELECT pg_stop_backup(); # 执行成功返回: # pg_stop_backup # ---------------- # 0/123456AB # (1 row) # 3. 验证备份历史文件(在数据目录下,可复制到备份目录归档) ls -l $KINGBASE_DATA/pg_backup_*.backup # 示例输出:-rw------- 1 kingbase kingbase 1024 Oct 24 10:00 pg_backup_20241024020000.backup

备份后归档(可选但推荐)

将备份历史文件复制到备份目录,方便恢复时查阅:

cp $KINGBASE_DATA/pg_backup_*.backup /backup/kingbase/hotbackup_20241024/

四、热备份恢复完整命令(分5步)

恢复需在新的数据库实例或故障后的原实例上执行,核心是“恢复数据文件 + 重演WAL日志”。

步骤1:停止目标数据库(必须关闭)

su - kingbase sys_ctl stop -D $KINGBASE_DATA # 目标数据库数据目录

步骤2:清理目标数据目录(谨慎!)

若为原实例恢复,需清空旧数据目录(确保无残留文件);若为新实例,跳过此步:

# 备份旧数据(可选,避免误删) mv $KINGBASE_DATA $KINGBASE_DATA_old # 创建新数据目录 mkdir -p $KINGBASE_DATA chown -R kingbase:kingbase $KINGBASE_DATA

步骤3:恢复备份的全量数据文件

将备份目录的文件复制到目标数据目录:

rsync -av \ /backup/kingbase/hotbackup_20241024/ # 源:备份目录 $KINGBASE_DATA/ # 目标:新数据目录

步骤4:配置恢复参数(关键)

需创建/修改kingbase.conf的恢复参数,指定WAL归档日志路径和恢复目标:

# 1. 编辑kingbase.conf vi $KINGBASE_DATA/kingbase.conf # 2. 添加恢复参数 recovery_target_timeline = 'latest' # 恢复到最新状态(可选:指定时间点) restore_command = 'cp /archive/kingbase/wal/%f %p' # 从归档目录读取WAL日志 recovery_end_command = 'echo "Recovery completed at $(date)" >> /var/log/kingbase/recovery.log' # 恢复完成后执行的命令(可选)

步骤5:启动数据库并完成恢复

# 1. 启动数据库(自动进入恢复模式) sys_ctl start -D $KINGBASE_DATA # 2. 查看恢复进度(通过日志或数据库状态) # 方法1:查看日志(默认路径:$KINGBASE_DATA/log/) tail -f $KINGBASE_DATA/log/kingbase-2024-10-24.log # 当日志出现“database system is ready to accept connections”,表示恢复完成 # 方法2:登录数据库查看状态(恢复中会提示“in recovery”) ksql -U sysdba -d kingbase -c "SELECT pg_is_in_recovery();" # 恢复完成后返回: # pg_is_in_recovery # ------------------- # f # (1 row) # f表示已退出恢复模式,正常提供服务

五、备份用户的最小权限(安全原则)

为避免过度授权导致安全风险,备份用户无需SUPERUSER权限,仅需以下最小权限组合(分数据库权限和操作系统权限):

1. 数据库层面最小权限

  • 核心权限BACKUP角色(人大金仓专为备份设计的角色,包含备份所需的所有权限)。
  • 附加权限CONNECT权限(允许连接到目标数据库)。

创建备份用户并授权的命令

# 1. 用sysdba登录数据库(仅超级用户可创建用户) ksql -U sysdba -d kingbase # 2. 创建备份用户(设置密码,避免弱密码) CREATE USER backup_user WITH PASSWORD 'StrongPass@2024'; # 3. 授予最小权限(关键!) GRANT CONNECT ON DATABASE kingbase TO backup_user; # 允许连接到kingbase数据库 GRANT BACKUP TO backup_user; # 授予备份核心权限(无需SUPERUSER) # 4. 验证权限(返回backup_user即成功) SELECT usename, usesuper, pg_has_role(usename, 'BACKUP', 'member') AS has_backup_role FROM pg_user WHERE usename = 'backup_user';

2. 操作系统层面最小权限

  • 用户组:将备份用户(如os_backup)加入kingbase用户组,避免直接用kingbase用户操作。
  • 目录权限
    • 数据库数据目录($KINGBASE_DATA):r权限(只读,需读取数据文件)。
    • 备份目录(如/backup/kingbase):rw权限(可写入备份文件)。
    • 归档目录(如/archive/kingbase/wal):r权限(备份时可能需校验归档日志,可选)。

操作系统用户创建与授权命令

# 1. 创建操作系统备份用户 useradd os_backup passwd os_backup # 2. 加入kingbase用户组 usermod -aG kingbase os_backup # 3. 授权目录权限 chmod 750 $KINGBASE_DATA # kingbase组有读和执行权限 chmod 770 /backup/kingbase /archive/kingbase/wal # os_backup可读写

六、热备份关键注意事项

  1. 归档目录监控:需确保归档目录有足够空间,避免WAL日志写满导致数据库挂起(建议配置磁盘告警)。
  2. 备份验证:每月至少执行1次恢复测试,确认备份文件和WAL日志完整(避免“备份成功但无法恢复”)。
  3. LSN校验:备份开始和结束的LSN值(如0/12345678)需连续,可通过pg_controldata查看,确保备份一致性。
  4. 避免备份冲突:同一时间不要执行多个热备份,避免WAL日志归档混乱。

要不要我帮你整理一份人大金仓热备份与恢复实操脚本?脚本会包含上述所有命令,你只需替换目录和用户名即可直接执行,大幅减少手动操作失误。

最后修改时间:2025-10-27 10:43:40
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论