變更linux 6 的登入紅色背景圖


Oracle Enterprise Linux 6在登入畫面的背景是一張紅色的圖片,感覺太顯眼了。
起初是在桌面上按右鍵更換Background的方法,結果只有桌面上背景圖換了。
最後找到在 /usr/share/backgrounds 內可以解決這個問題。

# cd /usr/share/backgrounds
# ls

1280x1024_dawn.png   1920x1200_dawn.png   2048x1536_dawn.png   abstract     images
1280x1024_day.png    1920x1200_day.png    2048x1536_day.png    cosmos       nature
1280x1024_dusk.png   1920x1200_dusk.png   2048x1536_dusk.png   default.png  scenery
1280x1024_night.png  1920x1200_night.png  2048x1536_night.png  default.xml

出現好多不同解析度的圖檔,還有一個default.xml,這個XML記錄了使用圖檔的時機 


因為我懶的去改XML,索性把它更名:

# mv default.xml default.xml_bk
# mv default.png default.png_bk

回到登入頁,那張紅色的背景圖就不見了。

VirualBox 無法連線Guest


今天以SSH想連線到Linux時,出現無法連線主機的問題,我是用VirualBox來建立Linux。

先開啟Win7的命令列模式(cmd.exe),ping 主機Linux的IP(192.168.56.200)

    C:\ping 192.168.56.200
    Ping 192.168.56.200 (使用 32 位元組的資料):
    回覆自 192.168.56.1: 目的地主機無法連線。
    要求等候逾時。


    ping VirualBox的虛擬網卡Host-Only Network的IP(192.168.56.1):
    C:\ping 192.168.56.1
    Ping 192.168.56.1 (使用 32 位元組的資料):
    回覆自 192.168.56.1: 目的地主機無法連線。
    要求等候逾時。


開啟「喜好設定」


不知道為什麼,IP變成了168.254.33.2,會不會與我早上執行系統優化軟體有關係。

將IP改為192.168.56.1,再以SSH試一次,結果成功了


ERP 11i--刪除盤點計劃(Physical Inventories)


如題,如果有需要刪除盤計劃的話,可以在Snapshot之後,選擇tools,將它purge。

可以只刪除Tags 或者全部刪除

開機後自動啟用Oracle DB


編輯 /etc/oratab

將  testdb:/opt/oracle/112:N 改成 testdb:/opt/oracle/112:Y或者新增  *:/opt/oracle/112:Y

其格式為 : <$ORACLE_HOME> : , *表示所有的Instance,Y表示啟用自動開啟資料庫功能

新增 Shell Script ,加入下列 Command 並且將此檔置於 /etc/init.d/(此為範例,檔名為 ora11):

#!/bin/sh
ORA_HOME=/opt/oracle/112
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
    echo "Oracle startup: cannot start"
    exit
fi
case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login
        # will not prompt the user for any values
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
        su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart"
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login
        # will not prompt the user for any values
        su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut immediate"
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
        ;;
esac

接者將此 Script 加入啟動選項

# chkconfig --add ora11

修改開機預設啟動 runlevel

# chkconfig --list ora11

# chkconfig --level 35 ora11 on

查詢export的dmp文件字元集


如何查詢export的dmp文件字元集:

用Oracle的exp工具導出的dmp檔案包含了字元集的資訊,可以用UltraEdit打開(16進制

方式),看第2及第3個位元組的內容,如0001,然後用以下SQL查出它對應的字元集:



SQL> select nls_charset_name(to_number('0001','xxxx')) from dual;


如果dmp檔案很大,用編輯器打開很慢,可以用以下命令(lunux):

 cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

ORA-19633: controlfile record 2290 is out of sync with recovery catalog


當要刪除過期的備份記錄時,出現ERROR,訊息如下:

RMAN> DELETE FORCE NOPROMPT OBSOLETE;

(略…)

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of delete command on ORA_DISK_1 channel at 08/26/2008 09:51:48
ORA-19633: controlfile record 2290 is out of sync with recovery catalog

Recovery Manager complete.


意思大概為CONTROLFILE內備份記錄的日期與CATALOG所記錄的日期不同。



解決方法如下:

1.連上TARGER與CATALOG

    # rman target sys/XXXXX@AA catalog rman/XXXXX@AA

2.執行同步指令

    RMAN> resync catalog;

    starting full resync of recovery catalog
    full resync complete

ORA-00119、ORA-00130


今天在測試機上啟動DB時,出現失敗訊息如下:

SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00130: invalid listener address '(ADDRESS=(PROTOCOL=TCP)(HOST=oel63.test.com.tw)(PORT=1521))'

訊息大致提到是address的問題,所以就注意到HOST=oel63.test.com.tw,查一下Linux的Host Name:

[root@oel63 sysconfig]# hostname
oel63.test.com.tw

再查詢Linux的/etc/hosts

