我的语句
use master
RESTORE DATABASE pos Page='1:88968,1:97055'
   FROM file_backup_of_file_PFS
   WITH NORECOVERY;
RESTORE LOG pos FROM log_backup
   WITH NORECOVERY;
RESTORE LOG pos FROM log_backup
   WITH NORECOVERY;
BACKUP LOG pos TO new_log_backup
RESTORE LOG pos FROM new_log_backup WITH RECOVERY;
GO
报错信息:
服务器: 消息 102,级别 15,状态 1,行 2
Incorrect syntax near 'Page'.我执行DBCC CHECKDB('POS')时报的错,所以想修复页面,希望高手指点。
服务器: 消息 8939,级别 16,状态 5,行 1
Table error: Object ID 0, index ID 0, page (1:88968). Test (m_headerVersion == HEADER_7_0) failed. Values are 0 and 1.
服务器: 消息 8939,级别 16,状态 1,行 1
Table error: Object ID 0, index ID 0, page (1:88968). Test ((m_type >=DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER)) failed. Values are 0 and 101.
服务器: 消息 8939,级别 16,状态 1,行 1
Table error: Object ID 0, index ID 0, page (1:88968). Test (m_freeData >= PAGEHEADSIZE && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot)) failed. Values are 0 and 8192.
服务器: 消息 8998,级别 16,状态 1,行 1
Page errors on the GAM, SGAM, or PFS pages do not allow CHECKALLOC to verify database ID 5 pages from (1:88968) to (1:97055). See other errors for cause.
DBCC results for 'POS'.
CHECKDB found 4 allocation errors and 0 consistency errors not associated with any single object.

