Oracle8.1.7 'DB-Link ohne Domänangabe'

hi leutz,
bin neu hier und extrem gefrustet von einem prob, welches ich einfach nicht hinbekomm.
mein vorgänger hat es irgendwie hinbekommen, einen datenbanklink namens „cmdb“ zu erstellen. die init-datei hat als db-domän keinen eintrag und einen haken bei standard.
lege ich mit der gleichen init-datei im selben schema den selben link(also gleiche referenz auf den dienst in der tns-names.ora) erzeugt oracle „cmdb.world“. ist mir auch logisch, den es ist keine domän angegeben und ein haken bei standard. also wird der defaultwert genommen und der heißt „world“.
alle views und proeduren haben als link „cmdb“ und mit „cmdb.world“ funktionieren es nicht *schnief*

wie und wo kann ich den standard „world“ durch „NICHTS“(im sinne von leer) ersetzen.

für hilfe wäre ich wirklich dankbar, da ich offengesagt mit meinem latein am ende bin.

hi!

/network/admin/tnsnames.ora

oder

/net8/admin/tnsnames.ora

oder … oder … oder

(Environment-Variable TNS_ADMIN)

kommt auf das betriebssystem an und wo die tns-einstellungen liegen

!!!ABER: laß das bitte jemanden machen, der etwas davon versteht!!!

oder setzt dich mit dem oracle-support in kontakt

grüße,
tomh

Hi,

bin neu hier und extrem gefrustet von einem prob, welches ich
einfach nicht hinbekomm.

Wie das? Im allgemeinen schaffe ich das locker, Probleme hinzubekommen :smile:

mein vorgänger hat es irgendwie hinbekommen, einen
datenbanklink namens „cmdb“ zu erstellen. die init-datei hat
als db-domän keinen eintrag und einen haken bei standard.

Irgendwie? Hmmm.

Normalerweise würde ich einen DB-Link per Script erstellen. Die Syntax lautet dann:

 create [public] database link cmdb 
 connect to benutzer 
identified by passwort 
 using '&tns\_remote';

Dann heißt der Link auch „cmdb“ und nicht „cmdb.world“.

Der Wert von benutzer und passwort ist derjenige auf der Remote-Datenbank.

Für tns_remote hast du zwei Möglichkeiten: entweder, wie du schon schreibst, eine Referenz auf den Dienst in der tnsnames.ora des Servers. Das ist aber meist nicht sehr praktisch, denn auf dem Server connectest du nicht über TNS. Ich mache das so, daß ich dafür den vollen Connect-String einsetze. Das sieht dann etwa so aus:

--
-- create\_db\_link.sql
--
-- Erwartete Parameter:
-- 01: Host IP oder DNS-Name remote DB
-- 02: Oracle Port Nr. remote DB
-- 03: SID remote DB remote DB
-- 04: Benutzerkennung remote DB
-- 05: Passwort remote DB
--
def host\_remote=&1
def oracle\_port\_remote=&2
def sid\_remote=&3
def benutzer\_remote=&4
def pw\_remote=&5

def tns\_remote=(description=(address=(host=&host\_remote)(protocol=tcp)(port=&oracle\_port\_remote))(connect\_data=(sid=&sid\_remote)))

create database link crdb connect to &benutzer\_remote identified by &pw\_remote using '&tns\_remote';

Der Aufruf dann ist simpel:

sql\> @create\_db\_link.sql dbserver.beispiel.com 1521 crdb scott tiger

für hilfe wäre ich wirklich dankbar, da ich offengesagt mit
meinem latein am ende bin.

Ich hoffe, das hilft dir weiter.

Gruß

Sancho

hi sancho,
erstmal danke für die tips. vielleicht hab ich mich unglücklich ausgedrückt? mein problem ist es nicht, einen funktionierenden db-link zu erstellen(egal ob per script oder assistent).
ich leg mir die karten bei dem „DOMÄN-ANHANG“.

so habe ich mal deinen vorschlag abgetippt. dabei CMDB als linknamen angegeben. meldung „erfolgreich erstellt“. vorfreude. blick in die datenbank. frust. im scheme public findet sich ein neuer db-link namens „CMDB.WORLD“. kotz, brech!!!

meiner meinung nach, wird ein einem link der domänname automatisch beigefügt, sofern dies in irgend einer einstellugsdatei so gesetzt ist.
ich schau mir also die „init.ora“ an, und sehe, das die variable „db_domain“ den wert NULL hat. weiterhin ist ein haken bei „standardwert“ gesetzt, den ich nicht entfernen kann(egal uneter welchem login). ich verstehe also: „was immer du erstallst, füge den standarddomännamen an“.
wie bekomm ich also den haken wech? ich trage zum beispiel „luna“ als domännamen ein. der haken verschwindet. vorfreude. db durchstarten. nochmal link erstellen. erwarte das der jetzt „CMDB.LUNA“ heißt. tut er nicht. er heißt „.WORLD“. unverständnis. ich verstehe also: „was immer du als domännamen angibst, er nimmt immer .world“.
na gut dann kann ich das auch wieder rückgängig machen. lösche luna aus dem feld. jetzt wieder NULL. der haken für standard kommt nicht wieder. ich starte die db durch und laufe auf fehler. das feld „domän_name“ muß ab sofort immer nen wert enthalten, sonst kann ich nicht hochfahren. wunder.

okay. viel gefaselt. konkret:
an welcher stelle im system, kann ich ausschalten, dass der domänname angehangen wird. da meine init.ora einstellungen(luna) nix ändern, muss es noch was anderes geben. irgendwo. aber wo???

gruss robin

hi tomh,
danke für deine infos. falls du die tips von snacho u meine antwort gelesen hast, weißt du ja schon, dass ich noch nicht weiter bin :wink:

um dir zuerstmal deine besorgnis zu nehmen: ich arbeite auf einer testmaschine. wenn da was schief geht, spiel ich einfach einen beliebigen sicherungsstand ein und weiter gehts.

die tnsnames.ora ist mir nicht unbekannt. ich versteh sogar, was drin steht und warum das so sein muss :wink:
ich hab das gefühl, deine idee führt in die richtige richtung. irgendwo muss stehen, dass er diesen standarddomänname „.WORLD“ anhängen soll. warum nicht in einer umgebungsvarible?!
die einstellungen in der init.ora ändern ja offenbar nix an dem domänname.

frage also: wo finde ich diese variable „TNS_ADMIN“ von der du sprachst und ist sie verantwortlich für mein problem? dann müsste sie ja theoretisch den inhalt „WORLD“ haben oder?!

bin gespannt, wie das hier weiter geht. finds jedenfalls sehr spannend :wink:

gruß robin

Hi,

ah, völlig falsch verstanden.

Die Default-Domain wird in der sqlnet.ora festgelegt. Da ist ein Eintrag in der Art:

names.default_domain = world
name.default_zone = world

Gruß

Sancho

hi sancho,
ich glaub wir nähern uns :wink:

hab die sqlnet.ora unter …oracle\network\admin gefunden. sie enthält nun folgende einträge

NAME.DEFAULT_ZONE =
#alter wert NAME.DEFAULT_ZONE = world
NAME.DEFAULT_DOMAIN =
#alter wert NAME.DEFAULT_DOMAIN = world
SQLNET.AUTHENTICATION_SERVICES = (NTS)
TRACE_LEVEL_CLIENT = OFF
NAMES.DIRECTORY_PATH = (TNSNAMES)
AUTOMATIC_IPC = OFF

nachdem ich also die datei modifiziert habe und die datenbank runter- und wieder hoch gefahren habe. gebe ich erwartungsfroh den db-link erstellungsbefehl ein. name „test“. erfolgreich. vorfreude.
datenbank öffnen. unter schema public nach db-links gucken. und???
„test.world“ glotzt mich an. ich werfe die ketetnsäge an und zerstöre zuerst den monitor und dann den rest des büros :wink:

bin ich so blöde, dass ich dabei was falsch gemacht hab oder gibt es etwa noch ne einstellung die man ändern muss?

hoffe ich nerv nicht?!

gruß robin

hi sancho,
ich glaub wir nähern uns :wink:

Danke, das ist nett. Dabei lag ich doch daneben.

Was ich dir geschrieben habe, ist die Default-Domain, um dich aus einem Client zu connecten, hat aber nichts mit dem DB-Link zu tun.

