Linux系统Postgresql数据库自动备份
PostgreSQL备份有3种方式:
文件系统级别备份,就是直接copy数据库目录,必须关闭服务,这无法在提供24小时不间断服务的Web上应用。并且产生的文件也不小,因为包括索引等无需备份的信息。
在线备份PITR,太麻烦了。。。
SQL转储,是通过PostgreSQL内置的pg_dump工具,作为一个普通的客户端进行联机备份,产生一个SQL命令的文本文件。由pg_dump创建的备份在内部是一致的,在pg_dump运行的时候对数据库的更新将不会被转储。pg_dump工作的时候并不阻塞其他的对数据库的操作(但会阻塞需要排它锁的操作)。另外pg_dump会忽略索引等信息,最终产生的文件容量有优势。运行在命令行上的pg_dump也有诸多便利性。
再考虑一般Web应用的特性:
用户需要全天的服务,生产服务器尽量不要中断服务
不同时间段的压力不同,服务器在夜间比较轻松
大多数不是关键数据,灾难恢复时可以允许适当的一点偏差
相对企业级系统,需要低成本运作。同时技术调整频繁,不能有固化的软硬件结构
因此我采用的策略是:
生产数据库基于X64或X86,Linux系统
双硬盘,容量大小基本一致,第一块硬盘作为根分区(数据库在其中),第二块作为备份分区
通过pg_dump进行SQL转储备份
通过Linux的cron服务,每日凌晨自动进行数据库备份,产生的备份文件存放于备份分区中
维护人员每周自行下载备份数据,即为低成本的异地备份
例如一台基于RedHat Enterprise Linux 4 AS的机器,跑PostgreSQL 8.1.4。硬盘是2个146GB的SCSI,/分区、/boot、SWAP等都在第一块硬盘。第二块硬盘整个挂载到/backup。
备份采用pg_dumpall。pg_dump进行单个数据库的备份,而pg_dumpall备份一个给出的集群中的每个数据库,同时还确保保留象用户和组这样的全局数据状态。使用方法如下:
su postgres (需要切换到系统的postgres用户来进行备份)
pg_dumpall > /backup/all_the_data.backup (备份整个数据库集群)
exit
要用cron来自动调度备份,则如下:
vi /etc/crontab
00 3 * * * postgres pg_dumpall > /backup/all_the_data.backup (添加这行,实现每日凌晨3点自动备份,并且是以postgres用户身份来运行的)
chown postgres /backup/all_the_data.backup (需要改变文件的拥有者,以确保postgres用户能写入)
service crond restart (重启crond服务以更新内存中的crontab)
恢复数据:
su postgres
psql -f /backup/all_the_data.back
up postgres
exit
注意此时数据库的postgres用户口令要和备份文件内的一致
一个非常好的技巧,
第二块硬盘划分为/backup分区后,编辑/etc/fstab,取消开机时的自动挂载,即平时无法操作这个硬盘;
编写一个shell脚本,先挂载/backup分