Bereinigen einer Tabelle aus Bash-Script

traced

Registered User
Hiho, ich wollte mal fragen ob einer von Euch ne Lösung für mich hat:
Ich möchte gerne aus einer Datenbank, spezieller aus einer bestimmten Tabelle per Bash-Script alle Einträge löschen, die älter als z.B. sagen wir 30 Tage sind.

Danke & viele Grüße
Basti
 
Welcher Server?

Die gängigen (MySQL, PostgreSQL u.s.w.) haben ein Kommandozeilentool, dem man auf der Commandline eine Datei mit SQL-Statements mitgeben kann.

In der steht dann einfach "DELETE FROM table WHERE ...". Das ganze wird dann per Crond ausgeführt und fertig.
 
Öhm, verdammt, ich wusste dass ich was vergessen hab :-)
MySQL 5 auf Debian Lenny :rolleyes:

Ich kann das ja einfach mit mysql auf der Bash machen, das ist kein Thema, nur der Syntax für das Query ist mir ein Rätsel.

Basti
 
Also ich hätte zwei Felder über die man das lösen könnte:

timestamp, Datentyp ist "timestamp", z.B. "2008-05-20 14:03:37"
und
date, Datentyp ist "date", z.B. "2008-05-20"

Ich denke am einfachsten ist "date".

Danke,
Basti
 
Super, danke! Da hab ich doch schon mal die ersten Anhaltspunkte, den Rest sollte ich mit Tante Google bei einem Kaffee noch herausfinden, Lösung gibts dann hier :D

Merci,
Basti
 
DELETE LOW_PRIORITY FROM xxxxxx WHERE timestamp < (now() - INTERVAL 30 DAY);

brachte das gewünschte Ergebnis, jetzt muss ich nur noch schauen wie ich das per Bashscript automatisieren kann.
 
Ich hab die Commands in ein Textfile geschrieben, als Endung .sql (sollte aber egal sein *g*) Das ganze dann mit:

Code:
mysql datenbankname -u username -ppasswort < tolledatei.sql

der Inhalt der .sql:

Code:
DELETE LOW_PRIORITY FROM xxxxxx WHERE timestamp < (now() - INTERVAL 30 DAY);
OPTIMIZE TABLE xxxxxxx;

funktioniert auch ganz gut, nur is halt doof weil der Username und PW mit in dem Bashscript, bzw. dem Cronjob steht. Aber das werde ich warsch. nicht anders lösen können.

Oder ich erstelle einen eigenen Benutzer, der nur sehr beschränkte Rechte auf diese Datenbank hat, wie z.B. DELETE.

lg Basti
 
Es geht auch mit
Code:
echo "delete ....; optimize table;" | mysql -u.....
oder
mysql -u..... -e "delete ....; optimize table;"
So kann man auf die SQL-Datei verzichten.

huschi.
 
Danke für den Tip!
Hab mir auch überlegt einfach das in ein BashScript zu schreiben, und dieses mit SHC zu verschlüsseln, dann kann das Kennwort auch keiner lesen ;)

Huschi, also Du meinst schon dass auch alles in einer Zeile geht, oder?

Code:
mysql datenbankname -u username -ppasswort -e "DELETE LOW_PRIORITY FROM xxxxxx WHERE timestamp < (now() - INTERVAL 30 DAY); OPTIMIZE TABLE xxxxxxx;"
 
Jupp, sagte ich ja bereits.
Der SQL-Syntax kennt nur einen Trenner zwischen den Befehlen. Und das ist nicht CR oder NL, sondern das Semikolon.

huschi.
 
Back
Top