2015年11月23日 星期一

Oracle - Tablespace 之建立與移除

==== 建立 Table Space ====
create tablespace test_tablespace
datafile
  '/aaa/bbb/ccc/test_tablespace_01.dbf' size 5M autoextend on next 1M maxsize 32767M,
  '/aaa/bbb/ccc/test_tablespace_02.dbf' size 5M autoextend on next 1M maxsize 32767M,
  '/aaa/bbb/ccc/test_tablespace_03.dbf' size 5M autoextend on next 1M maxsize 32767M,
  '/aaa/bbb/ccc/test_tablespace_04.dbf' size 5M autoextend on next 1M maxsize 32767M
;

建立一個名為 test_tablespace 之 Tablespace
並指定四個 data file 分別為
    /aaa/bbb/ccc/test_tablespace_01.dbf
    /aaa/bbb/ccc/test_tablespace_02.dbf
    /aaa/bbb/ccc/test_tablespace_03.dbf
    /aaa/bbb/ccc/test_tablespace_04.dbf
給 test_tablespace
這四個 data file 皆為初始大小 5 MB, 大小會自動增加,每次增加 1 MB, 最多增加到 32767 MB 為止




==== 移除 Table Space ====
drop tablespace test_tablespace including contents and datafiles cascade contsraints
移除 Tablespace test_tablespace

2015年11月5日 星期四

可設定 Timeout 之 Java Command Line Executor



import java.util.concurrent.TimeoutException;

public class TimeoutCommandLine {
    public static int executeCommandLine(String commandLine, long timeout)
            throws
Exception {
        Process process = Runtime.getRuntime().exec(commandLine);
        Worker worker = new Worker(process);
        worker.start();
        try {
            worker.join(timeout);
            if (worker.exit != null) {
                return worker.exit;
            } else {
                throw new TimeoutException();
            }
        } catch (InterruptedException ex) {
            worker.interrupt();
            Thread.currentThread().interrupt();
            throw ex;
        } finally {
            process.destroy();
        }
    }

    private static class Worker extends Thread {
        private final Process process;
        private Integer exit;

        private Worker(Process process) {
            this.process = process;
        }

        public void run() {
            try {
                exit = process.waitFor();
            } catch (InterruptedException ignore) {
                return;
            }
        }
    }
}
使用方式:
TimeoutCommandLine.executeCommandLine("rsh xxxHost hostname", 2000);
設定執行 command rsh xxxHost hostname , 超過 2秒 沒回應即回傳 TimeoutException。

2015年10月21日 星期三

Linux rsync 指令備忘 (同步遠端 server 目錄)

指令範例:rsync -avp -e ssh root@tsthost:/app/abc/def /app/abc
 

以 root 帳號 ssh 登入 tsthost 並將 tsthost 上的 /app/abc/def 目錄同步備份到本機 (下此指令的機器) 的 /app/abc 路徑下


參數詳解 (reference from rsync參數詳解--990209):
-v, --verbose 詳細模式輸出訊息
-q, --quiet 安靜模式,幾乎沒有訊息產生。常用在以 cron 執行 rsync
-c, --checksum 打在傳送之前透過 128bit 的 MD4 檢查碼來檢查所有要傳送的檔案(會拖慢速度)
-a, --archive 備份模式,表示以遞迴方式傳輸文件,並保持所有文件屬性,等於 -rlptgoD(沒有 -H)
-r, --recursive 對子目錄以遞迴模式處理
-R, --relative 使用相對路徑名稱
     --no-relative 不使用相對路徑
     --no-implied-dirs
rsync foo/bar/foo.c remote:/tmp/
則在 /tmp 目錄下產生 foo.c 文件,而如果使用 -R 參數:
rsync -R foo/bar/foo.c remote:/tmp/
則會產生文件 /tmp/foo/bar/foo.c,也就是會保持完全路徑。

-b, --backup 產生備份,也就是對於目的已經存在有同樣的文件名時,將老的文件重新命名為 ~filename。可以使用 --suffix 選項來指定不同的備份文件前綴。
     --backup-dir=DIR 將備份文件(如~filename)存放在在目錄下。
     --suffix=SUFFIX 定義備份文件前綴
-u, --update 僅僅進行更新,也就是略過所有已經存在於目的端,且文件時間比要備份的檔案為新。(不覆蓋較新的文件)
     --inplace
-K, --keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理
-l, --links 保留符號連結
-L, --copy-links 像對待常規文件一樣處理符號連結
     --copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的連結
     --safe-links 忽略指向來源端路徑目錄樹以外的連結
