PostgreSQL之精妙的数据库导入导出工具架构 (七)

(七)逻辑恢复

1 恢复过程

1.1 解析命令行参数
1.2 判断参数间是否相容(不相容则报错退出)
1.3 根据恢复参数,为_restoreOptions结构(注意研究此结构)定义的“opt”变量赋值,此opt决定了如何恢复数据库对象(表、视图等)和数据
1.4 调用OpenArchive函数打开pg_dump备份出的备份文件
1.5 调用RestoreArchive函数进行恢复(本质上是从备份文件中读出备份时保存好的SQL语句和Insert或Copy语句,执行SQL)

2 RestoreArchive函数详解
2.1 注意本函数的调用关系
    2.1.1 被pg_restore.c的main函数调用
    2.1.2 被pg_dump.c的main函数调用
    2.1.3 被pg_backup_tar.c的_CloseArchive函数调用
2.2 为什么会被这三个不同文件调用?
    2.2.1 被pg_restore.c的main函数调用,其本质功能是把内存中的Toc链表遍历,读出链表上保存有的SQL语句,逐个执行。注意如下调用关系:
    OpenArchive->_allocAH->InitArchiveFmt_Custom->ReadToc(ReadToc函数,读出备份文件中的Toc链表)
    2.2.2 被pg_dump.c的main函数调用,为什么备份时要调用恢复函数?RestoreArchive函数的调用关系值得仔细地研究。
    PostgreSQL有一个精妙的设计于此处 外存文件->内存->目的库或目的文件。计算机经常说解耦一词,此处就是一例。为什么这么说呢?
    在2.2.1中表述处,RestoreArchive函数是被pg_restore.c调用,根据用户参数,决定了输出目的是一个数据库或是一个文件;------从内存中直接拿到数据库对象定义和数据,发送到目的数据库或一个文本文件中
    在2.2.2中表述处,RestoreArchive函数是被pg_dump.c调用,根据用户参数,决定了输出目的是一个文本文件;------pg_dump的一个功能是,直接导出数据库对象和数据为文本格式的SQL文件
    在2.2.3中表述处,RestoreArchive函数是被pg_backup_tar.c调用,根据用户参数,决定了输出目的是一个数据库或是一个文件;------从tar包中把数据库对象定义和数据读出,发送到目的数据库或一个文本文件中
    因为备份时,Toc链(要导出的对象和数据的元信息)在内存中,所以,可以决定把这些信息直接导出的文件中;但是以SQL格式导出到文本,则是借助RestoreArchive函数直接把SQL语句输出到文本文件中。
    因为恢复时,先从备份文件中,读出Toc链信息到内存,所以,此后的操作,可以同备份时的后续操作相同,所以,可以支持把备份文件中的信息转化为SQL文本格式信息,也可以支持把备份文件的信息转化为SQL语句直接输送到目的数据库执行。
    而决定输出目的是SQL文本还是目的数据库,则取决于用户指定的参数。所以,请注意:
    RestoreArchive(Archive *AHX, RestoreOptions *ropt)
    在调用RestoreArchive函数时,ropt的不同值,决定了输出的目的地是什么。
    正因为不管导出还是导入,都要把Toc链的信息保存在内存中,所以,有了这个信息,就可以决定如何利用这个信息,就可以达到我们上面提到的解耦效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值