最近几天由于项目需要搭建新的开发环境,需要处理数据。本来是很简单的事情,但是由于数据库需要使用在线环境的数据,变得有些麻烦,主要是以前一些数据库的处理都是小数据量,一个命令很短就执行完毕了,而这次数据库文件在200G左右,数据备份和恢复,以及备份文件的转移都成了问题,因为文件相对比较大了,在文件备份、转移、恢复的时间就成倍的增长,不能再向以前一样始终在本地客户端操作了。
我将描述一下我自己的操作过程,和其中积累的经验。
数据库信息如下:
用户: SYSTEM 密码:ORACLE
用户:TEST 密码:ORACLE
SID:orcl
第一步数据库的备份:
1、 数据导出:
exp的常用方法如下:
A、 将数据库orcl完全导出,用户名system 密码oracle 导出到
/data/oracle/myoraclebak.dmp中。
命令如下:
exp system/oracle@orcl file=/data/oracle/myoraclebak.dmp full=y log=exp.log
B、 将数据库中system用户与test用户的表导出
命令如下:
exp system/oracle@orcl file=/data/oracle/myoraclebak.dmp owner=(system,test) log=exp.log
C、 将数据库中的表table1、table2导出
命令如下:
exp test/oracle@orcl file=/data/oracle/myoraclebak.dmp tables=(table1,table2) log=exp.log
D、 将数据库中的表table1中的字段filed1以"00"打头的数据导出
命令如下:
exp test/oracle@orcl file=/data/oracle/myoraclebak.dmp tables=(table1) query=" where filed1 like '00%'" log=exp.log
E、 将数据库中test用户的表导出到多个文件,要求单个文件大小不允许超过2000M
命令如下:
exp parfile=username.par file=/data/oracle/myoraclebak1.dmp, /data/oracle/myoraclebak2.dmp filesize=2000M log=exp.log
参数文件username.par内容
userid=test/oracle@orcl
buffer=8192000
compress=n
grants=y
说明:username.par为导出工具exp用的参数文件,里面具体参数可以根据需要去修改 filesize指定生成的二进制备份文件的最大字节数。
F、 增量导出
命令如下:
exp system/manager@svr_ora inctype=incremental file=d:/incremental.dmp
2、 我使用的命令如下:
more exp.sh
exp test/oracle@orcl file=/data/oracle/myoraclebak.dmp full=y log=exp.log
nohup ./exp sh &
进程运行时间24小时左右,最终myoraclebak.dmp文件大小32G左右。
第二步数据库导入:
3、 数据的导入
A、 将myoraclebak.dmp 中的数据导入 neworcl数据库中。
命令如下:
imp test/oracle@neworcl file=myoraclebak.dmp full=y ignore=y log=imp.log buffer=999999
在后面加上 ignore=y 是忽略警告错误。
B、 将myoraclebak.dmp中的表table1 导入
命令如下:
imp test/oracle@neworcl file= myoraclebak.dmp tables=(table1) ignore=y log=imp.log buffer=999999
C、 导入一个或一组指定用户所属的全部表、索引和其他对象
命令如下:
imp system/oracle@neworcl file=myoraclebak.dmp log=imp.log fromuser=(test1,testuser2)
D、 将一个用户所属的数据导入另一个用户
命令如下:
imp system/oracle@neworcl file=myoraclebak.dmp log=imp.log fromuser=test touser=testuser2
E、 从多个文件导入
命令如下:
imp system/oracle@neworcl file=(myoraclebak1.dmp, myoraclebak2.dmp) log= imp.log, filesize=1G full=y
F、 增量导入
命令如下:
imp system/manager@client_data inctype=restore ignore=y full=y file=d:/incremental.dmp
4、 我使用的命令如下:
more imp.sh
imp test/oracle@orcl file=myoraclebak.dmp full=y ignore=y log=imp.log buffer=999999
nohup ./imp.sh &
进程运行时间10小时左右。导入完毕后,数据占用空间200G左右
备注1:
1、给用户增加导入数据权限的操作
第一,启动sql*puls
第二,以system/manager登陆
第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字
2、创建表空间脚本
--need change url :'/mnt/data/database/SBAP_CONF.DBF',size :2048M
CREATE TABLESPACE SBAP_CONF DATAFILE
'/mnt/data/database/SBAP_CONF.DBF' SIZE 2048M AUTOEXTEND ON NEXT 2048M MAXSIZE UNLIMITED
NOLOGGING
PERMANENT
EXTENT MANAGEMENT LOCAL
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK OFF;
执行过程如下:
[oracle@REHL-oracle ~]$ sqlplus
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 20 06:57:31 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Enter user-name: /as sysdba
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> @/data/tablespace.sql
备注2:
DROP TABLE mytable
TRUNCATE TABLE (schema)table_name
Oracle10g 回收站及彻底删除table : drop table xx purge
drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉。这样,回收站里的表信息就可以被恢复,或彻底清除。
1.通过查询回收站user_recyclebin获取被删除的表信息,然后使用语句
flashback table <user_recyclebin.object_name or user_recyclebin.original_name> to before drop [rename to <new_table_name>];
将回收站里的表恢复为原名称或指定新名称,表中数据不会丢失。
若要彻底删除表,则使用语句:drop table <table_name> purge;
2.清除回收站里的信息
清除指定表:purge table <table_name>;
清除当前用户的回收站:purge recyclebin;
清除所有用户的回收站:purge dba_recyclebin;