Ansprechen eines virtuellen Netzwerkinterfaces aus der Oracle Virtual Box

Beim dem Versuch, aus einer Oracle Virtual Box (VBox) sowohl einerseits mein LAN als auch andererseits mein WLAN ansprechen zu können. Daraus entstand der Wunsch auf Betriebssystemseite ein virtuelles Netzwerkinterfaces bereit zu stellen, dass direkt von der VBox angesprochen wird. Dieses sollte je nach Verfügbarkeit der jeweiligen Netzwerkinterfaces (LAN und/oder WLAN) – immer eine Verbindung zum Internet zu haben.

Im ersten Schritt erstellte ich – basiserend auf dem eth0 (LAN) und wlan0 (WLAN) eine Bonding Interface bond0. Aus Sicht des OS konnte dieses erfolgreich eingesetzt werden. Die Verbindung bliebt bestehen, auch wenn ich einerseits das Kabel gezogen oder andererseits mein WLAN deaktiviert habe.

Leider konnte ich das so erstellte virtuelle Netzwerkinterface nicht der VBox zur Verfügung stellen, dass eine Bond0 nicht anerkannte. Aus der Suche nach einer Lösung fiel mit ein Artikel auf, in dem jemand – aus ganz anderen Gründen – heraus eine Bridge der VBox erfolgreich zur Verfügung stellte.

Also definierte ich auf dem virtuellen Netzwerkinterface bond0 noch eine weiteres virtuellen Interface br0, die lediglich nur das bond0 kannte. De facto habe ich auf das virtuelle bond0 noch eine br0 darübergesetzt – ohne weitere Funktionalität hinzuzufügen.
Auf OS Seite waren alle zuvor gemachten Tests mit der br0 jetzt ebenso erfolgreich.
Aber der VBox konnte ich diese neue virtuelle Interface br0 nun als Netzwerkinterface übergeben, über das sich diese dann direkt mit dem Internet verbinden konnte – unabhängig ob über WLAN oder LAN.

Die dazu notwendige Konfiguration liegt lediglich in der Datei
File: /etc/networkinterfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# FILE: /etc/network/interfaces
#
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
 
 
auto eth0
iface eth0 inet manual
	dns-search		scons.de fritz.box
	dns-nameservers		192.172.10.100 192.172.10.1
	mtu 			1500
	bond-master 		bond0
 
auto wlan0
iface wlan0 inet manual
	dns-search		scons.de fritz.box
	dns-nameservers		192.172.10.100 192.172.10.1
	mtu 			1500
	wpa-bridge		bond0
	wpa-driver 		wext
	wpa-ap_scan		1
	wpa-conf 		/etc/wpa_supplicant/wpa_supplicant.conf
	bond-master 		bond0
 
 
auto bond0
iface bond0 inet manual
	mtu 			1500
        bond-mode 		active-backup
        bond-miimon 		100
	bond-updelay		5
	bond-downdelay		5
        bond-slaves 		none
#	pre-up			/sbin/ifconfig bond0 hw ether 28:02:06:07:ae:ad
        post-up 		ifup eth0 wlan0 
        post-down 		ifdown eth0 wlan0
 
auto br0
iface br0 inet static
	mtu 			1500
	address			192.172.10.100
	broadcast		192.172.10.255
	network			192.172.10.0
	netmask			255.255.255.0
	gateway			192.172.10.1
	dns-search		scons.de fritz.box
	dns-nameservers		192.172.10.100 192.172.10.1
	bridge_ports 		bond0
	bridge_maxwait 		0
	bridge_fd 		0
	bridge_stp 		off
	post-up 		ifup 	bond0
	post-down 		ifdown	bond0

Einziger Nachteil:
Beim Wechsel in ein anderes Netzwerk muss diese Datei entsprechend angepasst werden, da ich aus verschiedenen Gründen hier feste IP benutzt habe. Eine Alternative ist der Einsatz von DHCP

