環境描述:
源數據庫
Oracle服務器版本: Oracle9.2.0.8
數據庫名稱 db_name = oradb instance_name=oradb
操作系統版本: windows 2003
實例安裝位置: $oracle_base = e:/oracle
目標數據庫
Oracle服務器版本: Oracle9.2.0.8
數據庫名稱 db_name = orcl instance_name=orcl
操作系統版本: windows xp
實例安裝位置: $oracle_base = d:/oracle
執行步驟.
一, 數據庫名稱和sid要求相同
1.1 數據庫名稱的相關概念
一, 數據庫名
數據庫名是數據庫的身份證號碼, 用於表示一個數據庫. 在參數文件(?/database/initSID.ora)中用DB_NAME表示.
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oradb'
*.instance_name='oradb'
數據庫名是在安裝數據庫, 創建新的數據庫, 創建數據控制文件, 修改數據庫結構, 備份與恢復數據庫時都需要使用到的.
查詢數據庫名稱:
n Select name, dbid from v$database;
u Show parameter db_name;
u 查看參數文件initsid.ora
二, 數據庫實例名
數據庫實例名是用戶和操作系統進行聯繫的標識, 也就是說數據庫和操作系統之間的交互使用的是數據庫實例名.
實例名在參數文件中也存在, 該參數爲instance_name.
數據庫名和實例名可以相同也可以不同, 在一般情況下, 數據庫名和實例名是一對一的關係,但如果在oracle並行服務器架構(即oracle實時應用集羣)中, 數據庫名和實例名是一對多的關係.
查詢當前數據庫實例名.
Ø 使用sql語句. Select instance_name from v$instance;
Ø 使用show命令. Show parameter instance_name;
Ø 查看參數文件initsid.ora.
數據庫實例名和oracle_sid兩者都表示oracle實例, 但是有區別的. Instance_name是oracle數據庫參數. 而oracle_sid是操作系統的環境變量. Oracle_sid用於於操作系統交互, 也就是說, 從操作系統角度訪問實例名, 必須通過oracle_sid.
Oracle_sid和instance_name必須是一致的, 否則用戶將會受到一個錯誤. 在unix平臺, 是oracle not available, 在winnt平臺, 是tns, 協議適配器錯誤.
三, 數據庫域名與全局數據庫名
隨着由多個數據庫構成的分佈式數據庫的普及, 單一的db_name表示的數據庫命名方式給數據庫的管理造成了一定的負擔. 因爲分佈式環境下的數據庫名字可能一樣, 造成管理上的混亂.
爲了解決這種情況, 引入了db_domain參數, 這樣在數據庫的標識是由db_name和db_domain兩個參數共同決定的. 避免了因爲數據庫重名而造成管理上的混亂.
查詢數據庫域名.
Ø 使用sql命令 select value from v$parameter where name = ‘db_domain’;
Ø 使用show命令 show parameter domain
Ø 查看參數文件initsid.ora
四, 數據庫服務名
該參數是oracle8i新引入的. 在8i之前, 我們用sid來表示數據庫的一個實例, 但是在oracle的並行環境中, 一個數據庫對應多個實例, 這樣就需要多個網絡服務名, 設置繁瑣. 爲了方便並行環境中的設置, 引進了service_name參數. 該參數對應一個數據庫, 而不是一個實例. 該參數的初始值爲db_name.db_domain, 即等於global_name. 如果數據庫有域名, 則數據庫服務器名就是全局數據庫名; 否則, 數據庫服務名與數據庫名相同.
查詢數據庫服務名的方法.
使用sql語句: select value from v$parameter where name = ‘service_name’;
使用show命令: show parameter service_name;
查看參數文件: 在參數文件initsid.ora中查詢.
五, 網絡服務名
網絡服務名, 又稱爲數據庫別名, 是客戶端程序訪問數據庫時需要的配置. 屏蔽客戶端如何連接到服務器端的細節, 實現了數據庫的位置透明的特性. 網絡服務名被記錄在tnsnames.ora文件中.
六, 總結
Oracle中各種命名的比較.
名稱 |
查詢方式 |
Db_name |
Select name from v$database |
Instance_name |
Select instance_name from v$instance |
Oracle_sid |
值和instance_name相同 |
Db_domain |
Select value from v$parameter where name = ‘db_domain’; |
Global_name |
Db_name.db_dommain |
Service_name |
Select value from v$parameter where name=’service_name’; |
Net_service_name |
檢查tnsnames.ora文件 |
1.2 修改oracle數據庫的db_name和sid
一,用oracle自帶的工具nid改數據庫名
在本例中,假設原來的數據庫名爲orcl, 要改成oradb, 原實例名(service_name, instance_name)orcl要改成oradb。
Nid是自帶的工具, 在oracle_home/bin目錄下, 以下方法假設登陸到需要修改db_name的數據庫服務器本地處理。
1, 在mount狀態下使用nid修改sid
C:/Documents and Settings/Administrator>sqlplus /nolog
SQL> conn / as sysdba
SQL> shutdown immediate
SQL> startup mount -- nid需要在mount狀態下處理。
SQL> host nid target=/ dbname=oradb
處理過程中需要與用戶執行一次交互。
Change database ID and database name ORCL to ORADB? (Y/[N]) => Y
2, 在mount狀態下修改db_name
完成上述操作後需要再次啓動到mount狀態修改參數文件。
SQL> shutdown immediate
SQL> startup mount
SQL> alter system set db_name=oradb scope=spfile;
SQL> shutdown immediate
3, 重建pwdsid.ora文件
Passwd文件通常放在oracle_home/database下, 文件命名形式爲pwdsid.ora, sid爲實例名(instance_name)
SQL> host orapwd file=D:/oracle/ora92/database/pwdorcl.ora password=sys_47522341 entries=5;
4, 開啓數據庫(要open resetlogs)
SQL> startup mount
SQL> alter database open resetlogs;
5, 檢查修改後的結果
SQL> select name from v$database;
二, 使用oradim工具修改instance_name
執行完步驟一中的操作後, 數據庫db_name變爲oradb, 但instance_name依然還是orcl。 這個名稱需要使用oracle的oradim工具進行修改。
1, 如果是windows系統, 先要將所有的oracle服務關閉, 否則會出錯。
2, 將之前的instance_name刪除
C:/Documents and Settings/Administrator>oradim -delete -sid orcl
3, 創建密碼文件
SQL> host orapwd file=D:/oracle/ora92/database/pwdoradb.ora password=sys_47522341 entries=5;
4, 創建一個新的sid。
C:/Documents and Settings/Administrator>oradim -new -sid oradb
C:/Documents and Settings/Administrator>oradim -new -sid oradb
5, 進入oracle並創建spfile
設置環境變量oracle_sid=oradb
C:/Documents and Settings/Administrator>set oracle_sid = oradb
修改spfile裏實例信息(包含路徑裏的zs改爲zstest,OS目錄zs改爲zstest)
//如果此處不修改路徑中的zs到zstest則後面應無需重建控制文件
C:/Documents and Settings/Administrator>sqlplus sys/admin as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 7月 3 16:23:16 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已連接到空閒例程。
//先從spfile創建pfile
SQL> create pfile='D:/oracle/product/10.2.0/admin/zs/pfile/init080703.ora' from
spfile='D:/oracle/product/10.2.0/db_1/database/SPFILEZS.ORA';
文件已創建。
//調整pfile裏的參數後再創建spfile
SQL> create spfile='D:/oracle/product/10.2.0/db_1/database/SPFILEZSTEST.ORA' fro
m pfile='D:/oracle/product/10.2.0/admin/zstest/pfile/init080703.ora';
文件已創建。
5)更改listener.ora和tnsnames.ora並重啓listener
直接編輯這兩個文件將裏面的sid_name、dbname和service_name都改爲zstest
6)因爲更改了OS數據庫目錄路徑(zs改爲zstest)所以需要重建controlfiles
//創建控制文件的腳本可以再舊數據庫的時候使用如下語句獲得:
alter database backup controlfile to trace as 'd:/controlfile.txt';
再做修改即可使用。
SQL> CREATE CONTROLFILE REUSE DATABASE "ZSTEST" RESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 (
9 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/REDO01A.LOG',
10 'E:/ORADATA/ZSTEST/REDO01B.LOG'
11 ) SIZE 250M,
12 GROUP 2 (
13 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/REDO02A.LOG',
14 'E:/ORADATA/ZSTEST/REDO02B.LOG'
15 ) SIZE 250M,
16 GROUP 3 (
17 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/REDO03A.LOG',
18 'E:/ORADATA/ZSTEST/REDO03B.LOG'
19 ) SIZE 250M
20 DATAFILE
21 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/SYSTEM01.DBF',
22 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/UNDOTBS01.DBF',
23 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/SYSAUX01.DBF',
24 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/USERS01.DBF',
25 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/EXAMPLE01.DBF',
26 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZSKJ_DATA01.DBF',
27 'E:/ORADATA/ZSTEST/ZSKJ_DATA02.DBF',
28 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZS_DATA01.DBF',
29 'E:/ORADATA/ZSTEST/ZS_DATA02.DBF',
30 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZS_IDXDATA01.DBF',
31 'E:/ORADATA/ZSTEST/ZS_IDXDATA02.DBF',
32 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZSKJ_IDXDATA01.DBF',
33 'E:/ORADATA/ZSTEST/ZSKJ_IDXDATA02.DBF'
34 CHARACTER SET ZHS16GBK;
控制文件已創建。
SQL> alter database open resetlogs;
數據庫已更改。
//重建完控制文件記得要重新啓用temp表空間,再trace的控制文件腳本里有提示
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST
/TEMP01.DBF'
2 SIZE 20971520 REUSE AUTOEXTEND ON NEXT 524288000 MAXSIZE 32767M;
表空間已更改。
二, 鏡像遷移數據文件,控制文件以及歸檔日誌文件
2.1 數據文件存儲位置
視圖 v$datafile;
Select file#, name from v$datafile;
2.2 控制文件存儲位置
視圖 v$controlfile
Select name from v$controlfile;
2.3 聯機重做日誌文件存儲位置
視圖 v$logfile;
Select * from v$logfile;
三, 鏡像跟蹤文件和警告文件到目標數據庫
如果源數據庫的安裝路徑和目標數據庫不一致, 則需要在源數據庫中先使用spfilesid.ora創建一個initsid.ora, 然後到目標數據庫中修改initsid.ora對應文件的配置. 然後再創建一個spfile.ora.
3.1 在源數據庫中創建pfile.
SQL> create pfile='E:/oracle/admin/oradb/pfile/initoradb20090922.ora' from spfile='E:/oracle/ora92/database/spfileoradb.ora';
3.2 將跟蹤文件和警告文件鏡像到目標數據庫
源數據庫路徑.
$oracle_base/admin
3.3 在目標數據庫中修改pfile
修改在3.1中生成的pfile文件initoradb20090922.ora, 將其中與目標數據庫配置路徑不同的地方替換爲目標數據庫中對應的路徑
3.4 常見的手工修改spfile的錯誤
Oracle的spfile是一個二進制文件, 這個文件不能採用手工修改的方式進行維護. 可以選擇的維護方式有兩種, 一是在登錄到服務器後使用alter system set … scope=both/spfile來實現. 或者是先通過create pfile from spfile.. 然後修改pfile的內容. 之後使用startup pfile=’’啓動數據庫後,再執行create create spfile from pfile來完成對spfile的修改.
在數據庫的遷移中, 只能採用第二種方式.
四, 重新生成控制文件
4.1 在目標數據庫中備份控制文件到跟蹤文件中
首先,我們使用下述命令備份源數據庫的控制文件;
SQL> alter database backup controlfile to trace as 'd:/zhanglei.txt';
4.2 修改控制文件中的內容
將上面步驟產生的控制文件中與目標數據庫不匹配的內容使用目標數據庫的路徑替換.
CREATE CONTROLFILE REUSE DATABASE "ORADB" NORESETLOGS ARCHIVELOG
-- SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 'E:/ORACLE/ORADATA/ORADB/REDO01.LOG' SIZE 100M,
GROUP 2 'E:/ORACLE/ORADATA/ORADB/REDO02.LOG' SIZE 100M,
GROUP 3 'E:/ORACLE/ORADATA/ORADB/REDO03.LOG' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'E:/ORACLE/ORADATA/ORADB/SYSTEM01.DBF',
'E:/ORACLE/ORADATA/ORADB/UNDOTBS01.DBF',
'E:/ORACLE/ORADATA/ORADB/CWMLITE01.DBF',
'E:/ORACLE/ORADATA/ORADB/DRSYS01.DBF',
'E:/ORACLE/ORADATA/ORADB/EXAMPLE01.DBF',
'E:/ORACLE/ORADATA/ORADB/INDX01.DBF',
'E:/ORACLE/ORADATA/ORADB/ODM01.DBF',
'E:/ORACLE/ORADATA/ORADB/TOOLS01.DBF',
'E:/ORACLE/ORADATA/ORADB/USERS01.DBF',
'E:/ORACLE/ORADATA/ORADB/XDB01.DBF',
'E:/ORACLE/ORADATA/ORADB/ASSM.DBF',
'E:/ORACLE/ORADATA/ORADB/PERFSTAT01.DBF',
'E:/ORACLE/ORADATA/ZHANGLEI.DBF',
'E:/ORACLE/ORADATA/ORADB/CTL01.DBF'
CHARACTER SET ZHS16GBK
;
4.3 在目標數據庫中執行替換後的控制文件
將上面替換後的sql語句拿到目標數據庫中進行執行
完成後, 可以使用下面的語句打開數據庫.
Sql> alter database open resetlogs;
4.4 生成spfile文件
SQL> create spfile='D:/oracle/ora92/database/spfileoradb.ora' from pfile='D:/oracle/admin/oradb/pfile/initoradb20090922.ora';
4.5 重啓數據庫完成數據庫遷移
到這一步完成, 數據庫已經遷移成功.
重新啓動數據庫, 使用spfile登錄.
SQL> shutdown immediate;
SQL> startup