[root@oel63 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.56.200 oel62 oel62.test.com.tw
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
fec0::a00:27ff:fe9a:a828 oel62 oel62.test.com.tw

hosts內容並沒有oel63.test.com.tw,原來是昨天在測試IPv6時有修改到Host Name。

修改Linux的Host Name,下面的指令只能暫時變更Host Name,關機重新就會失效。

[root@oel63 sysconfig]# hostname oel62.test.com.tw

再啟動一次資料庫

SQL> startup
ORACLE instance started.
Total System Global Area 1043886080 bytes
Fixed Size    2219952 bytes
Variable Size  679477328 bytes
Database Buffers  356515840 bytes
Redo Buffers    5672960 bytes
Database mounted.
Database opened.

啟動成功,修改/etc/sysconfig/network,永久更改Host Name,
將 HOSTNAME=oel63.ccc.com.tw 改為 HOSTNAME=oel62.ccc.com.tw





IPv6 切割子網域實驗


hosta --> fec0::a00:27ff:fe9a:a828
hostb --> fec0::10:a00:27ff:fe95:f91c

實驗1:prefix為63

[root@hosta ~]# ifconfig eth0 | grep Scope:Site
    inet6 addr: fec0::a00:27ff:fe9a:a828/64 Scope:Site

[root@hostb ~]# ifconfig eth0 | grep Scope:Site
    inet6 addr: fec0::1:a00:27ff:fe95:f91c/64 Scope:Site

主機分屬於feco:0000:0000:000及feco:0000:0000:001兩個網段,互ping不成功

[root@hosta ~]# ping6 -I eth0 fec0:0000:0000:0010:a00:27ff:fe95:f91c
PING fec0:0000:0000:0010:a00:27ff:fe95:f91c(fec0::10:a00:27ff:fe95:f91c) from fec0::a00:27ff:fe9a:a828 eth0: 56 data bytes
^C
--- fec0:0000:0000:0010:a00:27ff:fe95:f91c ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3602ms


實驗2:prefix為56

[root@hosta ~]# ifconfig eth0 | grep Scope:Site
    inet6 addr: fec0::a00:27ff:fe9a:a828/56 Scope:Site

[root@hostb ~]# ifconfig eth0 | grep Scope:Site
    inet6 addr: fec0::1:a00:27ff:fe95:f91c/56 Scope:Site

主機同屬於feco:0000:0000:00網段,互ping成功

[root@hosta ~]# ping6 -I eth0 fec0:0000:0000:0010:a00:27ff:fe95:f91c
PING fec0:0000:0000:0010:a00:27ff:fe95:f91c(fec0::10:a00:27ff:fe95:f91c) from fec0::a00:27ff:fe9a:a828 eth0: 56 data bytes
64 bytes from fec0::10:a00:27ff:fe95:f91c: icmp_seq=1 ttl=64 time=2.74 ms
64 bytes from fec0::10:a00:27ff:fe95:f91c: icmp_seq=2 ttl=64 time=0.753 ms
64 bytes from fec0::10:a00:27ff:fe95:f91c: icmp_seq=3 ttl=64 time=0.686 ms

由上實驗可知,IPv6在分割子網域上比IPv4方便,只需使用prefix即可。
在實驗的過程中,自己忽略了一件事,IPv6的是使用16進位來計算,
而prefix的是指2進位位元的位置,所以在計算上才會發現prefix在63、62時,
還是分屬不同的子網段,直到prefix在59時才是相同子網段,
這個結果與自己所預期的不同。原因如下:

以feco:0000:0000:0010:a00:27ff:fe95:f91c的第四組數字0010來計算。
16進位 ->  0010
 2進位 ->  0000 0000 0000 0001 0000

所以16進位的1,由右至左在位置2,但是對於2進位而言,其位置卻是在5。



在Linux 6.2上設定IPv6


1、查詢kernel是否有載入ipv6的模組
  # modprobe -c |grep ipv6
  如果有看到 alias net-pf-10 ipv6,就表示已經載入ipv6的模組

2、編輯/etc/sysconfig/network,加入 NETWORKING_IPV6=yes
 
  NETWORKING_IPV6=yes|no - 啟用或不啟用global IPv6
 
3、編輯/etc/sysconfig/network-scripts/ifcfg-eth0,並加入下列各行:

  IPV6INIT=yes
  IPV6ADDR=
  IPV6_DEFAULTGW=
 
  我的ifcfg-eth0內容如下,同時支援IPv4與IPv6:
    DEVICE=eth0
    BOOTPROTO=static
    ONBOOT=yes
    HWADDR=08:00:27:95:f9:1c
    IPADDR=192.168.56.201
    GATEWAY=192.168.56.1
    NETMASK=255.255.255.0
    IPV6INIT=yes
    IPV6ADDR=fec0::a00:27ff:fe95:f91c/64
    IPV6_DEFAULTGW=fec0::a00:27ff:fe95:1

  IPV6INIT=yes -啟用IPv6
  IPV6ADDR=fec0::a00:27ff:fe95:f91c/64 -IPv6 address
  IPV6_DEFAULTGW=fec0::a00:27ff:fe95:1 -default gateway

4、重新啟動網路

  # service network restart

5、查詢eth0的狀態,應該就可以看見IPv6的IP
  # ifconfig eth0
 
  eth0    Link encap:Ethernet  HWaddr 08:00:27:95:F9:1C
          inet addr:192.168.56.201  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fec0::a00:27ff:fe95:f91c/64 Scope:Site  -->IPv6的Site-local IP
          inet6 addr: fe80::a00:27ff:fe95:f91c/64 Scope:Link  -->IPv6的Link-local IP

 

Oracle 11gR2 IPv6的設定


零、作業系統:Oracle Enterprise Linux 6.2
    Database:11gR2(11.2.0.1.0)

一、設定Linux IPv6的位址:
    編輯 /etc/sysconfig/network-scripts/ifcfg-eth0,新增下列設定:
  
     IPV6ADDR=fec0::a00:27ff:fe9a:a828/64
     IPV6_AUTOCONF=no
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
     IPV6_PEERDNS=yes
    IPV6_PEERROUTES=yes
  
     或者利用GUI的網路管理套件來設定也可以。
  
    重新啟用網路設定:
     # service network restart
  
     查詢IP:
     # ifconfig eth0
  
     eth0  Link encap:Ethernet  HWaddr 08:00:27:9A:A8:28
          inet addr:192.168.56.200  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fec0::a00:27ff:fe9a:a828/64 Scope:Site
          inet6 addr: fe80::a00:27ff:fe9a:a828/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7729 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5332 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:744708 (727.2 KiB)  TX bytes:1014119 (990.3 KiB)
         
    如果ifcfg-eth0的設定是正確的,會有兩個inet6 addr,一個是Link-local、另一個是Site-local或是Global。
     不要像我使用Link-local IP來設定Oracle DB,肯定會出現錯誤的。
     因為Link-local IP只能在同網段內使用,不能通過路由器。
     所以要設定的IP為fec0::a00:27ff:fe9a:a828
  
二、確認Oracle DB的版本,因為目前只有Oracle 11gR2才有支援IPv6

    # su - oracle
    $ sqlplus /nolog
  
    SQL*Plus: Release 11.2.0.1.0 Production on Tue Jun 26 13:08:33 2012
    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    SQL> connect / as sysdba
  
    Connected to an idle instance.
 
     SQL> select version from v$instance;

    VERSION
    -----------------
    11.2.0.1.0
  
三、修改 $ORACLE_HOME/network/admin/listener.ora,增加如下面的第五列:
 
     LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.200 )(PORT = 1521))
          (ADDRESS = (PROTOCOL = TCP)(HOST = fec0::a00:27ff:fe9a:a828)(PORT = 1521))
      )
    )
    ADR_BASE_LISTENER = /opt/oracle
  
    重新啟用 listener
     $ lsnrctl stop
     $ lsnrctl start

