Seite 1 von 1

phpmyadmin Prozesse -> Liste mit alten Abfragen?

Verfasst: 03.05.2006 12:29
von mgutt
Man kann sich die aktive Prozessliste z.B. wie folgt anzeigen lassen:
http://www.php-faq.de/q/q-mssql-list-processes.html

In phpmyadmin kann man sich auch die Abfragen inkl. der ID anzeigen lassen. Werden die Abfragen nach Beendigung entfernt oder kann man die noch einsehen? Ich hätte gerne eine Einsicht über die Abfragen der letzten 120 Sekunden, falls das möglich ist.

Gruß

Verfasst: 03.05.2006 16:27
von Gumfuzi
Gute Frage.

Ich habe mir was gebastelt, wo ich alle SQL-Abfragen, die länger als x Sekunden (einstellbar) dauern, in eine logdatei (pro tag eine) am FTP speichert inkl. Usernamen, SQL-Befehl, Datei, Codezeile, etc.

Ist aber nur sinnvoll, wenn man den Sekundenwert auf mind. 5 Sekunden stellt, da sonst jede Abfrage geloggt wird - ich wollte nur die sehen, die eben lange brauchen.

Wäre aber schön, wenn es da wo in phpMyAdmin was gäbe...

Verfasst: 03.05.2006 22:07
von mgutt
Ich habe komischerweise manchmal Abfragen, die dauern bis zu 30 Sekunden.. aber ohne Inhalt.. also da steht dann immer nur "sleep". Daher würde ich mal gerne wissen, ob man an Hand der eigentlichen Abfrage eine Regelmäßigkeit erkennt.

Wie machst Du das denn mit den Abfragen, per PHP Script oder was serverbasierendes?

Verfasst: 03.05.2006 22:38
von Gumfuzi
php-basierend, mittels timer bei jeder im Forum ausgeführten Abfrage - also innerhalb der SQL-Funktion.
im Footer werden dann die einzelnen Abfragen, die eben länger als x Sekunden gedauert haben, izusammengefasst und in eine Logdatei geschrieben.

So sieht dann die Logdatei aus:
######################### Anfang SQL-Log User: xxxxx (IP: xxx.xxx.xxx.xxx) ##############################
### aufgerufene Seite: /phpBB2/statistics.php
### gekommen von: http://www.irgendeineseite.de/phpBB2/vi ... p?p=129496
### Browser: Mozilla/5.0 (Windows; U; WinNT4.0; de-AT; rv:1.4.1) Gecko/20031008

################## Zeitpunkt: 26.04.2006-07:26
### Datei: stat_modules/top_words/module.php
### Zeile: 86
### Zeit: 5.32241
### Abfrage: SELECT COUNT( swm.word_id ) word_count, swm.word_id word_id, swl.word_text word_text FROM phpbb_search_wordmatch swm, phpbb_search_wordlist swl WHERE swm.word_id = swl.word_id GROUP BY swm.word_id ORDER BY word_count DESC LIMIT 250
################## Ende Zeitpunkt ###

######################### Ende SQL-Log User: xxxxx ##############################



######################### Anfang SQL-Log User: Anonymous (IP: xxx.xxx.xxx.xxx) ##############################
### aufgerufene Seite: /phpBB2/viewtopic.php?t=3340&highlight=&
### gekommen von: http://images.google.de/imgres?imgurl=h ... eseite.de/...
### Browser: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2

################## Zeitpunkt: 26.04.2006-13:00
### Datei: viewtopic.php
### Zeile: 1140
### Zeit: 6.30536
### Abfrage: UPDATE phpbb_topics
SET topic_views = topic_views + 1
WHERE topic_id = 3340
################## Ende Zeitpunkt ###

######################### Ende SQL-Log User: Anonymous ##############################



######################### Anfang SQL-Log User: xxxxx (IP: xxx.xxx.xxx.xxx) ##############################
### aufgerufene Seite: /phpBB2/statistics.php
### gekommen von: http://www.irgendeineseite.de/phpBB2/se ... d=newposts
### Browser: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; de; rv:1.8.0.2) Gecko/20060328 Firefox/1.5.0.2

################## Zeitpunkt: 26.04.2006-20:37
### Datei: stat_modules/top_words/module.php
### Zeile: 86
### Zeit: 13.13647
### Abfrage: SELECT COUNT( swm.word_id ) word_count, swm.word_id word_id, swl.word_text word_text FROM phpbb_search_wordmatch swm, phpbb_search_wordlist swl WHERE swm.word_id = swl.word_id GROUP BY swm.word_id ORDER BY word_count DESC LIMIT 250
################## Ende Zeitpunkt ###

