前言
Postgres提供pg_dump
和pg_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