四、修改client的tnsname.ora,內容主要是修改HOST的部份,如下:
    TESTDB6 =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = fec0::a00:27ff:fe9a:a828)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = testdb)
        )
      )
    
以上設定完就可以了,只是我一開始都是用Link-local IP來設定,所以一直無法成功啟用listener。



在網址列輸入https:// [fec0::a00:27ff:fe9a:a828]:1158/em

 
   

IPv6 Unicast的三種類型


IPv6具有比IPv4大得多的地址空間。這是因為IPv6使用了128位元的地址,而IPv4只用32位元

就以地球人口70億人計算,每人平均可分得約4.86 x 10^28個IP

IPv6 unicast有以下三種:

Global:
  具有唯一性,不會有相同的位址,類似 IPv4 的 Public Address。

Link-Local:
  位址僅用在同一個子網路中,不可被繞送到其他連結或網際網路上,這類位址的封包不能通過路由器。
  概念很像在IPv4中,當DHCP分配失敗時,所產生的169.254.XXX.XXX的IP。
  在使用時必須注意,不要將它用在跨網段的應用程式的服務上,如Oracle DB Listen,會失敗的。
  目前是以FE80開頭的IP
  

Site-Local:
  位址可以跨連結,在不同網段間繞送,但不可被繞送到網際網路。
  概念就像是IPv4中的私有位址,對主機間及路由器間自動建立暫時性的通信非常有用。
  目前是以FEC0開頭的IP

IPv6 MAC 轉換成 Link-local IP


支援IPv6的介面都會有一個位址稱為link-local位址,也就是以FE80開頭的IP,該IP只能在同網段內活動,不能跨網段。

link-local是由網卡的MAC去換算出來的,千萬不要像我這樣傻傻的,沒有先了解,就手動指定IP,還怪Linux怎麼會無法修改。

[oracle@oel62 ~]$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:9A:A8:28
          inet addr:192.168.56.200  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fec0::a00:27ff:fe9a:a828/64 Scope:Site
          inet6 addr: fe80::a00:27ff:fe9a:a828/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6270 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4327 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:606953 (592.7 KiB)  TX bytes:900914 (879.7 KiB)
         
由上面的Scope可以知道,link-local IP是 fe80::a00:27ff:fe9a:a828,下面是換算的過程:
         
MAC             08:00:27:9A:A8:28
Step1           08:00:27:FF:FE:9A:A8:28
Setp2           0A:00:27:FF:FE:9A:A8:28 
Setp3           fe:80:00:00:00:00:00:00:0A:00:27:FF:FE:9A:A8:28
Setp4           fe80:0000:0000:0000:0A00:27FF:FE9A:A828    --> Link_local IP

Step1:
  將十六進位值 FF:FE 插入MAC位址的中間,也就是第三位元組與第四位元組中間。

Step2:
  將MAC用來識別Universal或Local的那個位元做補數(complement)的動作,也就是將"08"這個byte由左到右的倒數第二個 bit 從原來的"0"轉成 "1"。
  08(16) => 0000 1000(2) => 0000 1010(2) => 0A(16)

Setp3:
  在最前面加上fe:80:00:00:00:00:00:00。

Setp4:
  依照IPv6的格式重新排列,就可以得到fe80::a00:27ff:fe9a:a828的IP位址。

讓Winodws7顯示linux的GUI(xming)


讓Winodws7顯示linux的GUI程式(xming)

因為比較習慣在Win7的環境下擷取圖片、編修、文書處理,

所以也希望能在Win7或WinXP環境下顯示linux的畫面,以利處理。

