1. 增量备份
增量备份和任意时间点恢复:
实现增量备份的思路是1. 记录数据库系统的操作记录(WAL归档)2. 在某一时刻进行一次完整的数据库备份3. 需要恢复时,还原上一次完整的数据库备份,根据操作记录恢复数据库至指定的某个时刻(即可以实现PITR 时间点恢复)
2. 全量备份
2.1 全量备份:
1. 模拟环境:# 创建数据:create table t1(id int not null primary key,name varchar(20) not null);insert into t1 values(1,'zhnagsan'),(2,'lisi');2. 进行备份:pg_basebackup -Ft -Pv -Xf -z -Z5 -p 5432 -D /usr/local/pgsql/backup/3. 模拟数据库故障:pg_ctl -D /usr/local/pgsql/data/ stoprm -rf /usr/local/pgsql/data/*4. 进行数据恢复:cd /usr/local/pgsql/backup/tar xf base.tar.gz -C ../data
2.2 全备结合时间点恢复:
# 创建归档目录:mkdir -p /pgccc/archivechown -R postgres. /pgccc/# 开启归档,并重启数据库:wal_level = 'replica'archive_mode = 'on'archive_command = 'cp %p /pgccc/archive/%f'# 重启数据库:pg_ctl restart# 执行全量备份:pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres# 如果此时的数据有变化,也可以执行增量备份:pg_receivewal -D /pgccc/backup/ -p 5432# 插入数据:create table a(id int);insert into a values (2);select current_timestamp;select pg_switch_wal();checkpoint;# 模拟数据丢失:drop table a;# 启动备份实例,进行数据恢复:vim postgresql.confrecovery_target_time = '2021-07-03 11:55:41.543904+08'restore_command='cp /pgccc/archive/%f %p'recovery_target_action = 'promote'# 创建备库标签:touch recovery.signal# 启动数据库:pg_ctl -D /pgccc/backup start# 关闭读模式:select pg_wal_replay_resume();
2.3 全备结合还原点恢复:
# 创建归档目录:mkdir -p /pgccc/archivechown -R postgres. /pgccc/# 开启归档,并重启数据库:wal_level = 'replica'archive_mode = 'on'archive_command = 'cp %p /pgccc/archive/%f'# 重启数据库:pg_ctl restarat# 执行全量备份:pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres如果有变化的数据,可以执行增量备份:pg_receivewal -D /pgccc/backup/ -p 5432# 插入数据:create table a(id int);insert into a values (2);# 创建还原点:select pg_create_restore_point('huanyuan');# 模拟数据丢失:drop table a;# 启动备份实例,进行数据恢复:vim postgresql.confrecovery_target_name = 'huanyuan'restore_command='cp /pgccc/archive/%f %p'recovery_target_action = 'promote'touch recovery.signal# 启动数据库:pg_ctl -D /pgccc/backup start# 关闭读模式:select pg_wal_replay_resume();
2.4 全备结合指定事务恢复:
# 创建归档目录:mkdir -p /pgccc/archivechown -R postgres. /pgccc/# 开启归档,并重启数据库:wal_level = 'replica'archive_mode = 'on'archive_command = 'cp %p /pgccc/archive/%f'# 重启数据库:pg_ctl restarat# 执行全量备份:pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres# 如果有变化的数据,可以执行增量备份:pg_receivewal -D /pgccc/backup/ -p 5432# 插入数据:create table a(id int);insert into a values (2);select pg_current_xact_id();select pg_switch_wal();checkpoint;# 模拟数据丢失:drop table a;# 启动备份实例,进行数据恢复:vim postgresql.confrecovery_target_xid = '487'restore_command='cp /pgccc/archive/%f %p'recovery_target_action = 'promote'touch recovery.signal# 启动数据库:pg_ctl -D /pgccc/backup start# 关闭读模式:select pg_wal_replay_resume();
2.5 全备结合LSN号码恢复:
# 创建归档目录:mkdir -p /pgccc/archivechown -R postgres. /pgccc/# 开启归档,并重启数据库:wal_level = 'replica'archive_mode = 'on'archive_command = 'cp %p /pgccc/archive/%f'# 重启数据库:pg_ctl restarat# 执行全量备份:pg_basebackup -D /pgccc/backup -P -p 5432 -U postgres# 如果有变化的数据,可以执行增量备份:pg_receivewal -D /pgccc/backup/ -p 5432# 插入数据:create table a(id int);insert into a values (2);select pg_current_wal_lsn();select pg_switch_wal();checkpoint;# 模拟数据丢失:drop table a;# 启动备份实例,进行数据恢复:vim postgresql.confrecovery_target_lsn = '0/4011BF8'restore_command='cp /pgccc/archive/%f %p'recovery_target_action = 'promote'touch recovery.signal# 启动数据库:pg_ctl -D /pgccc/backup start# 关闭读模式:select pg_wal_replay_resume();
3. SQL转储和文件系统级别备份
2.1 pg_dump的使用:
1. 备份及恢复库下所有的数据:# 普通格式备份及恢复:# 备份:pg_dump -U postgres test >test.sql# 恢复:psqlcreate database test;psql -U postgres test < test.sql# 指定格式进行备份:# 备份:pg_dump -Fc -U postgres test >test.dmp# 恢复:psqlcreate database test;pg_restore -d test test.dmp2. 备份库下某个模式所有的表:# 备份:pg_dump -U postgres -t 'schema1.t*' test >test.sql# 恢复:psql -U postgres test < test.sql# 在备份过程中也可以排除某个表,例如排除zhang表:pg_dump -U postgres -t 'schema1.t*' -T 'schema1.zhang' test >test.sql3. 备份单个表:# 例如备份test库下的zhang表:# 备份:pg_dump -t zhang test >dump.sql# 恢复:create database test;psql -U test < dump.sql
2.2. pg_dumpall的使用:
# 全库级别备份:# 备份:pg_dumpall -U postgres > dumpall.sql# 恢复:psql -U postgres < dumpall.sql
