本文地址: 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

迁移oracle数据库至新分区的更多相关文章

  1. Windows C盘格式化或者同平台迁移oracle数据库

    我们知道如果是Linux 同平台迁移oracle数据库.只要是安全关闭了数据库,在新机器上创建用户组,配置了环境变量,将数据库安装目录拷贝到对应的目录就好用了. 一直在寻求Windows平台上这类的解 ...

  2. Oracle数据库表分区

    一.Oracle数据库表分区概念和理解         1.1.已经存在的表没有方法可以直接转化为分区表.         1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...

  3. 迁移ORACLE数据库文件到ASM

    迁移数据文件到ASM 数据库一致性情况下迁移:将数据库启动到mount状态,生成rman copy 语句,然后在rman中执行: SQL> startup mount SQL> selec ...

  4. Oracle数据库迁移到AWS云的方案

    当前云已经成为常态,越来越多的企业希望使用云来增加基础设施的弹性.减轻基础设施的维护压力,运维的成本等.很多企业使用云碰到的难题之一是如何将现有的应用迁移到云上,将现有应用的中间件系统.Web系统及其 ...

  5. Oracle数据库搬家牵扯出的一些知识点记录

    Oracle数据库迁移过程中的一些记录 工作原因,对开发服务器的数据库进行了迁移,实际执行操作之前查了一下迁移oracle数据库的可行方案,最后用了 exp/imp 进行导出导入(这个比较简单),以及 ...

  6. Oracle 数据库知识汇总篇

    Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...

  7. sqlserver 2008R2数据库迁移oracle

    x项目需要,将以前的sqlserver数据库迁移的oracle数据库中,由于以前对oracle只是在DML语句的步骤,所以总结一下这次遇到的问题以及具体步骤 1,oracle新建数据库 新建Oracl ...

  8. 迁移/home目录至新硬盘分区总结--无备份情况下

    搞了一天,终于成功迁移.由于一开始就没备份过程实在很曲折. 希望本篇对那些没有备份习惯的朋友们有所帮助. 准备工作: sudo vim /etc/fstab 在文件中加入: /dev/sdb8     ...

  9. Linux平台下使用rman进行oracle数据库迁移

        实验目的:将oracle数据库从一台机器迁移到另外的一台机器(同为linux平台),设置为不同的路径,不同的实例名 源端: ORACLE_BASE=/u01/app/oracle ORACLE ...

随机推荐

  1. DP:***24种设计模式--转自刘伟

    转自于高人的文章:http://blog.csdn.net/lovelion/article/details/17517213 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多 ...

  2. OpenCV_Python教程 系列!

    这个是作者的总结系列!赞一个! 原文链接:http://blog.csdn.net/sunny2038/article/details/9057415 在python中使用OpenCV:http:// ...

  3. 文字左右滚动选择,改变direction的值

    1.从左到右滚动显示<marquee direction=left>测试</marquee> 2.从右到左滚动显示<marquee direction=right> ...

  4. Mysql 5.7 for windows 免安装版(解压版)安装和配置

    网上写的不近详细,这里重新整理下. 准备: 1.windows操作系统 2.mysql 的解压版压缩文件 第一步: 解压mysql的压缩包到你的安装目录,因为是虚拟机,这里我就安装在C盘下:C:\my ...

  5. Linux crontab 在每月最后一天执行

    59  23 * * * if [ `date +%d -d tomorrow` = 01 ]; then; command(/usr/bin/curl -s -o temp.txt  http:// ...

  6. mysql修改时区的几种方法(转载自https://www.cnblogs.com/shiqiangqiang/p/8393662.html)

    说明: 以下记录修改mysql时区的几种方法. 具体: 方法一:通过mysql命令行模式下动态修改 1.1 查看mysql当前时间,当前时区 select curtime(); #或select no ...

  7. 当li设置为line-block时,元素之间出现间隙的原因和解决方法

    原因 因为浏览器默认把inline元素之间的空白符(Tab.空格.换行)渲染成一个空格.而如下述代码,两个li元素之间的换行符被渲染成一个空格,则元素之间产生了间隙. 用Chrome浏览器将场景模拟出 ...

  8. node中exports和module.exports的关系及使用

    在node中,需要记住,在使用exports和module.exports的时候,实际输出的是module.exports. exports指向module.exports,是module.expor ...

  9. Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )

    题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...

  10. Project Euler 30 Digit fifth powers

    题意:判断一个数 N 的每一位的5次方的和是否为其本身 ,求出所有满足条件的数的和 思路:首先设这个数 N 为 n 位,可以简单的判断一下这个问题的上界 10 ^ n <= 9 ^ 5 × n, ...