記錄我自己在Win7使用的方法:

    在Linux的X Server、X Client架構下,安裝X Server from Windows
   (X-client 負責程式的運作、X-Server 負責畫面的顯示)

    首先要安裝xming,官網:http://www.straightrunning.com/XmingNotes/

安裝完後執行它,讓它常駐在系統內。

設定putty、xshell的X11 Forwarding,或者利用$DISPLAY:

1、設定X11 Forwarding

  putty
 
  Xshell

 
  設定完後登入SSH,可以執行xeyes、xclock兩支GUI的程式,  
  如果win7的桌面上出現一雙眼睛或時鐘,就表示成功了。
  # xeyes
  或
  # xclock
 
2、利用$DISPLAY:

  直接以SSH Client登入Linux後,設定$DISPLAY變數,設定值:Win7的IP:0.0
  # export DISPLAY=192.168.1.43:0.0
  # xeyes
 
  如果win7的桌面上出現一雙眼睛,就表示成功了。
 

VirualBox--Guest ping Host失敗


Host:
OS:Windows 7
IP:192.168.1.43

Guest:
OS: Oracle Linux 6.2 64bit
IP: 192.168.56.201(Host Only Ethernet Adapter)
Gateway:192.168.56.1

問題:
    從win7 ping linux 沒有問題,但是從linux ping win7失敗。

說明:
    在網路上有人提到可以增加一個NAT的網路介面,所以我也增加一個。
因此我的guest上有兩塊網路卡,資訊如下:
eth0:192.168.56.201(Host Only Ethernet Adapter)
eth1:10.0.3.2(NAT)



    再測一次,從linux ping win7,還是失敗。

    查詢路由表:
    # route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    10.0.3.0        *               255.255.255.0   U     1      0        0 eth1
    192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
    192.168.56.0    *               255.255.255.0   U     0      0        0 eth0
    link-local      *               255.255.0.0     U     1002   0        0 eth0
    default         192.168.56.1    0.0.0.0         UG    0      0        0 eth0

    預設的Gateway是192.168.56.1,增加一條routing rule
    # route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1 gw 10.0.3.2

    查詢路由表:
    # route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.1.0     10.0.3.2        255.255.255.0   UG    0      0        0 eth1
    10.0.3.0        *               255.255.255.0   U     1      0        0 eth1
    192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
    192.168.56.0    *               255.255.255.0   U     0      0        0 eth0
    link-local      *               255.255.0.0     U     1002   0        0 eth0
    default         192.168.56.1    0.0.0.0         UG    0      0        0 eth0

    再試一次,從linux ping win7 ,成功。
    # ping -c 3 192.168.1.43
    PING 192.168.1.43 (192.168.1.43) 56(84) bytes of data.
    64 bytes from 192.168.1.43: icmp_seq=1 ttl=128 time=3.44 ms
    64 bytes from 192.168.1.43: icmp_seq=2 ttl=128 time=1.10 ms
    64 bytes from 192.168.1.43: icmp_seq=3 ttl=128 time=0.904 ms


安裝 11gR2,出現Invalid source path '../stage/Components/oracle.jdk


在執行runInstaller之後,出現下列的錯誤:

Invalid source path '../stage/Components/oracle.jdk/1.5.0.17.0/1/DataFiles' specified for unzip. Unzip command failed. Please check oraparam.ini and specify a valid source path.

原因是因為我把在官網下載的兩個DB壓縮檔分別解壓到不同的目錄,以致於找不到oracle.jdk。

重新將兩個壓縮檔解壓到同一個目錄就好了。

linux.x64_11gR2_database_1of2.zip
linux.x64_11gR2_database_2of2.zip

FileZilla IPv6連線說明


FileZilla 已經有支援Ipv6,但是在輸入主機IP時,需要加上左右括號,

如 [::1]、[2001:2002::a100]

vsftp IPv4、IPv6 Support


vsftp IPv4、IPv6 Support
OS:Oracle Enterprise Linux 6.2 64bit

安裝 vsftpd,放入光碟。
    # mount /dev/cdrom /media
    # cd /media/Server/Pageages/
    # rpm -ivh vsftpd-2.2.2-6.el6_0.1.x86_64.rpm

根據以下的說明,想要IPv4與IPv6共存的話,必須使用兩個設定檔,listen與listen_ipv6只能啟用一個。
    When "listen" directive is enabled, vsftpd runs in standalone mode and
    listens on IPv4 sockets. This directive cannot be used in conjunction
    with the listen_ipv6 directive.
    This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
    sockets, you must run two copies of vsftpd with two configuration files.
    Make sure, that one of the listen options is commented !!

複製vsftpd.conf
    # cp /etc/vsftpd/vsftpd.conf  /etc/vsftpd/vsftpd_ipv6.conf

修改 /etc/vsftpd/vsftpd_ipv6.conf,將 listen=YES 改為 listen_ipv6=YES

現在我們有兩個設定檔,vsftpd.conf、vsftpd_ipv6.conf:
    vsftpd.conf  -->  listen=YES
vsftpd_ipv6.conf -->  listen_ipv6=YES

重新啟用 vsftpd :
    # service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
    Starting vsftpd for vsftpd:                                [  OK  ]
    Starting vsftpd for vsftpd_ipv6:                           [  OK  ]

測試:
    # ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 2.2.2)
    Name (127.0.0.1:root):

    ftp ::1
    Connected to ::1 (::1).
    220 (vsFTPd 2.2.2)
    Name (::1:root):

