任何一个数据库系统,通常都会提供逻辑导入导出工具。如Oracle的exp/imp。PostgreSQL,开源数据库的典范之作,其架构设计之精巧,堪称典范。
本文拟分如下部分,从源码角度(基于postgresql-9.1alpha2),逐步剖析其精巧的架构。
(一)文件介绍
http://blog.163.com/li_hx/blog/static/183991413201131185934722/
(二)体系结构
http://blog.163.com/li_hx/blog/static/18399141320113128129155/
(三)导出文件的格式与函数指针的使用
http://blog.163.com/li_hx/blog/static/183991413201131563416456/
(四)pg_backup_custom.c文件的导出格式研究
http://blog.163.com/li_hx/blog/static/1839914132011316101947161/
(五)文件格式与备份恢复的关系---版本
http://blog.163.com/li_hx/blog/static/183991413201131885933515/
(六)流的应用
http://blog.163.com/li_hx/blog/static/183991413201131982717591/
(一)文件介绍
在PostgreSQL的“src/bin/dump”目录下,存放了如下文件:
Makefile nls.mk pg_backup_db.h pg_dump.h
README pg_backup.h pg_backup_files.c pg_dump_sort.c
common.c pg_backup_archiver.c pg_backup_null.c pg_dumpall.c
dumputils.c pg_backup_archiver.h pg_backup_tar.c pg_restore.c
dumputils.h pg_backup_custom.c pg_backup_tar.h po
keywords.c pg_backup_db.c pg_dump.c
其中,文件可以分为如下类型(头文件忽略,只介绍.c文件):
第一类:全系统导出文件
pg_dumpall.c: 导出所有的数据库。PostgreSQL是一个多库结构的数据库系统,其基本模型为:全系统->多个数据单库->每个数据库下多个模式(schema)->隶属模式的对象,如表、视图等。本文件就是导出全系统中的所有数据单库。Oracle是一个实例,只可以有一个数据单库,而PostgreSQL则是一个RDBMS下有多个单库。
第二类:导出单个数据库
pg_dump.c:导出单个数据库。被pg_dumpall.c循环调用,就可导出所有的数据单库。
第三类:导出单个数据库的辅助类
pg_backup_db.c:基本的辅助类,连接数据库系统、发送SQL语句等的类的封装。导入导出程序的基本原理是:连接目标数据库,读出要导出的对象的定义和数据,以及其他一些信息(如comment、权限)等。
dumputils.c:对字符串等做处理,还有对于对象权限信息导出的封装(buildACLCommands函数)。
keywords.c:引入PostGreSQL的关键字
第四类:导出文件格式类
pg_backup_custom.c:导出对象存储到二进制格式的文件中。
pg_backup_files.c:导出对象存储到指定的文件中。
pg_backup_null.c:导出文件到标准输出。
pg_backup_tar.c:以压缩文件的格式导出文件。
第五类:导出算法支持类
common.c:读出导出部分对象的功能。
pg_dump_sort.c:对于导出对象,进行逻辑上的前后次序排序,决定先导出的对象,后导出的对象,可能在逻辑上依赖于先前导出的对象。
第六类:导入类(逻辑还原)
pg_restore.c:读备份文件,还原数据库对象和数据到指定数据库