PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbank optimieren.


Sascha.
17.02.2002, 23:42
Hi!

Kann ich optimize nur für einzelne Tabellen anwenden oder auch für die ganze Datenbank?


Wäre ganz nützlich, wenn ich das ab und zu mal über die komplette db laufen lassen könnte....



Danke

Sascha

s.molinari
18.02.2002, 08:40
Hallo Sascha,

Nein "optimize" gilt nur für Tabellen. Du kannst aber mit

shell> myisamchk /path/to/database_dir/*.MYI (von www.mysql.com)

die ganze Datenbank überprüfen und optimieren. Dazu brauchst Du natürlich eine Telnet oder SSH Verbindung. "myisamchk" macht das gleiche wie "optimize". Du solltest auch ein Backup machen bevor Du sowas startest.;)

Scott

Znaper
18.02.2002, 18:20
Hier hast Du mal ein Skript um Deine DB zu optimieren.
Es stammt von AA auf dem gEb ich habe es nur ein bisschen verändert und um Funktionen erweitert.


<?php
if (function_exists("set_time_limit")==1 and get_cfg_var("safe_mode")==0) {
set_time_limit(1200);
}

require("config.php");

$dbclassname="db_$dbservertype.php";
require($dbclassname);

$DB_site=new DB_Sql_vb;
$DB_site->appname="Database_check";
$DB_site->appshortname="checkDB";
$DB_site->database=$dbname;
$DB_site->server=$servername;
$DB_site->user=$dbusername;
$DB_site->password=$dbpassword;
$DB_site->connect();

adminlog2("DB-Optimierung","");

function adminlog2 ($extrainfo="",$userid=-1,$script="",$scriptaction="") {
global $DB_site,$bbuserid,$PHP_SELF,$action;


$userid=$bbuserid;

if ($script=="") {
$script=basename($PHP_SELF);
}
if ($scriptaction=="") {
$scriptaction=$action;
}

$DB_site->query("INSERT INTO adminlog (adminlogid,userid,dateline,script,action,extrainfo) VALUES (NULL,'$userid',".time().",'".addslashes($script)."','".addslashes($scriptaction)."','".addslashes($extrainfo)."')");
}


$result=$DB_site->query("show tables");
$result2=$DB_site->query("show tables");
$result3=$DB_site->query("show tables");

while ($rowa = mysql_fetch_array ($result3)) {
if($rowa[0]!="session"){
$blahc=$DB_site->query("analyze table $rowa[0]");
}
}
echo "Table Analyze ausgeführt!<br>";

mysql_free_result ($result3);


while ($rowc = mysql_fetch_array ($result)) {
if($rowc[0]!="session"){
$blahc=$DB_site->query("check table $rowc[0] EXTENDED");
}
}
echo "Table Check ausgeführt!<br>";

mysql_free_result ($result);

echo "<tt><table bgcolor=#c0c0c0 cellpadding=4 cellspacing=1 border=0 width=\"90%\" align=center><tr bgcolor=#ffff99><td width='40%' nowrap><tt><b>Table</b></tt></td><td width='60%' nowrap><tt><b>Msg_text</b></tt></td></tr>";
echo "</table></tt>";

while ($row = mysql_fetch_array ($result2)) {
if($row[0]!="session"){
$blah=$DB_site->query("optimize table $row[0]");
$baba = mysql_fetch_array($blah);
$color="#FFCC66";
if($baba[Msg_text]=="Keine Veränderung seit der letzten Optimierung"){ $color="#CCFF99"; };
if($baba[Msg_text]=="OK"){ $color="#CCFFCC"; };
echo "<table bgcolor=#c0c0c0 cellpadding=4 cellspacing=1 border=0 width=\"90%\" align=center>";
echo "<tr bgcolor='$color'><td width='40%' nowrap><tt>".$baba[Table]."</tt></td><td width='60%'><tt>".$baba[Msg_text]."</tt></td></tr>";
echo "</table></tt>";
flush();
}
}

mysql_free_result ($result2);

?>


Speichere dies einfach unter dboptimize.php in Deinem Adminverzeichniss ab und führe es aus.


mfg Znaper

IcEmAn@GeR
11.05.2002, 13:58
@Znaper


Thanx für dein Script !!!

Das funzt alles eigentlich wunderbar nur bekomme ich die Fehlermeldung nachdem ich es ausgeführt habe :

Warning: Cannot set time limit in safe mode in /home/virtual/site30/fst/var/www/html/vbb/admin/dboptimize.php on line 3
Table Analyze ausgeführt!
Table Check ausgeführt!


aber in der Tabelle werden die Daten korrekt angezeigt ob OK oder Table is already up to date !!!


Ist das schlimm oder wie kann ich das beheben ??

TCM
28.05.2002, 21:20
thanks m8

Sebi
26.04.2003, 12:05
hehe funny skript ;)

ich habe das ganze mal bei mir getestet. und naja :D
also das skript lauft durch alles easy. nur bekomme ich eine fehler meldung bei der thread tabelle [ siehe bild ]

das porblem an der ganzen sache ist aber das dieses skript meine datenbank zersägt hat :D
habe dann erstmal ne vbulletin mail bekommen

Datenbank Fehler in vBulletin 2.3.0:

Invalid SQL: SELECT COUNT(*) AS count,postuserid,postusername FROM thread GROUP BY postuserid ORDER BY count DESC LIMIT 1
mysql error: Can't open file: 'thread.MYI'. (errno: 145)

mysql error number: 1016

Datum: Saturday 26th of April 2003 12:02:11 PM
Script: http://www.cnc-foren.de/
Referer:


nachdem ich die datenbank repariert habe über phpmyadmin ging wieder alles. nur ist das sicherlich nicht sinn eines optimirungs skripts oder?

pogo
26.04.2003, 12:43
Natürlich wär es gut, wenn du das Skript nochmal laufen lassen würdest, um zu überprüfen, ob es wirklich an dem Skript liegt.

Sebi
26.04.2003, 12:50
mmhhh

nun passiert nichts.
und es werden alle tabellen auf ok angezeigt.
auch die thread tabelle wird auf ok gesetzt.

Prankster
30.04.2003, 06:04
Könnte mir einer erklären , was das script von Znaper im genauen macht ?

grüsse Prankster

pogo
30.04.2003, 13:11
Es überprüft (http://www.mysql.de/doc/de/CHECK_TABLE.html), analysiert (http://www.mysql.de/doc/de/ANALYZE_TABLE.html) und optimiert (http://www.mysql.de/doc/de/OPTIMIZE_TABLE.html) die Tabellen.

Subu1
30.04.2003, 14:22
hab das Script mal übers Testboard laufen lassen, funktioniert, aber genau wie mein Vorgänger die gleiche Meldung

Warning: Cannot set time limit in safe mode in /home/virtual/site30/fst/var/www/html/vbb/admin/dboptimize.php on line 3
Table Analyze ausgeführt!
Table Check ausgeführt

Geschwindigkeitsveränderungen hab ich keine festgestellt, wofür sollte man das Script laufen lassen:confused: ;)

martin
07.05.2003, 00:43
der fehler entsteht durch das set_time_limit(1200); am anfang des skripts.
mit set_time_limit() kann man die maximal erlaubte ausführungszeit eines skripts in sekunden angeben. das funktioniert aber nicht wenn php im safe_mode läuft und/oder (da verwette ich meinen arsch drauf :D ) man einen puretec exclusiv server hat.
die funktion ist deshalb völlig ungeeignet für skripte, die nicht nur für den eigenbedarf bestimmt sind, sondern unter verschiedensten server-konfigurationen verwendet werden.

wenn du die ersten zeilen

if (function_exists("set_time_limit")==1 and get_cfg_var("safe_mode")==0) {
set_time_limit(1200);
}


durch

@set_time_limit(1200);


ersetzt, wird der fehler wenigstens nicht mehr angezeigt.

HerzZorro
01.11.2004, 11:08
Kann mir einer das script mal anpassen das ich meine ganze DB Optimieren kann, und nicht nur die Datenbank vom VB ?

Vieleicht sogar so umschreiben das ich gleich mehrere Datenbanken Obtimieren kann, da ich zwei getrennte habe.

Wäre echt nett wenn mir einer sowas machen könnte oder mir sagen wo ich sowas her bekomme.

Mystics
01.11.2004, 21:33
Das Skript ist nicht auf vBulletin-Tabellen beschränkt.

Bei vB3 brauchst du das Skript aber nicht, sondern du kannst deine komplette Datenbank auch damit optimieren:

Administrator-Kontrollzentrum -> Importieren & Wartung -> Tabellen reparieren/optimieren

HerzZorro
01.11.2004, 22:23
Das weis ich schon, aber ich meinte ein "unabhängiges" Script was ich einfach in mein ROOT verzeichnis kopieren kann und ausführen, und dann NICHT nur die Datenbank wo ich ein VB Board drauf habe, sondern "JEDE" beliebeige Datenbank auch "OHNE" einem VB Borad.

h75
01.11.2004, 22:52
Das Skript ist nicht auf vBulletin-Tabellen beschränkt. @HerzZorro: Wer lesen kann, ist klar im Vorteil...

Mystics
01.11.2004, 23:11
@HerzZorro: Wer lesen kann, ist klar im Vorteil...Er möchte ein Skript, das nicht die global.php von vBulletin verwendet und damit auch andere Datenbanken überprüfen kann.

h75
01.11.2004, 23:12
... Wer verstehen kann, ist klar im Vorteil... :o

Snatch
02.11.2004, 12:07
[code]
require($dbclassname);
[code]

Warning: main(db_.php): failed to open stream: No such file or directory in /var/www/web1/html/vb3/admincp/opt.php on line 9

Fatal error: main(): Failed opening required 'db_.php' (include_path='.::/usr/share/pear') in /var/www/web1/html/vb3/admincp/opt.php on line 9

Lightmaster-AH
02.11.2004, 16:04
Hallo zusammen,

habe hier mal ein Script ausgegraben, welches für jede db funktionieren soll. Dies Script ist nicht von mir, ich habe es mal vor Monaten irgendwo im Netz gefunden und abgespeichert. Es lief und läuft allerdings ohne Probleme bei einigen Projekten meiner Bekannten.

Bei Fragen kann ich also nur "bedingt" etwas dazu schreiben, da ich selbst eigentlich nur sehr wenig davon verstehe. Aber vielleicht können die Profis hier ja dann etwas dazu posten.

Hier nun die Infos zum Script:

dieses kleine Script repariert und optimiert täglich die Datenbank. Danach macht es einen komprimierten Dump, den man dann z.B. von zu Hause täglich runterladen kann.

Erstmal die Verzeichnisse /var/backup und /var/backup/logs anlegen. Man kann auch andere verwenden, dann muss man jedoch das script anpassen.

Das Passwort muss durch das mysql-root passwort ersetzt werden. Das script kann man dann z.B. als /usr/local/bin/mysqlbackup speichern. Man sollte es auf jedenfall auf chmod 700 setzten, damit niemand das root passwort lesen kann.

#!/bin/sh

date=`date -I`

case "$1" in
check)
echo Checking Databases ...
mysqlcheck --all-databases --auto-repair ..extended --optimize -uroot -ppassword > /var/databases/logs/check-$date.log
rm /var/databases/logs/check-current.log
ln -s /var/databases/logs/check-$date.log /var/databases/logs/check-current.log
;;
backup)
echo Saving Databases ...
mysqldump --all-databases -uroot -ppassword --opt | bzip2 -c > /var/databases/backup-$date.sql.bz2
rm /var/databases/backup-current.sql.bz2
ln -s /var/databases/backup-$date.sql.bz2 /var/databases/backup-current.sql.bz2
;;
restore)
echo Restoring Databases ...
bzcat /var/databases/backup-current.sql.bz2 | mysql -uroot -ppassword
;;
*)
echo "Usage: database {check|backup|restore}"
exit 1
esac
exit 0
jetzt noch wenn man möchte den Cronjob einrichten:
0 3 * * * /usr/local/bin/mysqlbackup
dies wir dann töglich um 3:00 Uhr ausgeführt.

Jetzt kann man noch /var/backup per ftp oder www (.htaccess?) erreichbar machen. Dazu richtet man zu Hause oder auf einem anderen Server einen cronjob ein, der jeden Tag databasebackup-current.sql.bz2 lädt. Unter /var/backup/logs kann man die logs von mysqlcheck einsehen.

Fertig ist das automatische tägliche Backup. Ohne Zusatzkosten, es fällt nur Traffic an.

Wenn man das Backup rückspielen möchte kann man folgenden Befehl benutzen:
bzcat databasebackup-current.sql.bz2 | mysql -uroot -ppasswort

Vielleicht hilft es ja einigen weiter. Wie erwähnt, ich selbst bin für weitere Fragen nicht der Richtige, aber wir haben hier ja genug Profis :) .

Gruß: Lightmaster-AH

eskito
12.12.2005, 11:05
Hallo zusammen,

ich weiss es gehört vielleicht nicht ganz hier hin, vielleicht hätte ich auch länger und woanders suchen sollen aber ich probiers einfgach, wenns nicht richtig ist bitte einfach löschen.

Ich hab ein Problem, klar sonst würd ich nicht hier posten.

Ich verwende aktuell vbulletin 3.0.7 mit vbportal 3.0.0 lief auch bisher recht Problemlos. Das Forum möchte und werde ich auch weiter verwenden, dann auch beizeiten in der aktuellen Version, von dem Portal möchte ich weg und zwar zu TYPO3 weil es ziemlich viel kann, wir es in der Firma einsetzen und ich gerade dabei bin mich einzuarbeiten.

Nun zu meinem Prob, wollte gestern Abend im vbPortal einen Artikel online stellen und hab dabei auf Datenbank optimieren geklickt, seitem habe ich folgenden Fehler:

Datenbankfehler in vBulletin 3.0.7:

Ungueltige SQL-Abfrage:
INSERT DELAYED INTO vbp_stats_hits (vbpstatsid, dateline, host, uri, query, port, protocol, method, connection, encoding, language, agent, referer, remoteip)
VALUES ('22dcb7eb2b8a4e07f6352f94b0a10961',
NOW(),
'www.twb-essen.de',
'/',
'',
1205,
'HTTP/1.1',
'GET',
'keep-alive',
'gzip,deflate',
'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.12) Gecko/20050919 Firefox/1.0.7',
'http://www.treffpunkt-westbahnhof.de/forums/index.php?',
'80.142.229.251')

mysql error: Unknown column 'vbpstatsid' in 'field list'

mysql error number: 1054

Datum: 12.12.2005 09:53:41
Skript: http://www.twb-essen.de/
Referer: http://www.treffpunkt-westbahnhof.de/forums/index.php?
Benutzername: Uwe
IP-Adresse: 80.142.229.251

Ich bin leider in MySQL nicht der Held und ich weiss nicht so recht weiter, im Forum des Portals bekommt man keine Hilfe ohne neue Mitgliedschaft, da ich aber umsteigen will möchte ich die Dollars nicht mehjr investieren. Allerdings werd ich wohl auch noch 2-3 Monate brauchen bis ich mit Typo soweit bin und es wär supergeil wenn hier jemand einen Tip für mich hätte.

Viele Grüße aus Bochum
Uwe

Mystics
12.12.2005, 20:42
In der Tabelle vbp_stats_hits gibt es das Feld vbpstatsid nicht mehr. Warum, keine Ahnung. Wie du es wieder her bekommst, keine Ahnung. Ich kenne das Skript nicht. Probiere es mal mit diesem Query (auf eigene Gefahr):ALTER TABLE vbp_stats_hits ADD vbpstatsid CHAR(32) NOT NULL;
ALTER TABLE vbp_stats_hits ADD PRIMARY KEY (vbpstatsid);PS: Ja, der Beitrag hat mit dem ursprünglichen Thema nichts zu tun ;)

eskito
12.12.2005, 21:01
Ich weiss Mike, ich wusste nur nicht wohin damit und wollte einen Tip von den SQL Freaks hier.

Hat sich erledigt, besten Dank trotzdem an alle die einen Blick drauf geworfen haben. Tabelle im phpmyadmin neu anlegen, die 14 Reihen die er beschreiben will eintragen, steht ja in dem Fehler wenn man mal liest, ich Idiot, und schon funzt es wieder.

Danke
Uwe

Philipp C. Gérard
27.12.2005, 23:30
Oder man gibt einfach folgenden, im obigen überflüssig langen Shell-Script enthaltenen Befehl ein:

mysqlcheck --all-databases --auto-repair --optimize -uroot -pPASSWORT

:)