::1 是一個特殊IP,其功能與 127.0.0.1一樣

剛開始測試時,IPv6的FTP一直無法連線成功,後來發現是ip6tables的緣故:
    iptables  --> IPv4
ip6tables --> IPv6
    將它關閉之後就可以正常登入:
# service ip6tables stop

Unix/Linux內查詢Oracle錯誤代碼


可以用指令 oerr 在Unix/Linux內查詢Oracle錯誤代碼的意義

$ oerr --help

Usage: oerr facility error
Facility is identified by the three-letter prefix in the error
string.  For example, if you get ORA-7300, "ora" is the facility
and "7300" is the error.  So you should type "oerr ora 7300".
If you get LCD-111, type "oerr lcd 111", and so on.

如果得到 lcd-100 的錯誤
$ oerr lcd 100
100, 0, "internal error, argument [%d]"
// *Cause: An internal error has occurred
// *Action: Report it to your System Administrator immediately

如果得到 ora-06504
$ oerr ora 06504
06504, 00000, "PL/SQL: Return types of Result Set variables or query do not match"
// *Cause: Number and/or types of columns in a query does not match declared
//         return type of a result set  variable, or declared types of two Result
//         Set variables do not match.
// *Action: Change the program statement or declaration. Verify what query the variable
//          actually refers to during execution.

VirtualBox新增虛擬機器時,出現UUID相同


VirualBOX新建一個虛擬機器A並安裝Linux 6.2(純文字介面)後,就將該虛擬機器A的映象檔及設定檔複製到備份資料夾。
但是卻又在虛擬機器A把作業系統刪除,重灌Linux 6.2(圖形介面)。
現在因為要拿速度較快的純文字介面Linux6.2來測試,所以加入一個虛擬機器,並選擇備份資料夾。

出現有相同UUID的錯誤,因為備份的映象檔與設定檔原本就是從虛擬機器A拷貝過去,所以兩者的UUID是一樣的。


只好先將虛擬機器A再製(Clone)一個虛擬機器B因為Clone會重新指派一個新的UUID給虛擬機器B




刪除虛擬機器A


再加入備份的映象檔及設定檔就可以同時存在虛擬機器A、虛擬機器B

增加SWAP的大小


建立512M的檔案swaptest。
    # dd if=/dev/zero of=/swaptest bs=1024 count=524288

    524288+0 records in
    524288+0 records out
    536870912 bytes (537 MB) copied, 6.971 s, 77.0 MB/s

設定 /swaptest 為 swap,參數-f為force
    # mkswap -f /swaptest

    Setting up swapspace version 1, size = 524284 KiB
    no label, UUID=c65946cf-6c09-431a-a884-1015bdaec7bf

先檢查目前swap的大小
    #free |grep Swap

Swap:      2097144          0    2097144 <-- swap的容量為2G

啟用 /swaptest
    # swapon /swaptest

再檢查swap的大小
    #free |grep Swap

Swap:      2621424          0    2621424  <--增加了256MB

關閉 /swaptest
    #swapoff /swaptest

如果想永遠都使用swap檔案,則編輯 /etc/fstab 加入以下設定:
/swaptest swap swap defaults 0 0

su 與 su - 的差異


su USER_NAME 會保留原來的exported環境變數。

su - USER_NAME 會重新初始化環境變數,就像重新登入一樣。


例:

    # su oracle
    $ cd ~
    $ pwd
    /root  <-- 因為保留root的環境變數,所以家目錄還是在/root

    # su - oracle
    $ cd ~
    $ pwd
    /home/oracle  <-- oracle帳號的家目錄

使用yum安裝光碟內的套件


安裝完Linux 6.2之後,原本想用gcc編譯一個軟體,但是sh傳回無此指令,用rpm檢查一下:

# rpm -qa | grep gcc

沒有任何回傳值,所以是真的沒有安裝,於是放入光碟準備安裝套件。

# df -vh 
Filesystem            Size  Used Avail Use%     Mounted on
/dev/sda3              38G  5.5G   30G  16%     /
tmpfs                   497M         0   497M   0%  /dev/shm
/dev/sda1           291M   43M   233M  16% /boot

光碟沒有自動mount,必須先手動掛載

#  mount  /dev/cdrom  /media
mount: block device /dev/sr0 is write-protected, mounting read-only

安裝套件
# cd /media/Server/Packages
# rpm -ivh gcc-4.4.6-3.el6.x86_64.rpm

系統提示缺少部份的套件,原本想使用rpm一個一個安裝,但是相依性的問題又覺得太麻煩,
於是參考網路上高手用yum來安裝套件,解決套件相依性的問題。

設定完本機的yum,安裝gcc就變得很簡單了,# yum install -y gcc

以下是我的操作部份:

使用cp指令將光碟資料拷貝到硬碟存放,原本想只以光碟當yum的資料夾,以節省空間
但是因為後續的步驟會寫入檔案到yum的資料夾,所以就把光碟內容複製到硬碟上。

# mkdir /source_data
# mount /dev/cdrom /media
# cp -R /media/. /source_data

因為yum client會向資料的來源(Server、資料夾…)抓取repodata目錄內的XML作為套件檔案列表,
所以下一步驟,是用createrepo指令來產生repodata目錄與XML檔案,但是我一開始安裝時選擇Basic Server,
並沒有自動安裝createrepo的套件,必須先安裝createrepo的套件。

