SqlServer索引页损坏恢复,聚簇索引和非聚簇索引

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。

DECLARE @UserID INT; --推广员帐号
DECLARE @ProxyID INT; --代理帐号
DECLARE @Score INT=1000; --分数
SELECT
    @UserID = [SpreaderID]
FROM
    [QPAccountsDB].[dbo].[AccountsInfo]
WHERE
    UserID = 5055;
SELECT --查出推广员的代理帐号
        @ProxyID = ProxyID
FROM
        [QPAccountsDB].[dbo].[AccountsInfo]
    LEFT JOIN
        [QPProxyDB].[dbo].[BS_ProxyInfo]
            ON BS_ProxyInfo.account = AccountsInfo.Accounts
WHERE
        UserID = @UserID;
PRINT @ProxyID;
CREATE TABLE #ProxyInfo
    (
        belongsAgent     INT,
        assignProportion TINYINT
    );
WITH cte
AS (   SELECT
           belongsAgent
       FROM
           [QPProxyDB].[dbo].[BS_ProxyInfo]
       WHERE
           ProxyID = @ProxyID
           AND belongsAgent <> -1
       UNION ALL
       SELECT
               a.belongsAgent
       FROM
               [QPProxyDB].[dbo].[BS_ProxyInfo] a
           JOIN
               cte                              b
                   ON a.ProxyID = b.belongsAgent
       WHERE
               a.belongsAgent <> -1)
INSERT #ProxyInfo
    (
        belongsAgent,
        assignProportion
    )
       SELECT
           BS_ProxyInfo.ProxyID,
           assignProportion
       FROM
           cte LEFT JOIN [QPProxyDB].[dbo].[BS_ProxyInfo] ON BS_ProxyInfo.ProxyID = cte.belongsAgent
       ORDER BY
           BS_ProxyInfo.belongsAgent ASC;
---游标更新删除当前数据
---1.声明游标
DECLARE cursor01 CURSOR SCROLL FOR
    SELECT
        *
    FROM
        #ProxyInfo
    ORDER BY
        belongsAgent ASC;
        DECLARE @AllTax INT 
        SET @AllTax =@Score
--2.打开游标
OPEN cursor01;
--3.声明游标提取数据所要存放的变量
DECLARE
    @belongsAgent     INT,
    @assignProportion TINYINT;
--4.定位游标到哪一行
FETCH FIRST FROM cursor01
INTO
    @belongsAgent,
    @assignProportion; --into的变量数量必须与游标查询结果集的列数相同
WHILE @@fetch_status = 0 --提取成功,进行下一条数据的提取操作 
    BEGIN

      SET   @AllTax=@assignProportion*@AllTax/100
UPDATE [QPProxyDB].[dbo].[BS_ProxyInfo] SET allTax+=@AllTax WHERE ProxyID=@belongsAgent
        FETCH NEXT FROM cursor01
        INTO
            @belongsAgent,
            @assignProportion; --移动游标
    END;
CLOSE cursor01;
DEALLOCATE cursor01;
DROP TABLE #ProxyInfo;

问题背景

运维操作失误,在没有正常关闭sqlserver的情况下,将服务器关闭了,重启后某些表损坏(应该是某些页损坏了,没有损坏的页还能访问到数据,但是访问损坏了的页就有问题),目前数据库只有4.20号的备份。

在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

 

报错信息

查询脚本:select * from t_jxjs_pctq where c_bh_tqxx = '8ae480b26320550e016323d098050175';

报错信息:HY000-[SQL Server] 数据库 ID 11,页[1:60682]已标记为RestorePending,可能表名磁盘已损坏,要从此状态进行恢复,请执行还原操作。

因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解释了。下面,我们可以看一下MYSQL中MYISAM和INNODB两种引擎的索引结构

报错可能的原因

RestorePending一般是在进行页恢复的过程中出现的,就是在进行了restore操作之后但还没有进行recovery操作之前页的状态。出现这样的问题可以肯定这个表是损坏了,但是在查询数据的时候如果不会查询到损坏页面的数据话是不会报错的,也就是说可以有条件的使用这个表。参考资料

 

5.7号和4.20号的数据量对比

表名 4.20号 5.6号
T_JXJS_PCTQ 1716 2175
T_YWGY_WSQD_WS 7358 8275
T_JXJS_HYJL 244 287

本文由澳门新葡亰平台官网发布于数据库,转载请注明出处:SqlServer索引页损坏恢复,聚簇索引和非聚簇索引

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。