-H, --hard-links 保留硬式連結
-p, --perms 保留檔案權限
-o, --owner 保留檔案擁有者資訊(root only)
-g, --group 保留檔案所屬群組資訊
-D, --devices 保留設備檔案資訊(root only)
-t, --times 保留檔案時間資訊
-S, --sparse 對稀疏檔案進行特殊處理以節省目的端的空間
-n, --dry-run 不實際執行傳送,只顯示將會有的傳輸動作
-W, --whole-file 複製檔案,不進行增量檢測
     --no-whole-file 關閉 --whole-file 參數
-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)
-B, --block-size=SIZE 強制透過 rsync 程式去比對修復 block-sizeforce,預設是700字節
-e, --rsh=COMMAND 定義所使用的 remote shell
     --rsync-path=PATH 定義 rsync 在遠端機器存放資料的路徑
     --existing 只比對更新目的端已經存在的檔案,而不備份那些新產生的檔案
     --ignore-existing 忽略目的端已經存在的檔案(也就是不更新)
     --delete 刪除傳送端已經不存在,而目的端存在的檔案
     --delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,也刪除 --exclude 參數所包含的檔案
     --delete-after rsync 預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除
     --ignore-errors 忽略任何錯誤既使是 I/O error 也進行 --delete 刪除動作
     --max-delete=NUM 定義 rsync 不要刪除超過 NUM 個檔案
     --partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除。在某種狀況下保留那些部分傳送的檔案是令人高興的。你可以透過 --partial 參數達到這個目的
     --partial-dir=DIR 在 --partial 參數啟動時,你還可以定義 rsync 把那些部分傳送的檔案寫入定義的資料夾,而非直接寫入目的端。需要注意的是,此資料夾不應該被其他使用者可以寫入(如:/tmp)
     --force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制 rsync 刪除資料夾,即使該資料夾不是空的
     --numeric-ids 不將傳送端檔案的 UID 及 GID 值,與目的端的使用者/群組進行配對。若傳送端並沒有 UID 及 GID 的對應名稱(如:原帳號群組被刪除的遺留檔案),或目的端沒有相對應的帳號/群組,保留數字型態的 UID/GID
     --timeout=TIMEOUT 設定 I/O 逾時的時間(秒)。超過這個秒數而沒有資料傳送,rsync 將會結束。預設為 0,也就是沒有定義逾時時間
-I, --ignore-times 不跳過那些有同樣的時間和長度的文件,可以透過此參數關閉此快速檢查
     --size-only 只檢查檔案大小是否改變,不管時間存取點是否改變。通常用在 mirror,且對方時間不太正確時
     --modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,預設為 0
-T, --temp-dir=DIR 定義 rsync 在接收端產生暫時性的複製檔案時使用資料夾暫存。預設是直接在接收端資料夾直接產生暫存檔案
     --compare-dest=DIR 定義 rsync 在目的端建立資料夾來比對傳送過來的檔案
     --link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結
-P, 等同於 --partial --progress 顯示備份過程,只是為了把參數簡單化
-z, --compress 對備份的檔案在傳輸時進行壓縮處理
-C, --cvs-exclude 排除那些通常不希望傳送的檔案。定義的方式與CVS傳送相同:
                          RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/ 符合以上條件的都會被忽略而不傳送
     --exclude=PATTERN 符合 PATTERN(規則表示式)樣式的檔案不進行傳送
     --exclude-from=FILE 和 --exclude 參數相同,不過是把不進行傳送的檔案事先寫入某一檔案,執行時,透過此參數讓 rsync 讀取。(; # 開頭的行列或空白行會被 rsync 忽略)
     --include=PATTERN 指定義 rsync 不要排除符合 pattern 樣式的檔案
     --include-from=FILE 和 --include 參數相同,只不過把要包含的檔案寫到某一檔案
     --files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓 rsync 讀取
                             如:rsync -a --files-from=/tmp/foo /usr remote:/backup
-0, --from0 定義檔案所要讀取的檔案是null字元結尾
     --version 顯示 rsync 版本
     --daemon 定義 rsyn c以 daemon 型態執行
     --no-detach 當以 daemon 型態執行時,不要進行分裂且變成背景程序
     --address=ADDRESS 定義所要連結(bind)的ip位址或是 host 名稱(daemon限定)
     --config=FILE 定義所要讀取的設定檔 rsyncd.conf 位置(daemon 限定)
                        預設值為 /usr/local/etc/rsyncd.conf
     --port=PORT 定義 rsyncd(daemon)要執行的 port(預設為 tcp 873)
     --blocking-io 使用 blocking I/O 連結遠端的 shell,如 rsh、remsh
     --no-blocking-io 使用 non-blocking 連結遠端的 shell,如 ssh(預設值)
     --stats 顯示檔案傳送時的資訊狀態
     --progress 顯示傳送的進度(給檔案傳送時,怕無聊的人用的..)
     --log-format=FORMAT 定義 log 的格式(在 rsyncd.conf 設定)
     --password-file=FILE 從檔案讀取與遠端 rsync 伺服器連結的密碼
     --bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)
     --write-back=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)
     --read-batch=FILE 透過讀取紀錄檔案來進行傳輸(檔案由 --write-batch 參數產生)
     --checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)
-4, --ipv4 使用 IPv4 協定
-6, --ipv6 使用 IPv6 協定
-h, --help 顯示 rsync 求助資訊

2015年10月19日 星期一

Linux ssh key (免密碼登入另一 host)

確認是否在該登入 user account 的 Home 目錄下。
例如 user = "abc",Home 目錄就是 /home/abc
或直接使用指令: cd ~ 就可以指向 Home目錄


1. 執行keygen指令 (2 選 1):

  • ssh-keygen -t rsa
    產出 .ssh/id_rsa 及 .ssh/id_rsa.pub 兩個檔案
  • ssh-keygen -d
    產出 .ssh/id_dsa 及 .ssh/id_dsa.pub 兩個檔案

2. 檔案產出後,將id_rsa.pub/id_dsa.pub檔案的內容 copy 到 target host (假設 target host name = testHost) 之相同 user 目錄之.ssh/authorized_keys 中。
舉例:home/abc/.ssh/authorized_keys

3. 確認
.ssh 目錄之權限為 0700。如下圖:


4. 試著 ssh 目標 server (舉例: host name = testHost)

   ssh testHost
   沒問你要密碼就直接登入成功即代表設定完成。

Linux scp 指令(抓取目錄下所有檔案)

scp -r [user name]@[server name]:/some/remote/directory /some/local/directory

-r: 遞迴抓取,若要一次抓取整個目錄的東西要加這個參數

2015年10月14日 星期三

Data Pump 複製 Schema 到另一個 Database Instance


--Login by SYSTEM@wmdev (Target DB)
-- 1. 登入 target db,建立一個 db directory,指定一個檔案系統的目錄路徑

CREATE DIRECTORY [DIR_NAME] AS '/xxxxx/xxxxx';


-- 2. 將此 directory grant read and write 權限給此次 import 會用到的 user schemas
GRANT READ,WRITE ON DIRECTORY [DIR_NAME] TO [Schema_Name];





-- 3. 建立 db link 到 source db (最好使用 source db 的 system 帳號建立 db link)
CREATE PUBLIC DATABASE LINK [Connection_Name]
CONNECT TO system IDENTIFIED BY '********'
USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = tcp.world)(PROTOCOL = TCP)(Host = [Host_Name])(Port = 1521))) (CONNECT_DATA = (SID = [SID])))';



--查看 DB Link 有沒有建成功
SELECT *
FROM ALL_DB_LINKS;



--試著從 DB Link 做 SELECT
SELECT 'A'
FROM DUAL@[Connection_Name];


-- 4. 登入 terminal 執行 impdb 的指令 (詳見附件檔案的範例,指令用法請參考 Oracle Data Pump)
--Login Terminal - 執行 Data Pump - Network Import
--Import Schema 
impdp system/*******@[TNS_NAME] DIRECTORY=[DIR_NAME] SCHEMAS=[Schema_Name] TABLE_EXISTS_ACTION=TRUNCATE NETWORK_LINK=[Connection_Name] ESTIMATE=STATISTICS VERSION=10.2 EXCLUDE=JOB PARALLEL=8



-- 5. Import 完成,檢查 import.log 是否有 error


-- 6. Drop db link
DROP PUBLIC DATABASE LINK WMDB_ONLINE2_CONNECTION;

-- 7. Drop db DIRECTORY
DROP DIRECTORY DMPDIR;

2015年10月11日 星期日

真正的富裕,不在於擁有多少,而在於能放下多少

這是今天臉書朋友分享天下雜誌的話:

「真正的富裕,不在於擁有多少,而在於能放下多少。」
不要執著太多,剛剛好就是滿足
(參考連結)

我看了還挺有感覺


當已經擁有太多,放下一些,達到剛剛好的狀態,也許就是人生中最滿足的時刻

然而,更深一層的意思是,能夠放下多少,代表的,就是你已經擁有多少

更簡潔的說法是:沒有提起,何來放下?

沒有提起過的放下,我想......都不是真的放下。

2015年9月14日 星期一

Java Method for Regular Expression


以下 Method 為判斷字串是否符合所設定之 Regular Expression

    /**
     * Get the match result between string and regular expression pattern string
     *
     * @param patternStr - Regular expression pattern string.
     * @param testString - String for testing with match pattern.
     * @return true/false: String is match (true), or is not match (false).
     */
    public static boolean isRegexMatch(String patternStr, String testString) {
        Pattern pattern = Pattern.compile(patternStr);
        Matcher matcher = pattern.matcher(testString);
       
        return matcher.matches();
    }