# rpm -ivh createrepo-0.9.8-4.el6.noarch.rpm
warning: createrepo-0.9.8-4.el6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
     deltarpm is needed by createrepo-0.9.8-4.el6.noarch
     python-deltarpm is needed by createrepo-0.9.8-4.el6.noarch

有兩個相依性的套件必須先安裝

# rpm -ivh deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm
warning: deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:deltarpm               ########################################### [100%]

# rpm -ivh python-deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm
warning: python-deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:python-deltarpm        ########################################### [100%]

# rpm -ivh createrepo-0.9.8-4.el6.noarch.rpm
warning: createrepo-0.9.8-4.el6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:createrepo             ########################################### [100%]

安裝完成後,使用指令createrepo來產生 repodata 目錄以及此目錄下 xml 檔案。

# createrepo /source_data

上述步驟需要一些時間,尤其我是以VirualBox來安裝Linux,花了更多的時間。

編輯新檔案test01.repo,檔案名稱自訂,但是副檔名必須是.repo。也可以加在/etc/yum.conf內

# vi /etc/yum.repos.d/test01.repo

[test01]
name=test01
baseurl=file:///source_data
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle

參考文件上是設定gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release,但是我是安裝Oracle Linux,
在/etc/pki/rpm-gpg找不到該檔案,所以以RPM-GPG-KEY-oracle來使用。
「baseurl=file:///source_data」是指本機 /source_data 目錄下的檔案,第三個斜線的意義是「根目錄」
「enabled=1」表示啟字(1 啟用 0 停用)。
baseurl參數除了「file://」方式之外,還有「ftp://」與「http://」兩種方式,所以也可以指定外部的yum Server

執行yum list來試試看

