rss
twitter
  •  

SQL – Duplikate finden und löschen

| Posted in Technik |

22

Hin und wieder ist man mit doppelten Einträgen in einer Datenbank und dem Problem der Beseitigung konfrontiert. Nachfolgend zeige ich einen Weg, wie sich per SQL Duplikate effektiv finden und entfernen lassen.

Meine Test-Tabelle ist eine einfache Adresstabelle mit etwas über 400.000 Datensätzen und etlichen Duplikaten.

Der übliche Tipp zum Auffinden von Duplikaten mit Hilfe von GROUP BY und HAVING COUNT(*)>1 ist aber in meinen Augen sehr unpraktisch, wie die folgende Abbildung verdeutlicht.

Duplikate finden - Variante 1

Nicht wirklich praktikabel…

Viel anzufangen ist mit diesem Ergebnis nicht. Wir wissen jetzt zwar, daß wir doppelte Einträge in der Tabelle haben, aber das wußten wir vorher ja auch schon. Ein weiterer Nachteil dieser Abfrage ist die schlechte Performance im Vergleich zur nachfolgend vorgestellten Lösung.

Die wesentlich elegantere Variante ist die Verwendung einer sogenannten Correlated Subquery. Hinter dieser Art der Abfrage verbirgt sich ein indirekter Self-Join, da ein und dieselbe Tabelle in zwei miteinander in Wechselwirkung stehenden Abfragen gemeinsam verwendet wird. Über eine Correlated Subquery kann ich nun also alle doppelten (oder auch mehrfach vorkommenden) Datensätze mit jeweils einer einzigen SQL-Anweisung anzeigen bzw. löschen.

Mit der folgenden Abfrage lasse ich mir alle Datensätze anzeigen, in denen Vorwahl und Telefonnummer doppelt vorkommen.

SELECT Id, Vorname, Nachname, Strasse, PLZ, Ort, Vorwahl, Telefon
FROM testdat
WHERE EXISTS (
SELECT Id FROM testdat Dup WHERE testdat.Vorwahl = Dup.Vorwahl AND testdat.Telefon = Dup.Telefon AND testdat.Id <> Dup.Id)
ORDER BY Nachname;

Wie die nächste Abbildung zeigt, sind die gelieferten Informationen hier wesentlich ausführlicher.

aa

…schon besser!

Auf gleiche Weise kann ich nun auch die vorhandenen Duplikate aus der Tabelle löschen:

DELETE FROM testdat
WHERE EXISTS (
SELECT Id FROM testdat Dup WHERE testdat.Vorwahl = Dup.Vorwahl AND testdat.Telefon = Dup.Telefon AND testdat.Id < Dup.Id);

Damit werden nun alle Duplikate mit der kleineren Id gelöscht.

Blackberry Enterprise-Aktivierung nach Server-Crash

| Posted in Technik |

0

Wer schon einmal das „Glück“ hatte, einen Server tauschen zu müssen, auf dem Exchange und der Blackberry Enterprise Server (BES) laufen, und nach dem Tausch Probleme hatte, die Blackberrys wieder zu aktivieren, findet in diesem Artikel möglicherweise die Lösung.

Problem: Nach einem Crash des Exchange-Servers, Austausch des Servers, Wiederherstellung und Zurückspielen der Datensicherung klappt die (erneute) Blackberry-Aktivierung für vorhandene Postfächer nicht.

Im Blackberry Administration Service steht der Status für die entsprechenden User auf Initializing.

Das ALRT-Log enthält folgende Meldungen:

(AFFF4F29) -> {users email address} MAPIMailbox::CheckSearchCriteria - GetSearchCriteria (0x80040102) failed
(AFFF4F29) -> {users email address} MAPIMailbox::CheckMsgOnDeviceSearchCriteria - GetSearchCriteria (0x80040102) failed
(AFFF4EB8) -> OpenDatabase() failed for usernamee
(AFFF4EBA) -> User username not started
(6FFFC39F) -> 1 user(s) failed to initialize

Das MAGT-Log enthält außerdem diese Meldungen:

Starting handheld for username

[40704] (06/27 14:41:42.609):{0x258C} MAPIMailbox::MAPIMailbox(2) ServerDN= …
[40739] (06/27 14:41:42.609):{0x258C} MAPIMailbox::MAPIMailbox(2) - ResolveName[1] success for DisplayName= ...

