【学习记录】PostgreSQL数据备份&恢复方案

PostgreSQL数据备份&恢复方案

  • 【备份】PostgreSQL数据备份方案:
    • 问题:
    • 解决:
    • a.创建备份shell脚本:
      • (1)创建备份脚本存放路径
      • (2)准备shell脚本
    • b.创建定时清除备份shell脚本:
      • (1)准备shell脚本
    • c.配置定时任务:
      • (1)添加定时任务
      • (2)查看定时任务
    • d.赋权限:
    • e.测试shell脚本:
  • 【恢复】PostgreSQL数据恢复方案:
    • 问题:
    • 解决:
    • a.导出数据目录:
    • b.搭建PostgreSQL:
    • c.使用 postgres 用户创建恢复目录:
    • d.修改配置文件:
      • (1)将配置文件PostgreSQL.conf中的以下选项注释掉,注释方法:在行首使用#。如有多个该选项,则全部注释掉。
      • (2)修改配置文件PostgreSQL.conf。
      • (3)在PostgreSQL.conf文件末尾追加配置,表示不再使用强同步模式。
      • (4)添加pg_hba.conf.
    • e.使用 root 用户更改文件夹权限
    • f.使用 postgres 用户启动数据库
    • g.登录数据库验证
      • (1)登录 PostgreSQL数据库
      • (2)登录 PostgreSQL数据库
    • h.通过手动导出数据进行恢复
      • (1)在云服务器下 dump 出数据,示例如下:
      • (2)服务器上恢复数据。

【备份】PostgreSQL数据备份方案:

问题:

Linux,为了避免操作数据库的风险 因此计划每天对postgresql 数据库进行定时备份

解决:

参考:Linux 上 定时备份postgresql 数据库的方法
服务器地址:
用于的备份服务器地址 10.10.10.101(虚构)
postgresql 数据库所在的服务器地址 10.10.10.100(虚构)
其实也可以在postgresql 数据库所在的服务器上进行,也不冲突。如果不在同一个服务器上操作 首先要保证这两个服务器的网络是通的

a.创建备份shell脚本:

(1)创建备份脚本存放路径

我把shell脚本存放在/u01/db-bak/2 。备份后的pgsql.backup 放到 /u01/db-bak/2/bak-file/all 文件中

mkdir -p /u01/db-bak/2/bak-file/all

(2)准备shell脚本

进入/u01/db-bak/2

cd /u01/db-bak/2

创建备份shell脚本

vim pgsql-all-backup.sh

shell脚本如下:

#!/bin/bash
echo "开始执行 PostgreSql 数据库hrmw的备份!"
echo "backup ing -------------------"
nowtime=$(date +%F+%T)
export PGPASSWORD=123
echo "时间:" $nowtime
set timeout 500
/usr/pgsql-11/bin/pg_dump --file "/u01/db-bak/2/bak-file/all/pgsql-all-"$nowtime".backup" --host "10.10.10.100" --port "5432" --username "postgres" --dbname "hrmw" --verbose --role "postgres" --format=c --blobs --encoding "UTF8"
echo "数据库 hrmw 备份结束!"
exit;

nowtime=$(date +%F+%T) --当前时间
PGPASSWORD=‘数据库密码’

b.创建定时清除备份shell脚本:

每天进行数据库备份 如果不清理会占用许多的内存 而手动清理又太麻烦了 所有还是让他自动执行吧。

(1)准备shell脚本

进入/u01/db-bak/2

cd /u01/db-bak/2

创建删除shell脚本

vim delete-pgbak.sh

shell脚本如下:

#!/bin/bash
echo "删除 3 天前的 数据库备份文件!"
find /u01/db-bak/2/bak-file/all/ -name "pgsql-all*" -mtime +2 -exec rm -rf {} \;
set timeout 1000
echo " 3 天前的数据库备份文件删除完毕!"

c.配置定时任务:

(1)添加定时任务

[root@host-10-10-10-101 db-bak]# crontab -e

每天2点进行数据库备份脚本 每天2点30运行删除脚本

30 2 * * * /u01/db-bak/2/delete-pgbak.sh
     
0 2 * * * /u01/db-bak/2/pgsql-all-backup.sh

(2)查看定时任务

[root@host-10-10-10-101 db-bak]# crontab -l     
    30 23 * * * /u01/db-bak/2/delete-pgbak.sh
     
    0 23 * * * /u01/db-bak/2/pgsql-all-backup.sh

d.赋权限:

配置权限chmod