# yum list
Loaded plugins: security
source_data                                                                            | 1.3 kB     00:00 ...
source_data/primary                                                                    |  11 MB     00:00 ...
source_data: [###############                                                                    ] 4107/21504


資料參考:
使用 yum 來做套件管理以及建置 yum Server
作者:徐秉義(Albert Hsu)

安裝Linux 6.2後,網路無法使用


版本:Oracle Enterprise Linux 6.2 64bit
安裝完Linux後,發現網路無法使用。先檢查網路目前的狀況。 
# ifconfig
由下圖可知,只有介面lo是有作用的。

找尋網卡的相關訊息,可以發現Linux有正確識別網卡e1000
# dmesg|grep eth

檢查網卡的設定檔,問題出現在這裡,onboot=”no”,所以開機不會啟用網卡。

因為要設定固定 IP,所以使用setup來設定,也可以用vi編輯ifcg-eth0的設定,
以下為我自己設定的步驟:



將「Use DHCP」的勾選取消,並填入相關的網路設定

再次檢查設定檔 ifcfg-eth0,用vi修改ONBOOT=yes

重新啟用網路 # service network restart
再次檢查網路目前的狀況 # ifconfig

網路已正常運行。

安裝 JIitortor


1、ERP需要使用 JInitator 的元件,但是 JInitator 內的 Java 已經是很舊的版本,因此在 IE7 以上之版本執行會有錯誤。

2、不論是 64 Bit 或 32 Bit 的作業系統,都必須安裝 Sun JAVA 32 Bit 版本。

3、安裝完 Sun Java 32位元的 Java Runtime 後,必須將 Sun 安裝目錄下的 jvm.dll 複製到 JInitator 的安裝目錄下,覆蓋相同的檔案。

4、JInitator 的目錄在:
      32 Bit : C:\Program Files\Oracle\JInitiator 1.3.1.18\bin\hotspot
      64 Bit : C:\Program Files(x86)\Oracle\JInitiator 1.3.1.18\bin\hotspot

5、將 IE 信任網域的安全性調整為「中低」。

6、將 ERP網址加入信任網域


2013/05/09 補充:
1、安裝最新版的 JRE 7 Update 21,結果jvm.dll無法使用,會出現缺少某些.dll的檔案。

Oracle Developer Days pre-built VM:dbca錯誤


Oracle釋出的Pre-built VM,個人覺得蠻方便的,只要以VirualBox匯入,就可以馬上擁有可以測試的Oracle 11g環境。

今天在測試機上執行dbca時,發生以下的錯誤,我是在VirualBox上匯入Pre-built VM。

Exception in thread "main" java.lang.NoClassDefFoundError: oracle/sysman/assistants/dbca/Dbca
Caused by: java.lang.ClassNotFoundException: oracle.sysman.assistants.dbca.Dbca
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: oracle.sysman.assistants.dbca.Dbca.  Program will exit.

自己檢查了一下參數及設定檔,覺得沒有什麼問題,而且Pre-built VM是由Oracle安裝製作的,

應該不會有設定上的錯誤才對。於是在網路上搜尋了一下,似乎是Pre-built VM拿掉了不少的功能。

看來自己要再找時間來自行安裝一個完整的環境。




Oracle ERP 檔案上傳的範例


declare  
   v_access_id      NUMBER;
    l_server_url VARCHAR2(255);
    l_url VARCHAR2(255);
    l_gfm_id NUMBER;
    temp NUMBER;
    button_choice NUMBER;
    tempdata varchar2(32767);
    v_raw            raw(32767);
    v_int            number;
 
    v_len          number;
    v_i              number:=0;
    v_count       number:=0;
    v_char         varchar2(120);
   
    v_user            number;
    li_pos             INTEGER  := 0;
    li_old_pos       INTEGER  := 0;
    dummy           number;
   
   
    v_sou  varchar2(100);
    i number;
    j number;
    k number;
    v_tar varchar2(100);
    v_check varchar2(10);
   
    v_a  varchar2(100);
    v_b  varchar2(100);
    v_c  varchar2(100);
    v_d  varchar2(100);    
   
begin

    --Get Process ID
    v_access_id := fnd_gfm.authorize(null);
   
    --Get User Name
    v_user:=fnd_profile.value('USER_ID');    
   
    --取出APPS_WEB_AGENT的Web Server String
    fnd_profile.get('APPS_WEB_AGENT',l_server_url);

    --組成完整的URL,chr(38) --> &
    -- http://test.erp.com.tw:82266/pls/CLONE/fnd_file_upload.displayGFMform?access_id=849330512&l_server_url=http://test.erp.com.tw:82266/pls/CLONE
    l_url := RTRIM(l_server_url, '/') ||
        '/fnd_file_upload.displayGFMform?access_id=' ||
        to_char(v_access_id) || chr(38) || 'l_server_url=' ||
        l_server_url;

    IF (l_url IS NULL) THEN
        RAISE FORM_TRIGGER_FAILURE;
        RETURN;
    END IF;
       
    --開啟上傳網頁,上傳完必須自行關閉網頁。
    fnd_utilities.open_url(l_url);

    --設定提示視窗,用來決定是否完成上傳的動作
    fnd_message.set_name('FND','ATCHMT-FILE-UPLOAD-COMPLETE');
 
    --設定提示視窗的按鈕,有「YES」、「NO」,YES傳回1、NO傳回3
    button_choice := FND_MESSAGE.question(
                button1 => 'YES',
                button2 => null,
                button3 => 'NO',
                default_btn => 1,
                cancel_btn => 3,
                icon => 'question');

    --按下提示視窗的「YES」
    if button_choice = 1 then
               
        --回傳上傳檔案的ID
        l_gfm_id := fnd_gfm.get_file_id(_access_id);
       
               
        --檔案上傳頁面會將檔案上傳到 fn_lob 表格內的一個欄位,型態為 Blob。
        --檔案上傳結束。
       
       --取出檔案資料方法,
       /*
       以文字檔為例,上傳的範例資料為
         aa,bb,cc
         11,22,33
      */
           
      loop
            tempdata :='';
                       
           --chr(10)換行符號,li_pos為符合的字串長度,(li_old_pos +1)開始位置,1為符合chr(10)的第一筆資料
           --存在Blob欄位的資料是連續的raw字元
           --下列SQL會取出文字檔一行的資料,因為每一行是以斷行chr(10)做為分行
           --取出的資料格式是raw類型,不是一般的文字格式。
           select dbms_lob.instr(file_data, utl_raw.cast_to_raw(chr(10)), li_old_pos+1 , 1)
                  into li_pos
                  from fnd_lobs
                  where file_id = l_gfm_id;
                 
          exit when li_pos = 0 ;  -- no more data            
           
            begin
                --取出指定字串,(li_pos - li_old_pos-1) 字串長度,(li_old_pos +1) 開始的位置                
                  select utl_raw.cast_to_varchar2(dbms_lob.substr(file_data, (li_pos - li_old_pos-1), li_old_pos +1))
                  into  tempdata
                  from  fnd_lobs
                  where file_id = l_gfm_id;                    
                                   
                  ----字元集轉換-----------------------------------------------
                  --因為從Windows上傳的文字檔是ansi碼,但是資料庫是UTF8
                  select rtrim(convert(tempdata|| ' ','AL32UTF8','ZHT16MSWIN950')) into tempdata from dual;
                  --select rtrim(convert(tempdata|| ' ','AL32UTF8','ZHT16BIG5')) into tempdata from dual;
                  -----------------------------------------------------------------
                                             
           end;
         
            begin  
                select replace(tempdata,chr(13)||chr(10),chr(10)) into tempdata from dual;
            end;

            v_count := 0;
            v_char := null;
           select length(tempdata) into v_len from dual;
           for i in 1..v_len loop
               begin                            
                            --一次取一個字元,如果是",",則表示已完成一個字串,其用意與split分割函數同
                            --if nvl(substr(tempdata,i,1),',')=',' or ascii(substr(tempdata,i,1)) in('10','13') then    
                            if nvl(substr(tempdata,i,1),'n')=','  then
                                v_count:=v_count+1;                              
                                if v_count=1 then --字串aa 或 11
                                    v_a :=v_char;
                                    v_char:=null;
                                elsif v_count=2 then --字串bb 或  22
                                    v_char:=null;                                        
                                end if;
                            else
                                v_char:=v_char||substr(tempdata,i,1);      
                            end if;
                           
                            --每行的最後一個字串
                            if (i  = v_len-1) then
                                v_receive_no:=v_char;  --字串cc 或 33
                              v_char:=null;  
                            end if;
                           
               end;                  
           end loop;
         
           li_old_pos := li_pos;  -- pos of a file
         
    end loop;
   
end;

HP-UX NTP的設定(時間校正)


聽到同事說伺服器的時間晚了一分鐘,就想以前在Linux上設定過ntp,HP-UX應該也可以吧。
以下為在網路上找到的方法,同時也與公司的HP-UX(已啟用xntpd)比對過。

1、編輯設定檔 /etc/rc.config.d/netdaemons,將 XNTPD 設定為 1(表示啟用)

   export XNTPD=1

2、編輯設定檔 /etc/ntp.conf ,加入兩台外部ntp server ,可參考「國家時間與頻率標準實驗室」。

   server xxx.xxx.xxx.xxx  #  Primary Time Server
   server yyy.yyy.yyy.yyy  #  Secondary Time Server

3、啟動 NTP 服務

   # /sbin/init.d/xntpd start
  
4、過一段時間後,再檢查是否與ntp server 對時

   # /usr/sbin/ntpq -p

   成功的話,會出現對時的ntp server ip,及對時後調整時間的訊息。

   如出現 No association ID's returned 則表示沒有成功。

5、下列我實際在一台HP-UX的查詢結果(有啟用xntpd)

   # ps -ef |grep ntp
       root  1807     1  0  Aug 20  ?        20:11 /usr/sbin/xntpd
     test01  9460 22208  1 14:42:34 pts/ta    0:00 grep ntp

   # ntpq -p
        remote           refid      st t when poll reach   delay   offset    disp
     ==============================================================================
     *192.168.100.10     59.124.196.84    3 u   44   64  377     0.26    2.239    1.62

   注:59.124.196.84 是外部時間伺服器(hntp1.hinet.net)

設定Linux主機的密碼原則


為了資訊安全及符合會計師的要求,設定Linux主機的密碼原則。
密碼原則設定於 /etc/login.defs

# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7

以下是我自己的設定規則:
1、90天必須更改密碼一次。
2、密碼變更後,最少要經過一天才能再更改。
3、密碼最小8位以上。
4、密碼到期前7天通知使用者。

所以我的設定值如下:
PASS_MAX_DAYS   90   --> 密碼有效天數,多久要變更密碼
PASS_MIN_DAYS   1       --> 變更密碼後要多久才能再修改密碼
PASS_MIN_LEN    8       --> 密碼的最小長度
PASS_WARN_AGE   7       --> 密碼失效之前幾天發出警告訊息

Xshell連線Telnet會固定產生字元


在 Xshell 預設的參數下,利用 Telnet 連線伺服器會在固定的時間傳回特定字元,如下圖:

這是因為勾選為了維持連線,固定時間送出訊息,以免暫停時間過長離線。
只要修改參數設定,如下圖,取消勾選,即可解決。

啟用vsftpd,出現500 OOPS錯誤


原本想以阻擋ftp來練習iptables,但是pre-built Oracle VM VirtualBox並沒有安裝vsftpd

# rpm -qa |grep vsftpd

那就自行下載vsftpd,並解壓縮到 ~/vsftpd-3.0.0

# tar -zxvf vsftpd-3.0.0.tar.gz

安裝vsftpd:
# cd /vsftpd-3.0.0
# make
# make install
# cp vsftpd.conf /etc

執行vsfptd:
[root@localhost share]# cd /usr/local/sbin/
[root@localhost sbin]# ./vsftpd &
500 OOPS: could not bind listening IPv4 socket

出現錯誤,無法啟動。查了錯誤訊息,好像是Port的問題。

# netstat -tulp |grep ftp
tcp   0  0 *:ftp   *:*  LISTEN    2780/tnslsnr

原來Port已經被Oracle tnslsnr佔走了,那只好改更vsftpd的port了。

在 /etc/vsftpd.conf 內加入下列:
listen_port=100

再次啟動,成功了。
[root@localhost sbin]# ./vsftpd &
[1] 21820

登入測試
# ftp 127.0.0.1 100
Connected to 127.0.0.1.
220 (vsFTPd 3.0.0)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root):


