`
bdk82924
  • 浏览: 551493 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

如何删除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.cxx 1140)
    Msg: 21, Level: 14, State: 0 Line: 0
 
    当发生这样的问题,我们打算删除损坏的表时该如何操作呢?下面介绍一下具体的方法和步骤(适用于IQ 12.6和IQ 12.7):
 
(1) 重启服务器
start_asiq -n bad_db_server -x 'tcpip{port=xxx}' -gm 1 -gd dba bad_db.db
在这个命令行中,-gm 1仅仅允许一个用户做连接,-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选项重新启动服务器,以恢复泄露的空间并把分配映射图(allocation map)修改到正确状态。
start_asiq -n bad_db_server -x 'tcpip{port=xxx}' -iqdroplks bad_db bad_db.db
您需要指定两次数据库名称,前者是-iqdroplks选项使用的,后者指定您要启动的数据库。
(5) 运行sp_iqcheckdb
sp_iqcheckdb 'allocation database'。
这个步骤用计算出来的分配映射图重新设置数据库分配映射表。
如果上面的存储过程执行没有错误出现,它将显示“Freelist Updated”信息,表明已经完成泄露空(leaked space)间的恢复
(6) 发出一个checkpoint
   即执行checkpoint语句
(7) 使用通用方式停止服务器
(8) 使用正常方式启动服务器,启动后即可进行正常操作。
我的解决方法:

(2) 打开临时选项FORCE_DROP为ON:
set temporary option FORCE_DROP = 'ON'
然后把表重建 ,记得数据如果能恢复照样恢复,不行的话就重建了

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics