1.物理备份
1.1 全量备份
- 备份机器执行pg_basebackup,需要手动输入源PG实例密码
pg_basebackup 是postgresql自带的全量备份工具,可在postgresql安装包里找到
pg_basebackup -v --password --pgdata=@baseDataDir --no-slot --wal-method=fetch --checkpoint=fast --host=@srcHost --port=@srcPort --username=@srcUsername@baseDataDir 表示备机上指定的目标目录@srcHost 表示源PG实例(主库)的IP地址@srcPort 表示源PG实例的端口@srcUsername 表示源PG实例的用户名 ,需要有 REPLICATION 或 SUPER 权限
举例说明
[telepg@pg-0005 data_51_8433]$ . /app/pg/pg_51_8433/postgresql/setenv.sh[telepg@pg-0005 data_51_8433]$ /app/pg/pg_51_8433/postgresql/bin/pg_basebackup -v --password --pgdata=/app/pg/data_51_8433/backups/202006282042 --no-slot --wal-method=fetch --checkpoint=fast --host=172.16.200.51 --port=8433 --username=rootPassword: pg_basebackup: initiating base backup, waiting for checkpoint to completepg_basebackup: checkpoint completedpg_basebackup: write-ahead log start point: 0/9000060 on timeline 1pg_basebackup: write-ahead log end point: 0/9000138pg_basebackup: syncing data to disk ...pg_basebackup: base backup completed
. /app/pg/pg_51_8433/postgresql/setenv.sh
的作用是export环境变量export LD_LIBRARY_PATH=/app/pg/pg_51_8433/postgresql/lib:/app/pg/pg_51_8433/postgresql/lib/postgresql
,因为pg_basebackup 的运行,需要找到依赖.so文件,需要通过LD_LIBRARY_PATH找到。
1.2 全量恢复
1.2.1 主库恢复
-
停止主从的gateway进程,避免恢复过程中主从切换或自动恢复。
pg控制台的实例列表-> 更多 -> 停止, 把pg和gateway进程都停掉; 或调用gateway安装目录/bin/shutdown.sh
-
停止主从的进程(通过控制台停掉实例,或调用script目录的stop_pg.sh)
-
把主库的data目录内容和表空间目录内容移到其他位置
-
将全量备份中的pgdata目录的所有内容拷贝到主库的data目录,表空间的数据的目录拷贝到对应的目录。
简单例子,因为备份放在本地,所以使用cp命令拷贝回去:
cp -R /app/pg/data_51_8433/backups/202006282042 /app/pg/data_51_8433/data
5.对需要恢复的data目录赋权
[telepg@pg-0005 data]$ chmod 700 data
6.启动PG实例,调用script目录下的start_pg.sh
[telepg@pg-0005 data]$ /app/pg/data_51_8433/scripts/start_pg.sh
7.执行登录命令,判断是否已经正常运行
[telepg@pg-0005 data]$ ./bin/psql -h172.16.200.51 -p8433 -Uroot postgres -c 'select version()';
1.2.2 从库恢复
-
把从库的data目录内容和表空间目录内容移到其他位置
-
执行scripts目录下的follow_master.sh脚本
[telepg@pg-0004 scripts]$ /app/pg/data_14_8433/scripts/follow_master.sh 172.16.200.51 8433 root 'password'follow_master.sh的参数如下:第一个参数:主库IP地址第二个参数:主库端口第三个参数:主库的用户名(super权限)第四个参数:主库的登录用户密码
3.查看从库实例是否启动,调用script目录下的status_pg.sh
[telepg@pg-0004 data]$ /app/pg/data_14_8433/scripts/status_pg.sh
4.执行登录命令,判断是否已经正常运行
[telepg@pg-0004 data]$ ./bin/psql -h172.16.200.14 -p8433 -Uroot postgres -c 'select version()';
1.2.3 恢复gateway
启动gateway进程
2.逻辑备份
通过pg_dump或pg_dumpall的工具将数据库的快照数据抽取为一个脚本文件或其他归档文件备份,并且可以通过psql或pg_restore工具将快照数据导入到其他数据库实例的方式进行恢复。相对于文件系统级别的备份具备有以下优势。Pg_dump跟pg_dumpall的用法大致相同,只是pg_dump只能转储单个数据库,如果需要转储数据库的全局对象,则使用pg_dumpall。
pg_dump , pg_dumpall 和pg_restore 是postgresql自带的逻辑备份恢复工具,可在postgresql安装包找到。
除了官方自带工具,一些PG的可视化客户端也自带了逻辑备份和恢复的功能,比如navicat 和 pgAdmin 4
2.1 pg_dump
常用参数说明
Pg_dump常用的option可选项有:-F, --format=c|d|t|p //这个参数选择dump输出的文件格式,可选值 c 输出一个自定义的格式 d 将表和其他对象输出为文件,并保存到一个目录中 t 输出为tar包 p 输出为纯文本的sql脚本(default)-j, --jobs=NUM 当使用目录输出格式(F参数的值为d)时,可以同时开始多个表进行dump-a, --data-only dump only the data, not the schema只导出数据,不包括表定义模式-c, --clean clean (drop) database objects before recreating在重新创建之前,先清除DROP(删除)准备重建的数据库对象,-C, --create include commands to create database in dump在转储中包括命令,以便创建数据库(包括创建database的语句,无需在导入之前先建数据库)-n, --schema=SCHEMA dump the named schema(s) only只转储指定名称的模式-N, --exclude-schema=SCHEMA do NOT dump the named schema(s)不转储已命名的模式-s, --schema-only dump only the schema, no data只转储模式, 不包括数据(不导出数据) -t, --table=TABLE dump the named table(s) only只转储指定名称的表-T, --exclude-table=TABLE do NOT dump the named table(s)只转储指定名称的表--inserts dump data as INSERT commands, rather than COPY--column-inserts dump data as INSERT commands with column names以带有列名的INSERT命令形式转储数据默认的,pg_dump输出的sql文件内使用pg特有的copy命令,可以使用以上两个参数指定输出sql文件使用insert命令。使用insert的命令逐行插入数据的恢复方式比较缓慢,但是用于非pg的异构数据库就非常有用。
示例
备份到文件
1. 只导出postgres数据库的数据,只包括模式 -spg_dump -h172.16.200.51 -p8433 -U root -f ./postgres.sql -s postgres(数据库名)2. 导出postgres数据库(包括数据)pg_dump -h172.16.200.51 -p8433 -U root -f ./postgres.sql postgres(数据库名)3. 导出postgres数据库中表test_big2的数据,包括建表语句pg_dump -h172.16.200.51 -p8433 -U root -f ./postgres.sql -t test01 postgres(数据库名)4. 导出postgres数据库中表test01的数据,以insert语句的形式pg_dump -h172.16.200.51 -p8433 -U root -f ./postgres.sql -t test01 --column-inserts postgres(数据库名)5. 使用自定义转储格式来转储一个数据库:pg_dump -h172.16.200.51 -p8433 -U root -Fc postgres > ./postgres.out
从文件中恢复
1. 恢复数据到bak01数据库psql -h172.16.200.51 -p8433 -U root -f ./postgres.sql bak012. 自定义格式的转储不是psql的脚本,只能通过pg_restore恢复pg_restore -h172.16.200.51 -p8433 -U root -d dbtest postgres.out
2.2 pg_dumpall
pg_dumpall需要和PostgreSQL 服务器连接多次(每个数据库一次)。如果你使用口令认证,可能每次都会询问口令。 这种情况下写一个~/.pgpass可能会比较方便。
备份到文件
pg_dumpall -h172.16.200.51 -p8433 -U root -f ./postgres.sql
从文件中恢复
执行这个命令的时候连接到哪个数据库无关紧要,因为pg_dumpall 创建的脚本将会包含恰当的创建和连接数据库的命令。
1. 恢复数据到bak01数据库psql -h172.16.200.51 -p8433 -U root -f ./postgres.sql bak01
2.3 Navicat
建议使用15或以上版本,对数据量比较小的场景,可以直接用navicat 导出/导入数据: