如何删除IQ数据库中损坏的表

转:http://blog.chinaunix.net/space.php?do=blog&uid=16765068&id=108095

 由于某种原因,IQ数据库中的表出现损坏不能访问,并且可能使用drop table语句也不能把它删除。对于这样的表,当我们访问它时IQ会报如下错误:

    ASA Error -1009039: main Bufman: Incorrect page header read; buffer={btype=14,nlb=16,blk=992,pbn=992,npb=16,uid=562,txn=1829,sp=0,flgs=0xc08} page={btype=0,nlb=0,npb=0,ctr=0,cta=0,pbn=0,txn=0,sp=0,ver=0,pb=0,pus=0}.

--(s_buf.cxx1140)

    Msg: 21, Level: 14, State: 0 Line: 0
 
    当发生这样的问题,我们打算删除损坏的表时该如何操作呢?下面介绍一下具体的方法和步骤(适用于IQ 12.6和IQ 12.7):
 
(1) 重启服务器

start_asiq-nbad_db_server-x'tcpip{port=xxx}'-gm1-gddbabad_db.db

在这个命令行中,-gm1仅仅允许一个用户做连接,-gd只允许DBA访问。当强制删除对象时,必须禁止其他用户连接。

   
    说明: bad_db_server即出现损坏的IQ Server,其名称为.cfg文件中-n参数指定的引擎名
          bad_db.db即出现损坏IQ数据库的catalog db名称
 
(2) 打开临时选项FORCE_DROP为ON:set temporary option FORCE_DROP = 'ON'

(3)删除所有不一致对象

使用DROP TABLE损坏的表。在重新启动服务器之前不要执行任何其他的DDL或者DML命令。

(4)重新启动服务器

可以用-iqdroplks选项重新启动服务器,以恢复泄露的空间并把分配映射图(allocationmap)修改到正确状态。

start_asiq-nbad_db_server-x'tcpip{port=xxx}'-iqdroplksbad_dbbad_db.db

您需要指定两次数据库名称,前者是-iqdroplks选项使用的,后者指定您要启动的数据库。

(5) 运行sp_iqcheckdb

sp_iqcheckdb'allocationdatabase'。

这个步骤用计算出来的分配映射图重新设置数据库分配映射表。

如果上面的存储过程执行没有错误出现,它将显示“FreelistUpdated”信息,表明已经完成泄露空(leakedspace)间的恢复

(6) 发出一个checkpoint

即执行checkpoint语句

(7) 使用通用方式停止服务器
(8) 使用正常方式启动服务器,启动后即可进行正常操作。
我的解决方法:
(2) 打开临时选项FORCE_DROP为ON:set temporary option FORCE_DROP = 'ON'
然后把表重建 ,记得数据如果能恢复照样恢复,不行的话就重建了

相关推荐