如何轻松迁移PostgreSQL服务器与最小停机时间
PostgreSQL是一个很好的数据库服务器,但是当您的数据集相当大时,使用pg_dump迁移服务器可能是一个相当长的过程。 在本教程中,我们将讨论一种尽可能少的停机时间迁移整个服务器的方法。 为了实现这一点,我们将使用PostgreSQL内置的PITR功能(即时恢复)。
假设
本教程假定您有2台基于Debian / Ubuntu的Linux发行版上运行的PostgreSQL 8.3服务器。 数据库版本需要相同。 您不能将其从8.3迁移到8.4。
目的地PostgreSQL服务器的数据目录将丢失!
预制
Preperation是关键,特别是为了避免尽可能多的停机时间。 因此,在继续运行任何命令之前,请阅读本教程。 如果你不完全明白命令应该做什么, 不要运行它 可以销毁您当前的PostgreSQL数据库。 总是有备份!
第一步:配置源Postgresql服务器
继续之前:确保目的地的PostgreSQL服务器未运行!
第一步是准备源数据库服务器。 如前所述,我们将使用PITR(Point In Time Recovery)。 这将创建将被复制到目标数据库服务器的WAL文件。 每个WAL文件(默认情况下)大小为16MB。 如果您的数据库经常更新,这可能会增加磁盘空间。 记住这一点。
我们需要在源服务器上设置PITR归档。 登录到源服务器并创建归档目录。 替换/存档
您想要的目录。
mkdir /archive; chown postgres.postgres /archive;
接下来,编辑文件/etc/postgresql/8.3/main/postgresql.conf
:
vim /etc/postgresql/8.3/main/postgresql.conf
添加以下行:
archive_mode = on # for pgpoolII archive_command = 'cp -i %p /archive%f
接下来,运行以下命令在备份模式下启动postgres。
# sudo /etc/init.d/postgresql-8.3 reload;
# sudo su postgres;
# psql;
postgres=# SELECT pg_start_backup('backup');
postgres=# \q
如果您在备份命令后收到错误; 在继续之前修复这个问题!
接下来,将/var/lib/postgresql/8.3/main
中的文件复制到目标服务器。 我喜欢用这个rsync。
rsync --progress -azv --delete /var/lib/postgresql/8.3/main/ root@<destinationserver>:/var/lib/postgresql/8.3/main
完成后,我们需要停止postgresql的备份模式;
# sudo su postgres;
# psql;
postgres=# SELECT pg_stop_backup();
postgres=# \q
目的服务器
现在我们需要配置目标服务器。 首先,创建另一个存档目录。 再次,替换/存档/
为您所需的目录。 为了方便起见,我建议保持这些目录是一样的。
# sudo mkdir /archive; sudo chown postgres.postgres /archive;
# sudo apt-get install postgresql-contrib-8.3
# sudo vim /var/lib/postgresql/8.3/main/recovery.conf
将以下行粘贴到新创建的文件中:
restore_command = '/usr/lib/postgresql/8.3/bin/pg_standby -l -d -s 2 -t /tmp/pgsql.trigger /archive %f %p %r 2>>standby.log'
接下来,我们将需要rsync / archive目录。 这可以从目标或源服务器完成。 以下假定目标服务器:
# sudo rsync --progress -azv --delete root@<sourceserver>:/archive /archive
完成后,启动postgresql ..
# sudo /etc/init.d/postgresql-8.3 start
当您要切换时,您只需要重新同步/ archive
目录并创建一个触发器文件即可将postgresql启动到正常模式。 请注意,从创建触发文件的那一刻起,源服务器的新数据将不会添加到目标服务器。
# sudo rsync --progress -azv --delete root@<sourceserver>:/archive /archive
# sudo su -c 'touch /tmp/pgsql.trigger' postgres
站起来,放松身心,做好工作
假设一切顺利,新的服务器现在已经开始运行,直到创建了触发器文件。 现在你可以退一步,享受一份好工作。