gpt4 book ai didi

sql-server-2008 - 资源池 'internal'系统内存不足

转载 作者:行者123 更新时间:2023-12-03 22:34:05 25 4
gpt4 key购买 nike

SQL Server 2008 链接服务器和临时插入导致快速内存泄漏,最终导致服务器无响应并以以下错误结束:

Msg 701, Level 17, State 123, Server BRECK-PC\SQLEXPRESS, Line 2
There is insufficient system memory in resource pool 'internal' to run this
query.

Location: qxcntxt.cpp:1052
Expression: cref == 0
SPID: 51
Process ID: 1880

在重新启动 SQL Server 之前,服务器保持无响应。

使用中的软件:
  • Windows Vista Ultimate 64 位版本 6001 SP1
  • Microsoft SQL Server 2008 (SP1) - 10.0.2734.0 (X64) 2009 年 9 月 11 日 14:30:58 版权所有 (c) 1988-2008 Microsoft Corporation Express Edition with Advanced Services (64-bit) o​​n Windows NT 6.0 (Build 6001: Service)包 1)
  • 来自 SQL Anywhere 的 SAOLEDB.11 驱动程序 11.0.1.2276

  • 将最大服务器内存 (MB) 设置为 2048 没有帮助。

    将各种 -g 值(例如,-g256;)添加到服务器启动参数没有帮助。

    使用 DBCC FREESYSTEMCACHE ('ALL')、DBCC FREESESSIONCACHE 和 DBCC FREEPROCCACHE 没有帮助。

    将累积更新包 4 安装到 SQL Server 2008 Service Pack 1 没有帮助,即使它包含对涉及链接服务器使用的内存泄漏症状的修复。

    将 SELECT ... ROW_NUMBER() OVER ... 查询与 INSERT 分开并没有帮助。实验表明,复杂的 SELECT 不会导致内存泄漏,而 INSERT 会。

    更改代码以使用临时“INSERT INTO OPENROWSET”语法而不是链接服务器没有帮助;下面的代码显示了链接服务器的使用情况。

    sysinternals.com 进程探索实用程序显示内存使用与 sqlserver.exe 相关联,而不是 SQL Anywhere OLEDB 驱动程序 SAOLEDB.11 使用的 DLL。

    请注意,链接服务器(代理表)的 SQL Anywhere 版本运行正常,可以在单个事务中将 190 万行从 SQL Server 2008 表“拉”到 SQL Anywhere 11 数据库。此处显示的逻辑是尝试使用链接服务器功能来“推送”行;相同的方向,不同的语法。

    代码如下;执行三四次 EXECUTE copy_mss_t2 后,4G RAM 耗尽:
    EXEC sys.sp_configure 
    N'show advanced options',
    N'1'
    GO

    RECONFIGURE WITH OVERRIDE
    GO

    EXEC sys.sp_configure
    N'max server memory (MB)',
    N'2048'
    GO

    RECONFIGURE WITH OVERRIDE
    GO

    EXEC sys.sp_configure
    N'show advanced options',
    N'0'
    GO

    RECONFIGURE WITH OVERRIDE
    GO
    EXEC master.dbo.sp_MSset_oledb_prop
    N'SAOLEDB.11',
    N'AllowInProcess',
    1
    GO

    sp_addlinkedserver
    @server = 'mem',
    @srvproduct = 'SQL Anywhere OLE DB Provider',
    @provider = 'SAOLEDB.11',
    @datasrc = 'mem_PAVILION2'
    GO

    EXEC master.dbo.sp_serveroption
    @server=N'mem',
    @optname=N'rpc',
    @optvalue=N'true'
    GO

    EXEC master.dbo.sp_serveroption
    @server=N'mem',
    @optname=N'rpc out',
    @optvalue=N'true'
    GO

    sp_addlinkedsrvlogin
    @rmtsrvname = 'mem',
    @useself = 'false',
    @locallogin = NULL,
    @rmtuser = 'dba',
    @rmtpassword = 'sql'
    GO

    CREATE PROCEDURE copy_mss_t2
    @from_row BIGINT,
    @to_row BIGINT,
    @rows_copied_count BIGINT OUTPUT
    AS

    SELECT *
    INTO #t
    FROM ( SELECT *,
    ROW_NUMBER()
    OVER ( ORDER BY sample_set_number,
    connection_number )
    AS t2_row_number
    FROM mss_t2 ) AS ordered_mss_t2
    WHERE ordered_mss_t2.t2_row_number BETWEEN @from_row AND @to_row;

    SELECT @rows_copied_count = COUNT(*)
    FROM #t;

    INSERT INTO mem..dba.sa_t2
    SELECT sampling_id,
    sample_set_number,
    connection_number,
    blocker_owner_table_name,
    blocker_lock_type,
    blocker_owner_name,
    blocker_table_name,
    blocker_reason,
    blocker_row_identifier,
    current_engine_version,
    page_size,
    ApproximateCPUTime,
    BlockedOn,
    BytesReceived,
    BytesSent,
    CacheHits,
    CacheRead,
    "Commit",
    DiskRead,
    DiskWrite,
    FullCompare,
    IndAdd,
    IndLookup,
    Isolation_level,
    LastReqTime,
    LastStatement,
    LockCount,
    LockName,
    LockTableOID,
    LoginTime,
    LogWrite,
    Name,
    NodeAddress,
    Prepares,
    PrepStmt,
    QueryLowMemoryStrategy,
    QueryOptimized,
    QueryReused,
    ReqCountActive,
    ReqCountBlockContention,
    ReqCountBlockIO,
    ReqCountBlockLock,
    ReqCountUnscheduled,
    ReqStatus,
    ReqTimeActive,
    ReqTimeBlockContention,
    ReqTimeBlockIO,
    ReqTimeBlockLock,
    ReqTimeUnscheduled,
    ReqType,
    RequestsReceived,
    Rlbk,
    RollbackLogPages,
    TempFilePages,
    TransactionStartTime,
    UncommitOp,
    Userid,
    previous_ApproximateCPUTime,
    interval_ApproximateCPUTime,
    previous_Commit,
    interval_Commit,
    previous_Rlbk,
    interval_Rlbk
    FROM #t;

    GO

    DECLARE @rows_copied_count BIGINT
    EXECUTE copy_mss_t2 1110001, 1120000, @rows_copied_count OUTPUT
    SELECT @rows_copied_count
    GO

    EXECUTE create_linked_server
    GO

    DECLARE @rows_copied_count BIGINT
    EXECUTE copy_mss_t2 1120001, 1130000, @rows_copied_count OUTPUT
    SELECT @rows_copied_count
    GO

    EXECUTE create_linked_server
    GO

    这是 SQL Server 源表,包含大约 1G 数据,190 万行:
    CREATE TABLE mss_t2 (
    sampling_id BIGINT NOT NULL,
    sample_set_number BIGINT NOT NULL,
    connection_number BIGINT NOT NULL,
    blocker_owner_table_name VARCHAR ( 257 ) NULL,
    blocker_lock_type VARCHAR ( 32 ) NULL,
    blocker_owner_name VARCHAR ( 128 ) NULL,
    blocker_table_name VARCHAR ( 128 ) NULL,
    blocker_reason TEXT NULL,
    blocker_row_identifier VARCHAR ( 32 ) NULL,
    current_engine_version TEXT NOT NULL,
    page_size INTEGER NOT NULL,
    ApproximateCPUTime DECIMAL ( 30, 6 ) NULL,
    BlockedOn BIGINT NULL,
    BytesReceived BIGINT NULL,
    BytesSent BIGINT NULL,
    CacheHits BIGINT NULL,
    CacheRead BIGINT NULL,
    "Commit" BIGINT NULL,
    DiskRead BIGINT NULL,
    DiskWrite BIGINT NULL,
    FullCompare BIGINT NULL,
    IndAdd BIGINT NULL,
    IndLookup BIGINT NULL,
    Isolation_level BIGINT NULL,
    LastReqTime TEXT NOT NULL DEFAULT '1900-01-01',
    LastStatement TEXT NULL,
    LockCount BIGINT NULL,
    LockName BIGINT NULL,
    LockTableOID BIGINT NULL,
    LoginTime TEXT NOT NULL DEFAULT '1900-01-01',
    LogWrite BIGINT NULL,
    Name VARCHAR ( 128 ) NULL,
    NodeAddress TEXT NULL,
    Prepares BIGINT NULL,
    PrepStmt BIGINT NULL,
    QueryLowMemoryStrategy BIGINT NULL,
    QueryOptimized BIGINT NULL,
    QueryReused BIGINT NULL,
    ReqCountActive BIGINT NULL,
    ReqCountBlockContention BIGINT NULL,
    ReqCountBlockIO BIGINT NULL,
    ReqCountBlockLock BIGINT NULL,
    ReqCountUnscheduled BIGINT NULL,
    ReqStatus TEXT NULL,
    ReqTimeActive DECIMAL ( 30, 6 ) NULL,
    ReqTimeBlockContention DECIMAL ( 30, 6 ) NULL,
    ReqTimeBlockIO DECIMAL ( 30, 6 ) NULL,
    ReqTimeBlockLock DECIMAL ( 30, 6 ) NULL,
    ReqTimeUnscheduled DECIMAL ( 30, 6 ) NULL,
    ReqType TEXT NULL,
    RequestsReceived BIGINT NULL,
    Rlbk BIGINT NULL,
    RollbackLogPages BIGINT NULL,
    TempFilePages BIGINT NULL,
    TransactionStartTime TEXT NOT NULL DEFAULT '1900-01-01',
    UncommitOp BIGINT NULL,
    Userid VARCHAR ( 128 ) NULL,
    previous_ApproximateCPUTime DECIMAL ( 30, 6 ) NOT NULL DEFAULT 0.0,
    interval_ApproximateCPUTime AS ( COALESCE ( "ApproximateCPUTime", 0 ) - previous_ApproximateCPUTime ),
    previous_Commit BIGINT NOT NULL DEFAULT 0,
    interval_Commit AS ( COALESCE ( "Commit", 0 ) - previous_Commit ),
    previous_Rlbk BIGINT NOT NULL DEFAULT 0,
    interval_Rlbk AS ( COALESCE ( Rlbk, 0 ) - previous_Rlbk ) )

    这是 SQL Anywhere 11 中的目标表:
    CREATE TABLE sa_t2 (
    sampling_id BIGINT NOT NULL,
    sample_set_number BIGINT NOT NULL,
    connection_number BIGINT NOT NULL,
    blocker_owner_table_name VARCHAR ( 257 ) NULL,
    blocker_lock_type VARCHAR ( 32 ) NULL,
    blocker_owner_name VARCHAR ( 128 ) NULL,
    blocker_table_name VARCHAR ( 128 ) NULL,
    blocker_reason TEXT NULL,
    blocker_row_identifier VARCHAR ( 32 ) NULL,
    current_engine_version TEXT NOT NULL,
    page_size INTEGER NOT NULL,
    ApproximateCPUTime DECIMAL ( 30, 6 ) NULL,
    BlockedOn BIGINT NULL,
    BytesReceived BIGINT NULL,
    BytesSent BIGINT NULL,
    CacheHits BIGINT NULL,
    CacheRead BIGINT NULL,
    "Commit" BIGINT NULL,
    DiskRead BIGINT NULL,
    DiskWrite BIGINT NULL,
    FullCompare BIGINT NULL,
    IndAdd BIGINT NULL,
    IndLookup BIGINT NULL,
    Isolation_level BIGINT NULL,
    LastReqTime TEXT NOT NULL DEFAULT '1900-01-01',
    LastStatement TEXT NULL,
    LockCount BIGINT NULL,
    LockName BIGINT NULL,
    LockTableOID BIGINT NULL,
    LoginTime TEXT NOT NULL DEFAULT '1900-01-01',
    LogWrite BIGINT NULL,
    Name VARCHAR ( 128 ) NULL,
    NodeAddress TEXT NULL,
    Prepares BIGINT NULL,
    PrepStmt BIGINT NULL,
    QueryLowMemoryStrategy BIGINT NULL,
    QueryOptimized BIGINT NULL,
    QueryReused BIGINT NULL,
    ReqCountActive BIGINT NULL,
    ReqCountBlockContention BIGINT NULL,
    ReqCountBlockIO BIGINT NULL,
    ReqCountBlockLock BIGINT NULL,
    ReqCountUnscheduled BIGINT NULL,
    ReqStatus TEXT NULL,
    ReqTimeActive DECIMAL ( 30, 6 ) NULL,
    ReqTimeBlockContention DECIMAL ( 30, 6 ) NULL,
    ReqTimeBlockIO DECIMAL ( 30, 6 ) NULL,
    ReqTimeBlockLock DECIMAL ( 30, 6 ) NULL,
    ReqTimeUnscheduled DECIMAL ( 30, 6 ) NULL,
    ReqType TEXT NULL,
    RequestsReceived BIGINT NULL,
    Rlbk BIGINT NULL,
    RollbackLogPages BIGINT NULL,
    TempFilePages BIGINT NULL,
    TransactionStartTime TEXT NOT NULL DEFAULT '1900-01-01',
    UncommitOp BIGINT NULL,
    Userid VARCHAR ( 128 ) NULL,
    previous_ApproximateCPUTime DECIMAL ( 30, 6 ) NOT NULL DEFAULT 0.0,
    interval_ApproximateCPUTime DECIMAL ( 30, 6 ) NOT NULL COMPUTE ( COALESCE ( "ApproximateCPUTime", 0 ) - previous_ApproximateCPUTime ),
    previous_Commit BIGINT NOT NULL DEFAULT 0,
    interval_Commit BIGINT NOT NULL COMPUTE ( COALESCE ( "Commit", 0 ) - previous_Commit ),
    previous_Rlbk BIGINT NOT NULL DEFAULT 0,
    interval_Rlbk BIGINT NOT NULL COMPUTE ( COALESCE ( Rlbk, 0 ) - previous_Rlbk ),
    PRIMARY KEY ( sample_set_number, connection_number ) );

    最佳答案

    不需要清空临时表#t每次迭代后?即添加 TRUNCATE TABLE #t在您的程序结束时?我认为临时表 #t存在直到您的 session 结束,而不是直到存储过程结束。 SELECT INTO只是附加到现有的 #t ,但不会取代它。

    另一件事是使用永久表而不是存储在 tempdb 中的内容 #tables .

    关于sql-server-2008 - 资源池 'internal'系统内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537812/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com