Auslesen aller ALERT.LOG in einem RAC

Seit Oracle 10g kann man über die View sys.x$dbgalertext die alert.log auslesen. Diese stellt aber nur die Zeilen derjenigen alert.log zur Verfügung, die auf dem Server lesbar ist, an dessen Instance man angemeldet ist. Wie kann man nun aber in einem RAC – Umfeld alle alert.log Weiterlesen

AAS und andere Key Performance Indikatoren

Das folgende SQL berechnet einige Key performance Indicators einer DB – auf Basis der AWR History Views. Speziell wird hier für Jeden Snapshot Weiterlesen

Erstellen von Histogrammen über die Laufzeit von SQL Statements

Um einen ersten Überblick um die Laufzeit von SQL Statements, genauer gesagt über die Elapsed_time pro Execution, zu bekommen, nutze ich folgende kleines SQL Abfrage. Dadurch Weiterlesen

Rebuild einer Tabelle mit einer LONG RAW Spalte

Bei einem Kunden trat das Problem auf, dass das Auslesen einer kleinen Tabelle (25 Zeilen mit 4 Spalten) durchschnittlich über 45 Sekunden (!) dauerte. Nach kurzer Analysze war das Problem <!–more–> klar: Die Tabelle war mal sehr groß gewesen und hatte jetzt nur noch Zeilen im ersten und im letzten Block. Dazwischen lagen ca. 4 GB allokierter, aber ungenutzter Speicher, der bei jedem Lesen überlesen werden musste.

Natürlich war die erste Idee, die Tabelle zu reorganisieren:

ALTER TABLE SMALLTAB move;

Leider hatte diese Tabelle jedoch eine LONG RAW Spalte, so dass dieses Kommando mit dem Fehler

ORA-00997: illegal USE OF LONG datatype

fehlschlug.

Da die LONG RAW Spalten nicht sehr groß waren (die Längen waren überall kleiner als 20.000 Zeichen), konnten wir das Problem in diesem Fall mit Hilfe eines kleinen PL/SQL Programms lösen. Wäre eine oder mehr Spalten länger als 32.767 Zeichen gewesen, hätten wir die Tabellen exportieren, mit TRUNCATE leeren und anschließend wieder importieren müssen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Umbenennen der alten
ALTER TABLE SMALLTAB RENAME TO SMALLTAB_OLD;
 
# Anlegen einer neuen
CREATE TABLE SMALLTAB( 
  id                NUMBER NOT NULL
 ,TYPE              NUMBER NOT NULL
 ,record            long raw NOT NULL
);
 
# Füllen der neuen Tabelle mit den Werten aus der alten
SET serveroutput ON
DECLARE
  v_txt VARCHAR(32767 CHAR);
  i     NUMBER              := 0;
BEGIN
  FOR r IN (SELECT id, TYPE, record FROM SMALLTAB_OLD) loop
    i := i + 1;
    v_txt := UTL_RAW.CAST_TO_VARCHAR2(r.record);
    dbms_output.put_line('Row='||i||': '||LENGTH(v_txt));
 
    INSERT INTO SMALLTAB(id,TYPE,record)
    VALUES (r.id, r.type, utl_raw.cast_to_raw(v_txt));
  END loop;
 
  commit;
END;
/
 
# die alte droppen
DROP TABLE SMALLTAB_OLD;

Raspberry Pi hardening

In diesem dritten Beitrag geht es um das Hardening eines RPi, der als Router mit DNS und DHCP arbeitet. Weiterlesen

Raspberry Pi als Router mit DNS und DHCP konfigurieren

In diesem Beitrag wird beschrieben, wie amn einen Raspberry Pi (RPi) als einen Router konfigurieren und einsetzen kann, der auch einen DNS Forward Server wie auch einen DHCP Dienst bereitstellt. Weiterlesen

ORA-7445 [kkzgiojt()+8] bei Fast Refreshable MatViews nach dem Einspielen des PSU 11.2.0.3.7

Das Einspielen des Patches 11.2.0.3.7 (PSU) führt bei der Verwendung von Fast Refreshable MatViews unter anderem zu einem ORA-7445 [kkzgiojt()+8].
Dies hat zur Folge, dass alle Fast Refreshable MatViews sich nicht mehr refreshen lassen bzw. nicht mehr refreshed werden.

Dies ist bekannter Oracle Bug 17230530, der seine Ursache im besagten PSU hat. Zu diesem gibt es schon seit einiger Zeit auch den entsprechenden Patch. Dieser ist resp. wird auch in allen nachfolgenden PSU enthalten sein, so dass dieser One-Off Patch nicht mehr manuell nachgezogen werden muss, wenn weitere PSU eingespielt werden.

Detaillierte Informationen befinden sich in der ML Note 1573704.1

In meinem Fall hatte ich Fast Refreshable MatViews – on Commit eingesetzt.
Der Fehler hatte zur Folge, dass zwar alle DML auf den der MatViews zugrundeliegenden Basistabellen noch funktionierten, beim Commit dann aber die Fehlermeldung

ORA-12008: error in materialized view refresh path
ORA-01741: illegal zero-length identifier 

auftrat.

Die eigentliche Anwendung, die über einen Applikationserver in Verbindung mit Hypernate auf die DB zugreifft, protokolliert dann immer nur die (Java-) Fehlermeldung

transaction not active

ohne jedoch irgendwelche Oracle Fehlermeldung auch zu protokollieren.

Instrumentalisieren von JDBC-Thin Verbindungen

Beim Aufbau einer JDBC-Thin Verbindung zur Datenbank werden in der Regel viele Spalten der v$session mir festen Defaults gesetzt – ganz im Gegensatz zu einer SQL*Net Verbindung.
Dies lässt sich allerdings durch ein paar Zeilen Code sehr leicht beheben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public Connection openDBCon(String userId
			, String passWord
			, String xmldb
			, Logging l
			, SQLExcep ex) {
 
	Connection con = null;
	String nameForConnect = userId;
        String basisUrl = "jdbc:oracle:thin:@";
        String driverName = "oracle.jdbc.driver.OracleDriver";
        String Url = basisUrl + driverName;
 
        String myName = "ProgName";                     // Name des Programms        String hostName = InetAddress.getLocalHost().getCanonicalHostName();        String processName = myName + "@" + hostName; 
	if (nameForConnect.equalsIgnoreCase("SYS")) {
		nameForConnect = nameForConnect + " as sysdba";
	}
 
	try {
		Properties pro = new java.util.Properties();
 
		pro.setProperty("password", passWord);
		pro.setProperty("user", nameForConnect);
 
		try {			pro.put("ApplicationName", NotNull( myName, "ApplicationName"));			pro.put("ClientHostname", NotNull( hostName, "ClientHostname"));			pro.put("ClientUser", NotNull( System.getProperty("user.name"), "ClientUser"));			pro.put("v$session.osuser", NotNull( System.getProperty("user.name"), "osuser"));			pro.put("v$session.machine", NotNull( hostName, "machine"));			pro.put("v$session.program", NotNull( myName + ".jar", "program"));			pro.put("v$session.process", NotNull( processName, "process"));			pro.put("v$session.terminal", NotNull( Strip(hostName), "terminal"));		} catch (Exception ignore) {		} 
		DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
		Class.forName(driverName).newInstance();
 
		con = DriverManager.getConnection(Url, pro);
 
		setDbMetaData(con.getMetaData());
		setClientPro(con.getClientInfo());
 
		return con;
 
	} catch (ClassNotFoundException e) {
		// Could not find the database driver
		System.out.println(e);
		e.printStackTrace();
	} catch (SQLException sqle) {
		ex.printSQLException(sqle, xmldb, l);
	} catch (Exception e) {
		System.out.println(e);
		e.printStackTrace();
	}
 
	return con;
}