遷移oracle數據庫至新分區


本文地址: http://www.cnblogs.com/blackmanba/p/move-oracle-database.html或者http://forkme.info/move-oracle-database/, 轉載請注明源地址。

最近一段時間,隨着數據的不停累積,之前的oracle數據庫所在的硬盤已經不能容納越來越多的數據以及日志信息。發生這種情況的原因是安裝時對數據庫的大小估算不夠(⊙﹏⊙b汗)。既然出了這種問題就要想方法解決。最后的做法其實就是最簡單的想法,將oracle數據庫遷移到更大的硬盤就行了唄!確實如此。但所謂知易行難,真正實施起來的時候才發現遷移過程中出現了很多問題。以下文章就是記錄我在遷移過程中遇到的各種問題以及解決辦法。

原因

為什么要花這么多時間和精力來將之前的數據庫遷移到別的硬盤呢?直接裝一個不就行了嗎?的確,重新安裝oracle數據庫到新硬盤確實能省去很多問題。但遷移數據庫卻有如下好處:

  • oracle數據庫的所有自定義配置能原封不動的保存
  • 數據庫完整轉移,不用再重新做創建用戶,分配權限等等的操作
  • 日志完整保存,能最大限度的保留之前數據庫的所有信息
  • 不用對數據庫的數據進行恢復

說了這么多,可能還是有人會說: "太麻煩了,遷移要做這么多東西,還不如重新來過"。這確實是個見仁見智的問題。但程序員不就是為了折騰嗎?

遷移數據庫

這是第一步,就是將oracle進程先停止再遷移到目標所在的硬盤上。我所用的版本是oracle 11g,不同的oracle版本出現的問題可能不一樣,需要特別注意。啟動停止oracle進程命令如下:

sqlplus "/as sysdba"
# 啟動oracle數據庫
startup (normal/nomount/mount  #參數,具體的意義可以查看官方文檔)
# 停止數據庫
shutdown (normal/immediate/transactional/abort)
exit

# 查看監聽狀態
lsnrctl status
# 啟動監聽
lsnrctl start
# 關閉監聽
lsnrctl stop

關閉完oracle進程后,就可以將數據庫所有文件都移動到新的硬盤去了。

啟動數據庫

移動完數據庫后,首先要將之前系統的環境變量都設置為當前數據庫所在的目錄,如LD_LIBRARY_PATH,ORACLE_HOME,ORACLE_SID等,在此不一一列舉。

1. 掛載啟動文件

檢驗系統配置無誤后就要啟動數據庫,采用上面的方法啟動數據庫,出現如下錯誤:

SQL> startup
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01262: Stat failed on a file destination directory
Linux-x86_64 Error: 2: No such file or directory

出現這個問題的原因是初始化文件中db_recovery_file_dest所指定的目錄不存在,解決方法如下:

復制數據庫初始化文件init.ora.8172011185713至其他目錄
(文件所在目錄:/opt/oracle/admin/orcldb/pfile/init.ora.8172011185713);

重命名init.ora.8172011185713為init.ora

以spfile方式加載啟動數據庫:
SQL>startup mount pfile='$oracle_home/admin/orcldb/pfile/init.ora';

打開數據庫
SQL>alter database open;

創建數據庫實例的spfile文件
SQL>create spfile from pfile='$oracle_home/admin/orcldb/pfile/init.ora';

重啟數據庫實例

如果你能按照上面的步驟執行成功,恭喜你下面的內容你可以不用看了。但我是執行到打開數據庫這個步驟出錯的。

2. 關閉flashback

在執行打開數據庫操作時,出現以下錯誤:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-38760: This database instance failed to turn on flashback database

這個錯誤的大意是數據庫實例無法啟用閃回數據庫,google下發現解決方法如下:

SQL>  select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

SQL> alter database flashback off;

Database altered.

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

3. 修改數據文件位置

解決上面出現的錯誤后重新執行,出現了另外一個錯誤:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/oracle/oradata/orcldb/system01.dbf'

這個錯誤的大意是無法對數據文件system01.dbf進行加鎖,輸出信息后發現是因為數據文件不存在。原因是數據文件被我們遷移至新的硬盤,並且目錄改變。

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/oracle/oradata/orcldb/system01.dbf
/oracle/oradata/orcldb/sysaux01.dbf
/oracle/oradata/orcldb/undotbs01.dbf
/oracle/oradata/orcldb/users01.dbf
/oracle/oradata/orcldb/ctf_main.dbf
/oracle/oradata/orcldb/ctf_weibo.dbf
/oracle/oradata/orcldb/mall_189.dbf
/oracle/oradata/orcldb/csip/csip_hr_idx_01.dbf
/oracle/oradata/orcldb/csip/csip_gate_data_01.dbf
/oracle/oradata/orcldb/csip/csip_arc08_idx_01.dbf
/oracle/oradata/orcldb/csip/csip_sys_idx_01.dbf
......

解決這個問題的方法如下:

# 修改數據庫物理文件到新的目錄
alter database rename file '$oracle_home/oradata/orcldb/system01.dbf' to '$oracle_home/oradata/orcldb/system01.dbf';

4. 修改重做日志目錄

修改完數據庫物理文件之后,執行之后出現另外一個錯誤,具體信息如下:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 28748
Session ID: 192 Serial number: 5

這個問題貌似是一個比較常出現的oracle錯誤,網上有很多種解決方法。但我試過了之后都發現無法解決。google后發現解決問題的一種方法,那就是查看日志,具體操作如下:

[oracle@edb bin]$ adrci

ADRCI: Release 11.2.0.1.0 - Production on Mon Dec 23 10:46:30 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/opt/oracle"
adrci> show homes;
ADR Homes: 
diag/tnslsnr/edb/listener
diag/rdbms/orcldb/orcl
adrci> set home diag/rdbms/orcldb/orcl

adrci> show alert -tail 100;

2013-12-23 10:39:01.252000 +08:00
alter database open
Errors in file /opt/oracle/diag/rdbms/orcldb/orcl/trace/orcl_m000_28651.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/oracle/oradata/orcldb/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory

這回發現問題了,那就是日志文件出錯,查看了這個錯誤后發現是日志文件路徑不對,修改日志文件路徑命令如下:

# 查詢重做日志文件
select * from v$log;
# 移動日志到新目錄
alter database rename file '$oracle_home/oradata/orcldb/redo01.log' to '$oracle_home/oradata/orcldb/redo03.log';

5. 成功

修改完日志文件后,再執行第一步時的余下操作,成功啟動數據庫。接下來啟動監聽,訪問也沒有問題。oracle數據庫遷移完成!!

總結

總的來說,這次遷移oracle數據庫還是比較順利的。並且也成功的讓數據庫重新啟動成功。但這種方法只限於學習使用。通常情況下正式環境是不能這樣子操作的,因為你要停止數據庫那么久!正式環境的一般操作是使用lvm的方式為硬盤擴容。當然還有更好的方法我還不知道(歡迎補充)。而且剛開始在規划數據庫硬盤容量時就應該考慮到各種情況,盡量保證數據庫不超出硬盤存儲范圍。遷移數據庫這種方法只是學習或者是實在沒有別的方法時使用!

參考文章:

http://blog.csdn.net/ghost241/article/details/6955817

http://dba.stackexchange.com/questions/49682/ora-03113-end-of-file-on-communication-channel-on-startup

http://database.51cto.com/art/201010/231946.htm

http://bbs.chinaunix.net/thread-3636279-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM