跳到主要內容

11g利用指令nid改db_name、db_id

原本的db_name為orcl,測試將改為testdb

直接用nid來更改db_name、db_id,可免去許多步驟,參數help='Y'可以看到說明
$ nid help='Y'
DBNEWID: Release 11.2.0.2.0 - Production on Mon Jun 17 01:26:21 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Keyword     Description                    (Default)
----------------------------------------------------
TARGET      Username/Password              (NONE)
DBNAME      New database name              (NONE)
LOGFILE     Output Log                     (NONE)
REVERT      Revert failed change           NO
SETNAME     Set a new database name only   NO
APPEND      Append to output log           NO
HELP        Displays these messages        NO

關閉DB後,重啟到mount
SQL> shutdown immediate;
SQL> startup mount;

這次只更改db_name,所以setname=Y
$ nid target=sys/oracle dbname=test_db setname=Y
DBNEWID: Release 11.2.0.2.0 - Production on Mon Jun 17 00:39:05 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Connected to database ORCL (DBID=1229390655)
Connected to server version 11.2.0
Control Files in database:
    /home/oracle/app/oracle/oradata/orcl/control01.ctl
    /home/oracle/app/oracle/flash_recovery_area/orcl/control02.ctl
Change database name of database ORCL to TEST_DB? (Y/[N]) => Y
Proceeding with operation
Changing database name from ORCL to TEST_DB
    Control File /home/oracle/app/oracle/oradata/orcl/control01.ctl - modified
    Control File /home/oracle/app/oracle/flash_recovery_area/orcl/control02.ctl - modified
    Datafile /home/oracle/app/oracle/oradata/orcl/system01.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/sysaux01.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/undotbs01.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/users01.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/example01.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/APEX_1246426611663638.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/APEX_1265209995679366.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/rman.db - wrote new name
    Datafile /home/oracle/app/oracle/oradata/orcl/temp01.db - wrote new name
    Control File /home/oracle/app/oracle/oradata/orcl/control01.ctl - wrote new name
    Control File /home/oracle/app/oracle/flash_recovery_area/orcl/control02.ctl - wrote new name
    Instance shut down
Database name changed to TEST_DB.
Modify parameter file and generate a new password file before restarting.
Succesfully changed database name.
DBNEWID - Completed succesfully.

已成功更改db_name為testdb,重建密碼檔
$ orapwd file=$ORACLE_HOME/dbs/orapwtest_db password=oracle

重開db發現錯誤
SQL> startup
ORA-01103: database name 'TEST_DB' in control file is not 'ORCL'

這是因為參數檔仍然記錄舊的db_name,在系統提示下複製一個pfile
$ cp $ORACLE_HOME/dbs/initorcl.ora inittest_db.ora

重新設定$ORACLE_SID,也可以修改.profile
$ export ORACLE_SID=test_db

手動修改inittest_db.ora的設定值
$ vi $ORACLE_HOME/dbs/initorcl.ora
將*.db_name='orcl'改為*.db_name='test_db'

如果有設定開機自動開啟Oracle,則要修改oratab的設定
$ vi /etc/oratab
將orcl改為test_db,完整如下:
test_db:/home/oracle/app/oracle/product/11.2.0/dbhome_2:Y

以pfile來啟動db之後重新建立spfile
SQL> shutdown abort
SQL> startup pfile=?/dbs/inittest_db.ora
SQL> create spfile from pfile;

再把db關閉後重開db,就沒有錯誤訊息了
SQL> shutdown abort
SQL> startup
ORACLE instance started.
Total System Global Area  456146944 bytes
Fixed Size              1344840 bytes
Variable Size            394267320 bytes
Database Buffers        54525952 bytes
Redo Buffers              6008832 bytes
Database mounted.
Database opened.

如果要同時更改db_name及db_id,可執行下列語法:
$  nid TARGET=SYS/password DBNAME=test_db setname='N'

如果只要變更db_id,則語法如下:
$ nid TARGET=SYS/password

注意,如果有變更到db_id,則必須用resetlogs來open資料庫
SQL> startup mount;
SQL> alter database open resetlogs;

留言

