修改oracle例項名(sid)和資料庫名(db_name)

cnhtm發表於2009-12-22

有時我們需要修改資料庫的sid和dbname,除了使用rman進行備份恢復之外,也可以透過手工方式修改,主要由兩個主要過程完成:
1、修改例項名(SID)
2、修改資料庫名(dbname)

下面演示將資料庫sid和dbname由orcl修改為cnhtm的過程:

[@more@]


1、修改例項名(sid)

1.1、檢查原來的資料庫例項名(sid)

oracle@oracle[/home/oracle]> echo $ORACLE_SID
orcl
oracle@oracle[/home/oracle]> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 20 11:14:49 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

sys@ORCL> select instance from v$thread;

INSTANCE
--------------------------------------------------------------------------------
orcl

1.2、關閉資料庫

注意不能用shutdown abort,只能是shutdown immediate或shutdown normal

sys@ORCL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

1.3、修改oracle使用者的ORACLE_SID環境變數,如由orcl修改為cnhtm

oracle@oracle[/home/oracle]> cat ~/.bash_profile|grep -i sid
ORACLE_SID=cnhtm
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH

1.4、修改/etc/oratab檔案,將sid名由舊的修改為新的,如從orcl修改為cnhtm

oracle@oracle[/home/oracle]> cat /etc/oratab

......

cnhtm:/oracle/app/10.1:Y
+ASM:/oracle/app/10.1:Y

1.5、進入到$ORACLE_HOME/dbs目錄

將所有檔名中包含原來的sid的修改為對應的新sid的
如我對如下檔案修改為其後對應的檔案

hc_orcl.dat->hc_cnhtm.dat
lkORCL->lkCNHTM
orapworcl->orapwcnhtm
snapcf_orcl.f->snapcf_cnhtm.f
spfileorcl.ora->spfilecnhtm.ora

1.6、使新修改的ORACLE_SID環境變數生效

oracle@oracle[/oracle/app/10.1/dbs]> . ~/.bash_profile
oracle@oracle[/oracle/app/10.1/dbs]> echo $ORACLE_SID
cnhtm

1.7、重建口令檔案

因為口令檔案改名後不能在新例項中使用,所以重建

oracle@oracle[/oracle/app/10.1/dbs]> orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle entries=5 force=y
oracle@oracle[/oracle/app/10.1/dbs]> ls -lrt orapw*
-rw-r----- 1 oracle oinstall 2048 Dec 20 11:27 orapwcnhtm

1.8、啟動資料庫

oracle@oracle[/oracle/app/10.1/dbs]> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 20 11:29:53 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

idle> startup
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218292 bytes
Variable Size 62916876 bytes
Database Buffers 96468992 bytes
Redo Buffers 7168000 bytes
Database mounted.
Database opened.

1.9、檢查資料庫例項名

透過如下語句檢查資料庫例項名,發現例項名已經由orcl變成cnhtm

idle> select instance from v$thread;

INSTANCE
--------------------------------------------------------------------------------
cnhtm

2、修改資料庫名(dbname)

雖然已經修改過了例項名(sid),但是資料庫的名稱(dbname還是原來的名稱orcl)

idle> conn / as sysdba
Connected.
sys@ORCL> show parameter name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
db_name string orcl
db_unique_name string orcl
global_names boolean FALSE
instance_name string cnhtm
lock_name_space string
log_file_name_convert string
service_names string orcl

可以透過如下步驟修改資料庫名(dbname)

2.1、首先切換一下線上日誌,使資料庫做checkpoint

sys@ORCL> alter system archive log current;

System altered.

2.2、生成重建控制檔案的指令碼

sys@ORCL> alter database backup controlfile to trace resetlogs;

Database altered.

2.3、關閉資料庫,需要乾淨關閉,不能shutdown abort

sys@ORCL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

2.4、進入$ORACLE_BASE/admin//udump目錄中,找到最新生成的trc檔案,這就是重建控制檔案的指令碼

oracle@oracle[/oracle/admin/orcl/udump]> ls -lrt
total 2608
-rw-r----- 1 oracle oinstall 577 Nov 7 13:37 orcl_ora_12020.trc

......

-rw-r----- 1 oracle oinstall 4407 Dec 20 11:36 cnhtm_ora_7789.trc

2.5、將找到的trc檔案複製一份,並命名為ccf.sql

oracle@oracle[/oracle/admin/orcl/udump]> cp cnhtm_ora_7789.trc ccf.sql

2.6、修改ccf.sql

查詢STARTUP NOMOUNT語句,將這一行上面的所有行都刪除
查詢所有以--開始的行,把這些行刪除
查詢所有的orcl修改為cnhtm,所有的ORCL修改為CNHTM
找到CREATE CONTROLFILE REUSE DATABASE...語句,將其中的REUSE修改為SET
找到RECOVER DATABASE USING BACKUP CONTROLFILE語句,將其用雙橫線(--)註釋掉
如果有精力,可以修改這個指令碼中的datafile和logfile部分使用新的檔名稱,其實這部分不修改也可以,我為了測試的目的進行了修改,修改後要記得去重新命名資料檔案和log檔案,將對應的資料檔案和log檔案與這裡的名稱相對應

