源數據庫
Oracle服務器版本:? Oracle9.2.0.8
數據庫名稱 db_name = oradb? instance_name=oradb
操作系統(tǒng)版本: windows 2003
實例安裝位置: $oracle_base = e:/oracle
?
目標數據庫
Oracle服務器版本:? Oracle9.2.0.8
數據庫名稱 db_name = orcl? instance_name=orcl
操作系統(tǒng)版本: windows xp
實例安裝位置: $oracle_base = d:/oracle
?
執(zhí)行步驟. 一, 數據庫名稱和sid要求相同1.1 數據庫名稱的相關概念
一, 數據庫名
數據庫名是數據庫的身份證號碼, 用于表示一個數據庫. 在參數文件(?/database/initSID.ora)中用DB_NAME表示.
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oradb'
*.instance_name='oradb'
數據庫名是在安裝數據庫, 創(chuàng)建新的數據庫, 創(chuàng)建數據控制文件, 修改數據庫結構, 備份與恢復數據庫時都需要使用到的.
查詢數據庫名稱:
n???????? Select name, dbid from v$database;
u?????? Show parameter db_name;
u?????? 查看參數文件initsid.ora
二, 數據庫實例名
數據庫實例名是用戶和操作系統(tǒng)進行聯(lián)系的標識, 也就是說數據庫和操作系統(tǒng)之間的交互使用的是數據庫實例名.
實例名在參數文件中也存在, 該參數為instance_name.
數據庫名和實例名可以相同也可以不同, 在一般情況下, 數據庫名和實例名是一對一的關系,但如果在oracle并行服務器架構(即oracle實時應用集群)中, 數據庫名和實例名是一對多的關系.
查詢當前數據庫實例名.
????????? 使用sql語句. Select instance_name from v$instance;
????????? 使用show命令. Show parameter instance_name;
????????? 查看參數文件initsid.ora.
數據庫實例名和oracle_sid兩者都表示oracle實例, 但是有區(qū)別的. Instance_name是oracle數據庫參數. 而oracle_sid是操作系統(tǒng)的環(huán)境變量. Oracle_sid用于于操作系統(tǒng)交互, 也就是說, 從操作系統(tǒng)角度訪問實例名, 必須通過oracle_sid.
Oracle_sid和instance_name必須是一致的, 否則用戶將會受到一個錯誤. 在unix平臺, 是oracle not available, 在winnt平臺, 是tns, 協(xié)議適配器錯誤.
三, 數據庫域名與全局數據庫名
隨著由多個數據庫構成的分布式數據庫的普及, 單一的db_name表示的數據庫命名方式給數據庫的管理造成了一定的負擔. 因為分布式環(huán)境下的數據庫名字可能一樣, 造成管理上的混亂.
為了解決這種情況, 引入了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的并行環(huán)境中, 一個數據庫對應多個實例, 這樣就需要多個網絡服務名, 設置繁瑣. 為了方便并行環(huán)境中的設置, 引進了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中查詢.
五, 網絡服務名
網絡服務名, 又稱為數據庫別名, 是客戶端程序訪問數據庫時需要的配置. 屏蔽客戶端如何連接到服務器端的細節(jié), 實現(xiàn)了數據庫的位置透明的特性. 網絡服務名被記錄在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狀態(tài)下使用nid修改sid
C:/Documents and Settings/Administrator>sqlplus /nolog
SQL> conn / as sysdba
SQL> shutdown immediate
SQL> startup mount? -- nid需要在mount狀態(tài)下處理。
SQL> host nid target=/ dbname=oradb
處理過程中需要與用戶執(zhí)行一次交互。
Change database ID and database name ORCL to ORADB? (Y/[N]) => Y
2, 在mount狀態(tài)下修改db_name
完成上述操作后需要再次啟動到mount狀態(tài)修改參數文件。
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
執(zhí)行完步驟一中的操作后, 數據庫db_name變?yōu)閛radb, 但instance_name依然還是orcl。 這個名稱需要使用oracle的oradim工具進行修改。
1, 如果是windows系統(tǒng), 先要將所有的oracle服務關閉, 否則會出錯。
2, 將之前的instance_name刪除
C:/Documents and Settings/Administrator>oradim -delete -sid orcl
3, 創(chuàng)建密碼文件
SQL> host orapwd file=D:/oracle/ora92/database/pwdoradb.ora password=sys_47522341 entries=5;
4, 創(chuàng)建一個新的sid。
C:/Documents and Settings/Administrator>oradim -new -sid oradb
C:/Documents and Settings/Administrator>oradim -new -sid oradb
5, 進入oracle并創(chuàng)建spfile
設置環(huán)境變量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創(chuàng)建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';
文件已創(chuàng)建。
//調整pfile里的參數后再創(chuàng)建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';
文件已創(chuàng)建。
5)更改listener.ora和tnsnames.ora并重啟listener
直接編輯這兩個文件將里面的sid_name、dbname和service_name都改為zstest
6)因為更改了OS數據庫目錄路徑(zs改為zstest)所以需要重建controlfiles
//創(chuàng)建控制文件的腳本可以再舊數據庫的時候使用如下語句獲得:
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;
控制文件已創(chuàng)建。
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 聯(lián)機重做日志文件存儲位置
視圖 v$logfile;
Select * from v$logfile;
三, 鏡像跟蹤文件和警告文件到目標數據庫如果源數據庫的安裝路徑和目標數據庫不一致, 則需要在源數據庫中先使用spfilesid.ora創(chuàng)建一個initsid.ora, 然后到目標數據庫中修改initsid.ora對應文件的配置. 然后再創(chuàng)建一個spfile.ora.
3.1 在源數據庫中創(chuàng)建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來實現(xiàn). 或者是先通過create pfile from spfile.. 然后修改pfile的內容. 之后使用startup pfile=’’啟動數據庫后,再執(zhí)行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 在目標數據庫中執(zhí)行替換后的控制文件
將上面替換后的sql語句拿到目標數據庫中進行執(zhí)行
完成后, 可以使用下面的語句打開數據庫.
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
?