Obsah
Administrace Oracle
- partisovani
- –> xml a zverejnovani dat po http ←-
2011-01-10
Oracle XML DB
v listerneru (listener.ora) nastavit naslouchani na dany port, a pak pres sethttpport nastavit spravne pozadavky
zpracovani pomoci poli hodnot
E.s. BEGIN DECLARE SECTION char uname[20][25]; /*20x string*/ short ind_uname[20]; E.S. END DECLARE SECTION E.S. INSERT INTO T(U) VALUES (:uname:ind_uname) <=> FOR (i=0;i<20;i++) { INSERT INTO T(U) VALUES(:uname[i]:ind_name[i]); }
E.S. OPEN C; zprac=0; for(;;) { E.S. FETCH C INTO :pole1, :pole2:ind_pole2,...; nyni = sqlca.sqlerrd[2] - zprac; //pocet zpracovanych radku poslednim fetchem / 0-velikost poli zprac += nyni; for (k=0;k<nyni;k++) { /* zpracuj k-ty prvek z pole */ } if (nyni < VELIKOST_POLI) break; }
najit na tirpitzu slozku proc a soubor zprac_pole.c v ni (ukazkove kody)
!! nakopirovat z /tmp
2010-12-20 - Oracle streams
replikace
semora1 semora2 ---- ----- | | ---------> | | | | | | | | <--------- | | ---- -----
oboustranné linky
replikační master group
- objekt
- server
TODO: založit účty na semora2 (dbadmin/dbadmin)
- nemá cenu tvořit další tabulkový prostor
- jen si založit tabulku, kterou někam pak napropagovat
přidělení práv
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
vlastní schéma:
create table moje_repl_tab(...);
repadmin:
DBMS_REPCAT.CREATE_MASTER_REPGROUP(gname => 'machvrep'); -- potom yaregistrovat objekty k replikaci DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'machvrep', type => 'TABLE', oname => 'REPLIKOVANA', sname => 'mach', ... );
min_communication .. minimaliyace komunikace, replikace jen změn
ukázkové použití - replikace.sql
asznchronni je cca jednou za 10 minut
2010-12-13
– temelin –
2010-12-06
– zaspal –
2010-11-29
Oracle a c++
jak ošetřit chyby..
ukázkový kód s připojením a ošetřením chyb
E. S. WHENEVER [SQLERROR|SQLWARNING|NOT FOUND] alce;
- CONTINUE .. if(chyba) then;
- DO sth; … if(chyba) then sth;
- DO break;
- DO fce();
- GOTO label;
- STOP
select s více řádky nadefinovat kurzor, kterým budu procházet
E.S. DECLARE c CURSOR FOR SELECT ...;
(c není proměnná v c, jde o symbolické jméno pro preprocesor.)
E.S. OPEN c;
provede SELECT v DB
nekonečný cyklus procházející řádky
E.S. WHENEVER NOT FOUND DO break; //skonci to ten cyklus for(;;) { E.S. FETCH INTO :prom1, :prom2, :prom3,...; ... zpracuj radky ... }; E.S. WHENEVER NOT FOUND CONTINUE; //vypneme ten break E.S. CLOSE c;
hodnoty indikatoru EXEC SQL FETCH C INTO :tn:itn, :co:ico; if ico …
0 | OK |
-1 | NULL |
>0 | hodnota delsi nez promenna |
2010-11-22
http://www.ms.mff.cuni.cz/~kopecky/oracleParallel.pdf
pro p5ehled jak dotaz vypada
set autotrace on|off|traceonly
2010-11-15
Embedded SQL
výhody preprocesou
- určitá standardizace
- oddělení kódu v C od DB kódu
- existuje podpora pro jiné jazyky
EXEC SQL příkaz; deklarace proměnných, které budou vidět i pro preprocesor, resp. databázi.
EXEC SQL BEGIN DECLARE SECTION . . . EXEC SQL END DECLARE SECTION
k dispozici máme atomické proměnné
- int,
- long,
- short,
- float,
- double,
- char *,
- char[n]
- 1 royměrná pole atomických hodnot
- (ploché) struktury atomických hodnot
- 1r. pole struktur
navíc atomický pro oracle, sturktura pro C:
varchar prom[n];
v céčku se z toho stane struktura, která má délku a obsah
struct { short len; char arr[]; }
k=8; j=10; EXEC SQL insert into tabulka (K,J) values (:k,:j);
kde :x je odkaz na hostitelskou proměnnou jazyka
pro čtení z db:
EXEC SQL K,J INTO :k,:j FROM tabulka WHERE ...;
databáze musí vrátit právě jeden řádek (třeba ošetřit takové chyby)
char s1[10]; car*s2; varchar s3[10]; .. struct viz výše strcpy(s1,"ahoj"); s2="ahoj";
nebo
s2=malloc(100); strcpy(s2,"ahoj");
pokud bych udělal jen tohle
strcpy(s3.arr,"ahoj");
tak to nestačí, ještě třeba nastavit tu délku
s3.len=4;
resp.
s3.len=strlen(s3.arr); EXEC SQL insert into tabulka (txt) values (<:s1, :s2 nebo :s3>);
načtení dat
s2=malloc(10); EXEC SQL select txt into <:s1, :s2 nebo :s3> from tabulka ...; - s1: v pořádku, Oracle nakopíruje data a ukončí pomocí \0 - s2: třeba přepsat 9 znaků jinéým než \0, aby strlen správně vrátil velikost - s3: s3.arr[s3.len]='\0';
EXEC SQL CONNECT :x <-- 'jmeno/heslo@db'
nebo
EXEC SQL CONNECT :x identified by :y [using :z] <-- x .. jmeno nebo jmeno@db
E.S. CREATE TABLE Tabulka (txt varchar2(10));
nakonec
E. S. COMMIT|ROLLBACK WORK [RELEASE];
– release zaroven ukonci pripojeni k sql
soubory by měly mít příponu .ps a zkompilovat se dají skriptem pcc
2010-11-01
Start databáze
Průběh startu databáze: startup → přečíst ini soubor (obsahující parametry konfigurace) → alokace SGA → start procesů → mount → čtou se řídící soubory → kontrola datových souborů → otevření datových souborů → nastartováno
při vypínání se jde pozadu, ale počká se na dokončení načatých transakcí (commit, rollback)
control file - říkáme jaká data tvoří databázi (tabulkové prostory, kódování, soubory…)
- doporučuje se mít alespoň tři control soubory, pro případ crash recovery; výchozí nastavení obsahuje 2 soubory
alter database parameter=hodnota scope memory|file|both
scope říká jestli se parametr má změnit hned, v paměti (na otestování, jen v téhle instanci), nebo v ini souboru a zavést až následně po restartu nebo obojí
kontrétní hodnotu parametru zjistí
show parameter <parametr>
např. memory_target
Zálohování
zálohovat smí
- uživatel
- administrátor
obnovovat
- uživatel - vlastní schéme
- administrátor - celá dbb, schéma, soubor, ts,…)
čím
- exp (export), imp (import) - jdou po řádcích a dumpuje je po řádcích, ale kompatibilnější - jdou i nastarších verzích databáze; při startu se zeptá na několik základních informací aby export vytvořil; dump, ač je binární, tak není nijak komprimovaný a vyplatí se ho následně zkomprimovat
- expdp, impdb - po úrovni datových bloků → rychlejší
Pozor
- pokud export dělal uživatel s DBA → import je možné provést také jen pro DBA
- import nelze provést do nižší verze db → lze použít pro migraci do vyšší verze (zároven ani nejde přenášet mezi plnou a free verzí databáze)