######################### Ende SQL-Log User: xxxxx ##############################
(sensible Daten wurden hier verändert)

Wenn innerhalb eines Seitenaufrufes mehrere SQL-Abfragen über der Zeit waren, dann kommt der Block "Zeitpunkt" mehrmals innerhalb eines Block des Users.

Die Idee kam daher, daß ich zwar eine Zeit hatte, wie lange der Seitenaufbau dauerte mit den %-Anteil alle SQL-Abfragen. Ich wollte aber eben wissen, welche Abfrage da so bremst.

Wobei man Einzelfälle nicht berücksichtigen kann, da es auch immer darauf an kommt, wieviele User exakt zur gleichen Zeit SQL-Abfragen machen bzw. noch sinnloser ist es bei Shared-Servern.

Wenn interesse besteht, kann ich mal nachschauen, wie die Codeänderungen aussehen und hier porten.

Verfasst: 03.05.2006 23:16
von Gumfuzi
Ich habe es mal eben in einen kleinen Mod verpackt:

Code: Alles auswählen

##############################################################
## MOD Title:           SQL-Log
## MOD Author:          Gumfuzi (www.gumfuzi.com)
## MOD Description:     Protokolliert in eine Log-Datei am Server (ohne zusätzliche SQL-Abfragen),
##                      sobald eine einzelne SQL-Abfrage mehr als eine einstellbare Anzahl an
##                      Sekunden benötigt.
##                      Diese Funktion kann deaktiviert werden, die Anzahl an Sekunden kann ebenso
##                      eingestellt werden - leider beides nicht via ACP, aber einfach im Quellcode.
##                      getestet auf phpBB ab Version 2.0.17
##
## MOD Version:         0.0.1
##
## Installation Level:  Easy
## Installation Time:   2-4 minutes
##
## Files To Edit (2) :  
##                      includes/page_tail.php
##                      db/mysql.php
##
############################################################## 
## Author Notes: 
## - ersetze im Code beim Einfügen in der page_tail.php das "/www/xxx/xxx/phpBB2/"
##   durch Deinen Pfad zum Forum! 
## - kann durch setzen der Variable "sql_log" in der page_tail.php rasch wieder
##   deaktiviert werden 
## - auch in der page_tail.php einstellbar: ab wieviel Sek. pro Abfrage geloggt
##   werden soll (siehe Quellcode)
##
############################################################## 
## MOD History:
##
## 08/05/2006- First release 0.0.1
##
############################################################## 
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD 
############################################################


# 
#-----[ OPEN ]------------------------------------------ 
#
includes/page_tail.php

#
#-----[ FIND ]------------------------------------------
#
exit;
?>

#
#-----[ BEFORE, ADD ]------------------------------------------
#
# ersetze im nachstehenden Code das "/www/xxx/xxx/phpBB2/" (ohne "xYz"!) durch Deinen Pfad zum Forum!