這個網誌中的熱門文章

Shell Script簡易教學

一、概論
在許多的情況之下,我們都需要固定一組可以重覆或判斷資訊的指令,
而把這些指令存被在文字檔中,再交由Shell執行,就是Script。
一般會將Shell Script的副檔名命名為.sh,雖然副檔名在Linux中並非必要,
但是有副檔名可以讓我們更容易管理這些檔案。

假設有一個名為test.sh 的 Shell Script,首先用文字編輯器來撰寫內容如下:
#!/bin/bash
echo Hello World

第一行是必需的,它是用來定義你要使用的 shell。Linux中有許多的Shell可以使用,
如:ksh、bash,但是彼此之間語法有所差異,所以我們首先需要定義使用哪一個Shell。
而第二行的 echo 代表列出一個字串,預設會把後面的字串「Hello World」顯示在螢幕上。
將test.sh存檔後,可以用下列其中一種方式執行它:
1、直接輸入 sh test.sh
2、改變test.sh的權限,加上可以執行的權限,
   chmod a+x test.sh
   接著直接執行它:
   ./test.sh

在Shell Script中,「#」表示註解,在#後面將視為註解並且被程式忽略。
例如:
#pwd
ls -l
Shell只會執行ls -l,而不會執行ls -l

而「;」 則代表指令的分隔,例如:
pwd;ls -l

pwd
ls -l
都是一樣執行pwd及ls -l。

二、變數的使用
在Shell Script中,所有的變數都視為字串,因此不需要在定義變數類型。
在Shell中定義和使用變數時並不一樣。
例如,定義一個變數id並且設定值為2013001,接著還要將印出變數的值:
id=2013001 -> 定義變數時前面不加「$」符號
echo $id   -> 使用變數時前面要加「$」符號
注意,在等號的二邊不可以有空白,否則將出現錯誤。

再介紹一個範例:
dir=/home/oracle
ls $dir

這裡我們定義了變數dir的值為/home/oracle,接著用ls指令來印出變數dir,
此時指令會變為ls /home/oracle,所以就把目錄中所有檔案都列出來。


我們再來看一個例子,說明如何使用變數來定義變數:
$ tmppath=/tmp$ tmpfile=$tmppath/abc.txt$ ec…

Line如何換行

在電腦版的Line輸入文字時,遇到需要換行的情形時,我都是用記事本先寫好再複製上去,這樣就可以有換行的效果,可是這樣的做法好像失去Line的便利性。

於是查了一下,原來有一個設定可以指定Enter換行,而不是發訊息出去。



完成設定之後,要發送訊息就改用Alt+Enter,而Enter就可以換行了。

在Windows下,利用tasklist與taskkill來刪除Process

Windows7 / Windows8 kill process

Linux下要刪除某個程序通常會使用 ps 配合 kill 來刪除程序。
例如:ps -ef |grep [PROCESS NAME]
      kill -9 [PID]

在Windows下,通常是開啟工作管理員來強制結束應用程式,但是如果要寫成Script,就必須改為命令式。

TASKLIST [/S system [/U username [/P [password]]]]
         [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]

TASKKILL [/S system [/U username [/P [password]]]]
         { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]

(Tasklist:查詢Process ; Taskkill:刪除Process)


例如要刪除已開啟的記事本(notepad):

1、查詢記事本的Process訊息
    C:\> tasklist |find /i "notepad.exe"
    notepad.exe      6092 Console     1     5,832 K

2、由上得知記事本的PID為6092
    C:\> taskkill /f /PID 6092
    成功:處理程序 PID 6092 已經終止了。

    taskkill使用的參數
    /f:指定此參數可強制終止處理程序
    /PID:指定要終止之處理程序的 PID

3、也可以直接以程式名稱刪除
    C:\ taskkill /f /im notepad.exe
    成功:處理程序 "notepad.exe" <PID 6092> 已經終止了


下面是我自己測試的Script,可以刪除多個相同的程式,例如同時開啟了三個記事本:
@echo off

for /f "tokens=2 delims= " %%c in ('tasklist /FI "imagename eq notepad.exe" /FO table /NH&…