postgres冷备

使用脚本进行每天一次的postgres数据库冷备

配置文件 : pg_backup.config

##############################
## POSTGRESQL BACKUP CONFIG ##
##############################
 
# Optional system user to run backups as.  If the user the script is running as doesn't match this
# the script terminates.  Leave blank to skip check.
BACKUP_USER=root
 
# Optional hostname to adhere to pg_hba policies.  Will default to "localhost" if none specified.
HOSTNAME=
 
# Optional username to connect to database as.  Will default to "postgres" if none specified.
USERNAME=
PASSWORD=
export PGPASSWORD=
# This dir will be created if it doesn't exist.  This must be writable by the user the script is
# running as.
BACKUP_DIR=/datamnt/dbbackup/
 
# List of strings to match against in database name, separated by space or comma, for which we only
# wish to keep a backup of the schema, not the data. Any database names which contain any of these
# values will be considered candidates. (e.g. "system_log" will match "dev_system_log_2010-01")
SCHEMA_ONLY_LIST=""
 
# Will produce a custom-format backup if set to "yes"
ENABLE_CUSTOM_BACKUPS=yes
 
# Will produce a gzipped plain-format backup if set to "yes"
ENABLE_PLAIN_BACKUPS=no
 
 
#### SETTINGS FOR ROTATED BACKUPS ####
 
# Which day to take the weekly backup from (1-7 = Monday-Sunday)
DAY_OF_WEEK_TO_KEEP=6
 
# Number of days to keep daily backups
DAYS_TO_KEEP=7
 
# How many weeks to keep weekly backups
WEEKS_TO_KEEP=5

备份脚本: pg_backup_rotated.sh

#!/bin/bash
 
###########################
####### LOAD CONFIG #######
###########################
 
while [ $# -gt 0 ]; do
        case $1 in
                -c)
                        CONFIG_FILE_PATH="$2"
                        shift 2
                        ;;
                *)
                        ${ECHO} "Unknown Option \"$1\"" 1>&2
                        exit 2
                        ;;
        esac
done
 
