Sybase

Aus Mikiwiki
Wechseln zu: Navigation, Suche

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:

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

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/sprocs173.htm

Weblinks