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/ stop
rm -rf /usr/local/pgsql/data/*
4. 进行数据恢复:
cd /usr/local/pgsql/backup/
tar xf base.tar.gz -C ../data
2.2 全备结合时间点恢复:
# 创建归档目录:
mkdir -p /pgccc/archive
chown -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.conf
recovery_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/archive
chown -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.conf
recovery_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/archive
chown -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.conf
recovery_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/archive
chown -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.conf
recovery_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
# 恢复:
psql
create database test;
psql -U postgres test < test.sql
# 指定格式进行备份:
# 备份:
pg_dump -Fc -U postgres test >test.dmp
# 恢复:
psql
create database test;
pg_restore -d test test.dmp
2. 备份库下某个模式所有的表:
# 备份:
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.sql
3. 备份单个表:
# 例如备份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