programing

실시간 MySQL 쿼리를 보려면 어떻게 해야 합니까?

randomtip 2022. 9. 23. 21:22
반응형

실시간 MySQL 쿼리를 보려면 어떻게 해야 합니까?

Linux 서버에서 발생한 MySQL 쿼리를 추적하려면 어떻게 해야 합니까?

예를 들어 청취자를 설정하고 웹 페이지를 요청하여 엔진이 실행한 모든 쿼리를 보거나 프로덕션 서버에서 실행 중인 모든 쿼리를 볼 수 있습니다.이거 어떻게 해?

모든 쿼리를 로그 파일에 매우 쉽게 기록할 수 있습니다.

mysql> SHOW VARIABLES LIKE "general_log%";

+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log      | OFF                        |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+

mysql> SET GLOBAL general_log = 'ON';

(db는 db입니다. 그 이외의 방법으로 GREP를 합니다./var/run/mysqld/mysqld.log

그럼 잊지 말고

mysql> SET GLOBAL general_log = 'OFF';

퍼포먼스가 저하되어 디스크가 가득 찰 것입니다.

명령어 MySQL 을 할 수 .SHOW FULL PROCESSLIST;어떤 쿼리가 처리되고 있는지 확인할 수 있지만, 원하는 것을 달성하지 못할 수도 있습니다.

서버를 사용하여 모든 응용 프로그램을 변경하지 않고 이력을 얻는 가장 좋은 방법은 트리거를 사용하는 것입니다.모든 쿼리를 실행할 때마다 쿼리가 일종의 이력 테이블에 삽입되도록 트리거를 설정한 다음 별도의 페이지를 생성하여 이 정보에 액세스할 수 있습니다.

이 것이 수 단, 추가의 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」에 해 주세요.INSERT모든 쿼리 위에 있습니다.


편집: 또 다른 방법은 일반 쿼리 로그입니다. 단, 플랫 파일에 기록하면 특히 실시간으로 표시할 수 있는 유연성이 크게 떨어집니다.GQL을 유효하게 한 후 실행함으로써 상황을 알기 쉬운 심플하고 구현이 용이한 방법을 선택합니다.tail -f★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

답변은 이미 접수되었지만, 가장 간단한 선택지를 제시하겠습니다.

$ mysqladmin -u bob -p -i 1 processlist

그러면 화면의 현재 쿼리가 매초 인쇄됩니다.

  • -u를 "로
  • -p비밀번호를 입력하도록 프롬프트 표시(파일에 저장하거나 명령 내역에 명령어가 표시되지 않도록 함)
  • i초단위의 간격.
  • 하다를 사용하세요.--verbose전체 프로세스 목록을 표시하고 각 프로세스에 대한 전체 쿼리를 표시합니다.(고마워 nmat)

단점이 있을 수 있습니다.설정된 간격 사이에 고속 쿼리가 실행되면 고속 쿼리가 표시되지 않을 수 있습니다. IE를 : "1초", "1초", "1초".02실행 시간(초)과 실행 간격(간격) 사이에 실행되므로 볼 수 없습니다.

수신기 또는 다른 항목을 설정하지 않고 실행 중인 쿼리를 빠르게 확인하려면 이 옵션을 사용하는 것이 좋습니다.

MySQL 쿼리 실행을 확인하려면 이 편리한 SQL 쿼리를 실행하십시오.코드 변경이나 오버헤드 없이 언제든지 원하는 환경에서 실행할 수 있습니다.MySQL 권한 구성이 필요할 수 있지만 특별한 설정 없이 실행됩니다.

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep';

유일한 문제는 실행 속도가 매우 빠른 쿼리를 자주 놓치기 때문에 장시간 실행되는 쿼리나 MySQL 서버에 백업 중인 쿼리가 있을 때 가장 유용하다는 것입니다. 제 경험상 지금이 바로 "실시간" 쿼리를 볼 때입니다.

조건을 추가하여 SQL 조회만 더 구체화할 수도 있습니다.

예: 5초 이상 실행 중인 모든 쿼리를 표시합니다.

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5;

예: 실행 중인 모든 업데이트 표시:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %';

상세한 것에 대하여는, http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html 를 참조해 주세요.

strace

실시간 MySQL/MariaDB 쿼리를 보는 가장 빠른 방법은 디버거를 사용하는 것입니다. 를 사용할 수 .strace예를 들어 다음과 같습니다.

sudo strace -e trace=read,write -s 2000 -fp $(pgrep -nf mysql) 2>&1

이스케이프 문자가 많으므로 파이프별로 strace 출력을 포맷할 수 있습니다(추가만 함).|위의 두 줄 사이의)를 다음 명령어로 변환합니다.

