[postgresql]逻辑备份与还原

前言

Postgres提供pg_dumppg_dumpall用于数据库逻辑备份。

  • pg_dumpall:将一个PostgreSQL数据库集群全部转储到一个脚本文件中
  • pg_dump:可以选择一个数据库或部分表进行备份,生成的文件可以是一个SQL脚本文件,也可以是一个归档文件。SQL文件允许自行修改,修改后可以转到其它类型的数据库(postgres有不少特有的东西,实际上迁移可能会有问题)。归档文件只能和pg_restore配合使用。

逻辑备份

# 查看帮助
pg_dump --help

# 备份dbtest库到指定文件
pg_dump -h 127.0.0.1 -p 5432 -U postgres dbtest -f /var/lib/postgresql/backup/dbtest.sql

# 如果就在本地,也可以直接用dba账户备份
pg_dump dbtest -f /var/lib/postgresql/backup/dbtest.sql

# 导出为自定义格式, postgres建议的备份方式
pg_dump -Fc -h 192.168.0.10 -Uzhangsan zhangsan -f zhangsan.dump 

逻辑还原

# 使用dump文件还原到zhangsan2数据库,需要先创建
pg_restore -d zhangsan2 zhangsan.dump

备份脚本

postgresql使用docker安装。宿主机调用容器内部的备份脚本,然后从容器中拷贝出来。

  • 容器内的备份脚本:/root/backup_in_docker.sh
#!/bin/bash
# description: 配在容器里的备份脚本,需要放到容器内的/root路径

set -u

function premkdir() {
    # 提前创建目录
    mkdir -p /root/backup
}

function cleandir() {
    # 清理备份目录
    cd /root/backup
    rm -f ./*
}

function backup() {
    # 执行备份
    pg_dump -U postgres -Fc wikijs -f /root/backup/wikijs.dump
}

function main() {
    # 主函数
    premkdir
    cleandir
    backup
}

main
  • 宿主机的备份脚本:/home/apps/postgresql/backup_in_host.sh
#!/bin/bash
# description: 调用容器内的备份脚本 -> 将备份文件拷贝到宿主机 -> 归档 -> 删除历史文件

function log_info() {
    # 日志函数
    logfile="/home/apps/postgresql/backup.log"
    logtime=$(date "+%Y-%m-%d %H:%M:%S")
    echo "${logtime} | $@"
    echo "${logtime} | $@" >> ${logfile}
}

function exe_backupscript_docker() {
    # 调用容器内的备份脚本
    log_info "调用容器内备份脚本"
    /usr/local/bin/docker exec -it postgresql bash /root/backup_in_docker.sh
    # 等60秒
    sleep 60
}

function copy_to_host() {
    # 将备份文件从docker容器内拷贝到宿主机
    /usr/local/bin/docker cp postgresql:/root/backup /home/apps/postgresql
    # cd /home/apps/postgresql
}

function cleanfile() {
    # 删除15天之前的备份文件
    find /home/apps/postgresql/archived_backupfiles/* -ctime +15 -type f -exec rm -f {} \;

    # 删除backup目录
    cd /home/apps/postgresql
    if [[ -d "./backup" ]]; then
        rm -rf ./backup
    fi
}

function arrange() {
    # 整理备份文件
    cd /home/apps/postgresql
    if [[ ! -d "./backup" ]]; then
        log_info "备份目录不存在"
        exit 1
    fi

    # 将压缩后的目录转移到归档目录
    archive_dir="/home/apps/postgresql/archived_backupfiles"
    if [[ ! -d ${archive_dir} ]]; then
        mkdir -p /home/apps/postgresql/archived_backupfiles
    fi
    baktime=$(date "+%Y%m%d-%H%M%S")
    bakname="wikijs_${baktime}.tar.gz"
    tar zcf ${bakname} ./backup

    mv ${bakname} ${archive_dir}
}

function main() {
    exe_backupscript_docker
    copy_to_host
    arrange
    cleanfile
}

main
  • crontab配置
0 3 * * * /home/apps/postgresql/backup_in_host.sh
posted @ 2022-07-24 23:44  花酒锄作田  阅读(130)  评论(0编辑  收藏  举报