2015年2月9日 星期一

清除 Oracle Data Pump Job

步驟 1:找出正在執行的 JOB


用 system 帳號登入 oracle 並利用下面 SQL 指令
SQL> select job_name, state from dba_datapump_jobs;

JOB_NAME         STATE
------------------------------ ------------------------------
SYS_IMPORT_SCHEMA_02        EXECUTING
SYS_EXPORT_SCHEMA_01        NOT RUNNING
SYS_IMPORT_SCHEMA_01        NOT RUNNING
SYS_EXPORT_SCHEMA_02        NOT RUNNING
 
看到 STATE = EXECUTING 則代表此 JOB 正在執行中,因此我們可以先將 JOB_NAME 記下來
此例子 JOB_NAME = SYS_IMPORT_SCHEMA_02 

步驟 2:執行 Impdp utility
 
   impdp system/******* attach=system.SYS_IMPORT_SCHEMA_02 
system/******* ==> 代表 system 之帳號及密碼

執行結果:
Import: Release 11.2.0.3.0 - Production on Sab May 19 21:55:38 2012

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

Job: SYS_IMPORT_SCHEMA_02
  Owner: system
  Operation: IMPORT
  Creator Privs: TRUE
  GUID: C06A6B4EAEB4122ER0434EDH74850F
  Start Time: Sabado, 19 Mayo, 2012 21:55:04
  Mode: SCHEMA
  Instance: BD1
  Max Parallelism: 1
  EXPORT Job Parameters:
  Parameter Name      Parameter Value:
     CLIENT_COMMAND        system/******** SCHEMAS=SCHEMA DIRECTORY=BCK dumpfile=export_SCHEMA.dmp logfile=export.SCHEMA.log reuse_dumpfiles=true
  IMPORT Job Parameters:
     CLIENT_COMMAND        system/******** SCHEMAS=SCHEMA DIRECTORY=BCK dumpfile=export_SCHEMA.dmp logfile=import_SCHEMA.log
  State: EXECUTING
  Bytes Processed: 90.681.272
  Percent Done: 98
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /bck/export_SCHEMA.dmp

Worker 1 Status:
  Process Name: DW00
  State: EXECUTING
  Object Schema: SCHEMA
  Object Name: TABLE_EXAMPLE
  Object Type: SCHEMA_EXPORT/TABLE/TABLE_DATA
  Completed Objects: 28
  Completed Bytes: 90.832
  Worker Parallelism: 1

Import> 

亦可透過 STATUS 指令觀察該 Job 之狀態:
Import> STATUS
Job: SYS_IMPORT_SCHEMA_02
  Operation: IMPORT
  Mode: SCHEMA
  State: EXECUTING
  Bytes Processed: 91.676.344
  Percent Done: 99
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /bck/export_SCHEMA.dmp

Worker 1 Status:
  Process Name: DW00
  State: EXECUTING
  Object Schema: SCHEMA
  Object Name: TABLE_OBJECTS_EXAMPLE
  Object Type: SCHEMA_EXPORT/TABLE/INDEX/INDEX
  Completed Objects: 38
  Worker Parallelism: 1
 
步驟 3:刪除 Job
Import> kill_job
Are you sure you wish to stop this job ([yes]/no):
 
 
步驟 4:刪除 Table (若 Table 還在)
sqlplus / as sysdba
SQL> drop table SYS_IMPORT_SCHEMA_02;
Table dropped. 
 
參考資料:http://albertolarripa.com/2012/05/19/clean-oracle-data-pump-jobs/

How to delete/remove non executing datapump jobs?
https://pavandba.com/2011/07/12/how-to-deleteremove-non-executing-datapump-jobs/

Kill, cancel and resume or restart datapump expdp and impdp jobs
http://blog.oracle48.nl/wordpress/killing-and-resuming-datapump-expdp-and-impdp-jobs/

Find DB Session and DB Process by Server Process ID  (SPID)
--Find Session by SPID (Server Process ID)
SELECT
     S.SID,
     S.SERIAL#,
     S.PROCESS,
     P.SERIAL# PROCESS_SERIAL#,
     P.PID,
     P.SPID,
     S.LOCKWAIT,
     S.STATUS,
     S.LOGON_TIME,
     S.MODULE,
     S.ACTION,
     S.MACHINE
FROM
     V$SESSION S,
     V$PROCESS P
WHERE 1 = 1
AND S.PADDR = P.ADDR
AND (
     P.SPID IN (
          '21581','21674','23559'
     )
)