龙空技术网

分享一份生产环境PG数据库定时备份脚本,值得收藏

波波说运维 1064

前言:

而今兄弟们对“mysqlcluster备份”大约比较重视,大家都需要了解一些“mysqlcluster备份”的相关知识。那么小编同时在网摘上搜集了一些关于“mysqlcluster备份””的相关文章,希望咱们能喜欢,各位老铁们一起来了解一下吧!

概述

今天主要分享一下我这边生产环境的PG数据库备份脚本,仅供参考。

一、备份方式

PG数据库的备份有多种分类方式。

按照备份后的文件类型,可以分为物理备份(文件系统级别的备份)和逻辑备份(备份后的文件是sql文件或特定格式的导出文件);

按照备份过程中是否停止数据库服务,可分为冷备份(备份过程中停止数据库服务)和热备份(备份过程中数据库服务开启并可供用户访问);

按照备份是否是完整的数据库,可分为全量备份(备份是完整的数据库)和增量备份(备份是上一次全量备份后数据库改变的内容)。

Postgresql的常见备份方式有以下三种:

1、文件系统级别的冷备份。

这种备份方式需要关闭数据库,然后拷贝数据文件的完整目录。恢复数据库时,只需将数据目录复制到原来的位置。该方式实际工作中很少使用。

2、 SQL转储。

PG数据库用到的备份工具:pg_dump,pg_dumpall,恢复时用pg_restore

这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。它会产生一个脚本文件,里面包含备份开始时,已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行备份。pg_dump只备份数据库集群中的某个数据库的数据,它不会导出角色和表空间相关的信息,因为这些信息是整个数据库集群共用的,不属于某个单独的数据库。pg_dumpall,对集簇中的每个数据库调用pg_dump来完成该工作,还会还转储对所有数据库公用的全局对象(pg_dump不保存这些对象)。 目前这包括适数据库用户和组、表空间以及适合所有数据库的访问权限等属性。

3、连续归档

这种方式的策略是把一个文件系统级别的全量备份和WAL(预写式日志)级别的增量备份结合起来。当需要恢复时,我们先恢复文件系统级别的备份,然后重放备份的WAL文件,把系统恢复到之前的某个状态。这种备份有显著的优点:

1)不需要一个完美的一致的文件系统备份作为开始点。备份中的任何内部不一致性将通过日志重放来修正。

2)可以结合一个无穷长的WAL文件序列用于重放,可以通过简单地归档WAL文件来达到连续备份。

3)不需要重放WAL项一直到最后。可以在任何点停止重放,并使数据库恢复到当时的一致状态。

4)可以连续地将一系列WAL文件输送给另一台已经载入了相同基础备份文件的机器,得到一个实时的热备份系统。

二、pg_dump的用法(脚本需要)

数据库的导入导出是最常用的功能之一,每种数据库都提供有这方面的工具,例如Oracle的exp/imp,Informix的dbexp/dbimp,MySQL的mysqldump,而PostgreSQL提供的对应工具为pg_dump和pg_restore。

pg_dump是用于备份PostgreSQL数据库的工具。它可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。

转储格式可以是一个脚本或者归档文件。转储脚本的格式是纯文本,包含许多SQL命令,这些SQL命令可以用于重建该数据库并将之恢复到保存脚本时的状态。可以使用 psql从这样的脚本中恢复。它们甚至可以用于在其它机器甚至是其它硬件体系的机器上重建数据库,通过对脚本进行一些修改,甚至可以在其它SQL数据库产品上重建数据库。

归档文件格式必须和pg_restore一起使用重建数据库。它们允许pg_restore对恢复什么东西进行选择,甚至是在恢复之前对需要恢复的条目进行重新排序。归档文件也是可以跨平台移植的。

D:\Program Files\PowerCmd>pg_dump --help

pg_dump 把一个数据库转储为纯文本文件或者是其它格式.

1、用法:

pg_dump [选项]... [数据库名字]

2、一般选项:

-f, --file=FILENAME output file or directory name-F, --format=c|d|t|p output file format (custom, directory, tar, plain text)-v, --verbose 详细模式-Z, --compress=0-9 被压缩格式的压缩级别--lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败--help 显示此帮助信息, 然后退出--versoin 输出版本信息, 然后退出

3、控制输出内容选项:

