2018年3月4日 星期日

[Oracle]Oracle修改DBID的方式,NID 與 dbms_backup_restore

有些情況必須要修改ORACLE的DBID,因此Oracle發展了兩個工具以方便達成此任務。
NID 與 dbms_backup_restore。

兩個最大的差別在於,NID方便使用但無法指定更改為甚麼DBID,
DBMS_BACKUP_RESTORE較複雜,但是可以指定要使用甚麼DBID。

本文會先介紹NID使用,再介紹DBMS_BACKUP_RESTORE


一、NID
NID可以做到修改DBNAME與DBID兩種功能,
若要使用前,請先將資料庫至於mount的狀態,如下語法:

$ sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup mount;
SQL> exit

然後再執行NID的工具。
若是只想更改DBID,輸入以下語法
$ nid target=sys/password
在對話框輸入y,即會自動變更為新的DBID(無法指定)。

如果變更DBID,則必須要使用resetlogs來開啟資料庫
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database open resetlogs;



二、DBMS_BACKUP_RESTORE
手動執行procedure修改DBID,較複雜但可自行指定DBID。
若是執行Procedure過程中出現任何問題,可以使用NID工具取消變更DBID。
$nid target = sys/password REVERT=Yes

使用前仍須將資料庫設定為mount狀態。

1.將資料庫設為mount
$ sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup mount;

2.檢查目前的dbid
SQL> select dbid, name from v$database;

3.修改DBNAME與DBID
(1)開始執行nid procedure
SQL> exec dbms_backup_restore.nidbegin([new_dbname], [old_dbname], [new_dbid], [old_dbid], 0, 0, 0);

(2)設立變數,稍後使用
SQL> var v_skipped number;
SQL> var v_idchged number;
SQL> var v_nmchged number;

(3)執行以下語法,並執行其結果
SQL> select ' exec dbms_backup_restore.nidprocessdf('||file#||',0,:v_skipped, :v_idchged, :v_idchged);' from v$datafile;

(4)執行以下語法,並執行其結果
SQL> select 'exec dbms_backup_restore.nidprocessdf('||file#||',1,:v_skipped, :v_idchged, :v_idchged);' from v$tempfile;

(5)獲得所需數字,執行最後最後語法,並結束NID PROCEDURE
SQL>exec dbms_backup_restore.nidprocesscf(:v_idchged, :v_nmchged);
SQL>exec  dbms_backup_restore.nidend;

4.以resetlogs方式打開資料庫
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database open resetlogs;



參考資料:
http://m.blog.itpub.net/28539951/viewspace-2138760/
http://www.hwrf.com.cn/tech/207146.html
http://www.eygle.com/archives/2008/05/dbms_backup_restore_dbid.html
http://www.programering.com/a/MTNzQzNwATU.html


2018年2月8日 星期四

[SQL Server]sql server升級或不同版本的資料移轉

SQL Server 2016® Upgrade Advisor

https://www.microsoft.com/en-us/download/details.aspx?id=48119

使用此軟體做須修正項目的確認。

2017年7月7日 星期五

[Linux]RHEL 7 / CentOS 7 忘記 root 密碼的解開方式:

RHEL 7 / CentOS 7 忘記 root 密碼的解開方式:

來源網址:
http://linux.onlinedoc.tw/2015/08/rhel-7-centos-7.html

  1. 先確認有沒有鎖 BIOS 或是 「開機選單」密碼,都沒有,才可以利用下列方式解碼!
  2. 開機選單 --> 按 「e」
  3. 選擇  linux 開頭的項目名稱 
  4. 在 Linux 開頭項目的行尾,加上 「rd.break」項目
  5. 按下 Ctrl + x 開機
  6. 輸入  mount  -o  remount,rw   /sysroot
  7. 輸入  chroot  /sysroot
  8. 輸入 passwd
  9. 輸入兩次密碼!注意:密碼輸入過程中,游標是不會移動的!
  10. 輸入  touch  /.autorelabel    --> 請注意,不要打錯字!
  11. 輸入  exit
  12. 輸入  mount  -o  remount,ro   /sysroot
  13. 輸入  exit  後,重開機!

只要「黑屏」,表示上述步驟有錯!再來一次即可,不用重裝系統!

如果有鎖 BIOS 密碼,記得替主機板放電!

如果有鎖開機選單密碼,只能使用光碟或 USB 開機!開機後,照上述的步驟方式執行,亦可解開 root 帳密!

2017年4月19日 星期三

[oracle]Shrink時undo tablespace產生大量資料,不想留存那些資料時的應對

在做shrink時undo tablespace產生大量的資料,使用者希望不要留那些資料。
我想可能先建一個新的undo tablespace,完成之後再把新的undo tablespace刪除比較安全些。

請試試以下語法:
1.確認原本使用的 tablespace為何
show parameter undo;

















2.建立undo tablespace
CREATE UNDO TABLESPACE [tablespace_name] DATAFILE ’[datafile_route]’ SIZE [datafile_size] autoextend on;

