逻辑备分与恢复的数据导出与导入工具exp/imp,在安装有oracle客户端的机器上就会有。
使用该工具之前,第一要了解一下当前oracle数据库的字符集(characterset)与国家字符集(nchar_characterset)设置情况。
字符集是用来存储:CHAR,VARCHAR2,CLOB,LONG等类型数据的。
而国家字符集是用来存储:NCHAR,NVARCHAR2,NCLOB等类型数据的。
一般创建数据库时就要指定这两个字符集。
通常,公司的oracle是安装在简体中文windows操作系统上的,所以一般默认值是:
CHARACTERSET=ZHS16GBK
NCHARACTERSET=AL16UTF16
现在,公司所有局点的数据库,这两个字符集设置应都是这样。
可以通过pl/sql developer的Reports菜单来查看:
第二,要了解客户端的字符集设置,也就是客户端的NLS_LANG环境变量的设置。
NLS_LANG参数由以下部分组成:
NLS_LANG=<language>_<Territory>.<Clients Characterset>
NLS_LANG各部分含义如下:
(1) LANGUAGE指定:
Oracle消息使用的语言。
日期中月份和日的显示。
(2) TERRITORY指定:
货币和数字格式。
地区和计算星期及日期的习惯。
(3) CHARACTERSET指定:
控制客户端应用程序使用的字符集。
通常来说,在windows下时,安装了oracle后,在注册表的/HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0下会存在键:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
如果没有设置环境变量NLS_LANG时,则使用这里的设置。
在linux系统下,则要你亲自添加这个NLS_LANG变量了。通常是在每个要使用oracle数据库的用户主目录下的.bahs_profile文件中添加一行:
export NLS_LANG=American_america.zhs16gbk
二、备份简述
通常公司对于oracle数据库的使用特点是每个应用建一个用户,而备份时,只备份该用户的数据。
在建库时是先为该用户建立永久表空间、临时表空间和索引表空间。
如超级信使这个应用,会建立smk这个用户,并建立SMK_DEF,SMK_TMP,SMK_IDX三个表空间。
通常为smk做备份时是用下如命令:
exp smk/smk rows=y indexes=y compress=n buffer=10240000 direct=y feedback=100000 file=smkfull.dmp log=smkfull.log
该命命在windows/linux下都可以使用,这样可以导出smk这个用户的所有数据。
导出数据之前,如果是在另一台机上做的,就要注意这台系统的NLS_LANG设置有没有和oracle服务器的字符集相同了。通常来说,我们都是在用简体中文的windows系统,所以都会是相同的。
三、恢复备份
恢复备份的smkfull.dmp。基本有三种情况:
1、重建数据库后恢复smk用户的所有数据
安装oracle数据库
创建smk用户的三个表空间SMK_DEF,SMK_TMP,SMK_IDX三个表空间。
创建smk用户。
使用下面命令导入smk所有的数据:
imp smk/smk fromuser=smk touser=smk ignore=y file=smkfull.dmp log=smkfull.log
2、在现有的oracle数据库进行恢复,该数据库已存在smk用户
先把用户smk和相应的表空间SMK_DEF,SMK_TMP,SMK_IDX删掉
再创建smk用户的三个表空间SMK_DEF,SMK_TMP,SMK_IDX三个表空间
创建smk用户。
使用下面命令导入smk所有的数据:
imp smk/smk fromuser=smk touser=smk ignore=y file=smkfull.dmp log=smkfull.log
3、在现有的oracle数据库进行恢复,该数据库已存在smk用户
直接使用下面命令导入,不删除用户和表空间
imp smk/smk fromuser=smk touser=smk ignore=y file=smkfull.dmp log=smkfull.log
这样导入后,不大好。建议还是用上面的两种方法。
附上公司用于创建表空间和用户的脚本。
需注意的是表空间的名称在用双引号括起来时,注意要用大写的,不要用小写。其实在建立各种数据库对象(如表、序列)时,用到双引号时,注意要用大写,不要用小写。
还有一定要用sys用户来执行该脚本。
------------------------------------------------------------------------------
--功能:创建表空间
--注意:必须用sys用户创建,这个脚本在sqlplus命令行下用@符号执行
-- 执行脚本时必须根据Oracle的安装目录修改表空间的数据文件目录,
-- 如下脚本中的SMK目录必须存在
------------------------------------------------------------------------------
--创建默认空间
prompt
prompt 创建默认空间 SMK_DEF ...
prompt ===============================
prompt
CREATE TABLESPACE "SMK_DEF" LOGGING DATAFILE
'E:/SMK/SMK_DEF_1.DBF' SIZE 512M AUTOEXTEND ON NEXT 128M MAXSIZE UNLIMITED,
'E:/SMK/SMK_DEF_2.DBF' SIZE 512M AUTOEXTEND ON NEXT 128M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
--创建索引表空间
prompt
prompt 创建索引表空间 SMK_IDX ...
prompt ===============================
prompt
CREATE TABLESPACE "SMK_IDX" LOGGING DATAFILE
'E:/SMK/SMK_IDX_1.DBF' SIZE 512M AUTOEXTEND ON NEXT 64M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
--创建临时表空间
prompt
prompt 创建临时表空间 SMK_TMP ...
prompt ===============================
prompt
CREATE TEMPORARY TABLESPACE "SMK_TMP" TEMPFILE
'E:/SMK/SMK_TMP_2.DBF' SIZE 256M AUTOEXTEND ON NEXT 64M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;
-----------------------------------------------------------------------------
--功能:创建用户
--注意:必须用sys用户创建,这个脚本在sqlplus命令行下用@符号执行
------------------------------------------------------------------------------
prompt
prompt 创建主库用户 SMK...
prompt ===============================
prompt
-- Create the user
create user SMK
identified by SMK
default tablespace SMK_DEF
temporary tablespace SMK_TMP
profile DEFAULT
quota unlimited on SMK_DEF
quota unlimited on SMK_IDX
quota unlimited on SMK_TMP;
-- Grant/Revoke object privileges
grant select, insert, update, delete on SYS.DBA_JOBS to SMK;
-- Grant/Revoke role privileges
grant connect to SMK;
grant dba to SMK;
grant resource to SMK;
-- Grant/Revoke system privileges
grant create database link to SMK;
grant force any transaction to SMK;
grant unlimited tablespace to SMK;
grant execute any procedure to SMK;
grant create any view to SMK;
grant create any table to SMK;
grant select any table to SMK;
grant insert any table to SMK;
grant delete any table to SMK;
grant update any table to SMK;