-a, --data-only 只转储数据,不包括模式-b, --blobs 在转储中包括大对象-c, --clean 在重新创建之前,先清除(删除)数据库对象-C, --create 在转储中包括命令,以便创建数据库-E, --encoding=ENCODING 转储以ENCODING形式编码的数据-n, --schema=SCHEMA 只转储指定名称的模式-N, --exclude-schema=SCHEMA 不转储已命名的模式-o, --oids 在转储中包括 OID-O, --no-owner 在明文格式中, 忽略恢复对象所属者-s, --schema-only 只转储模式, 不包括数据-S, --superuser=NAME 在转储中, 指定的超级用户名-t, --table=TABLE 只转储指定名称的表-T, --exclude-table=TABLE 只转储指定名称的表-x, --no-privileges 不要转储权限 (grant/revoke)--binary-upgrade 只能由升级工具使用--column-inserts 以带有列名的INSERT命令形式转储数据--disable-dollar-quoting 取消美元 (符号) 引号, 使用 SQL 标准引号--disable-triggers 在只恢复数据的过程中禁用触发器--inserts 以INSERT命令,而不是COPY命令的形式转储数据--no-security-labels do not dump security label assignments--no-tablespaces 不转储表空间分配信息--no-unlogged-table-data do not dump unlogged table data--quote-all-identifiers quote all identifiers, even if not key words--serializable-deferrable wait until the dump can run without anomalies--use-set-session-authorization使用 SESSION AUTHORIZATION 命令代替ALTER OWNER 命令来设置所有权联接选项:-h, --host=主机名 数据库服务器的主机名或套接字目录-p, --port=端口号 数据库服务器的端口号-U, --username=名字 以指定的数据库用户联接-w, --no-password 永远不提示输入口令-W, --password 强制口令提示 (自动)--role=ROLENAME do SET ROLE before dump如果没有提供数据库名字, 那么使用 PGDATABASE 环境变量的数值.

三、定时逻辑备份脚本

需求:每日按日期执行自动备份,备份文件保存14天

#!/bin/bash  PG_USER="postgres"  SUDO="sudo -u $PG_USER"  #备份的数据库名称,一次可备份多个数据库,使用空格将名称分开  DBS="postgres FSL-VIS dbmt"  #备份日期backupdate=`date  +"%Y%m%d-%H%M%S"`#备份保留时间 MAX_DAYS=14     # 备份文件存放路径,如果不存在需要创建  BACKUPS_DIR="/data/backup"PSQ="$SUDO /opt/postgres/bin/psql"  #pg_dump dumps a database as a text file or to other formats.PGDUMP="$SUDO /opt/postgres/bin/pg_dump" #vacuumdb cleans and analyzes a PostgreSQL database.VACUUM="$SUDO /opt/postgres/bin/vacuumdb"     # To get a list of all databases uncomment the following 3 lines  #DBS=$($PSQL -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'} | grep -v :)  #echo $DBS  #exit     # Uncomment bellow to backup all databases  #DBS=$($PSQL -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'} | grep -v :)  ####log_correct函数打印正确的输出到日志文件function log_correct () {DATE=`date +"%Y%m%d-%H%M%S"`  ####显示打印日志的时间USER=$(whoami) ####那个用户在操作echo “${DATE} ${USER} execute $0 [INFO] $@” >> log_info.log ######($0脚本本身,$@将参数作为整体传输调用)}#log_error打印shell脚本中错误的输出到日志文件function log_error (){DATE=`date +"%Y%m%d-%H%M%S"`USER=$(whoami)echo “${DATE} ${USER} execute $0 [INFO] $@” >> log_error.log ######($0脚本本身,$@将参数作为整体传输调用)}####fn_log函数 通过if判断执行命令的操作是否正确,并打印出相应的操作输出function fn_log (){if [ $? -eq 0 ]thenlog_correct “$@ sucessed!”echo -e “\033[32m $@ sucessed. \033[0m”elselog_error “$@ failed!”echo -e “\033[41;37m $@ failed. \033[0m”exitfi}   for DB in $DBS      do          echo -n "Vacuuming database $DB ... "          $VACUUM -z $DB         log_correct "$DB update optimizer statistics Done."        BACKUP_NAME="$BACKUPS_DIR/$DB-$backupdate.sql"          log_correct "Creating backup of database $DB"        $PGDUMP  -b $DB > $BACKUP_NAME          log_correct "$DB backup Done."          echo -n "Removing backups of database $DB older than $MAX_DAYS days"         find $BACKUPS_DIR  -mtime +$MAX_DAYS  -type f -name "$DB*" -exec rm -f {} \;        log_correct "Removing backups of database $DB older than $MAX_DAYS days."  done  

备份文件:

输出日志:

定期备份:

 30 23 * * * sh /home/scripts/pg_backup.sh

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

标签: #mysqlcluster备份