// SQL-Log Anfang
$sql_log = 1;
$cr = chr(13).chr(10);
if ($sql_log == 1)
{
	$zmtotal = $db->zmtotal;
	$abfrage1 = $db->abfrage;
	$abfrage = explode("xYz",$db->abfrage);
	$zmteil = explode("xYz",$db->zmteil);
	$zmfile = explode("xYz/www/xxx/xxx/phpBB2/",$db->zmfile);
	$zmline = explode("xYz",$db->zmline);
	$sl_aktuell = $_SERVER['REQUEST_URI'];
	$sl_referer = $_SERVER["HTTP_REFERER"];
	$sl_browser = getenv('HTTP_USER_AGENT');
	$sl_ip = GetIP();
	$co = 1;
	$sql_log_total = '######################### Anfang SQL-Log User: ' . $userdata['username'] . ' (IP: ' . 

$sl_ip . ') ##############################' . $cr;
	$sql_log_total = $sql_log_total . '### aufgerufene Seite: ' . $sl_aktuell . $cr . '### gekommen von: ' . 

$sl_referer . $cr . '### Browser: ' . $sl_browser . $cr;
	while ($abfrage[$co] <> "")
	{
		if ($zmteil[$co] >= 5) # hier die Sekunden eintragen, ab wieviel Sek. pro Abfrage geloggt werden 

soll!
		{
			$sql_log_abfrage = "";
			$sql_log_abfrage =  $cr .'################## Zeitpunkt: ' . date("d.m.Y-H:i",time()) . $cr;
			$sql_log_abfrage = $sql_log_abfrage . '### Datei: ' . $zmfile[$co] . $cr;
			$sql_log_abfrage = $sql_log_abfrage . '### Zeile: ' . $zmline[$co] . $cr;
			$sql_log_abfrage = $sql_log_abfrage . '### Zeit: ' . $zmteil[$co] . $cr;
			$sql_log_abfrage = $sql_log_abfrage . '### Abfrage: ' . $abfrage[$co] . $cr;
			$sql_log_abfrage = $sql_log_abfrage . '################## Ende Zeitpunkt ###' . $cr;
			$sql_log_total = $sql_log_total . $sql_log_abfrage . $cr;
			$sql_log_ja = 1;
		}
		$co++;
	}
	$sql_log_total = $sql_log_total . '######################### Ende SQL-Log User: ' . $userdata['username'] . 

' ##############################' . $cr . $cr . $cr . $cr;

	if ($sql_log_ja == 1)
	{
		$sl_time = str_replace(".", "-", max($zmteil));
		$avz = getcwd();
		$dateiname = date("Y_m_d",time()) . ".txt"; #  pro Tag eine Datei
#		$dateiname = date("Ymd_Hi",time()) . "_" . $sl_time . "_" . $userdata['user_id'] . "_" . 

rand(100,999) . ".txt"; #Jedes mal eine neue Datei
		$navz = $avz . "/log_sql";
		chdir($navz);
		$testa = getcwd();
		$abc = fopen($dateiname, a);
		fwrite($abc, $sql_log_total);
		fclose($abc);
		chdir($avz);
	}
}
// SQL-Log Ende


#
#-----[ OPEN ]------------------------------------------
#
db/mysql.php


#
#-----[ FIND ]------------------------------------------
#
	//
	// Base query method
	//
	function sql_query($query = "", $transaction = FALSE)
	{


#
#-----[ AFTER, ADD ]------------------------------------------
#
		// SQL-Zeitmessung Anfang
		$zmtime = microtime();
		$zmtime = explode(" ",$zmtime);
		$zmstart = $zmtime[1] + $zmtime[0];
		$abfrage = $query;
		$test = debug_backtrace();
		$this->zmfile .= "xYz" . $test[0]['file'];
		$this->zmline .= "xYz" . $test[0]['line'];
		// SQL-Zeitmessung Ende

#
#-----[ FIND ]------------------------------------------
#
		// Remove any pre-existing queries
		unset($this->query_result);
		if($query != "")
		{
			$this->num_queries++;

			$this->query_result = @mysql_query($query, $this->db_connect_id);
		}
		if($this->query_result)
		{
			unset($this->row[$this->query_result]);
			unset($this->rowset[$this->query_result]);


#
#-----[ AFTER, ADD ]------------------------------------------
#
		// SQL-Zeitmessung Anfang
		$zmtime = microtime();
		$zmtime = explode(" ",$zmtime);
		$zmende = $zmtime[1] + $zmtime[0];
		$zmtotal = round(($zmende - $zmstart), 5);
		$this->zmtotal += $zmtotal;
		$this->zmteil .= "xYz" . $zmtotal;
		$this->abfrage .= "xYz" . $abfrage;
		// SQL-Zeitmessung Ende



#
#-----[ FIND ]------------------------------------------
#
			return $this->query_result;
		}
		else
		{


#
#-----[ AFTER, ADD ]------------------------------------------
#
		// SQL-Zeitmessung Anfang
		$zmtime = microtime();
		$zmtime = explode(" ",$zmtime);
		$zmende = $zmtime[1] + $zmtime[0];
		$zmtotal = round(($zmende - $zmstart), 5);
		$this->zmtotal += $zmtotal;
		$this->zmteil .= "xYz" . $zmtotal;
		$this->abfrage .= "xYz" . $abfrage;
		// SQL-Zeitmessung Ende


#
#-----[ DO ]------------------------------------------
#
Einen Ordner "log_sql" als Unterordner im Forum-Root-Verzeichnis anlegen,
und mit CHMOD 777 einstellen


#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM

Verfasst: 26.11.2006 14:02
von mgutt
Erfordert die Loggeschichte noch was hier von:
http://www.phpbb.de/viewtopic.php?p=650594#650594

Oder ist das autark?

Korrekturvorschlag (Deine Funktion kann dann komplett raus)

Code: Alles auswählen

(IP: ' . 

decode_ip($user_ip) . ')