grep --line-buffered -o '".\+[^"]"' | grep --line-buffered -o '[^"]*[^"]' | while read -r line; do printf "%b" $line; done | tr "\r\n" "\275\276" | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"

따라서 구성 파일을 건드리지 않고 시간이 필요 없이 매우 깨끗한 SQL 쿼리를 볼 수 있습니다.

이는 SQL 서버를 새로고침해야 하는 일반적인 로그 활성화 방법을 대체하는 것은 아닙니다.

dtrace

MySQL 프로브를 사용하여 서버를 건드리지 않고 실시간 MySQL 쿼리를 봅니다.스크립트 예시:

#!/usr/sbin/dtrace -q
pid$target::*mysql_parse*:entry /* This probe is fired when the execution enters mysql_parse */
{
     printf("Query: %s\n", copyinstr(arg1));
}

위의 스크립트를 파일에 저장합니다(예:watch.d and:::::::::

pfexec dtrace -s watch.d -p $(pgrep -x mysqld)

상세: MySQL DTracing 시작하기

깁스 MySQL 스파이글래스

답을 보세요.

로그

다음은 개발 제안에 유용한 단계입니다.

도 이 을 더해서 쓰세요.~/.my.cnf 글로벌 "" " " " " " "my.cnf:

[mysqld]
general_log=1
general_log_file=/tmp/mysqld.log

로::/var/log/mysqld.log ★★★★★★★★★★★★★★★★★」/usr/local/var/log/mysqld.log파일 권한에 따라서는 동작할 수도 있습니다.

MySQL는 "MySQL/MariaDB"입니다).sudo다음 중 하나:

killall -HUP mysqld

다음으로 로그를 확인합니다.

tail -f /tmp/mysqld.log

후, 「」를 변경합니다.general_log로로 합니다.0할 수 ) 합니다.killall -HUP mysqld.

로그 온 권한이 없고 로그 온이 되어 있으면 로그를 볼 수 있는 권한이 없는 특정 상황입니다.트리거를 추가할 수는 없지만 show processlist를 호출할 권한은 있습니다.그래서 저는 최선을 다해서 이렇게 생각해 냈습니다.

"showsql processlist"라는 이름의 bash 스크립트를 만듭니다.

#!/bin/bash

while [ 1 -le 1 ]
do
         mysql --port=**** --protocol=tcp --password=**** --user=**** --host=**** -e "show processlist\G" | grep Info | grep -v processlist | grep -v "Info: NULL";
done

스크립트를 실행합니다.

./showsqlprocesslist > showsqlprocesslist.out &

출력을 테일링합니다.

tail -f showsqlprocesslist.out

빙고빵고.슬롯링이 되어 있지 않지만, 실행한 박스에서는 CPU 사용률이 2~4%에 불과했습니다.이게 도움이 됐으면 좋겠어요.

명령줄에서 다음을 실행할 수 있습니다.

watch --interval=[your-interval-in-seconds] "mysqladmin -u root -p[your-root-pw] processlist | grep [your-db-name]"

값 [x]를 값으로 바꿉니다.

또는 더 나은 방법:

 mysqladmin -u root -p -i 1 processlist;

Linux Ubuntu 머신에서 가장 쉬운 셋업입니다.생방송으로 모든 쿼리를 보는 것은 미친 짓이다.

MySQL 구성 파일(일반적으로 Ubuntu에서 /etc/mysql/my.cnf)을 찾아 엽니다."로깅 및 복제" 섹션을 찾습니다.

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.

log = /var/log/mysql/mysql.log

로그를 켜려면 "log" 변수의 주석을 해제하십시오.다음 명령을 사용하여 MySQL을 재시작합니다.

sudo /etc/init.d/mysql restart

이제 쿼리가 들어오는 대로 모니터링을 시작할 준비가 되었습니다.새 터미널을 열고 이 명령을 실행하여 로그 파일을 스크롤하고 필요에 따라 경로를 조정합니다.

tail -f /var/log/mysql/mysql.log

이제 응용 프로그램을 실행합니다.터미널 창에 데이터베이스 쿼리가 이동하기 시작하는 것을 볼 수 있습니다.(단말기에서 스크롤 및 이력이 활성화되어 있는지 확인합니다.)

송신원: http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/

mtop을 확인해 주세요.