我修改後的ccf.sql檔案內容如下

STARTUP NOMOUNT
CREATE CONTROLFILE set DATABASE "cnhtm" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '+DATA/cnhtm/onlinelog/group_1.LOG' SIZE 100M,
GROUP 2 '+DATA/cnhtm/onlinelog/group_2.LOG' SIZE 100M,
GROUP 3 '+DATA/cnhtm/onlinelog/group_3.LOG' SIZE 100M,
GROUP 4 '+DATA/cnhtm/onlinelog/group_4.LOG' SIZE 100M
DATAFILE
'+DATA/cnhtm/datafile/system01.DBF',
'+DATA/cnhtm/datafile/undotbs101.DBF',
'+DATA/cnhtm/datafile/sysaux01.DBF',
'+DATA/cnhtm/datafile/users01.DBF',
'+DATA/cnhtm/datafile/example01.DBF',
'+DATA/cnhtm/datafile/tbs_lmt01.DBF',
'+DATA/cnhtm/datafile/tbs_lmt_201.DBF',
'+DATA/cnhtm/datafile/tbs_lmt_301.DBF'
CHARACTER SET ZHS16GBK
;
--RECOVER DATABASE USING BACKUP CONTROLFILE;
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/cnhtm/tempfile/temp.269.705923003'
SIZE 104857600 REUSE AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M;

2.7、修改資料檔案、線上日誌檔名

如果上一步修改了ccf.sql檔案中的datafile和logfile段的檔名,這裡要將這些檔名重命令為與其一致。
因為我的實驗環境使用了ASM,在Oracle 10.2中ASM中不能重新命名和複製檔案,我採用了建立別名的方式,操作如下:

oracle@oracle[/oracle/admin/cnhtm/udump]> export ORACLE_SID=+ASM
oracle@oracle[/oracle/admin/cnhtm/udump]> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 20 12:08:52 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

idle> alter diskgroup data add directory '+data/CNHTM';

Diskgroup altered.

idle> alter diskgroup data add directory '+data/CNHTM/DATAFILE';

Diskgroup altered.

idle> alter diskgroup data add alias
2 '+data/CNHTM/DATAFILE/EXAMPLE01.DBF'
3 for
4 '+data/ORCL/DATAFILE/EXAMPLE.261.705922745';

Diskgroup altered.

......

idle> alter diskgroup data add alias
2 '+data/CNHTM/DATAFILE/USERS01.DBF'
3 for
4 '+data/ORCL/DATAFILE/USERS.266.705922777';

Diskgroup altered.

idle> alter diskgroup data add directory '+data/CNHTM/ONLINELOG';

Diskgroup altered.

......

idle> alter diskgroup data add alias
2 '+data/CNHTM/ONLINELOG/group_4.LOG'
3 for
4 '+data/ORCL/ONLINELOG/group_7.273.705923695';

Diskgroup altered.

2.8、如果歸檔日誌目錄名中包含sid,那麼修改歸檔目錄名

我的測試環境,歸檔目錄使用的是flash_recovery_area,所以需要將這個目錄中的ORCL目錄重新命名為CNHTM

2.9、使用spfile生成pfile

注意這裡沒有啟動資料庫,只是連結到idle狀態

oracle@oracle[/home/oracle]> export ORACLE_SID=cnhtm
oracle@oracle[/home/oracle]> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 20 11:49:20 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

idle> create pfile='?/dbs/initcnhtm.ora' from spfile;

File created.

idle> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

2.10、進入$ORACLE_HOME/dbs目錄

2.11、編輯initcnhtm.ora檔案

搜尋所有的orcl,重命令為cnhtm,搜尋所有的ORCL,重新命名為CNHTM

2.12、刪除控制檔案

將原來的控制檔案刪除或重新命名
控制檔案的位置名稱可以透過檢視2.11步驟中的*.control_files來確定
如果控制檔案在ASM中,可以進入asmcmd命令,然後用rm命令刪除

2.13、進入$ORACLE_BASE/admin目錄

將orcl目錄重新命名為cnhtm

2.14、使用修改過的pfile生成spfile

oracle@oracle[/oracle/admin/cnhtm/udump]> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 20 11:59:56 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

idle> create spfile from pfile='?/dbs/initcnhtm.ora';

File created.

2.15、呼叫2.6步驟修改好的ccf.sql

idle> @/oracle/admin/cnhtm/udump/ccf.sql
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218292 bytes
Variable Size 67111180 bytes
Database Buffers 92274688 bytes
Redo Buffers 7168000 bytes

Control file created.


Database altered.


Database altered.


Tablespace altered.

2.16、檢查資料庫狀態

idle> conn / as sysdba
Connected.
sys@CNHTM>select open_mode from v$database;
OPEN_MODE
----------
READ WRITE

sys@CNHTM> show parameter name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
db_name string cnhtm
db_unique_name string cnhtm
global_names boolean FALSE
instance_name string cnhtm
lock_name_space string
log_file_name_convert string
service_names string cnhtm

發現資料庫名(db_name)已經修改為cnhtm

--end--

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22049049/viewspace-1029874/,如需轉載,請註明出處,否則將追究法律責任。

相關文章