源端数据库配置修改
在进行PostgreSQL数据库迁移之前,必须确保data目录下的postgresql.conf文件中的三个设置项的符合预期。三个设置项分别是:
1.wal_level

可以设置为replica或logical
minimal --不能通过基础备份和wal日志恢复数据库。
replica – 9.6版本以前的archive和hot_standby --该级别支持wal归档和复制。
logical --在replica级别的基础上添加了支持逻辑解码所需的信息
2.archive_mode

开启PostgreSQL的归档模式

3.archive_command

设置归档指令,可以参考如下

postgresql 归档日志脚本 pg数据库归档日志_postgresql

%p - 是归档日志的完整路径
%f - 是归档日志的完整文件名
/home/postgres/backup/pgwal/ – 这个可以自定义,是用来存放之后PGSQL产生的归档日志的。
整条命令的逻辑就是把归档日志拷贝到/home/postgres/backup/pgwal下,做一个备份。
设置完成后,必须重新启动数据库,才能生效。
整个迁移过程中,如果遇到问题,首先排查文件和目录的owner是否为数据库onwer。

源端存量数据打包

在进行全量数据打包之前,需要去存储归档日志的目录下,确认并记录最新的归档日志的文件名。后面传增量数据文件(也就是归档日志)的时候,传输包括这份归档日志在内的,之后的所有归档日志。

命令为: pg_base???backup -Ft -Pv -z -Z5 -p5432 -D /home/postgres/full_backup/

-Ft 把输出的备份文件打包到一个tar包中

-Pv v是配合P的,P为在备份过程中实时打印备份进度,v是打印出正在备份

的具体文件的信息

-z 使用gzip压缩,仅能配合tar输出模式配合使用

-Z5 压缩等级设为5

-D 指定存放压缩包的文件夹路径

/home/postgres/full_backup 自定义存放压缩包的文件夹。当存量数据打包完后,会显示下图。

postgresql 归档日志脚本 pg数据库归档日志_数据库_02

这时候全量数据成功打包完成。

在/home/postgres/full_backup中,会生成如下两个压缩包。

postgresql 归档日志脚本 pg数据库归档日志_postgresql_03

数据传输

在存量数据迁移之前,确保目标端数据库是停止状态。

postgresql 归档日志脚本 pg数据库归档日志_database_04

先把存量数据(就是之前获得的两个压缩包base.tar.gz和pg_wal.rar.gz)传送到目标端。目标端需要在pgsql文件目录下创建一个data目录,把用户和用户组修改为数据库用户,并且把权限修改为700.

postgresql 归档日志脚本 pg数据库归档日志_postgresql_05

确保压缩包base.tar.gz和pg_wal.rar.gz在data目录下。

1.先解压base.tar.gz压缩包

postgresql 归档日志脚本 pg数据库归档日志_postgresql_06

2.把pg_wal.rar.gz放到pg_wal目录下,并解压缩

postgresql 归档日志脚本 pg数据库归档日志_postgresql 归档日志脚本_07

3.可以将两个压缩包删除。
4.根据业务情况修改pg_hba.conf和postgresql.conf。监听的IP地址必须修改,archive_command可以根据业务情况修改。
传输增量数据

a)首先关闭源端应用服务

关闭服务应用后,在数据库内输入

select pg_switch_wal();

将内存数据落盘。

关闭源端数据库,确保目标端再想把数据和业务切回到源端时,可以直接使用归档日志进行恢复,不用再导入一遍全量数据。

b)将需要的归档日志传输到目标端指定目录

归档日志所在目录,在第一步的archieve_command中已经设置。

c)确认归档日志的用户和用户组

在传输到目标端之后,确认归档日志的用户和用户组是否属于数据库用户。

d)创建恢复配置文件

在数据库data目录下,创建 recovery.conf文件,用户和用户组设置为数据库用户,用户组。

并且在文件内添加如下行:

restore_command=‘cp /存储目标端归档日志的目录名/%f %p’

保存后启动数据库

e)确认数据一致性

打开数据库,输入如下命令

select pg_current_wal_lsn()

select pg_switch_wal()

postgresql 归档日志脚本 pg数据库归档日志_数据库_08

在目标端生成新的归档日志,通过pg_waldump命令,将归档日志转为可读格式,然后查询匹配当前lsn的前一行lsn。比如,当前目标端数据库lsn为E10000D0。

postgresql 归档日志脚本 pg数据库归档日志_database_09

lsn后面显示的是当前事务的lsn号码。

prev后面显示的是上一个事务的lsn号码。

postgresql通过lsn保证连续性,如果中间有数据出问题,lsn号码会不匹配。

通过归档日志可以知道,当前lsn为E10000D0,之前是E1000098,再之前是E1000028,在这之前是E01B3640。

打开从源端传来的归档日志,找到最后一份归档日志,通过pg_waldump转为可读格式,用tail命令查询最后一行。

postgresql 归档日志脚本 pg数据库归档日志_postgresql 归档日志脚本_10

可以看到最后一行是E01B3640。说明数据符合一致性要求。