저도 같은 일을 하고 싶다고 생각하고 있습니다.또한 다양한 투고로부터 솔루션을 짜고, 로그 파일에 쓰여질 때 라이브 쿼리 텍스트를 출력하는 작은 콘솔 앱을 만들었습니다.MySQL에서 Entity Framework를 사용하고 있으며 생성된 SQL을 검사할 수 있어야 하기 때문에 이 작업은 제 경우 매우 중요했습니다.

로그 파일을 작성하는 순서(간단하게 하기 위해서, 다른 투고와 중복되는 것도 있습니다).

  1. 다음 위치에 있는 파일을 편집합니다.

    C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.ini
    

    파일 하단에 "log=development.log"를 추가합니다(이 파일을 저장하려면 관리자 권한으로 텍스트 편집기를 실행해야 합니다).

  2. MySql 워크벤치를 사용하여 명령줄을 열고 암호를 입력합니다.

    실행된 모든 쿼리를 기록하는 일반 로깅을 켜려면 다음을 수행합니다.

    SET GLOBAL general_log = 'ON';
    
    To turn off:
    
    SET GLOBAL general_log = 'OFF';
    

    그러면 실행 중인 쿼리가 다음 위치에 있는 텍스트 파일에 기록됩니다.

    C:\ProgramData\MySQL\MySQL Server 5.5\data\development.log
    
  3. 로그 정보를 실시간으로 출력하는 콘솔 앱 만들기/실행:

    다운로드 가능한 소스

    출처:

    using System;
    using System.Configuration;
    using System.IO;
    using System.Threading;
    
    namespace LiveLogs.ConsoleApp
    {
      class Program
      {
        static void Main(string[] args)
        {
            // Console sizing can cause exceptions if you are using a 
            // small monitor. Change as required.
    
            Console.SetWindowSize(152, 58);
            Console.BufferHeight = 1500;
    
            string filePath = ConfigurationManager.AppSettings["MonitoredTextFilePath"];
    
            Console.Title = string.Format("Live Logs {0}", filePath);
    
            var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    
            // Move to the end of the stream so we do not read in existing
            // log text, only watch for new text.
    
            fileStream.Position = fileStream.Length;
    
            StreamReader streamReader;
    
            // Commented lines are for duplicating the log output as it's written to 
            // allow verification via a diff that the contents are the same and all 
            // is being output.
    
            // var fsWrite = new FileStream(@"C:\DuplicateFile.txt", FileMode.Create);
            // var sw = new StreamWriter(fsWrite);
    
            int rowNum = 0;
    
            while (true)
            {
                streamReader = new StreamReader(fileStream);
    
                string line;
                string rowStr;
    
                while (streamReader.Peek() != -1)
                {
                    rowNum++;
    
                    line = streamReader.ReadLine();
                    rowStr = rowNum.ToString();
    
                    string output = String.Format("{0} {1}:\t{2}", rowStr.PadLeft(6, '0'), DateTime.Now.ToLongTimeString(), line);
    
                    Console.WriteLine(output);
    
                    // sw.WriteLine(output);
                }
    
                // sw.Flush();
    
                Thread.Sleep(500);
            }
        }
      }
    }
    

일반적인 로깅을 활성화하는 방법을 설명한 이전 답변 외에 SQL이 로그에 기록되기 전에 vanilla MySql 5.6 설치에서 다음 변수 하나를 추가로 수정해야 했습니다.

SET GLOBAL log_output = 'FILE';

기본 설정은 'NONE'입니다.

깁스 MySQL 스파이글래스

AgilData는 최근 Gibbs MySQL Scalability Advisor(무료 셀프서비스 툴)를 출시하여 사용자가 Gibbs에 업로드할 쿼리의 라이브 스트림을 캡처할 수 있도록 하였습니다.Spyglass(오픈 소스)는 MySQL Server와 클라이언트 응용 프로그램 간의 상호 작용을 감시합니다.MySQL 데이터베이스 서버를 재구성하거나 다시 시작할 필요가 없습니다(클라이언트 또는 앱).

GitHub: AgilData/gibbs-mysql-spyglass

상세: MySQL을 녹슬게 캡처하는 패킷

설치 명령:

curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash

모니터링과 통계를 원하는 경우 Percona Monitoring and Management라는 오픈소스 툴이 있습니다.

그러나 이것은 서버 기반 시스템이기 때문에 시작하기에 그리 간단한 일은 아닙니다.

테스트용 라이브 데모 시스템도 갖추고 있습니다.

언급URL : https://stackoverflow.com/questions/568564/how-can-i-view-live-mysql-queries

반응형