天天看點

資料庫遷移方案

環境描述:

源資料庫

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