if [ -z $CONFIG_FILE_PATH ] ; then
        SCRIPTPATH=$(cd ${0%/*} && pwd -P)
        CONFIG_FILE_PATH="${SCRIPTPATH}/pg_backup.config"
fi
 
if [ ! -r ${CONFIG_FILE_PATH} ] ; then
        echo "Could not load config file from ${CONFIG_FILE_PATH}" 1>&2
        exit 1
fi
 
source "${CONFIG_FILE_PATH}"
 
###########################
#### PRE-BACKUP CHECKS ####
###########################
 
# Make sure we're running as the required backup user
if [ "$BACKUP_USER" != "" -a "$(id -un)" != "$BACKUP_USER" ] ; then
    echo "This script must be run as $BACKUP_USER. Exiting." 1>&2
    exit 1
fi
 
 
###########################
### INITIALISE DEFAULTS ###
###########################
 
if [ ! $HOSTNAME ]; then
    HOSTNAME="localhost"
fi;
 
if [ ! $USERNAME ]; then
    USERNAME="postgres"
fi;
 
 
###########################
#### START THE BACKUPS ####
###########################
 
function perform_backups()
{
    SUFFIX=$1
    FINAL_BACKUP_DIR=$BACKUP_DIR"`date +\%Y-\%m-\%d`$SUFFIX/"
 
    echo "Making backup directory in $FINAL_BACKUP_DIR"
 
    if ! mkdir -p $FINAL_BACKUP_DIR; then
        echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2
        exit 1;
    fi;
 
 
    ###########################
    ### SCHEMA-ONLY BACKUPS ###
    ###########################
 
    for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ }
    do
            SCHEMA_ONLY_CLAUSE="$SCHEMA_ONLY_CLAUSE or datname ~ '$SCHEMA_ONLY_DB'"
    done
 
    SCHEMA_ONLY_QUERY="select datname from pg_database where false $SCHEMA_ONLY_CLAUSE order by datname;"
 
    echo -e "\n\nPerforming schema-only backups"
    echo -e "--------------------------------------------\n"
 
    SCHEMA_ONLY_DB_LIST=`psql -h "$HOSTNAME" -U "$USERNAME" -At -c "$SCHEMA_ONLY_QUERY" postgres`
 
    echo -e "The following databases were matched for schema-only backup:\n${SCHEMA_ONLY_DB_LIST}\n"
 
    for DATABASE in $SCHEMA_ONLY_DB_LIST
    do
            echo "Schema-only backup of $DATABASE"
 
            if ! pg_dump -Fp -s -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress; then
                    echo "[!!ERROR!!] Failed to backup database schema of $DATABASE" 1>&2
            else
                    mv $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz
            fi
    done
 
 
    ###########################
    ###### FULL BACKUPS #######
    ###########################
 
    for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ }
    do
        EXCLUDE_SCHEMA_ONLY_CLAUSE="$EXCLUDE_SCHEMA_ONLY_CLAUSE and datname !~ '$SCHEMA_ONLY_DB'"
    done
 
    FULL_BACKUP_QUERY="select datname from pg_database where not datistemplate and datallowconn $EXCLUDE_SCHEMA_ONLY_CLAUSE order by datname;"
 
    echo -e "\n\nPerforming full backups"
    echo -e "--------------------------------------------\n"
 
    for DATABASE in `psql -h "$HOSTNAME" -U "$USERNAME" -At -c "$FULL_BACKUP_QUERY" postgres`
    do
        if [ $ENABLE_PLAIN_BACKUPS = "yes" ]
        then
            echo "Plain backup of $DATABASE"
 
            if ! pg_dump -Fp -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress; then
                echo "[!!ERROR!!] Failed to produce plain backup database $DATABASE" 1>&2
            else
                mv $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE".sql.gz
            fi
        fi
 
        if [ $ENABLE_CUSTOM_BACKUPS = "yes" ]
        then
            echo "Custom backup of $DATABASE"
 
            if ! pg_dump -Fc -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" -f $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress; then
                echo "[!!ERROR!!] Failed to produce custom backup database $DATABASE"
            else
                mv $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress $FINAL_BACKUP_DIR"$DATABASE".custom
            fi
        fi
 
    done
 
    echo -e "\nAll database backups complete!"
}
 
# MONTHLY BACKUPS
 
DAY_OF_MONTH=`date +%d`
 
if [ $DAY_OF_MONTH -eq 1 ];
then
    # Delete all expired monthly directories
    find $BACKUP_DIR -maxdepth 1 -name "*-monthly" -exec rm -rf '{}' ';'
 
    perform_backups "-monthly"
 
    exit 0;
fi
 
# WEEKLY BACKUPS
 
DAY_OF_WEEK=`date +%u` #1-7 (Monday-Sunday)
EXPIRED_DAYS=`expr $((($WEEKS_TO_KEEP * 7) + 1))`
 
if [ $DAY_OF_WEEK = $DAY_OF_WEEK_TO_KEEP ];
then
    # Delete all expired weekly directories
    find $BACKUP_DIR -maxdepth 1 -mtime +$EXPIRED_DAYS -name "*-weekly" -exec rm -rf '{}' ';'
 
    perform_backups "-weekly"
 
    exit 0;
fi
 
# DAILY BACKUPS
 
# Delete daily backups 7 days old or more
find $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec rm -rf '{}' ';'
 
perform_backups "-daily"

定时任务:  pg_backup.cron

#!/bin/sh
echo "*******************************************************" >> /datamnt/dbbackup/backup.log 2>&1
echo "postgres backup started at $(date +'%d-%m-%Y %H:%M:%S')" >> /datamnt/dbbackup/backup.log 2>&1
#source ~/.bash_profile
/mnt/postgresql/backupscript/pg_backup_rotated.sh -c /mnt/postgresql/backupscript/pg_backup.config >> /datamnt/dbbackup/backup.log 2>&1
echo "postgres backup end at $(date +'%d-%m-%Y %H:%M:%S')" >> /datamnt/dbbackup/backup.log 2>&1



还有一个日志文件   /datamnt/dbbackup/ backup.log




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows下设置PostgreSQL的主备(主服务器和备份服务器)可以通过以下步骤完成: 1. 安装PostgreSQL:首先,在主服务器和备份服务器上分别安装相同版本的PostgreSQL。你可以从官方网站(https://www.postgresql.org/download/windows/)下载最新的Windows安装程序。 2. 配置主服务器:在主服务器上,打开PostgreSQL安装目录中的postgresql.conf文件(默认路径为C:\Program Files\PostgreSQL\<版本号>\data\postgresql.conf)。找到以下行,并进行相应的更改: ``` # 启用归档模式 archive_mode = on # 指定归档命令 archive_command = 'copy "%p" "归档路径\%f"' ``` 确保将"归档路径"替换为一个备份存储的有效路径。保存并关闭文件。 3. 配置备份服务器:在备份服务器上,打开PostgreSQL安装目录中的postgresql.conf文件。找到以下行,并进行相应的更改: ``` # 启用热备 hot_standby = on # 指定主服务器的连接信息 primary_conninfo = 'host=主服务器IP地址 port=5432 user=用户名 password=密码' # 指定归档命令 restore_command = 'copy "归档路径\%f" "%p"' ``` 确保将"主服务器IP地址"、"用户名"和"密码"替换为实际的连接信息,并将"归档路径"替换为与主服务器相同的路径。保存并关闭文件。 4. 启动主服务器和备份服务器:在两台服务器上分别启动PostgreSQL服务。你可以使用"pg_ctl"命令来启动服务,如: ``` pg_ctl start -D "安装目录\data" ``` 5. 配置流复制:在备份服务器上,创建一个名为"recovery.conf"的文件,内容如下: ``` standby_mode = 'on' primary_conninfo = 'host=主服务器IP地址 port=5432 user=用户名 password=密码' trigger_file = '安装目录\data\trigger' ``` 确保将"主服务器IP地址"、"用户名"和"密码"替换为实际的连接信息。保存并关闭文件。 6. 启动备份服务器:在备份服务器上启动PostgreSQL服务后,它将连接到主服务器并开始进行流复制。 这样,你就完成了在Windows下设置PostgreSQL的主备配置。主服务器将负责处理所有的写操作,而备份服务器将通过流复制从主服务器同步数据,并提供读访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值