[40204] (06/27 14:41:42.609):{0x258C} MailboxManager::GetMailboxSession - Using MAPI profile 'besadmin'

[40430] (06/27 14:41:42.609):{0x258C} {email address} MAPIMailbox::MAPIMailbox(2) - Mailbox opened on session 0x013dbd08

[40153] (06/27 14:41:42.609):{0x258C} PMDatabase::OpenNamedFolder: opening existing folder 'BlackBerryHandheldInfo'

[40155] (06/27 14:41:42.609):{0x258C} PMDatabase::OpenNamedFolder: opened an existing folder 'BlackBerryHandheldInfo'

[40158] (06/27 14:41:42.609):{0x258C} Pager::OpenClientDatabase: invalid number of messages in client folder , num msg = 4

[20152] (06/27 14:41:42.609):{0x258C} OpenDatabase() failed for username

[40205] (06/27 14:41:42.609):{0x258C} MailboxManager::CloseMailboxSession - closing session

[20154] (06/27 14:41:42.609):{0x258C} User username not started

Ursache: Im Postfach des Benutzers auf dem Exchange werden bei der Aktivierung für Blackberry versteckte Ordner angelegt (siehe Screenshot).

Blackberry - Versteckte Verzeichnisse

Versteckte Verzeichnisse in Blackberry-aktivierten Mailboxen

Der Ordner BlackBerryHandheldInfo verursacht in diesem Fall das Problem. Normalerweise wird dieser Ordner wohl entfernt, wenn ein Benutzer vom BES entfernt wird. In meinem Fall sind dieser Ordner bzw. die darin enthaltenen Informationen beim Zurückspielen der Datensicherung offensichtlich beschädigt worden.

Lösungsmöglichkeit 1: Der entsprechende Benutzer wird vom BES entfernt und neu hinzugefügt (hat in meinem Fall nichts gebracht).

Lösungsmöglichgeit 2: Mit einem Tool namens DBCLEAN.EXE können diese Informationen entfernt werden (hat bei mir auch nicht funktioniert).

Lösungsmöglichkeit 3: Entfernen des Ordners mit dem Microsoft Exchange MAPI Editor (MFCMAPI). Mit diesem Tool können Inhalte von Exchange direkt per MAPI verändert werden.

Lösungsmöglichkeit 4: Die Postfächer der betroffenen Benutzer mit Outlook exportieren, die Postfächer im Exchange löschen und neu anlegen und per Outlook wieder importieren. Zu beachten ist hierbei allerdings, dass beim Löschen des Postfachs mit Hilfe der Exchange-Verwaltungskonsole (ab Exchange 2007) auch gleich der Benutzer mitgelöscht wird. Besser ist es hier, das Postfach vom Benutzer zu trennen und mit Hilfe von Remove-Mailbox in der Exchange Verwaltungsshell zu löschen. Eine ausführliche Beschreibung von Remove-Mailbox ist in der Technet Lib von Microsoft zu finden.

Der Nachteil dieser Lösung: Bei großen Postfächern mit mehreren Gigabyte pro Postfach wird eine derartige Aktion zu einer absoluten Geduldsprobe. Vor allem bei der Kombination aus großem Postfach und Outlook 2010, sind Abstürze mitten im Import/Export-Vorgang nicht ausgeschlossen.

Lösungsmöglichkeit 5: Auch hier werden zunächst die betroffenen Postfächer vom Exchange gelöscht und neu angelegt und danach mit Hilfe der Datensicherung wieder mit Daten bestückt, wobei der Ordner BlackBerryHandheldInfo explizit ausgeklammert wird. Voraussetzung ist allerdings eine Datensicherung mit der Möglichkeit der Wiederherstellung auf Mailbox-Ebene, wie z. Bsp. Symantec Backup mit Exchange Agent. Außerdem sollte mach noch prüfen, welche Daten seit der letzten Sicherung geändert wurden und diese ggf. nochmal getrennt sichern. Diese Lösung hat bei mir letztendlich zum Erfolg geführt.

Aktive HTTP-Verbindungen

| Posted in Linux, Technik, Webserver |

0

Falls man mal herausfinden muss, wie viele aktive HTTP-Verbindungen der Apache gerade verarbeitet, kann man das mit folgendem Befehl:

netstat -n |grep ESTAB|grep '\:80 '|wc -l

Apache Benchmark Tool

| Posted in Linux, Technik |

0

Aufruf des Benchmarktools über die Kommandozeile mit:

#/usr/local/apache/bin/ab -n 1000 http://www.mysite.de/index.html

Der Schalter

-n

legt dabei die Anzahl der Requests fest (im Beispiel 1000). Die Ausgabe sieht dann in etwa so aus:

Concurrency Level: 1
Time taken for tests: 0.86 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 2602000 bytes
HTML transferred: 2274000 bytes
Requests per second: 5162.79[#/sec] (mean)
Time per request: 0.86[ms] (mean)...

Soll das Resultat direkt in eine HTML-Datei geschrieben werden, so lautet der Aufruf:

#/usr/local/apache/bin/ab -n 1000 ↵
 http://www.mysite.de/index.html -w > my_bench.html

Über den Schalter

-v

kann man die Ausgabe jetzt noch verfeinern. Dazu gibt es verschiedene Level (2,3,4):

#/usr/local/apache/bin/ab -n 1000 ↵
 http://www.mysite.de/index.html -v 3-w > my_bench.html

Der Aufruf

#/usr/local/apache/bin/ab -h

liefert noch weitere Infos.

Unverträglichkeiten zwischen DATEV und dem Microsoft .NET Framework 2.0

| Posted in Technik, Windows |

0

Problem: Zwischen dem Microsoft-Produkt .NET Framework 2.0 und DATEV-Programmen kann es zu Unverträglichkeiten kommen, wenn die DATEV-Programme im Netz installiert (d. h. Programmpfad liegt im Netz) sind. Man erhält in diesen Fällen am betroffenen PC in DATEVProgrammen unter Umständen Fehlermeldungen (z. B. beim Laden zusätzlicher Programmteile).

Abgesicherter Modus unter Windows

| Posted in Technik, Windows |

0

So gut wie jeder Windows-Nutzer war wohl schon in dieser Situation: Windows will nicht mehr starten. Wenn nicht gerade ein gravierendes Problem mit der verwendeten Hardware vorliegt, ist es oft eine verunglückte Treiber- oder Softwareinstallation, die das System ins Wanken bringt. Eine Möglichkeit, diese Situation zu meistern ist der „Abgesicherte Modus“. Doch was genau im abgesicherten Modus geladen wird oder auch nicht, daüber läßt einen das System im Dunkeln.

Hier also mal eine Aufstellung, der Basistreiber -und Dienste, die im abgesicherten Modus geladen werden:

1. Geräte bzw. deren Treiber

  • Diskettenlaufwerk (intern und/oder USB)
  • Interne CD/DVD-Laufwerke (IDE, SCSI)
  • Externe CD/DVD-Laufwerke (USB)
  • Interne Festplattenlaufwerke (IDE, SATA, SCSI)
  • Externe Festplattenlaufwerke (USB)
  • Tastaturen (USB, PS/2, seriell)
  • Mäuse (USB, PS/2, seriell)
  • Grafikkarten (Standardtreiber (vga.sys) mit Standard-VGA Auflösung von 640×480 Pixeln bei 16 Farben)

2. Windows-Dienste

  • Ereignisprotokolle
  • Verwaltung logischer Datenträger
  • Plug & Play
  • RPC-dienste
  • Kryptografiedienste
  • Hilfe und Support
  • Systemwiederherstellung
  • WMI (Windows-Verwaltungsinstrumentation)

3. Netzwerktreiber -und Dienste beim Start im abgesicherten Modus mit Netzwerktreibern

  • Netzwerkadapter (verkabeltes Ethernet und drahtloses 802.11x)
  • Computerbrowser
  • DHCP-Client
  • DNS-Client
  • Netlogon
  • Netzwerkverbindungen
  • Serverdienste
  • Terminaldienste
  • TCP/IP-NetBIOS-Hilfsprogramm
  • Upload-Manager
  • Konfigurationsfreie drahtlose Netzwerkverbindung
  • Arbeitsstationsdienst

Ansonsten werden noch einige Teile der Registry übersprungen, Autoexec.bat und Config.sys werden übersprungen und alle Autostartobjekte werden deaktiviert.

Da im abgesicherten Modus viele Hintergrundprozesse (Antivirenprogramme, Netzwerkkomponenten, Serverkomponenten) deaktiviert sind, hat man so die Möglichkeit, fehlerhafte Software (Treiber, Dienste, Programme) für den Normalstart zu deaktivieren oder gleich zu deinstallieren.

Datenbank sichern mit mysqldump

| Posted in Linux, Technik |

0

MySQL Datenbanken die bei einem Webhoster liegen sichert man bequem mit phpMyAdmin. In manchen Fällen ist phpMyAdmin aber nicht unbedingt das Tool der Wahl. Größere Datenbanken lassen sich meist schlecht sichern, da die meisten Webhoster der Ausführungszeit von PHP-Scripten beschränken. Auch der eigene Internetzugang kann einem schon einen Strich durch die Rechnung machen. Als Ergebnis gibts dann entweder einen Server-Fehler oder einen Timeout.

Hat man in seinem Hostingpaket aber Shellzugriff mit drin, so läßt sich dieses Problem bei den meisten Hostern umgehen. Man loggt sich per SSH auf dem Webserver ein und sichert seine Datenbank(en) mit dem Kommandozeilentool mysqldump.

Die allgemeine Sytax zum Sichern:

mysqldump [OPTIONS] database [tables]

Das folgende Beispiel sichert die Datenbank Datenbank in die Datei backup.sql:

mysqldump --opt datenbank > backup-file.sql

Bei Strato z. Bsp. würde der Aufruf folgendermaßen aussehen:

mysqldump --opt -h rdbms --user=username --password=passwort ↵
 DB123 > backup-file.sql

Mit „–opt“ werden einige Standareinstellungen des MySQL-Server aktiviert, „-h rdbms“ gibt den Host an, auf welchem die Datenbanken liegen (bei vielen Hostern liegen Webserver und Datenbanken auf unterschiedlichen Maschinen). Bei „–username“ und „–password“ natürlich die eigenen Benutzerangaben eintragen. Damit wird die Datenbank DB123 in die Datei backup-file.sql gesichert.

Sollte die Sicherung mit einem Fehler abbrechen, kann man noch die Option „–force“ verwenden, dann dumpt mysqldump auch bei Fehlern weiter.

Das Rücksichern des Backups übenimmt das Tool mysql. Der Aufruf ist ähnlich wie bei mysqldump:

mysql datenbank < backup-file

In meinem Beispiel also:

mysql -h rdbms --user=username --password=passwort DB123 < backup-file.sql

Somit hat man seine Datenbank auf einfache und schnelle Weise gesichert. Die Sicherungen kann man dann entweder auf dem Server archivieren, oder per FTP herunterladen. Da die Backupdatei eine reine Textdatei ist, läßt sich diese auch wunderbar komprimieren, damit sie für den Download etwas handlicher ist.

Das Ganze verpacke ich dann noch in ein Shellscript, so ist meine Datenbank mit einem Aufruf gesichert, komprimiert und bereit zur Archivierung:

#!/bin/sh
#Sicherung Datenbank

echo "Datenbank wird jetzt gesichert..."

DATESTRING=`date +"%Y-%m-%d"`
NEWNAME=db123_$DATESTRING

mysqldump -h euerhost --user=euername --password=euerpasswort ↵
DB123 > $NEWNAME.sql
gzip -9 -S .zip $NEWNAME.sql

echo "Die Datenbank nach $NEWNAME gesichert"

Dieses Script einfach in eine Textdatei kopieren und z. Bsp. dasi.sh benennen und dann per FTP auf den Server kopieren und per SSH auf dem Server einloggen. Bei vielen Hostern muss dann noch das Recht zum Ausführen gesetzt werden:

chmod u+x dasi.sh

und das Script dann mit

./dasi.sh

aufrufen. Fertig.

OODefrag: Dienst entfernen

| Posted in Technik, Windows |

0

Wurde OO-Defrag per Agent auf einem entfernten Rechner installiert, dann kann es passieren, daß dieser Agent bei der Deinstallation nicht sauber entfernt wird. Dieser muss dann manuell entfernt werden.

Der Aufruf von

x:\windows\system32\oocinst /unregserver

löscht den Dienst sauber aus der Registry. Danach kann die Datei gefahrlos gelöscht werden.