Сервер MySQL перестает работать при большой вычислительной нагрузке [закрыто]

При выполнении присоединенной процедуры mysql зависает и больше не выполняет воспроизведение, пока не отменит задачу. Он устанавливается локально на машине с Windows. В целом его исполнение ужасно. Что делать?

// редактировать: Информация о системе: i7 3 ГГц, 8 ГБ ОЗУ, Windows 8.

CREATE PROCEDURE fix_lft_rgt_news ()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE v_char VARCHAR(1);
    DECLARE maximumId INT DEFAULT 1;
    DECLARE currentId INT DEFAULT 1;
    DECLARE currentLft INT DEFAULT 1;
    DECLARE categoryLft INT DEFAULT 1;
    DECLARE categoryId INT DEFAULT 1;
    DECLARE v_parseStr VARCHAR(255) DEFAULT ' ';

    SELECT MIN(id) INTO i FROM avsn_assets WHERE name LIKE 'com_content.article%';
    SELECT id INTO categoryId FROM avsn_assets WHERE title = 'News' AND name LIKE 'com_content.category%';
    SELECT lft INTO categoryLft FROM avsn_assets WHERE title = 'News' AND name LIKE 'com_content.category%';
    SELECT MAX(id) INTO maximumId FROM avsn_assets WHERE name LIKE 'com_content.article%';
    SET currentLft = categoryId + 1;

    WHILE (i <= maximumId )  DO 

        UPDATE `avsn_assets` SET `lft` = currentLft WHERE `id` = i;
        UPDATE `avsn_assets` SET `rgt` = currentLft + 1 WHERE `id` = i;

        SET currentLft = currentLft + 2;

        SET i = i + 1;
    END WHILE;
    UPDATE `avsn_assets` SET `rgt` = currentLft + 1 WHERE `id` = cateGoryId;    
END;
-1
задан 13 January 2013 в 21:44
1 ответ

Насколько мне известно, для этого не существует интерфейса WMI.

Мне не хватает вызова API, который предоставит мне всю эту информацию в одном место?

Ага. Вы можете получить данные из Win32 API. Точнее, из wtsapi32.dll. Вы можете написать программу на C или вызвать ее с помощью P / Invoke из C # или даже Powershell.

Поскольку вам, вероятно, нужен Powershell, я написал для вас сегодня утром:

# QuerySessionInformation.ps1
# Written by Ryan Ries, Jan. 2013, with help from MSDN and Stackoverflow.

$Code = @'
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
public class RDPInfo
{
    [DllImport("wtsapi32.dll")]
    static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

    [DllImport("wtsapi32.dll")]
    static extern void WTSCloseServer(IntPtr hServer);

    [DllImport("wtsapi32.dll")]
    static extern Int32 WTSEnumerateSessions(
        IntPtr hServer,
        [MarshalAs(UnmanagedType.U4)] Int32 Reserved,
        [MarshalAs(UnmanagedType.U4)] Int32 Version,
        ref IntPtr ppSessionInfo,
        [MarshalAs(UnmanagedType.U4)] ref Int32 pCount);

    [DllImport("wtsapi32.dll")]
    static extern void WTSFreeMemory(IntPtr pMemory);

    [DllImport("Wtsapi32.dll")]
    static extern bool WTSQuerySessionInformation(System.IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out System.IntPtr ppBuffer, out uint pBytesReturned);

    [StructLayout(LayoutKind.Sequential)]
    private struct WTS_SESSION_INFO
    {
        public Int32 SessionID;
        [MarshalAs(UnmanagedType.LPStr)]
        public String pWinStationName;
        public WTS_CONNECTSTATE_CLASS State;
    }

    public enum WTS_INFO_CLASS
    {
        WTSInitialProgram,
        WTSApplicationName,
        WTSWorkingDirectory,
        WTSOEMId,
        WTSSessionId,
        WTSUserName,
        WTSWinStationName,
        WTSDomainName,
        WTSConnectState,
        WTSClientBuildNumber,
        WTSClientName,
        WTSClientDirectory,
        WTSClientProductId,
        WTSClientHardwareId,
        WTSClientAddress,
        WTSClientDisplay,
        WTSClientProtocolType
    }

    public enum WTS_CONNECTSTATE_CLASS
    {
        WTSActive,
        WTSConnected,
        WTSConnectQuery,
        WTSShadow,
        WTSDisconnected,
        WTSIdle,
        WTSListen,
        WTSReset,
        WTSDown,
        WTSInit
    }