3.設定使用該undo tablespace
alter system set undo_tablespace = [tablespace_name]

4.使用後設定回原本的undo tablespace
alter system set undo_tablespace = [tablespace_name]

5.刪除tablespace的內容與datafile
DROP TABLESPACE [tablespace_name] including contents and datafiles;


Drop時請務必小心,確認兩次在做Drop動作。

2017年4月14日 星期五

[ORACLE]shrink原理與注意事項

擔心LOG產生太大時,先修改TABLE為NOLOGGING模式:
alter table t1 nologging;

當Oracle 建置一個segment 的時候,會藉由HWM (Hight Water Mark)指標來記錄segment 內,有哪些blocks 是被使用過的
HWM 就像一個分屆點,一邊代表使用過的blocks,另一邊則是尚未被使用的blocks. 
HWM有一個特性,就是只會向尚未使用的blocks 方向移動,也就是說當資料不斷被insert 時,HWM會不斷向尚未使用blocks 方向移動,但當資料被delete 後,雖然有儲存資料的blocks 已經減少,並不會讓HWM向反方向移動, 要注意的是當insert 失敗也是會讓HWM移動,即使失敗後rollback 也不會讓HWM向下降
HWM以下如果存有太多空的blocks, 除了浪費空間之外,最明顯的缺點就是當Full Table Scan 時產生不必要的I/O, 因為Oracle 進行Full Table Scan 時,會讀取HWM以下的blocks
要調整HWM可以藉由下面的指令達成
1. export / import 
2. alter table table_name move; 
3. alter index index_table rebuild online; 
4. alter table table_name shrink space ; (only for Oracle 10g)
alter table XX move 使用table lock , alter table XX shrink space 使用row lock

Shrink Space Syntax
shrink space 的兩個必要條件 
1. Enable row movement 
2. Table 所在的tablespace 不能使用在segment space management manaual 的tablespace, 必須為auto
執行shrink space 分成兩個階段 
1. compact : 透過insert / delete 將資料盡量排例在segment 前面.這個階段會造成rowid的改變,因此需要enable row movement.
alter table TABLE_NAME enable row movement;
2. HWM 調整:這個階段是調整HWM位置,釋放表格空間
alter table <TABLE_NAME> shrink space compact ; 只會執行第一階段 
alter table <TABLE_NAME> shrink space ; 兩個階段都會執行 
alter table <TABLE_NAME> shrink space cascade ; 兩個階段都執行,並同時處理相關index 空間 
alter table <TABLE_NAME> modify lob (<lob_clomun>) (shrink space);
由於alter table TABLE_NAME enable row movement 可能會使的引用該table的object( ex procedure,package,view...) 變成invalid,所以執行後最後執行一下utlrp.sql 或 utlprp.sql 來編譯一下invalid object ,
utlrp.sql 或 utlprp.sql放在$ORACLE_HOME/rdbms/admin 目錄下,或者執行
UTL_RECOMP這個package

Shrink space script 
1. Normal Table
select'alter table '|| owner || '.' || table_name||' enable row movement;
'||chr(10)||'alter table '|| owner || '.'||table_name||' shrink space;'||chr(10)
from  dba_tables;

select'alter index '|| owner || '.' ||index_name||' shrink space;'||chr(10)<
from dba_indexes;
2. Partition Table
select 'alter table '|| owner || '.'  ||table_name||' enable row movement;'||chr(10)||
'alter table '|| owner || '.'||table_name||' shrink space;'||chr(10) from dba_tables 

select 'alter index '|| owner || '.'||index_name||' shrink space;'||chr(10)
from dba_indexes where uniqueness='NONUNIQUE' ;

select 'alter table '|| owner || '.'||segment_name||' modify subpartition '||partition_name||' shrink space;'||chr(10) 
from dba_segments where segment_type='TABLE SUBPARTITION' ; 

資料引用自:
http://rickyju.pixnet.net/blog/post/32217992
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/schema.htm#sthref2096

2017年4月13日 星期四

[MSSQL]使用PAL進行MSSQL效能檢測

https://dotblogs.com.tw/jamesfu/archive/2012/12/07/perfmon.aspx

https://social.technet.microsoft.com/Forums/zh-TW/c6cb2234-f834-495b-aa66-5fcc3b95b243/palperformance-analysis-of-logs?forum=winserverzhcht

[oracle]檢查目前事件

https://community.oracle.com/thread/358789?start=15&tstart=0

select a.event , a.WAIT_TIME , c.SQL_TEXT , c.PHYSICAL_READ_BYTES / 1024 / 1024 / 1024 "GB_READ" , c.PHYSICAL_WRITE_BYTES / 1024 / 1024 / 1024 "GB_WRITE"
from v$session_wait a , v$session b , v$sql c
where a.SID = $SID
and a.sid = b.sid
and b.SQL_ID = c.SQL_ID;