Linux顯示單一目錄的資訊


作業系統:Oracle Enterprise Linux

目的:顯示單一目錄的資訊。

當我們在 ls 後方加入目錄名稱時,它會將該目錄內的檔案列表出來。
[root@localhost /]# ls -l home
total 36
drwx------  3 davfs2      501  4096 Apr 15  2010 davfs2
drwx------  2 root          root      16384 Apr  5  2010 lost+found
drwxr-xr-x 43 oracle    oracle     4096 Jun  1 01:20 oracle
drwx------  3 spotlight spotlight  4096 Mar 29 20:22 spotlight
drwx------  3 u078      u078       4096 Mar 12 01:11 u078

此時可以加入參數 -d,就可以了。
[root@localhost /]# ls -ld home
drwxr-xr-x 7 root root 4096 Mar 29 20:10 home

如果想查詢目錄的總容量,可以輸入以下的指令。
[root@localhost /]# du -sh home
5.5G    home

讓Firefox可以正常瀏覽針對IE的網頁

由於內部有一套以.NET 為基礎的外購BPM系統,開發的程式在Firefox上常會有元件無法使用,格式錯誤的情形。

所以找了一下是否有方法可以解決,記錄如下:


Firefox 外掛 IE Tab+
簡介:IE Tab+允許讓Firefox能以IE的核心瀏覽網頁,以解決某些只能在IE上正常瀏覽的網頁。

開啟Firefox的功能列,選取「附加元件」

在搜尋框中輸入「ie tab+」,再按下鍵盤的「Enter

找到「 IE Tab + 2.04.20110724」外掛元件後,按下「安裝」
安裝完後,將Firefox關閉再重新開啟


總共有兩種方法可以使用:
方法一:
在畫面按下滑鼠右鍵,出現功能表,選擇「用IE Tab +檢視此頁」à「切換引擎」


方法二:
此方法是將URL加到清單內,只要做一次,以後就不必按滑鼠右鍵。

選擇「擴充套件」,再選擇「選項」


1、選擇「網站篩選器」
2、輸入URL
3、先按下「新增」,再按下「確定」