MySQL: Suchen und Ersetzen


Um in einer MySQL-Tabelle was zu suchen und zu ersetzen, gibts die REPLACE-Funktion. Das ermöglicht zum Beispiel folgende SQL-Statements:

UPDATE mytable SET mycolumn = REPLACE(mycolumn, 'old', 'new')

Klingt vielleicht trivial, aber das muss man erstmal wissen! Smile

MySQL: Einstellung für Maximalanzahl geöffneter Dateien wird nicht beachtet


Über die Konfigurationsoption open_files_limit kann festgelegt werden, wieviele gleichzeitig geöffnete Dateien MySQL vorhält. Unter bestimmten Umständen ist diese Zahl zu niedrig und man bekommt Fehler-Codes vom Kernel wie 23 bzw. 24. Diese bedeuten folgendes:

m@bheil.net:~> perror 23
OS error code  23:  Too many open files in system
m@bheil.net:~> perror 24
OS error code  24:  Too many open files

Es reicht meist nicht aus, nur durch open_files_limit die Maximal-Anzahl der offenen Dateien in MySQL zu erhöhen, sondern es gibt noch eine Maximalzahl pro Prozess im Kernel selbst. Diese muss ebenfalls angepasst werden. Eine einfache Methode ist, /etc/init.d/mysql zu bearbeiten und dort eine neue Maximalzahl mit ulimit anzugeben. Die Datei sieht dann im start-Abschnitt so aus:

case "${1:-''}" in
  'start')
	sanity_checks;
	# Start daemon
	log_daemon_msg "Starting MySQL database server" "mysqld"
	ulimit -n 4096

Wichtig ist der neue Eintrag ulimit -n 4096. Dies sorgt dafür, dass jeder einzelne Prozess 4096 Dateien gleichzeitig offen halten kann. Statt 4096 ist hier natürlich die gewünschte Zahl einzutragen.

Das Ganze sorgt dafür, dass die neue Maximal-Zahl immer beim Start von MySQL gesetzt wird. Da root das Skript ausführt, funktioniert das auch. Und da man eigentlich den SQL-Server nicht oft manuell neu startet, ist der Aufruf da gut aufgehoben. Aber natürlich könnte man auch ein eigenes Skript schreiben oder den Aufruf anderswo unterbringen.

MySQL: Wichtigste Tuning-Möglichkeiten


Tja, leider gibts ein paar Perfomance-Probleme momentan und ich denke, dass die mit MySQL zu tun haben. Da heißts nun ausprobieren. Dabei habe ich auch eine gute, knappe Seite gefunden über die Schräubchen, an den das Drehen am meisten bringt:

http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/

Backups aller MySQL-Datenbanken, Version 2

Kategorie Code 28.11.2007    Kategorie Code Code    Tags backup, bash, mysql    Kommentare 0 Kommentare

Ich habe das Skript, das in diesem Post beschrieben ist, überarbeitet. Nun macht es nicht nur Backups aller lokalen MySQL-Datenbanken, sondern löscht vorher auch alle Backups, die seit einer gewissen Anzahl an Tagen nicht mehr geändert wurden.
Vorteil: Im Backup-Verzeichnis liegt nun immer nur eine festgelegte Anzahl an Sicherungen. Das sieht dann z.B. so aus:

test@bheil-pc:~> ls /var/backups/sql/
insgesamt 28K
drwxr-xr-x 2 root root 4,0K 2007-11-22 06:03 2007.11.22
drwxr-xr-x 2 root root 4,0K 2007-11-23 06:03 2007.11.23
drwxr-xr-x 2 root root 4,0K 2007-11-24 06:03 2007.11.24
drwxr-xr-x 2 root root 4,0K 2007-11-25 06:03 2007.11.25
drwxr-xr-x 2 root root 4,0K 2007-11-26 06:03 2007.11.26
drwxr-xr-x 2 root root 4,0K 2007-11-27 06:03 2007.11.27
drwxr-xr-x 2 root root 4,0K 2007-11-28 15:27 2007.11.28

Man sieht also, es liegen generell immer Sicherungen der letzten 7 Tage bereit.

Hier nun das angepasst Skript:

#!/bin/bash

####################
# Das hier anpassen!
####################
# Das Sicherungsverzeichnis - hier landen alle Backups als 
# Unterverzeichnisse und nach Datum sortiert
# Achtung: Dieses Verzeichnis muss existieren und das
# Skript muss dort Schreibrechte besitzen!
SAVEDIR="/home/backup/sql"

# Anzahl der Sicherungen, sprich Tage - 6 steht fuer eine 
# Woche (7 Sicherungen, da die aktuelle nicht gezaehlt wird)
DAYSOLD="6"

# Temp-Verzeichnis (das Skript braucht dort Schreibrechte)
TMPDIR="/tmp"

# Root-Passwort zur MySQL-Datenbank
DBPWD="PASSWORT"

####################
# Ab hier i.d.R. keine Aenderung mehr noetig
####################

# Erzeuge Liste aller Datenbanken in $TMPDIR/dbaselist.txt
mysqlshow -u root -p$DBPWD | awk '{print $2}' | \
grep -v Databases | sort > $TMPDIR/dbaselist.txt

# Finde und loesche alles, was seit $DAYSOLD Tagen nicht 
# veraendert wurde
find $SAVEDIR -maxdepth 1 -mindepth 1 \
-mtime +$DAYSOLD -exec rm -rf {} \;

# Geh ins Sicherungsverzeichnis und lege ein Verzeichnis 
# des heutigen Datums an
cd $SAVEDIR
mkdir -p `date +%Y.%m.%d`
cd `date +%Y.%m.%d`

# Liste der Datenbanken durchgehen und Sicherung erstellen
for x in `cat /tmp/dbaselist.txt`; do
    mysqldump --opt -u root -p$DBPWD $x >$x.sql;
done;

# Aufraeumen
rm -f *.gz
rm -f /tmp/dbaselist.txt

# Alle Dateien zippen
gzip *

Backups aller MySQL-Datenbanken

Kategorie Code 11.09.2007    Kategorie Code Code    Tags backup, mysql    Kommentare 0 Kommentare

Wichtig:
Von diesem Skript gibt es eine überarbeitete Version hier!

Wie sichert man alle MySQL-Datenbanken eines Systems? Folgendes Skript funktioniert auf etlichen Systemen und erstellt ein Dump jeder Datenbank nach /var/backups/sql: