Oracle数据库备份和恢复
如何迁移或者备份Oracle数据库?
方法一
直接上Oracle SQL Developer,注意,不是PL/SQL Developer,这是我的首选方法,“快糙猛”,
操作方法,首先,选择工具菜单,在菜单项中选中数据库复制;然后,在数据库复制向导弹窗中,编辑合适的源连接、目标连接;接下来,一路傻瓜地点击下一步(N)即可。
当然,方法一不是万能的,否则没必要写方法二了,有下面的几点限制:
- 源连接、目标连接所在网络必须是互通的;
- 源连接、目标连接对应的Oracle数据库大版本号尽可能保持一致,比如都是11.2的;
注意:如果复制出现了异常,请仔细阅读操作日志,对于大多数的常见问题,都能百度到解决方法!!!
方法二
类比在电脑上安装App,如果方法一算是一键安装,方法二就相当于自定义安装,分成先导出、再导入等2个步骤。
-
从旧数据库中导出数据
打开命令提示符(CMD),输入并执行如下命令:
exp test/123456@localhost:1521/xe file=D:\xe.dump log=D:\xe.log
默认是导出当前用户的数据。
-
如果要导出全部用户的数据,就在命令的末尾加上
full=y
参数:exp test/123456@localhost:1521/xe file=D:\xe.dump log=D:\xe.log full=y
-
如果只要导出表结构(DDL),就在命令的末尾加上
rows=n
参数:exp test/123456@localhost:1521/xe file=D:\xe.dump log=D:\xe.log rows=n
注意:在执行导出数据命令的过程中,如果出现了
EXP-00003: 未找到段 (0,0) 的存储定义
,就要小心了,错误提示中提到的这些表,因为没有数据,是空表,Oracle数据库没有给它们分配存储空间,所以无法导出这些表的结构和数据。如果要解决这个问题,就照下面的步骤处理。-
查询所有的空表
SELECT table_name FROM user_tables WHERE segment_created = 'NO';
-
手动给空表分配存储空间
ALTER TABLE [table_name] ALLOCATE EXTENT;
然后,重新执行上面的导出数据库命令即可。
-
-
把数据导入到新数据库
打开命令提示符(CMD),输入并执行如下命令:
imp test2/123456@localhost:1521/xe2 file=D:\xe.dump log=D:\xe2.log full=y commit=y ignore=y
在一切正常的情况下,到这里就应该结束了。当然,这是非常理想的,实际上完全不是那么回事儿。
注意:在执行导入数据命令的过程中,如果出现了
ORA-00959: 表空间 'XXX' 不存在
,就说明新数据库的表空间与旧数据库冲突,需要创建新的表空间或者重命名当前的表空间。如果当前用户所属的表空间不是
SYSTEM
等默认的表空间,最简单的方法就是把它重命名为旧数据库对应的表空间,完整的命令如下:ALTER TABLESPACE [old name] RENAME TO [new name];
否则,就手动创建新的表空间:
CREATE TEMPORARY TABLESPACE ts_test2_temp TEMPFILE 'D:\app\oradata\xe2\ts_test2_temp.dbf' SIZE 100M AUTOEXTEND ON NEXT 32M [MAXSIZE 500M EXTENT MANAGEMENT LOCAL]; CREATE TABLESPACE ts_test2_data DATAFILE 'D:\app\oradata\xe2\ts_test2_data.dbf' SIZE 100M AUTOEXTEND ON NEXT 32M [MAXSIZE 500M EXTENT MANAGEMENT LOCAL];