„test.world“ glotzt mich an. ich werfe die ketetnsäge an und
zerstöre zuerst den monitor und dann den rest des büros :wink:

Do it. Aber laß den Ordner mit der Doku intakt, dann kannst du folgendes drin lesen:

If you omit the domains from the name of a database link, Oracle expands the name by qualifying the database with the domain of your local database as it currently exists in the data dictionary, and then stores the link name in the data dictionary. The characters valid in a database domain name are: alphanumeric characters, underscore (_), and number sign (#).

(http://download-west.oracle.com/docs/cd/A91202_01/90…)

Das, was du siehst, ist also absolut normal.

Kleine Frage: was stört dich an die Endung „.world“? Das og. Verhalten funktioniert sowohl beim Erstellen als auch beim Abfragen, will sagen:

aus „create database link test“ -> test.world
aus „select * from kuckuck@test“ -> select * from [email protected]

Dann ist doch die Welt in Ordnung, oder?

Gruß

Sancho

was mich stört ist folgendes:

auf einem server „produktiv“ existiert oracle mit zwei datenbanken. „itsm“ und „cmdb“. beide enthalten im schema public einen db-link auf die jeweils andere.
so heißt beispielsweiße der db-link in der itsm-db „cmdb“. MAN BEACHTE: er heißt nicht „cmdb.world“!!! alle prozeduren, views, etc. in der itsm-db verweisen über diesen link auf die entfernte db.

nun wird grad ein zeiter server „test“ aufgebaut. auf diesen soll, wenn ich mein problem hier mal gelöst bekomm, der inhalt der beiden datenbanken vom server „produktiv“ eingespielt werden bzw. ist er schon.
erstelle ich nun einen db-link auf der testmaschine, um zwischen den beiden dbs auf der testmaschine daten auszutauschen, macht oracle aus meiner eingabe „cmdb“ „cmdb.world“. dies führt dazu, das ein view „select * from trallala@cmdb“ nicht mehr funktioniert.
ich müsste also ALLE!!! vorkommen von cmdb bzw itsm durch cmdb.world bzw. itsm.world ersetzen. das ginge noch aber jetzt kommts:

wenn ich auf der angepassten testmaschine eine erweiterung vornehme, teste ich mit den geänderten links. vor dem einspielen in die produktivumgebung müsste ich jedes vorkommen der links in einer prozedur oder in einem view zurückändern, damit sie auf der produktiven maschine mit den anderen links läuft.

zwischen test und einspielen mach ich also nochmal ne änderung und das läßt das system hier nicht zu!!!

hoffe ich konnte meine zwickmühle einigermaßen anschaulich darstellen?!

gruss robin

auf einem server „produktiv“ existiert oracle mit zwei
datenbanken. „itsm“ und „cmdb“. beide enthalten im schema
public einen db-link auf die jeweils andere.

so heißt beispielsweiße der db-link in der itsm-db „cmdb“. MAN
BEACHTE: er heißt nicht „cmdb.world“!!! alle prozeduren,
views, etc. in der itsm-db verweisen über diesen link auf die
entfernte db.

nun wird grad ein zeiter server „test“ aufgebaut. auf diesen
soll, wenn ich mein problem hier mal gelöst bekomm, der inhalt
der beiden datenbanken vom server „produktiv“ eingespielt
werden bzw. ist er schon.
erstelle ich nun einen db-link auf der testmaschine, um
zwischen den beiden dbs auf der testmaschine daten
auszutauschen, macht oracle aus meiner eingabe „cmdb“
„cmdb.world“. dies führt dazu, das ein view „select * from
trallala@cmdb“ nicht mehr funktioniert.

OK, ich glaube, ich habs kapiert.

ich müsste also ALLE!!! vorkommen von cmdb bzw itsm durch
cmdb.world bzw. itsm.world ersetzen.

Nein, das wäre Blödsinn. Das Problem muß zu lösen sein.

zwischen test und einspielen mach ich also nochmal ne änderung
und das läßt das system hier nicht zu!!!

Was auch absolut richtig ist :smile:

hoffe ich konnte meine zwickmühle einigermaßen anschaulich
darstellen?!

Ja, wir verstehen uns langsam.

Mach doch mal auf den beiden Maschinen (Test und Produktion) folgende Abfrage:

select * from global_name;

Da sollte doch in beiden cmdb.world bzw. test.world rauskommen. Mein Verdacht ist, daß eine der beiden, vermutlich die cmdb, keine Domain angegeben hat, also lautet sie cmdb (und deswegen wird der Link auch so dargestellt).

Du hast vorhin versucht, das auf der Testmaschine anzupassen, durch Stellen von "db_domain= " in der Init-Ora. Kleine bescheidene Frage: hast du die Datenbank dabei runter- und wieder hochgefahren? Dieser Parameter wird nämlich nur bei der Initialisierung gesetzt.

Gruß

Sancho

Mach doch mal auf den beiden Maschinen (Test und Produktion)
folgende Abfrage:

select * from global_name;

angemeldet an der cmdb-db der produktiven maschine gibt es folgendes ergebnis: „cmdb“
ergänze ich die abfrage um @itsm(weils ja da auch die tabelle gibt sieht das ergebnis so aus: „itsm“

Da sollte doch in beiden cmdb.world bzw. test.world
rauskommen. Mein Verdacht ist, daß eine der beiden, vermutlich
die cmdb, keine Domain angegeben hat, also lautet sie cmdb
(und deswegen wird der Link auch so dargestellt).

offenbar ist dein verdacht also richtig, denn auf der testmaschine heißt der globale name „itsm.world“. witziger weise, steht aber in der sqlnet.ora der produktionsmaschine „names.default_domain = world“

Du hast vorhin versucht, das auf der Testmaschine anzupassen,
durch Stellen von "db_domain= " in der Init-Ora. Kleine
bescheidene Frage: hast du die Datenbank dabei runter- und
wieder hochgefahren? Dieser Parameter wird nämlich nur bei der
Initialisierung gesetzt.

ja hab ich runter und wieder hoch.

jetzt paß auf, jetzt kommt der hammer schlechthin. irgendwo im netz hab ich folgendes gefunden:
„…der globale dab name besteht aus zwei komponenten und wird bereits bei der erzeugung aus dem inhalt der beiden init-parameter „DB_NAME“ und „DB_DOMAIN“ zusammengesetzt und im datadictionary der db hinterlegt. diese init-pramaeter bleiben dann bei späteren db starts unberücksichtigt, änderungen der parameter bleiben also wirkungslos. eine änderung des globalen db namens ist später nur mit dem befehl möglich…“

is ein ding oder. das würde bedeuten jemand hat die db auf der produktionsmaschine aufgesetzt während die variable db_domain leer war. ausserdem scheint es so zu sein, dass die erstellung eines db-links nicht auf die variable sondern auf den globalen namen zugreift. ich bin verwirrt :frowning:

was denkst du?

hi nochmals!

kurzer einwurf:

wie lauten denn die einträge in den init-datei der „alten“ und der „test“-db bezüglich „global_names“?
wie lauten der einträge bei db_domain?

falls „global_names“ auf TRUE ist (und du dies NICHT explizit benötigst), dann ändere dies mal auf FALSE (bei der neuen vor allem)

TRUE bedeutet, daß der db-link-name IDENT mit dem namen der db-instanz sein muß

grüße,
tomh

hi!

ich hätte wohl deine antwort vor meinem posting lesen sollen - die verdächte ähneln sich …

grüße,
tomh

ICH HABS!!!
leute ich glaub ich hab die nuss geknackt *freu* möchte natürlich noch euer urteil abwarten aber folgendes ist passiert:

habe aus der sqlnet.ora den eintrag „names.default_domain“ entfernt. anschließend habe ich eine neue datenbank „madmax“ erstellt. wenn ich mir von dieser den global_name anzeigen lasse, bekomme ich „madmax“. kein „madmax.world“. erzeuge ich nun einen db-link innerhalb von madmax, so heißt dieser „neuer_link“ und nicht mehr „neuer_link.world“.

daraus leite ich folgende erkenntnis ab:
der parameter „db_domain“ in der init.ora und der parameter „names.defaul_domain“ in der sqlnet.ora werden nur beim erstellen der db und beim ändern via „alter database…“ zum tragen. danach kann ich die parameter ändern wie ich will, hoch und runter fahren scheißegal. es rührt sich nix mehr. eine db-link erbt demnach den domain-teil des globalen db-namens.

was haltet ihr davon?

werde jetzt noch einen abschließenden test durchführen:
ich trage den parameter „names.defaul_domain=world“ in der sqlnet.ora wieder ein. dann führe ich „alter database rename global_name“ durch.
wenn meine vermutung stimmt, müsste anschließend das erstellen eines links wieder „neuer_link.world“ ergeben.

einstweilen danke für eure anregeungen. sie haben den richtigen weg erst aufgezeigt!
ich melde mich in kürze wieder mit dem testergebnis.

gruss robin

Ich muß zugeben, daß ich diese Konstellation noch nie erlebt habe.

das würde bedeuten jemand hat die db auf der
produktionsmaschine aufgesetzt während die variable db_domain
leer war.

Sieht in der Tat so aus.

ausserdem scheint es so zu sein, dass die erstellung
eines db-links nicht auf die variable sondern auf den globalen
namen zugreift. ich bin verwirrt :frowning:

Nein, das mußt du nicht. Geht mir genauso, aber wenn ds so ist, ist das so…

diese init-pramaeter
bleiben dann bei späteren db starts unberücksichtigt,
änderungen der parameter bleiben also wirkungslos. eine
änderung des globalen db namens ist später nur mit dem befehl
möglich…"

Auf jenden Fall hast du hier eine ziemlich genaue Handlungsanweisung, oder?

Ich würde das mal tun, allerdings nicht ohne einen Backup zu erstellen :smile:

Fragt sich nur, welche Datenbank umbenannt werden soll. Für mein Verständniis müßten die beiden Produktionsmachinen umbenannt werden, andererseist, never touch a running system…

Gruß

Sancho

Abschlussbericht
bitte zuerst den artikel „ich habs“ lesen, damit ich nicht alles nochmal schreiben muß :wink:

also die zuvor aufgestellte vermutung konnt im test nicht belegt werden.
offensichtlich wird der wert von „names.default_domain“ in der sqlnet.ora ausschließlich beim erstellen der datenbank benutzt. dieser ist dann entscheident für das erstellen von db-links, d.h. diese endung wird an jeden unqualifizierten db-link angefügt. eine spätere änderung bewirkt rein garnichts, zumindest nicht in dem angesprochenen bereich. gleiches gilt für den wert von „db_domain“ der init.ora.
möchte man nun den globalen namen der db ändern und somit auch die endung für unqualifizierte db-links, so nutzt man:

ALTER DATABASE RENAME GLOBAL_NAME TO neuer_name.neue_domain

danach sehen db-links so aus: neuer_db_link.neue_domain

möchte man keine domain-endung haben läßt man also „.neue_domain“ beim „alter database…“ befehl weg.

danach sehen neu erstellte db-links so aus: neuer_db_link

war ein einschneidendes erlebnis für mich, auf einer solchen plattform mit völlig fremden leuten, von totaler verwirrung zu einem akzeptablen ergebnis zu gelangen. auch wenn einige fragen offen bleiben(z.b. welchen sinn hat db_domain in der init.ora??), bin ich echt super zufrieden :smile:
dank euch für die hilfe und bis demnächst mal wieder.

gruß robin

Hi,

was mir noch eingefallen ist:

wäre es gegangen, einen DB-Link ohne Domain zu erzeugen, wenn man an den Namen einen Punkt anhängt? Also anstatt:

„create public database link kuckuck“ -> kuckuck.world
„create public database link kuckuck.“ ?

Gruß

Sancho

wäre es gegangen, einen DB-Link ohne Domain zu erzeugen, wenn
man an den Namen einen Punkt anhängt? Also anstatt:

„create public database link kuckuck“ -> kuckuck.world
„create public database link kuckuck.“ ?

hab irgendwo gelesen, dass es so gehen soll. in demzusammenhang war von „qualifizierten“ und „unqualifizierten“ links die rede?! gab allerdings einnige worte in dem text(englisch), deren bedeutungs sich mir nicht erschlossen hat :frowning:
habs dann einfach so eingegeben(mit punkt am ende) und es lief auf nen fehler.

da ich das problem parallel ja auf anderem wege umschifft hab, konnte ich mich nicht aufraffen, in die richtiung weiter zu forschen :wink:

gruß robin