Sybase
Die Firma Sybase (engl. system, database) wurde 1984 gegründet, hat ihren Firmensitz in Dublin (Kalifornien, USA) und ist Hersteller von Produkten in den Bereichen Informationsmanagement, Entwicklung und Integration, Mobile Lösungen und spezielle Geschäftslösungen. In diese Bereiche fallen vor allem Datenbanken, Entwicklungs- und Design-Werkzeuge, Synchronisations- und Replikations-Software sowie Produkte für das Mobile Enterprise (PDA, Handy usw.).
Die Stärken des RDBMS von Sybase sind:
- Geschwindigkeit (besonders unter Linux)
- einfache Installation und Administration
- einfache Erlernbarkeit
- gute Ausnutzung der Systemressourcen
- Total Cost of Ownership
Produkte
Zu den bekanntesten Sybase-Produkten zählen:
- Sybase Adaptive Server Enterprise
- Adaptive Server Anywhere
- PowerBuilder
- PowerDesigner
- SQL Anywhere
Geschichte
Jahr | Ereignis |
---|---|
1984 | Firmengründung |
"Sybase SQL Server" ist das erste Client-Server-RDBMS | |
1988 | Sybase SQL Server 3.0 (stored procedures, trigger, cost-based query optimizer) |
Microsoft vertreibt Sybase SQL Server als "Microsoft SQL Server" für OS/2 und (später) für Windows NT | |
1990 | Sybase SQL Server 4.0: (Datentypen image und text) |
Sybase SQL Server 4.9.2 entspricht Microsoft SQL Server Version 4.2.2 | |
1993 | Sybase SQL Server X (=10) (mit Backup Server, Identity-Spalten, Cursor) |
1994 | Verkauf des Quellcodes an Microsoft, getrennte Weiterentwicklung |
1995 | Sybase SQL Server 11.0 (named cache, dirty read, sp_sysmon) |
1997 | Umbenennung von Sybase SQL Server in "Adaptive Server Enterprise" (ASE) 11.5 (proxy-Tabellen, XP-Server) |
1998 | Sybase Adaptive Server Enterprise 11.9 EARL (eagerly awaited row-level locking) |
1999 | Sybase Adaptive Server Enterprise 12.0 (Änderung Installationsbaum, Java-Unterstützung) |
2001 | Sybase Adaptive Server Enterprise 12.5 (union views, wählbare Pagegrösse) |
2003.10 | Sybase Adaptive Server Enterprise 12.5.1 (Datentypen date und time Datentypen, dynamic data cache) |
2005 | Sybase Adaptive Server Enterprise 12.5.3 und Sybase Adaptive Server Enterprise 15.0 (verbesserter Optimizer, computed columns, acrollable cursors, Datentyp unitext) |
2006 | Sybase Adaptive Server Enterprise 12.5.4 und Sybase Adaptive Server Enterprise 15.0.1 |
Verwendung
Anzahl der Benutzer mit männlichem Geschlecht.
select count(*) from d02ben where d02sex="M"
Anzahl der Benutzer von Zweigstelle 00, die seit dem 1. Dezember 2001 aktiv waren.
Achtung: Die Werte von Feldern (hier "d02zweig") des Typs SMALLINT dürfen nicht in Anführungszeichen gesetzt werden!
select count(*) from d02ben where d02ladatum>"30.11.2001" and d02zweig=00
Anzeige der Mediennummer aller Buchdatensätze, die seit dem 3. Juli 2003 zurückgegeben wurden.
select d01gsi from d01buch where d01lrv2>="03.07.2003"
Anzeige der Mediennummer aller Buchdatensätze, die in der Abteilung 01 der Zweigstelle 00 stehen.
Achtung: Die Werte von Feldern (hier "d01abtlg" und "d01zweig") des Typs SMALLINT dürfen nicht in Anführungszeichen gesetzt werden!
select d01gsi from d01buch where d01abtlg=01 and d01zweig=00
Anzeige von Mediennummer und Signatur aller Buchdatensätze mit mehr als drei Vormerkungen.
Achtung: Die Werte von Feldern (hier "d01vmanz") des Typs SMALLINT dürfen nicht in Anführungszeichen gesetzt werden!
select d01gsi, d01ort from d01buch where d01vmanz>3
Anzeige von Signatur, Mediennummer, Anzahl der Ausleihen im Vorjahr sowie Anzahl der Ausleihen im laufenden Jahr aller Buchdatensätze mit der Systematiknummer 10. Achtung: Die Werte von Feldern (hier "d01abtlg" und "d01mart") des Typs SMALLINT dürfen nicht in Anführungszeichen gesetzt werden!
select d01ort, d01gsi, d01svjanz, d01sljanz from d01buch where d01mart=10
Anzeige der aktuellen Datenbank.
select db_name()
Zur Ausführung von Abfragen innerhalb eines Skripts können zwei Schreibweisen verwendet werden.
/opt/sybase/OCS-12_5/bin/isql -b -s "|" -w 1024 -U<Benutzer> -P<Passwort> \ -D<Datenbank> <<!!! >> /tmp/ausgabedatei select count(*) from d02ben go !!!
oder
printf "select count(*) from d02ben\ngo\n" |\ /opt/sybase/OCS-12_5/bin/isql -b -s "|" -w 1024 -U<Benutzer> -P<Passwort> \ -D<Datenbank> >> /tmp/ausgabedatei
Datenbankchecks
#!/bin/bash # # Sybase ASE database checks for database "sisis" # ## set -x PASSWORD=xxxxxx # Password for user "sa" PATH=$PATH:/usr/local/bin . /opt/lib/sisis/etc/syb.rc for DATABASE in sisis do SC_SQL="/opt/sybase/OCS-12_5/bin/isql -b -w 160 -Usa -P${PASSWORD} \ -SsisisSYB -D${DATABASE}" printf "dbcc checkdb(${DATABASE})\ngo\n" | \ $SC_SQL > /tmp/infofile1.checkdb.${DATABASE} printf "dbcc checkcatalog(${DATABASE})\ngo\n" | \ $SC_SQL > /tmp/infofile2.checkcatalog.${DATABASE} printf "dbcc checkalloc(${DATABASE}, nofix)\ngo\n" | \ $SC_SQL > /tmp/infofile3.checkalloc.${DATABASE} done
Im Fehlerfall ausführen des Datenbankchecks im "single user"-Modus.
$ SybSQLsa 1> use master 2> go 1> sp_dboption msisis, "single user", true 2> go Database option 'single user' turned ON for database 'msisis'. Running CHECKPOINT on database 'msisis' for option 'single user' to take effect. (return status = 0) 1> use msisis 2> go 1> checkpoint 2> go 1> dbcc checkalloc 2> go 1> use master 2> go 1> sp_dboption dbname, "single user", false 2> go 1> use dbname 2> go 1> checkpoint 2> go
Fehlermeldungen
Hängende Bandsicherung
Hängende Bandsicherung sichtbar in "sisisSYBbackup.errorlog".
May 15 22:00:00 2006: Backup Server: 6.53.1.1: OPERATOR: Volume on device '/dev/ nrmt0' cannot be opened for write access. Mount another volume. May 15 22:00:00 2006: Backup Server: 6.78.1.1: EXECUTE sp_volchanged @session_id = 18, @devname = '/dev/nrmt0', @action = { 'PROCEED' | 'RETRY' | 'ABORT' }, @vname = <new_volume_name>
Abbrechen mit
1> sp_volchanged 18, '/dev/nrmt0', 'ABORT' 2> go
Danach manuelle Sicherung durchführen.
engine x not online
Fehlermeldung in "sisisSYB.errorlog".
01:00000:00011:2010/05/20 10:58:37.06 kernel kesetown: engine 2 not online 01:00000:00011:2010/05/20 10:58:37.06 kernel upsetaffinity: can't affinity to engine 2 for kpid 917518 01:00000:00011:2010/05/20 10:58:37.06 kernel upsetaffinity: can't affinity to engine 2 for kpid 917518
Kann behoben werden wie folgt:
# vi sysctl.conf kernel.randomize_va_space = 0 # sysctl -p
Transaktionen
Verhindern des Abschneidens der Transaktionslogs (normaler Zustand für den Datenbankbetrieb mit SISIS-SunRise).
# su - sisis $ $SYBASE/OCS-12_5/bin/isql -Usa -Pxxxxxx -SsisisSYB 1> sp_dboption sisis, "trunc. log on chkpt.", false 2> go 1> use sisis 2> go 1> checkpoint 2> go 1> quit
Löschen aller inaktiven Transaktionen aus den Logs der Datenbank "sisis". Es wird dabei keine Kopie des Logs erstellt.
# su - sisis $ $SYBASE/OCS-12_5/bin/isql -Usa -Pxxxxxx -SsisisSYB 1> dump tran sisis with truncate_only 2> go
Datenbank vergrössern
Bestehende Datenbank "sisis" wird um 500 MB vergössert:
Amlegen eines 500 MB grossen Datenbankdevice namens "DATAsisisDev2".
$ vi /home/sisis/sc/DiskInit.sql disk init name="DATAsisis2Dev", physname="/SunRiseDatabase/sybaseDatabase/DATAsisisDev2", size="500M", dsync=false go $ . /opt/lib/sisis/etc/syb.rc && export LC_ALL=de $ $SYBASE/OCS-15_0/bin/isql -Usa -Pxxxxxx -SsisisSYB -i /home/sisis/sc/DiskInit.sql
Hinzufügen des neuen Datenbankdevice "DATAsisisDev2" zur Datenbank "sisis"
$ SybSQLsa 1> alter database sisis on DATAsisisDev2 = "500M" 2> go
Datenbankdevices löschen
Beispiel.
1> drop database abc 2> go 1> sp_dropdevice DATAabcDev 2> go 1> sp_dropdevice LOGabcDev 2> go
Sybase-Server stoppen.
Physikalische Dateien löschen.
Sybase-Server wieder starten.
Datenbank entladen und laden
Erstellen einer Sicherung mit Skript "SYBASEsave.sh".
#!/bin/bash # # Sybase ASE database backup # PATH=$PATH:/usr/local/bin . $(pkgparam sisisbase SISISROOT)/etc/syb.rc # Password of Sybase user "sa" PASSWORD=$(cat $SISISROOT/etc/syb/syb.pw | grep ^sa: | awk -F: '{ print $2 }' | tr -d '\012') BACKUPPATH=/backup/sybase SC_SQL="/opt/sybase/OCS-12_5/bin/isql -Usa -P${PASSWORD} -SsisisSYB" for DATABASE in bsisis gsisis lsisis msisis sisis do DATE=$(date +%Y%m%d-%H%M) printf "dump database ${DATABASE} to \"compress::${BACKUPPATH}/DBSAVE${DATABASE}.${DATE}.cdmp\"\ngo\n" | $SC_SQL done
Erstellen einer Sicherung der Datenbank "sisis".
$ $SYBASE/OCS-12_5/bin/isql -Usa -Pxxxxxx 1> dump database sisis to "/backup/sybase/dump-1" 2> stripe on "/backup/sybase/dump-2" 3> stripe on "/backup/sybase/dump-3" 4> go
Datenbank "sisis" in bestehenden DBspace laden.
$ $SYBASE/OCS/bin/isql -Usa -Pxxxxxx 1> load database sisis from "/backup/sybase/dump-1" 2> stripe on "/backup/sybase/dump-2" 3> stripe on "/backup/sybase/dump-3" 4> go 1> online database sisis 2> go
Jeder "dump"- bzw. "load"-Befehl kann bis zu 31 "stripe on"-Klauseln besitzen (was insgesamt 32 dump devices ergibt).
Entladen von Daten
Schreiben der Ergebnisse einer Abfrage in die Datei "/tmp/outfile".
$ printf "select count(*) from d01buch\ngo\n" | \ /opt/sybase/OCS-12_5/bin/isql -b -s "|" -w 1024 \ -U<Benutzer> -P<Passwort> -D<Datenbank> > /tmp/outfile
entladen.sh
#!/bin/sh read -p "Select-Abfrage? " abfrage if [ "$(echo "$abfrage" | awk '{ print $1 }')" != "select" ]; then echo "Der Befehl beginnt nicht mit \"select\" - Abbruch!!!" exit 1 fi tmp=$(mktemp /tmp/temp.XXXXXX) echo "" echo "Die Abfrage wird jetzt ausgeführt..." printf "${abfrage}\ngo\n" | \ $SC_SQL -b -s ";" -w 1024 -Usisis -P<password> -SsisisSYB -Dsisis > ${tmp} echo "" echo "Die ersten 10 Zeilen der Entladedatei sehen so aus:" echo "" head ${tmp} echo "" echo "Die Datei steht unter ${tmp}" echo ""
dbtool
Unter Sybase kann mit dem SISIS-Werkzeug "dbtool" entladen werden (leider nicht so bequem wie unter Informix mit "unload").
login: sisis $ export DBS=syb DATABASE=sisis $ /home/sisis/sc/dbtool steuerdatei
Die Steuerdatei muss vorher mit "vi" angelegt werden:
1. Entladen aller Datensätze
@@UNLOAD sisisinst /tmp/sisisinst.load @@END
2. Entladen aller Datensätze, aber nur zwei Spalten
@@UNLOAD sisisinst /tmp/sisisinst.load @@FIELDS datum version @@END
3. Entladen von zwei Spalten mit where-Bedingung
@@UNLOAD sisisinst /tmp/sisisinst.load @@FIELDS datum version @@WHERE version=V3.0A00 @@END
Ausgabe von Systematiknummer und Mediennummer aller Buchdatensätze mit der Systematiknummer 11 in die Datei "/tmp/ergebnis". Achtung: Die Werte von Feldern (hier "d01mart") des Typs SMALLINT dürfen nicht in Anführungszeichen gesetzt werden!
@@UNLOAD d01buch /tmp/ergebnis @@FIELDS d01mart d01gsi @@WHERE d01mart=11 @@END
4. Entladen von zwei Spalten aus zwei unterschiedlichen Tabellen
Zuerst muss ein view (hier "bibliotheca") angelegt werden.
$ $SYBASE/OCS/bin/isql -Usisis -Psisis123 -SsisisSYB -Dsisis 1> create view bibliotheca as 2> select d01gsi, titel from d01buch, titel_dupdaten where d01katkey=katkey 3> go 1> quit $ export DBS=syb $ export DATABASE=sisis $ /home/sisis/sc/dbtool connected to Sybase:sisis @@UNLOAD bibliotheca /tmp/bibliotheca.unl @@END begin operation: UNLOAD (bibliotheca) 370020 rows unloaded... command executed CTRL+C
loadINFintoSYB.sh.txt
Achtung: Zu diesem Thema gibt es auch ein offizielles Dokument.
Wechsel ins Verzeichnis, wo sich die Informix db-schema-Datei befindet und Setzen der Umgebung. Name der Beispieldatenbank ist hier "kbu".
$ cd ..../dbexport.kbu $ export DBS=syb $ export DATABASE=kbu $ export SISISHOME=$(pkgparam sisisbase SISISHOME) $ export LANG=de $ export AREA=/tmp
Hinzufügen des Pfads zu Perl zur Variable PATH.
$ export PATH=$PATH:/usr/local/sisis-pap/bin
Aufruf des Skripts "loadINFintoSYB.sh".
$ $SISISHOME/sc/loadINFintoSYB.sh -a
Eine einzelne Tabelle kann wie folgt aus einer Datei geladen werden.
$ $SISISHOME/sc/loadINFintoSYB.sh -t <Tabellenname> -f <Informix-unload-Datei>
Datenstruktur auf Bandsicherung
Möglicherweise hilfreich sind folgende Sätze:
They were actually a workaround for the problem that arises when multiple dumps are saved with the same name to one tape - when loading a dump by name, ASE will always load the first one on the tape - but is applicable to your issue as well When you dump a DB on tape, you will have in fact 3 "files" on the tape for each dump, one for "header", one for "data" and one for "trailer/end". So if you have dumped 20 times a DB on your tape, you would have 20*3 files on the tape. If you want to reload the last (20th) one (and gave the same name for each dump), you would have to build a new tape. 1- get the first "header" (that is different than next header) % dd if=/dev/rmt/0lbn of=/tmp/header01 bs=2048 where 'if=' is the name of his tape device without rewind on close (letter 'n' in '0lbn') and where 'bs=' is the block size. I put 2048, because I have used this value duing my dump command. 2- skip the rest of the first dump % mt -f /dev/rmt/0lbn fsf 2 where 'fsf' is to forward the tape and '2' is to do it 2 times. 3- skip dump #2 to dump #19 (exemple in csh) % foreach i (2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19) ? mt -f /dev/rmt/0lbn fsf 3 ? end where 'fsf' is to forward the tape and '3' is to do it 3 times. 4- skip the "header" of the wanted dump. % mt -f /dev/rmt/0lbn 5- get the "data" of the wanted dump % dd if=/dev/rmt/0lbn of=/tmp/data20 bs=2048 6- get the "trailer" block of the wanted dump % dd if=/dev/rmt/0lbn of=/tmp/trail20 bs=2048 now with theses files, build a new tape : (dont use the same tape, in case of ...) 1- rewind the tape (to be sure) % mt -f /dev/rmt/0lb rewind 2- copy the "header" onto the tape : % dd if=/tmp/header01 of=/dev/rmt/0lbn bs=2048 where 'bs=' is the block size, customer may adjust this value. 3- copy the "data" onto the tape : % dd if=/tmp/data20 of=/dev/rmt/0lbn bs=2048 4- copy the "trailer" block onto the tape : % dd if=/tmp/trail20 of=/dev/rmt/0lbn bs=2048 5- rewind the tape % mt -f /dev/rmt/0lb rewind Adjust as needed for which dump you need from the tape. In summary, you need the *first* header off the tape, and the nth data and nth trailer for the nth dump.
FAQ
Cross-platform dump
Bei einem Betriebssystemwechsel (etwa von Solaris zu SUSE Linux) muss ein sogenannter "cross-platform dump" erstellt werden.
- Datenbank mittels "sp_dboption" in den "single user mode" fahren
- Ausführen von "sp_flushstats" und abwarten, bis die Seiten gespült wurden
- Erstellen eines Checkpoints für die Datenbank
- Ausführen von "dump database ..."
- Laden der Datenbank auf dem neuen Betriebssystem
Details dazu unter: Cross-platform dump and load functionality in ASE 12.5.3
Hinzufügen eines Zeitraums zu einem Datum
Hinzufügen von 3 Tagen zum Geburtsdatum der Person mit dem Namen "Zweidler".
1> select dateadd(day,3,d02gedatum) from d02ben where d02name="Zweidler" 2> go
http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/34742;hf=0
Passwort ändern
Änderung des Passworts von Benutzer "sa" zu "newpassword".
1> sp_password sa, "newpassword" 2> go
Weblinks
- Sybase (Sybase.com)
- Sybase Deutschland (Sybase.de)
- Sybase (Selectorweb.com)
- Die Big Boys kommen : Sybase Adaptive Server Enterprise (Linux-Magazin.de 1999.05)