解决方案 »

  1.   

    -先备份一下要修复的数据库,再执行下面的操作(此方法曾修复过2000的数据库)--把下面的数据库名blpsjxc_fzgt改成你自己的数据库名
    use master
    go
    exec sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE
    go
    update sysdatabases set status=32768 where name='blpsjxc_fzgt'
    go
    DBCC REBUILD_LOG ('blpsjxc_fzgt','D:\Microsoft SQL Server\MSSQL\Data\blpsjxc_fzgt.LDF')
    go
    update sysdatabases set status=0 where name='blpsjxc_fzgt' 
    go
    restore database blpsjxc_fzgt WITH RECOVERY 
    go
    exec sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE 
      

  2.   

    执行完成后报以下错误。
    Configuration option 'allow updates' changed from 1 to 1. Run the RECONFIGURE statement to install.(所影响的行数为 1 行)服务器: 消息 5023,级别 16,状态 2,行 1
    Database must be put in bypass recovery mode to rebuild the log.
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.(所影响的行数为 1 行)服务器: 消息 913,级别 16,状态 8,行 1
    Could not find database ID 65535. Database may not be activated yet or may be in transition.
    服务器: 消息 3013,级别 16,状态 1,行 1
    RESTORE DATABASE is terminating abnormally.
    Configuration option 'allow updates' changed from 1 to 0. Run the RECONFIGURE statement to install.
      

  3.   

    是SQL SERVER 2000?2000下好像没有PAGE修复。
      

  4.   

    是2000,没page修复啊。悲剧了。那数据库检测报下面的错有什么好的建议修复么?
    DBCC CHECKDB('pos',repair_allow_data_loss) WITH TABLOCK也报相同的错误。我执行DBCC CHECKDB('POS')时报的错,所以想修复页面,希望高手指点。
    服务器: 消息 8939,级别 16,状态 5,行 1
    Table error: Object ID 0, index ID 0, page (1:88968). Test (m_headerVersion == HEADER_7_0) failed. Values are 0 and 1.
    服务器: 消息 8939,级别 16,状态 1,行 1
    Table error: Object ID 0, index ID 0, page (1:88968). Test ((m_type >=DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER)) failed. Values are 0 and 101.
    服务器: 消息 8939,级别 16,状态 1,行 1
    Table error: Object ID 0, index ID 0, page (1:88968). Test (m_freeData >= PAGEHEADSIZE && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot)) failed. Values are 0 and 8192.
    服务器: 消息 8998,级别 16,状态 1,行 1
    Page errors on the GAM, SGAM, or PFS pages do not allow CHECKALLOC to verify database ID 5 pages from (1:88968) to (1:97055). See other errors for cause.
    DBCC results for 'POS'.
    CHECKDB found 4 allocation errors and 0 consistency errors not associated with any single object.
      

  5.   

    估计sql server自己修复不了。备份日志后恢复吧,或者,把现有的数据转移到其他地方吧。
      

  6.   

    就是说完全备份时数据页已经出错了。那用这个备份的页就是能PAGE恢复也是个出错的页啊。
    所以要么找到最初这些页没有报错时的完全备份恢复。
    或者新建一个空数据库,把现在库中的表能够导出的都尽量导出(应该是有一些表不能导出或者数据不全的)。
      

  7.   

     这就是为什么需要经常 dbcc checkdb的原因。。 如果你之前的完备时  页面已经出了问题,就不好办了 
      只能repair_allow_data_loss 试试
      

  8.   

    感谢cd731107的SQL语句,以前我也用这个方法修复过数据库,顶一下
      

  9.   


    之前没用过尾日志备份,看网上操作执行后也报错 。我想问下从完整备份开始恢复到尾日志的详细过程,比对下我有否做错,我的尾日志备份出特别小,是不是有问题啊。
    我用:BACKUP LOG database_name TO <backup_device> WITH NORECOVERY备份的。
      

  10.   

      备份尾日志
       
         BACKUP LOG 数据库名称 TO <备份设备> [WITH { CONTINUE_AFTER_ERROR | NO_TRUNCATE }
         -- 除非数据库受损,否则不建议使用 NO_TRUNCATE。
       
        
        
    --完备
    RESTORE  DATABASE  dbname
    FROM  DISK='c:\a.bak'
    WITH norecovery--日志还原
    RESTORE  LOG   dbname
    FROM  DISK='c:\a_log1.bak'
    WITH norecoveryRESTORE  LOG   dbname
    FROM  DISK='c:\a_log2.bak'
    WITH norecoveryRESTORE  LOG   dbname
    FROM  DISK='c:\a_log3.bak'
    WITH  recovery
       
      
      

  11.   

    语句上应该不会有差异。
    我执行的为
    ALTER DATABASE pos SET RECOVERY FULL BACKUP LOG pos TO DISK = 'C:\pos_log.ldf'  WITH NORECOVERYrestore database pos from disk='C:\pos.bak' with file=1,norecoveryrestore log pos
    from disk='C:\pos_log.ldf' with norecovery报错:服务器: 消息 4305,级别 16,状态 1,行 1
    The log in this backup set begins at LSN 193988000000003000036, which is too late to apply to the database. An earlier log backup that includes LSN 193862000000070700001 can be restored.
    服务器: 消息 3013,级别 16,状态 1,行 1
    RESTORE LOG is terminating abnormally.
      

  12.   

    我想搞明白,目前库是有问题的,算A库,我备份出尾日志A.log,之前无问题库B,我restore×.bak库的时候应该是B库吧?然后恢复尾日志A.log。
    这个思路是否正确,网上写的比较多,有点混乱。
      

  13.   

     这个有问题的  ALTER DATABASE pos SET RECOVERY FULL 如果从简单模式到完整模式,日志链是截断一次的 
     你必须先做一个完备 建立基准点,再做日志备份才能有效。
      
     每修改一次数据库的恢复模式 都要先做一次完整备份 
      

  14.   

    你说的完备我在那个库的基础上做,之前好的?还是现在有问题的。
    这问题困扰了好久了。,哥们你有QQ或msn么?沟通开比较方便。
      

  15.   

    继续,现在感觉有点乱了,目前手头有有问题的库A,之前的好库b,我想知道尾日志是从A备?还是B?我觉得应该是A,但A备份完尾日志后,然后再完全备份?再还原B?还原A的尾日志?
    流程与思路有点不明白,希望明白的解读下。最好有过成功经历的。谢谢!
      

  16.   

    建议,SQL SERVER 2000 无PAGE 修复的功能请将数据库恢复到2005 将数据库修复后 利用 REPLICATION 的功能将 2005上修复好的数据库用流方式 (publication subscription)的方式 复制到SQL SERVER 2000 则你的问题解决