    public static IntPtr OpenServer(String Name)
    {
        IntPtr server = WTSOpenServer(Name);
        return server;
    }

    public static void CloseServer(IntPtr ServerHandle)
    {
        WTSCloseServer(ServerHandle);
    }

    public static void ListUsers(String ServerName)
    {
        IntPtr serverHandle = IntPtr.Zero;
        List<String> resultList = new List<string>();
        serverHandle = OpenServer(ServerName);

        try
        {
            IntPtr SessionInfoPtr = IntPtr.Zero;
            IntPtr userPtr = IntPtr.Zero;
            IntPtr domainPtr = IntPtr.Zero;
            IntPtr clientNamePtr = IntPtr.Zero;
            Int32 sessionCount = 0;
            Int32 retVal = WTSEnumerateSessions(serverHandle, 0, 1, ref SessionInfoPtr, ref sessionCount);
            Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO));
            Int32 currentSession = (int)SessionInfoPtr;
            uint bytes = 0;
            if (retVal != 0)
            {
                for (int i = 0; i < sessionCount; i++)
                {
                    WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)currentSession, typeof(WTS_SESSION_INFO));
                    currentSession += dataSize;

                    WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSUserName, out userPtr, out bytes);
                    WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSDomainName, out domainPtr, out bytes);
                    WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSClientName, out clientNamePtr, out bytes);

                    if(Marshal.PtrToStringAnsi(domainPtr).Length > 0 && Marshal.PtrToStringAnsi(userPtr).Length > 0)
                    {
                        if(Marshal.PtrToStringAnsi(clientNamePtr).Length < 1)                       
                            Console.WriteLine(Marshal.PtrToStringAnsi(domainPtr) + "\\" + Marshal.PtrToStringAnsi(userPtr) + "\tSessionID: " + si.SessionID + "\tClientName: n/a");
                        else
                            Console.WriteLine(Marshal.PtrToStringAnsi(domainPtr) + "\\" + Marshal.PtrToStringAnsi(userPtr) + "\tSessionID: " + si.SessionID + "\tClientName: " + Marshal.PtrToStringAnsi(clientNamePtr));
                    }
                    WTSFreeMemory(clientNamePtr);
                    WTSFreeMemory(userPtr);
                    WTSFreeMemory(domainPtr);
                }
                WTSFreeMemory(SessionInfoPtr);
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine("Exception: " + ex.Message);
        }
        finally
        {
            CloseServer(serverHandle);
        }
    }
}
'@

Add-Type $Code

Скопируйте все это в файл с именем QuerySessionInformation. ps1. Теперь запустите 32-разрядную версию Powershell в папке C: \ Windows \ SysWOW64 \ WindowsPowershell \ v1.0. В приведенном выше коде используются указатели, которые не будут работать в собственной 64-битной среде.

Теперь запустите сценарий. Если вы никогда раньше не запускали 32-разрядную версию Powershell на этом сервере, вам нужно будет изменить политику выполнения сценария с помощью Set-ExecutionPolicy, поскольку 32-разрядная и 64-разрядная версии Powershell имеют отдельные политики выполнения. Обратите внимание, что сам скрипт не должен выводить данные, поскольку все, что он делает, - это компиляция файла. NET и добавив его в текущую среду. Также обратите внимание, что после добавления типа с помощью Add-Type вы не можете выгрузить его, не выходя из сеанса Powershell ... AFAIK. Это делает отладку такого рода вещей действительно раздражающей, поскольку вам приходится перезапускать Powershell каждый раз, когда вы изменяете код.

Теперь, когда код загружен, введите следующее:

PS C:\> [RDPInfo]::ListUsers("REMOTESERVER")

Если есть какие-либо активные пользовательские сеансы на REMOTESERVER, вывод будет выглядеть так:

DOMAIN\UserName  SessionID: 2    ClientName: RYAN-PC

Это будет работать на удаленных компьютерах, а также на локальном компьютере, но будьте осторожны, если у пользователя, запускающего это, нет достаточных разрешений на удаленный компьютер, он потерпит неудачу без уведомления (без вывода).

Edit: В WTS_INFO_CLASS есть и другие фрагменты информации, которые могут вас заинтересовать, например WTSConnectState и WTSClientAddress. Все, что вам нужно сделать, это запросить их.

Изменить:

0
ответ дан 5 December 2019 в 20:48

Теги

Похожие вопросы