chmod +x /u01/db-bak/2/*

e.测试shell脚本:

[root@host-10-10-10-101 2]# bash pgsql-all-backup.sh

[root@host-10-10-10-101 2]# bash delete-pgbak.sh

【恢复】PostgreSQL数据恢复方案:

问题:

存在docker或者服务器上(无论是windows还是linux)的PostgreSQL无法启动,需要对数据进行恢复

解决:

a.导出数据目录:

找到“…/data”目录下所有的数据文件,如下图所示(注意并不是所有数据文件都长这样,因版本、软件和操作系统不同而异,但是绝大多数文件相同,故只列出了以下这些)。一般这些文件位于PostgreSQL的…/data/目录,可以自行查找(网络,或者find命令),记得删除多余的临时文件。

b.搭建PostgreSQL:

在一个没有任何PostgreSQL的服务器上搭建跟原先版本一模一样的PostgreSQL(有postgis也得安装到位),这步也可以使用虚拟机来搭建,但是千万别用docker这类软件。

c.使用 postgres 用户创建恢复目录:

切换为 postgres 用户,在云服务器中创建恢复目录recovery。

mkdir /var/lib/pgsql/10/recovery

其中,recovery 为示例目录,用户可自行修改恢复目录。后续示例中不同版本目录名将不再区分描述,请以实际为准,如PostgreSQL 10.x 均为/var/lib/pgsql/10,PostgreSQL 9.5.x 均为/var/lib/pgsql/9.5
PostgreSQL 9.5 版本命令如下:

mkdir /var/lib/pgsql/9.6/recovery

PostgreSQL 14版本命令如下:

mkdir /var/lib/PostgreSQL/14/recovery

d.修改配置文件:

(1)将配置文件PostgreSQL.conf中的以下选项注释掉,注释方法:在行首使用#。如有多个该选项,则全部注释掉。

shared_preload_libraries
local_preload_libraries
pg_stat_statements.max
pg_stat_statements.track
archive_mode
archive_command
synchronous_commit
synchronous_standby_names

说明:如果恢复版本为 PostgreSQL 12.4,还需要注释 include = 'standby.conf' 这一行。

(2)修改配置文件PostgreSQL.conf。

port = '5432'    ##将port参数的值修改为5432
unix_socket_directories = '/var/run/PostgreSQL/'  ##将unix_socket_directories的值修改为/var/run/PostgreSQL/,如未设置此值,可跳过此项

(3)在PostgreSQL.conf文件末尾追加配置,表示不再使用强同步模式。

synchronous_commit = local
synchronous_standby_names = ''

(4)添加pg_hba.conf.

可以在安装好的数据库位置下,大概是/usr/pgsql-10/bin/pg_hba.conf(可能版本不同路径不同,但绝大多数是),找到pg_hba.conf。然后cp到recovery/。可能要vim进行修改一下,主要是port需要设置成默认的5432。
最后配置结果如下所示。

e.使用 root 用户更改文件夹权限

chmod 0700 /var/lib/pgsql/10(版本号)/recovery
chown postgres:postgres /var/lib/pgsql/10(版本号)/recovery -R

f.使用 postgres 用户启动数据库

/usr/pgsql-10/bin/pg_ctl start -D /var/lib/pgsql/10/recovery

如果没有“server start”那就挨个去看log信息,可能是某个配置文件没有找到(那就在main里面或者原来数据库的安装位置中寻找,然后cp),可能是端口。

g.登录数据库验证

(1)登录 PostgreSQL数据库

export PGDATA=/var/lib/pgsql/10(版本号)/recovery
psql

(2)登录 PostgreSQL数据库

/usr/pgsql-10(自定义)/bin/pg_ctl status -D /var/lib/pgsql/10(版本号)/recovery
如提示"server is running",则代表数据库正在运行。

h.通过手动导出数据进行恢复

您也可以手动导出备份数据,然后在服务器上进行恢复操作,该方案在 Windows 和 Linux 下同样适用,与物理文件所在的文件系统无关。

(1)在云服务器下 dump 出数据,示例如下:

命令格式为:

pg_dump -h <访问IP> -U <访问用户> -f <备份文件全路径> -c -C <导出的数据库名>

Example:
/usr/pgsql-10/bin/pg_dump -h 192.168.0.16 -U testroot -f backup.sql -c -C postgres

若数据较大,可通过 -Fc 指定为二进制文件。

(2)服务器上恢复数据。

进入PostgreSQL安装目录的bin文件夹下(例如,/usr/pgsql-14/bin/),使用psql工具进行数据恢复。

./psql -p 端口号 -U 用户名 -W -f ../backup.sql

其中这里端口号自定义,用户名建议都换成旧数据库一样的名称(如果没有,记得先创建被赋予超级权限)。
说明:因为有 pg_stat_error 等插件,可能会导致报错,但不影响数据导入。只要能运行下去不报错停止就行。

你可能感兴趣的:(Postgresql系列,postgresql,数据库,linux)