1. 增量备份

增量备份和任意时间点恢复:
image.png

  1. 实现增量备份的思路是
  2. 1. 记录数据库系统的操作记录(WAL归档)
  3. 2. 在某一时刻进行一次完整的数据库备份
  4. 3. 需要恢复时,还原上一次完整的数据库备份,根据操作记录恢复数据库至指定的某个时刻(即可以实现PITR 时间点恢复)

概述 操作

2. 全量备份

2.1 全量备份:

  1. 1. 模拟环境:
  2. # 创建数据:
  3. create table t1(id int not null primary key,name varchar(20) not null);
  4. insert into t1 values(1,'zhnagsan'),(2,'lisi');
  5. 2. 进行备份:
  6. pg_basebackup -Ft -Pv -Xf -z -Z5 -p 5432 -D /usr/local/pgsql/backup/
  7. 3. 模拟数据库故障:
  8. pg_ctl -D /usr/local/pgsql/data/ stop
  9. rm -rf /usr/local/pgsql/data/*
  10. 4. 进行数据恢复:
  11. cd /usr/local/pgsql/backup/
  12. tar xf base.tar.gz -C ../data

2.2 全备结合时间点恢复:

  1. # 创建归档目录:
  2. mkdir -p /pgccc/archive
  3. chown -R postgres. /pgccc/
  4. # 开启归档,并重启数据库:
  5. wal_level = 'replica'
  6. archive_mode = 'on'
  7. archive_command = 'cp %p /pgccc/archive/%f'
  8. # 重启数据库:
  9. pg_ctl restart
  10. # 执行全量备份:
  11. pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres
  12. # 如果此时的数据有变化,也可以执行增量备份:
  13. pg_receivewal -D /pgccc/backup/ -p 5432
  14. # 插入数据:
  15. create table a(id int);
  16. insert into a values (2);
  17. select current_timestamp;
  18. select pg_switch_wal();checkpoint;
  19. # 模拟数据丢失:
  20. drop table a;
  21. # 启动备份实例,进行数据恢复:
  22. vim postgresql.conf
  23. recovery_target_time = '2021-07-03 11:55:41.543904+08'
  24. restore_command='cp /pgccc/archive/%f %p'
  25. recovery_target_action = 'promote'
  26. # 创建备库标签:
  27. touch recovery.signal
  28. # 启动数据库:
  29. pg_ctl -D /pgccc/backup start
  30. # 关闭读模式:
  31. select pg_wal_replay_resume();

2.3 全备结合还原点恢复:

  1. # 创建归档目录:
  2. mkdir -p /pgccc/archive
  3. chown -R postgres. /pgccc/
  4. # 开启归档,并重启数据库:
  5. wal_level = 'replica'
  6. archive_mode = 'on'
  7. archive_command = 'cp %p /pgccc/archive/%f'
  8. # 重启数据库:
  9. pg_ctl restarat
  10. # 执行全量备份:
  11. pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres
  12. 如果有变化的数据,可以执行增量备份:
  13. pg_receivewal -D /pgccc/backup/ -p 5432
  14. # 插入数据:
  15. create table a(id int);
  16. insert into a values (2);
  17. # 创建还原点:
  18. select pg_create_restore_point('huanyuan');
  19. # 模拟数据丢失:
  20. drop table a;
  21. # 启动备份实例,进行数据恢复:
  22. vim postgresql.conf
  23. recovery_target_name = 'huanyuan'
  24. restore_command='cp /pgccc/archive/%f %p'
  25. recovery_target_action = 'promote'
  26. touch recovery.signal
  27. # 启动数据库:
  28. pg_ctl -D /pgccc/backup start
  29. # 关闭读模式:
  30. select pg_wal_replay_resume();

2.4 全备结合指定事务恢复:

  1. # 创建归档目录:
  2. mkdir -p /pgccc/archive
  3. chown -R postgres. /pgccc/
  4. # 开启归档,并重启数据库:
  5. wal_level = 'replica'
  6. archive_mode = 'on'
  7. archive_command = 'cp %p /pgccc/archive/%f'
  8. # 重启数据库:
  9. pg_ctl restarat
  10. # 执行全量备份:
  11. pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres
  12. # 如果有变化的数据,可以执行增量备份:
  13. pg_receivewal -D /pgccc/backup/ -p 5432
  14. # 插入数据:
  15. create table a(id int);
  16. insert into a values (2);
  17. select pg_current_xact_id();
  18. select pg_switch_wal();checkpoint;
  19. # 模拟数据丢失:
  20. drop table a;
  21. # 启动备份实例,进行数据恢复:
  22. vim postgresql.conf
  23. recovery_target_xid = '487'
  24. restore_command='cp /pgccc/archive/%f %p'
  25. recovery_target_action = 'promote'
  26. touch recovery.signal
  27. # 启动数据库:
  28. pg_ctl -D /pgccc/backup start
  29. # 关闭读模式:
  30. select pg_wal_replay_resume();

2.5 全备结合LSN号码恢复:

  1. # 创建归档目录:
  2. mkdir -p /pgccc/archive
  3. chown -R postgres. /pgccc/
  4. # 开启归档,并重启数据库:
  5. wal_level = 'replica'
  6. archive_mode = 'on'
  7. archive_command = 'cp %p /pgccc/archive/%f'
  8. # 重启数据库:
  9. pg_ctl restarat
  10. # 执行全量备份:
  11. pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres
  12. # 如果有变化的数据,可以执行增量备份:
  13. pg_receivewal -D /pgccc/backup/ -p 5432
  14. # 插入数据:
  15. create table a(id int);
  16. insert into a values (2);
  17. select pg_current_wal_lsn();
  18. select pg_switch_wal();checkpoint;
  19. # 模拟数据丢失:
  20. drop table a;
  21. # 启动备份实例,进行数据恢复:
  22. vim postgresql.conf
  23. recovery_target_lsn = '0/4011BF8'
  24. restore_command='cp /pgccc/archive/%f %p'
  25. recovery_target_action = 'promote'
  26. touch recovery.signal
  27. # 启动数据库:
  28. pg_ctl -D /pgccc/backup start
  29. # 关闭读模式:
  30. select pg_wal_replay_resume();

3. SQL转储和文件系统级别备份

2.1 pg_dump的使用:

  1. 1. 备份及恢复库下所有的数据:
  2. # 普通格式备份及恢复:
  3. # 备份:
  4. pg_dump -U postgres test >test.sql
  5. # 恢复:
  6. psql
  7. create database test;
  8. psql -U postgres test < test.sql
  9. # 指定格式进行备份:
  10. # 备份:
  11. pg_dump -Fc -U postgres test >test.dmp
  12. # 恢复:
  13. psql
  14. create database test;
  15. pg_restore -d test test.dmp
  16. 2. 备份库下某个模式所有的表:
  17. # 备份:
  18. pg_dump -U postgres -t 'schema1.t*' test >test.sql
  19. # 恢复:
  20. psql -U postgres test < test.sql
  21. # 在备份过程中也可以排除某个表,例如排除zhang表:
  22. pg_dump -U postgres -t 'schema1.t*' -T 'schema1.zhang' test >test.sql
  23. 3. 备份单个表:
  24. # 例如备份test库下的zhang表:
  25. # 备份:
  26. pg_dump -t zhang test >dump.sql
  27. # 恢复:
  28. create database test;
  29. psql -U test < dump.sql

2.2. pg_dumpall的使用:

  1. # 全库级别备份:
  2. # 备份:
  3. pg_dumpall -U postgres > dumpall.sql
  4. # 恢复:
  5. psql -U postgres < dumpall.sql

4. 其他备份工具

url