Meist aus Sicherheitsaspekten, existieren in vielen heutigen Organisationen mehrere Subnetze, in denen Anwendungen unterschiedlichster Art betrieben werden. Für einen DBA in solch einer Organisation kann es daher sinnvoll sein, seinen Oracle Cluster (Grid Infrastructure) um ein oder mehrere Subnetze zu erweitern. Im diesem Beitrag möchte ich auf die Möglichkeiten der Verwendung von mehreren Public Networks im Oracle Cluster in der aktuellen Version eingehen. Ich werde kurz den Zweck und die sich daraus ergebenen Vorteile erläutern und anschließend exemplarisch ein Beispiel zur Einrichtung eines zweiten Public Networks aufzeigen.
SCAN und Public Network
Bevor es zum eigentlichen Thema komme, noch eine kurze Erklärung zur grundlegenden Funktion eines SCAN (Single Client Access Name) im Oracle Cluster. Mit Hilfe des SCAN können sich Oracle Clients, sprich die Datenbankanwendungen, in einfacher Weise mit einer Datenbankinstanz in einem Oracle Cluster verbinden, ohne Kenntnis darüber haben zu müssen, auf welchen Knoten diese gerade läuft. Der SCAN ist ein von den Clients zum Verbindungsaufbau verwendeter Name, hinter dem sich die drei IP-Adressen der drei SCAN-Listener verbergen. Die SCAN-Listener wiederum, die selber verteilt auf den Cluster-Knoten laufen, leiten die Verbindungswünsche der Clients an die Datenbankinstanzen weiter. Die Clients greifen über ein als „Public Network“ bezeichnetes Netzwerk auf die Datenbankinstanzen zu. Das ist in der Regel das Netzwerksegment, indem sich die Clients ebenfalls befinden.
Während der Installation der Grid Infrastructure wird standardmäßig nur ein Public Network konfiguriert. Benötigt man weitere Public Networks für den Cluster, so müssen diese nach der Installation manuell eingerichtet werden. Bereits ab Release 11.2 war die Einrichtung und Nutzung von zusätzlichen Public Networks mit Hilfe weiterer virtueller IPs möglich – mehrere SCANs jedoch nicht. Dies hat sich nun mit dem Release 12.0.1.2 der Grid Infrastructure geändert. In dieser Version ist man, insofern man SCANs zum Verbinden der Client nutzen möchte, nicht mehr auf nur ein einziges Public Network beschränkt.
Nutzen
Welchen Nutzen haben mehrere Public Networks? Vorausgesetzt die Cluster-Knoten verfügen über die entsprechenden Netzwerkschnittstellen in weitere Subnetze, so lassen sich über weitere Public Networks und richtiger Parametrisierung der Datenbanken, der Zugriff aus diesen Subnetzen vom DBA steuern. Die Oracle Grid Infrastruktur arbeitet in dem Fall wie ein Router, der die Verbindungen von verschiedenen Subnetzen zu den richtigen Endpoints weiterleitetet.
Dieser „Multiple Subnet Support“ bietet nun die großartige Möglichkeit, dass man mehrere Datenbanken in einem einzigen Oracle Cluster betreiben kann, die wiederum für Ihre Clients nur aus bestimmten Subnetzen erreichbar sind. Damit lässt sich technisch verhindern, dass sich Oracle Clients aus nicht vertrauenswürdigen Netzwerkbereichen sich mit Datenbanken verbinden können, auf die sie keinen berechtigten Zugriff haben.
Netzwerkeinrichtung
Im folgenden Abschnitt zeige ich in einem Beispiel wie sich ein zweites Puplic Network in der Version 12.1.0.2 einrichten lässt. Um mehr Freiheit bei der Benennung des bereits bei der Installation eingerichteten Public Networks zu haben, werde ich dies zuvor noch einmal löschen und dann ebenfalls mit neuen Parameter und Namen einrichten. Dies ist aber optional.
Initiale Cluster-Konfiguration nach der Installation (Ausgangsbasis)
Cluster-Nodes: ofc1srv, ofc2srv Public Network: 192.168.20.0/24 Private Network: 10.10.20.0/24 (Interconnect) NIC Public Network: enp0s10 SCAN ofc-scan SCAN-Listener: listener_scan Listener Name/Port: listener/1521 Node 1 IP Adresse: ofc1srv (192.168.20.81) Node 2 Name: ofc2srv (192.168.20.82) Vip Name/IP Node 1 ofc1srv-vip (192.168.20.91) Vip Name/IP Node 2 ofc2srv-vip (192.168.20.92)
Gewünschte Erweitertung um ein zweites Public Network (Ziel 1)
Public Network 2: 192.168.56.0/24 NIC Public Network 2: enp0s8 SCAN Network 2: ofc-scan-net2 SCAN-Listener 2: scan_listener2 Listener 2 Name/Port: listener_net2 / 1521 Node 1 Name/IP: ofc1srv-net2 (192.168.56.81) Node 2 Name/IP: ofc2srv-net2 (192.168.56.82) Vip Name/IP Node 1 ofc1srv-net2-vip (192.168.56.91) Vip Name/IP Node 2 ofc2srv-net2-vip (192.168.56.92)
Neukonfiguration des ersten Public Network (Änderung der Namen – Ziel 2)
Public Network 1: 192.168.20.0/24 NIC Public Network 1: enp0s10 SCAN Network 1 ofc-scan-net1 SCAN-Listener 1: scan_listener1 Listener 1 Name/Port: listener_net1 / 1521 Node 1 Name/IP: ofc1srv-net1 (192.168.20.81) Node 2 Name/IP: ofc2srv-net1 (192.168.20.82) Vip Name/IP Node 1 ofc1srv-net1-vip (192.168.20.91) Vip Name/IP Node 2 ofc2srv-net1-vip (192.168.20.92)
Wenn nicht anders beschrieben, werden alle nachfolgenden Arbeiten als Grid User durchgeführt. Die Einrichtung erfolgt mit den Oracle Tools srvctl, crsctl, oifcfg und clufvy.
Tool Referenzen:
Oracle Interface Configuration Tool (OIFCFG) Command Reference
https://docs.oracle.com/cd/E11882_01/rac.112/e41959/oifcfg.htm#CWADD828
Server Control Utility ( SRVCTL) Command Reference
https://docs.oracle.com/database/121/RACAD/srvctladmin.htm#RACAD5006
Oracle Clusterware Control (CRSCTL) Utility Reference
https://docs.oracle.com/database/121/CWADD/crsref.htm#CWADD91142
Cluster Verification Utility Reference
https://docs.oracle.com/database/121/CWADD/cvu.htm#CWADD1100
1. Entfernung des bisherigen Netz, SCAN, VIPs und Listener
srvctl config listener -listener LISTENER srvctl status listener -listener LISTENER srvctl stop listener -listener LISTENER srvctl remove listener -listener LISTENER srvctl config scan_listener -netnum 1 srvctl status scan_listener -netnum 1 srvctl stop scan_listener -netnum 1 srvctl remove scan_listener -netnum 1 srvctl config scan -netnum 1 srvctl status scan -netnum 1 srvctl stop scan -netnum 1 srvctl remove scan -netnum 1 srvctl config vip -node ofc1srv srvctl config vip -node ofc2srv srvctl status vip -vip ofc1srv-vip srvctl status vip -vip ofc2srv-vip srvctl stop vip -vip ofc1srv-vip srvctl stop vip -vip ofc2srv-vip srvctl remove vip -vip ofc1srv-vip srvctl remove vip -vip ofc2srv-vip srvctl config network -netnum 1 > config_network1.txt srvctl remove network -netnum 1 –f
2. Booten beider Cluster-Knoten
crsctl stop cluster –all
3. Einrichtung der Namensauflösung
Die Auflösung der Namen in IP Adressen für die zukünftig verwendeten Hostnamen und SCANs muss neu eingerichtet werden. Die unterschiedlichen Namens-Typen haben unterschiedliche Vorgaben hinsichtlich der Methode mit der diese in IP Adressen aufgelöst werden müssen (DNS, GNS, /etc/hosts,). So müssen z.B. die SCAN via DNS oder GNS in die drei IP Adressen aufgelöst werden. Die entsprechenden Vorgaben, können aus dem Installation Guide entnommen werden,
Bei Verwendung GNS:
https://docs.oracle.com/database/121/CWLIN/networks.htm#CWLIN214
Bei Verwendung von DNS
https://docs.oracle.com/database/121/CWLIN/networks.htm#CWLIN216
In meinem Beispiel wurden folgenden Namensauflösungen via DNS und /etc/hosts eingerichtet.
# Private (Interconnect)(DNS und Hostfile) 10.10.20.81 ofc1srv-priv.vbox.de ofc1srv-priv 10.10.20.82 ofc2srv-priv.vbox.de ofc2srv-priv # Public Network 1 (DNS) 192.168.20.81 ofc1srv-net1.vbox.de ofc1srv-net1 ofc1srv.vbox.de ofc1srv 192.168.20.82 ofc2srv-net1.vbox.de ofc2srv-net1 ofc2srv.vbox.de ofc2srv # Public Network 2 (DNS) 192.168.56.81 ofc1srv-net2.vbox.de ofc1srv-net2 192.168.56.82 ofc2srv-net2.vbox.de ofc2srv-net2 # Virtual Network 1 (DNS und Hostfile) 192.168.20.91 ofc1srv-net1-vip.vbox.de ofc1srv-net1-vip 192.168.20.92 ofc2srv-net1-vip.vbox.de ofc2srv-net1-vip # Virtual Network 2 (DNS und Hostfile) 192.168.56.91 ofc1srv-net2-vip.vbox.de ofc1srv-net2-vip 192.168.56.92 ofc2srv-net2-vip.vbox.de ofc2srv-net2-vip # SCAN Network 1 (DNS) 192.168.20.101 ofc-scan-net1.vbox.de ofc-scan-net1 192.168.20.102 ofc-scan-net1.vbox.de ofc-scan-net1 192.168.20.103 ofc-scan-net1.vbox.de ofc-scan-net1 # SCAN Network 2 (DNS) 192.168.56.101 ofc-scan-net2.vbox.de ofc-scan-net2 192.168.56.102 ofc-scan-net2.vbox.de ofc-scan-net2 192.168.56.103 ofc-scan-net2.vbox.de ofc-scan-net2
4. Die derzeit im Cluster konfigurierten Netzwerk anzeigen
(Als user grid oder root)
oifcfg getif
enp0s10 192.168.20.0 global public enp0s9 10.10.20.0 global cluster_interconnect
5. Die im Cluster verfügbaren Netzwerke anzeigen (auf beiden Knoten)
(Als grid oder root)
oifcfg iflist
enp0s3 10.0.2.0 enp0s8 192.168.56.0 enp0s9 10.10.20.0 enp0s9 169.254.0.0 enp0s10 192.168.20.0 virbr0 192.168.122.0
6. Das Interface für das zweite Public Network als als Public Interface setzen
(Als grid oder root)
oifcfg setif -global enp0s8/192.168.56.0:public
7. Die derzeit im Cluster konfigurierten Netzwerk anzeigen
(Als grid oder root)
oifcfg getif
enp0s10 192.168.20.0 global public enp0s9 10.10.20.0 global cluster_interconnect enp0s8 192.168.56.0 global public
8. Cluvfy Check durchführen
(Als grid oder oracle)
cluvfy stage -post hwos -n ofc1srv,ofc2srv
9. Beide Public Networks hinzufügen
(Als root)
Netzwerk 1
srvctl add network -netnum 1 -subnet 192.168.20.0/255.255.255.0/enp0s10 -verbose srvctl config network -netnum 1
Network 1 exists Subnet IPv4: 192.168.20.0/255.255.255.0/enp0s10, static Subnet IPv6: Ping Targets: Network is enabled Network is individually enabled on nodes: Network is individually disabled on nodes:
Netzwerk 2
srvctl add network -netnum 2 -subnet 192.168.56.0/255.255.255.0/enp0s8 -verbose srvctl config network -netnum 2
Network 2 exists Subnet IPv4: 192.168.56.0/255.255.255.0/enp0s8, static Subnet IPv6: Ping Targets: Network is enabled Network is individually enabled on nodes: Network is individually disabled on nodes:
10. Cluvfy Check für die hinzugefügten Netzwerke durchführen
(Als grid oder oracle)
cluvfy comp nodecon -networks enp0s8 cluvfy comp nodecon -networks enp0s10
11. VIPs zum 1. Knoten hinzufügen
(Als root)
srvctl add vip -node ofc1srv -netnum 1 -address ofc1srv-net1-vip/255.255.255.0 -verbose srvctl add vip -node ofc1srv -netnum 2 -address ofc1srv-net2-vip/255.255.255.0 -verbose srvctl start vip -node ofc1srv srvctl status vip -node ofc1srv
(Als grid oder oracle)
srvctl config vip -node ofc1srv
IP exists: network number 1, hosting node ofc1srv VIP Name: ofc1srv-net1-vip VIP IPv4 Address: 192.168.20.91 VIP IPv6 Address: VIP is enabled. VIP is individually enabled on nodes: VIP is individually disabled on nodes: VIP exists: network number 2, hosting node ofc1srv VIP Name: ofc1srv-net2-vip VIP IPv4 Address: 192.168.56.91 VIP IPv6 Address: VIP is enabled. VIP is individually enabled on nodes: VIP is individually disabled on nodes:
12. VIPs zum 2. Knoten hinzufügen
(Als User root)
srvctl add vip -node ofc2srv -netnum 1 -address ofc2srv-net1-vip/255.255.255.0 -verbose srvctl add vip -node ofc2srv -netnum 2 -address ofc2srv-net2-vip/255.255.255.0 -verbose srvctl start vip -node ofc2srv srvctl status vip -node ofc2srv
(Als grid oder oracle)
srvctl config vip -node ofc2srv
VIP exists: network number 1, hosting node ofc2srv VIP Name: ofc2srv-net1-vip VIP IPv4 Address: 192.168.20.92 VIP IPv6 Address: VIP is enabled. VIP is individually enabled on nodes: VIP is individually disabled on nodes: VIP exists: network number 2, hosting node ofc2srv VIP Name: ofc2srv-net2-vip VIP IPv4 Address: 192.168.56.92 VIP IPv6 Address: VIP is enabled. VIP is individually enabled on nodes: VIP is individually disabled on nodes:
Anmerkung: Die Netzwerke werden automatisch mit dem Hinzufügen der VIPs “gestartet”.
13. Die beiden Listener den beiden Public Networks hinzufügen
(Als grid oder oracle)
Netzwerk 1
srvctl add listener -listener LISTENER_NET1 -netnum 1 -endpoints "TCP:1521"
Netzwerk 2
srvctl add listener -listener LISTENER_NET2 -netnum 2 -endpoints "TCP:1521"
Tipp: Wenn vor dem Start des ersten Listener der zweite Listener hinzugefügrt wird, so kann man übriges für beide Listener den gleichen Port wählen (hier 1521)!
14. Die neuen Listener starten
Netzwerk 1
srvctl start listener -listener LISTENER_NET1 srvctl status listener -listener LISTENER_NET1
Listener LISTENER_NET1 is enabled Listener LISTENER_NET1 is running on node(s): ofc2srv,ofc1srv
srvctl config listener -listener LISTENER_NET1
Name: LISTENER_NET1 Type: Database Listener Network: 1, Owner: oracle Home: <CRS home> End points: TCP:1521 Listener is enabled. Listener is individually enabled on nodes: Listener is individually disabled on nodes:
Netzwerk 2
srvctl start listener -listener LISTENER_NET2 srvctl status listener -listener LISTENER_NET2
Listener LISTENER_NET2 is enabled Listener LISTENER_NET2 is running on node(s): ofc2srv,ofc1srv
srvctl config listener -listener LISTENER_NET2
Name: LISTENER_NET2 Type: Database Listener Network: 2, Owner: root Home: <CRS home> End points: TCP:1521 Listener is enabled. Listener is individually enabled on nodes: Listener is individually disabled on nodes:
Anmerkung: Die VIPs werden mit dem Start der Listener „gestartet“.
15. SCAN den Public Networks hinzufügen
(Als root)
Netzwerk 1
srvctl add scan -scanname ofc-scan-net1 -netnum 1 srvctl start scan -netnum 1 srvctl status scan -netnum 1 srvctl config scan -netnum 1
SCAN name: ofc-scan-net1, Network: 1 Subnet IPv4: 192.168.20.0/255.255.255.0/enp0s10, static Subnet IPv6: SCAN 0 IPv4 VIP: 192.168.20.101 SCAN VIP is enabled. SCAN VIP is individually enabled on nodes: SCAN VIP is individually disabled on nodes: SCAN 1 IPv4 VIP: 192.168.20.102 SCAN VIP is enabled. SCAN VIP is individually enabled on nodes: SCAN VIP is individually disabled on nodes: SCAN 2 IPv4 VIP: 192.168.20.103 SCAN VIP is enabled. SCAN VIP is individually enabled on nodes: SCAN VIP is individually disabled on nodes:
Netzwerk 2
srvctl add scan -scanname ofc-scan-net2 -netnum 2 srvctl start scan -netnum 2 srvctl status scan -netnum 2 srvctl config scan -netnum 2
SCAN name: ofc-scan-net2, Network: 2 Subnet IPv4: 192.168.56.0/255.255.255.0/enp0s8, static Subnet IPv6: SCAN 0 IPv4 VIP: 192.168.56.101 SCAN VIP is enabled. SCAN VIP is individually enabled on nodes: SCAN VIP is individually disabled on nodes: SCAN 1 IPv4 VIP: 192.168.56.102 SCAN VIP is enabled. SCAN VIP is individually enabled on nodes: SCAN VIP is individually disabled on nodes: SCAN 2 IPv4 VIP: 192.168.56.103 SCAN VIP is enabled. SCAN VIP is individually enabled on nodes: SCAN VIP is individually disabled on nodes:
16. Neuen SCAN Listener den Public Networks hinzufügen
(Als grid)
Netzwerk 1
srvctl add scan_listener -netnum 1 srvctl start scan_listener -netnum 1 srvctl status scan_listener -netnum 1 srvctl config scan_listener -netnum 1
Netzwerk 2
srvctl add scan_listener -netnum 2 srvctl start scan_listener -netnum 2 srvctl status scan_listener -netnum 2 srvctl config scan_listener -netnum 2
Optional: Möchte man vom Standardport 1521 abweichen, so kann man dies wie folgt enrichten.
srvctl add scan_listener -netnum 2 -endpoints "TCP:1523"
17. Erreichbarkeit der VIP beider Netzwerke prüfen
Netzwerk 1
ping ofc1srv-net1-vip ping ofc1srv-net1-vip
Netzwerk 2
ping ofc1srv-net2-vip ping ofc2srv-net2-vip
18. Listener Status der Listener beider Netzwerke prüfen
(Als grid)
lsnrctl status listener_net1 lsnrctl status listener_net2 srvctl config listener -a
19. Cluvfy Check SCAN durchführen
(Als grid oder oracle)
cluvfy comp scan -verbose
Datenbankseitige Konfiguration
Wenn alle Public Networks eingerichtet wurden, muss noch festgelegt werden, welche Datenbank welche Verbindungswünsche aus welchem Netzwerk annehmen kann. Im hier angeführten Beispiel soll die Datenbank CMSDB nur Verbindungswünsche aus dem Netzwerk 1 und die Datenbank ERPDB nur Verbindungswünsche aus dem Netzwerk 2 annehmen.
Parameter LISTENER_NETWORKS, REMOTE_LISTENER und LOCAL_LISTENER
Um sicherzustellen, dass die Datenbanken ihre Services bei den richtigen Listener der richtigen Public Networks registrieren und die Verbindungswünsche somit an die richtigen Datenbanken weitergeleitet werden, müssen in den Datenbanken einige Parameter gesetzt werden. Essentiell hierbei ist der Parameter LISTENER_NETWORKS. Dieser Parameter verknüpft die zu einem Netzwerk zugehörigen Listener miteinander. So wird dafür gesorgt, dass an den Remote Listener gerichtete Verbindungswünsche nur an die lokalen Listener desselben Netzwerkes gehen. Der Parameter LOCAL_LISTENER einer Datenbankinstanz muss auf die Adresse des lokalen Listener auf dem entsprechenden Knoten gesetzt werden. Der lokale Listener läuft im Cluster auf einer VIP. Der Parameter REMOTE_LISTENER muss auf die Adresse des SCAN_LISTENER verweisen.
Beispiel Datenbank CMSDB (Netzwerk 1):
Davon ausgehend, dass die Instanz CMSDB1 auf dem Knoten ofc1srv und die Instanz CMSDB2 auf dem Knoten ofc2srv läuft, sind folgende Parametrisierungen notwendig.
ALTER SYSTEM SET LISTENER_NETWORKS='((NAME=net1)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=ofc1srv-net1-vip.vbox.de)(PORT=1521)))(REMOTE_LISTENER=ofc-scan-net1.vbox.de:1521))' SCOPE=BOTH SID='cmsdb1'; ALTER SYSTEM SET LISTENER_NETWORKS='((NAME=net1)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=ofc2srv-net1-vip.vbox.de)(PORT=1521)))(REMOTE_LISTENER=ofc-scan-net1.vbox.de:1521))' SCOPE=BOTH SID='cmsdb2';
ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=ofc1srv-net1-vip.vbox.de)(PORT=1521))' SCOPE=BOTH SID='cmsdb1'; ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=ofc2srv-net1-vip.vbox.de)(PORT=1521))' SCOPE=BOTH SID='cmsdb2';
ALTER SYSTEM SET REMOTE_LISTENER='ofc-scan-net1.vbox.de:1521' SCOPE=BOTH SID='*';
Beispiel Datenbank ERPD (Netzwerk 2):
Davon ausgehend, dass die Instanz ERP1 auf dem Knoten ofc1srv und die Instanz ERP2 auf dem Knoten ofc2srv läuft, sind folgende Parametrisierung notwendig.
ALTER SYSTEM SET LISTENER_NETWORKS='((NAME=net2)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=ofc1srv-net2-vip.vbox.de)(PORT=1521)))(REMOTE_LISTENER=ofc-scan-net2.vbox.de:1521))' SCOPE=BOTH SID='erpdb1'; ALTER SYSTEM SET LISTENER_NETWORKS='((NAME=net2)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=ofc1srv-net2-vip.vbox.de)(PORT=1521)))(REMOTE_LISTENER=ofc-scan-net2.vbox.de:1521))' SCOPE=BOTH SID='erpdb2';
ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=ofc1srv-net2-vip.vbox.de)(PORT=1521))' SCOPE=BOTH SID='erpdb1'; ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=ofc2srv-net2-vip.vbox.de)(PORT=1521))' SCOPE=BOTH SID='erpdb2';
ALTER SYSTEM ST REMOTE_LISTENER='ofc-scan-net2.vbox.de:1521' SCOPE=BOTH SID='*';
Service Registrierung
Die unten aufgeführte Grafik veranschaulicht den Zusammenhang zwischen den zu setzenden Netzwerkparametern und der Service-Registrierung bei den Lokalen und Remote-Listenern. Der Übersicht wegen, ist hier nur jeweils eine Instanz auf jedem Knoten dargestellt.
Zugriff Datenbank-Services
Der Zugriff auf die Datenbank im Cluster erfolgt wie gewohnt über den SCAN.
Beispiel tnsnames.ora Einträge:
CMSDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ofc-scan-net1.vbox.de)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cmsdb) ) )
# ERPDB Netzwerk 2
ERPDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ofc-scan-net2.vbox.de)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = erpdb) ) )
Referenzen
MOS Note 2138078.1: 12c How to create additional SCAN/SCAN VIP
White Paper: Multiple Public Networks in Private Database Clouds – Oracle
http://www.oracle.com/technetwork/database/database-cloud/privatedbcloudonoda-1522348.pdf
Testkommentar
Antwort auf Testkommentar