數(shù)據(jù)庫(kù)遷移方案01
源數(shù)據(jù)庫(kù)
Oracle服務(wù)器版本:? Oracle9.2.0.8
數(shù)據(jù)庫(kù)名稱 db_name = oradb? instance_name=oradb
操作系統(tǒng)版本: windows 2003
實(shí)例安裝位置: $oracle_base = e:/oracle
?
目標(biāo)數(shù)據(jù)庫(kù)
Oracle服務(wù)器版本:? Oracle9.2.0.8
數(shù)據(jù)庫(kù)名稱 db_name = orcl? instance_name=orcl
操作系統(tǒng)版本: windows xp
實(shí)例安裝位置: $oracle_base = d:/oracle
?
執(zhí)行步驟. 一, 數(shù)據(jù)庫(kù)名稱和sid要求相同1.1 數(shù)據(jù)庫(kù)名稱的相關(guān)概念
一, 數(shù)據(jù)庫(kù)名
數(shù)據(jù)庫(kù)名是數(shù)據(jù)庫(kù)的身份證號(hào)碼, 用于表示一個(gè)數(shù)據(jù)庫(kù). 在參數(shù)文件(?/database/initSID.ora)中用DB_NAME表示.
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oradb'
*.instance_name='oradb'
數(shù)據(jù)庫(kù)名是在安裝數(shù)據(jù)庫(kù), 創(chuàng)建新的數(shù)據(jù)庫(kù), 創(chuàng)建數(shù)據(jù)控制文件, 修改數(shù)據(jù)庫(kù)結(jié)構(gòu), 備份與恢復(fù)數(shù)據(jù)庫(kù)時(shí)都需要使用到的.
查詢數(shù)據(jù)庫(kù)名稱:
n???????? Select name, dbid from v$database;
u?????? Show parameter db_name;
u?????? 查看參數(shù)文件initsid.ora
二, 數(shù)據(jù)庫(kù)實(shí)例名
數(shù)據(jù)庫(kù)實(shí)例名是用戶和操作系統(tǒng)進(jìn)行聯(lián)系的標(biāo)識(shí), 也就是說(shuō)數(shù)據(jù)庫(kù)和操作系統(tǒng)之間的交互使用的是數(shù)據(jù)庫(kù)實(shí)例名.
實(shí)例名在參數(shù)文件中也存在, 該參數(shù)為instance_name.
數(shù)據(jù)庫(kù)名和實(shí)例名可以相同也可以不同, 在一般情況下, 數(shù)據(jù)庫(kù)名和實(shí)例名是一對(duì)一的關(guān)系,但如果在oracle并行服務(wù)器架構(gòu)(即oracle實(shí)時(shí)應(yīng)用集群)中, 數(shù)據(jù)庫(kù)名和實(shí)例名是一對(duì)多的關(guān)系.
查詢當(dāng)前數(shù)據(jù)庫(kù)實(shí)例名.
????????? 使用sql語(yǔ)句. Select instance_name from v$instance;
????????? 使用show命令. Show parameter instance_name;
????????? 查看參數(shù)文件initsid.ora.
數(shù)據(jù)庫(kù)實(shí)例名和oracle_sid兩者都表示oracle實(shí)例, 但是有區(qū)別的. Instance_name是oracle數(shù)據(jù)庫(kù)參數(shù). 而oracle_sid是操作系統(tǒng)的環(huán)境變量. Oracle_sid用于于操作系統(tǒng)交互, 也就是說(shuō), 從操作系統(tǒng)角度訪問(wèn)實(shí)例名, 必須通過(guò)oracle_sid.
Oracle_sid和instance_name必須是一致的, 否則用戶將會(huì)受到一個(gè)錯(cuò)誤. 在unix平臺(tái), 是oracle not available, 在winnt平臺(tái), 是tns, 協(xié)議適配器錯(cuò)誤.
三, 數(shù)據(jù)庫(kù)域名與全局?jǐn)?shù)據(jù)庫(kù)名
隨著由多個(gè)數(shù)據(jù)庫(kù)構(gòu)成的分布式數(shù)據(jù)庫(kù)的普及, 單一的db_name表示的數(shù)據(jù)庫(kù)命名方式給數(shù)據(jù)庫(kù)的管理造成了一定的負(fù)擔(dān). 因?yàn)榉植际江h(huán)境下的數(shù)據(jù)庫(kù)名字可能一樣, 造成管理上的混亂.
為了解決這種情況, 引入了db_domain參數(shù), 這樣在數(shù)據(jù)庫(kù)的標(biāo)識(shí)是由db_name和db_domain兩個(gè)參數(shù)共同決定的. 避免了因?yàn)閿?shù)據(jù)庫(kù)重名而造成管理上的混亂.
查詢數(shù)據(jù)庫(kù)域名.
????????? 使用sql命令 select value from v$parameter where name = ‘db_domain’;
????????? 使用show命令 show parameter domain
????????? 查看參數(shù)文件initsid.ora
四, 數(shù)據(jù)庫(kù)服務(wù)名
該參數(shù)是oracle8i新引入的. 在8i之前, 我們用sid來(lái)表示數(shù)據(jù)庫(kù)的一個(gè)實(shí)例, 但是在oracle的并行環(huán)境中, 一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)多個(gè)實(shí)例, 這樣就需要多個(gè)網(wǎng)絡(luò)服務(wù)名, 設(shè)置繁瑣. 為了方便并行環(huán)境中的設(shè)置, 引進(jìn)了service_name參數(shù). 該參數(shù)對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù), 而不是一個(gè)實(shí)例. 該參數(shù)的初始值為db_name.db_domain, 即等于global_name. 如果數(shù)據(jù)庫(kù)有域名, 則數(shù)據(jù)庫(kù)服務(wù)器名就是全局?jǐn)?shù)據(jù)庫(kù)名; 否則, 數(shù)據(jù)庫(kù)服務(wù)名與數(shù)據(jù)庫(kù)名相同.
查詢數(shù)據(jù)庫(kù)服務(wù)名的方法.
使用sql語(yǔ)句: select value from v$parameter where name = ‘service_name’;
使用show命令: show parameter service_name;
查看參數(shù)文件: 在參數(shù)文件initsid.ora中查詢.
五, 網(wǎng)絡(luò)服務(wù)名
網(wǎng)絡(luò)服務(wù)名, 又稱為數(shù)據(jù)庫(kù)別名, 是客戶端程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí)需要的配置. 屏蔽客戶端如何連接到服務(wù)器端的細(xì)節(jié), 實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的位置透明的特性. 網(wǎng)絡(luò)服務(wù)名被記錄在tnsnames.ora文件中.
六, 總結(jié)
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數(shù)據(jù)庫(kù)的db_name和sid
一,用oracle自帶的工具nid改數(shù)據(jù)庫(kù)名
在本例中,假設(shè)原來(lái)的數(shù)據(jù)庫(kù)名為orcl, 要改成oradb, 原實(shí)例名(service_name, instance_name)orcl要改成oradb。
Nid是自帶的工具, 在oracle_home/bin目錄下, 以下方法假設(shè)登陸到需要修改db_name的數(shù)據(jù)庫(kù)服務(wù)器本地處理。
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
處理過(guò)程中需要與用戶執(zhí)行一次交互。
Change database ID and database name ORCL to ORADB? (Y/[N]) => Y
2, 在mount狀態(tài)下修改db_name
完成上述操作后需要再次啟動(dòng)到mount狀態(tài)修改參數(shù)文件。
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為實(shí)例名(instance_name)
SQL> host orapwd file=D:/oracle/ora92/database/pwdorcl.ora password=sys_47522341 entries=5;
4, 開(kāi)啟數(shù)據(jù)庫(kù)(要open resetlogs)
SQL> startup mount
SQL> alter database open resetlogs;
5, 檢查修改后的結(jié)果
SQL> select name from v$database;
二, 使用oradim工具修改instance_name
執(zhí)行完步驟一中的操作后, 數(shù)據(jù)庫(kù)db_name變?yōu)閛radb, 但instance_name依然還是orcl。 這個(gè)名稱需要使用oracle的oradim工具進(jìn)行修改。
1, 如果是windows系統(tǒng), 先要將所有的oracle服務(wù)關(guān)閉, 否則會(huì)出錯(cuò)。
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)建一個(gè)新的sid。
C:/Documents and Settings/Administrator>oradim -new -sid oradb
C:/Documents and Settings/Administrator>oradim -new -sid oradb
5, 進(jìn)入oracle并創(chuàng)建spfile
設(shè)置環(huán)境變量oracle_sid=oradb
C:/Documents and Settings/Administrator>set oracle_sid = oradb
修改spfile里實(shí)例信息(包含路徑里的zs改為zstest,OS目錄zs改為zstest)
//如果此處不修改路徑中的zs到zstest則后面應(yīng)無(wú)需重建控制文件
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)建。
//調(diào)整pfile里的參數(shù)后再創(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
直接編輯這兩個(gè)文件將里面的sid_name、dbname和service_name都改為zstest
6)因?yàn)楦牧薕S數(shù)據(jù)庫(kù)目錄路徑(zs改為zstest)所以需要重建controlfiles
//創(chuàng)建控制文件的腳本可以再舊數(shù)據(jù)庫(kù)的時(shí)候使用如下語(yǔ)句獲得:
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;
數(shù)據(jù)庫(kù)已更改。
//重建完控制文件記得要重新啟用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;
表空間已更改。
二, 鏡像遷移數(shù)據(jù)文件,控制文件以及歸檔日志文件2.1 數(shù)據(jù)文件存儲(chǔ)位置
視圖 v$datafile;
Select file#, name from v$datafile;
2.2 控制文件存儲(chǔ)位置
視圖 v$controlfile
Select name from v$controlfile;
2.3 聯(lián)機(jī)重做日志文件存儲(chǔ)位置
視圖 v$logfile;
Select * from v$logfile;
三, 鏡像跟蹤文件和警告文件到目標(biāo)數(shù)據(jù)庫(kù)如果源數(shù)據(jù)庫(kù)的安裝路徑和目標(biāo)數(shù)據(jù)庫(kù)不一致, 則需要在源數(shù)據(jù)庫(kù)中先使用spfilesid.ora創(chuàng)建一個(gè)initsid.ora, 然后到目標(biāo)數(shù)據(jù)庫(kù)中修改initsid.ora對(duì)應(yīng)文件的配置. 然后再創(chuàng)建一個(gè)spfile.ora.
3.1 在源數(shù)據(jù)庫(kù)中創(chuàng)建pfile.
SQL> create pfile='E:/oracle/admin/oradb/pfile/initoradb20090922.ora' from spfile='E:/oracle/ora92/database/spfileoradb.ora';
3.2 將跟蹤文件和警告文件鏡像到目標(biāo)數(shù)據(jù)庫(kù)
源數(shù)據(jù)庫(kù)路徑.
$oracle_base/admin
3.3 在目標(biāo)數(shù)據(jù)庫(kù)中修改pfile
修改在3.1中生成的pfile文件initoradb20090922.ora, 將其中與目標(biāo)數(shù)據(jù)庫(kù)配置路徑不同的地方替換為目標(biāo)數(shù)據(jù)庫(kù)中對(duì)應(yīng)的路徑
3.4 常見(jiàn)的手工修改spfile的錯(cuò)誤
Oracle的spfile是一個(gè)二進(jìn)制文件, 這個(gè)文件不能采用手工修改的方式進(jìn)行維護(hù). 可以選擇的維護(hù)方式有兩種, 一是在登錄到服務(wù)器后使用alter system set … scope=both/spfile來(lái)實(shí)現(xiàn). 或者是先通過(guò)create pfile from spfile.. 然后修改pfile的內(nèi)容. 之后使用startup pfile=’’啟動(dòng)數(shù)據(jù)庫(kù)后,再執(zhí)行create create spfile from pfile來(lái)完成對(duì)spfile的修改.
在數(shù)據(jù)庫(kù)的遷移中, 只能采用第二種方式.
四, 重新生成控制文件4.1 在目標(biāo)數(shù)據(jù)庫(kù)中備份控制文件到跟蹤文件中
首先,我們使用下述命令備份源數(shù)據(jù)庫(kù)的控制文件;
SQL> alter database backup controlfile to trace as 'd:/zhanglei.txt';
4.2 修改控制文件中的內(nèi)容
將上面步驟產(chǎn)生的控制文件中與目標(biāo)數(shù)據(jù)庫(kù)不匹配的內(nèi)容使用目標(biāo)數(shù)據(jù)庫(kù)的路徑替換.
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 在目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行替換后的控制文件
將上面替換后的sql語(yǔ)句拿到目標(biāo)數(shù)據(jù)庫(kù)中進(jìn)行執(zhí)行
完成后, 可以使用下面的語(yǔ)句打開(kāi)數(shù)據(jù)庫(kù).
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 重啟數(shù)據(jù)庫(kù)完成數(shù)據(jù)庫(kù)遷移
到這一步完成, 數(shù)據(jù)庫(kù)已經(jīng)遷移成功.
重新啟動(dòng)數(shù)據(jù)庫(kù), 使用spfile登錄.
SQL> shutdown immediate;
SQL> startup
?