Oracle数据库的数据备份,本地,异地,exp-imp,expdp-impdp

时间:2022-09-14 08:01:29

        是这样的,2018年6月,上一次比较频繁听到勒索病毒差不多是去年这个时候,那时候我是刚从学校毕业,也没受到这小可爱的毒害,所以一直没太放在心上。结果,最近公司这边一周以内两次出现了客户机房出现勒索病毒,所有文件被加密,损失有点严重。

        特别是有一个系统的数据库服务器和应用服务器和备份服务器是同一台,结果一出事,迷之尴尬。

        嗯,另外有一点,被感染的几台服务器都是默认的administrator用户名,不知道是否跟这个有点关系。

        好像偏题了呢。

        好吧,前面说了一大堆,其实就是想说一个事,数据备份很重要,毕竟一直都在说,数据无价!而且尽量进行异地备份,这样一台机子出问题的时候还能从另外一台上取回数据。


        因为本来了解得不是特别详细,查阅了网上很多文档。大佬们如果发现有错的还请指出。跪谢!


测试环境:操作系统方面,还是熟悉的windows 10,数据库是Oracle Database 11g r2。


一、exp--imp

(一)exp导出

        exp导出可一次导出整个数据库、或者按用户导出、或者导出指定表、或者指定表的部分数据(通过select子句)

        还有个要说明一下,就是exp命令后面跟着的“用户/密码”,如果你这个用户有dba权限,那你就可以导出整个数据库能导出的数据,像导全库,跨用户导数据,都需要登录的这个用户有dba权限,否则的话,就只能导自己用户下的数据。

        所以呢,下面的代码我全部都用system这个用户来登录验证,system的密码我简单设置为oracle。导出导入的代码中习惯性加入输出日志的参数,log=XXX.log,方便导完后查看记录。

        1、导整个库

        导出文件orclAll.dmp,输入日志orclAll.log,full=y即为导出全库,代码如下。

exp system/oracle@orcl file=orclAll.dmp log=orclAll.log full=y

        2、导用户

        exp可以按用户来进行数据导出,可一次导单个或者多个用户,通过owner这个参数来设置导出的用户,例如orcl数据库下的lhy用户和test用户。

exp system/oracle@orcl file=owner.dmp log=owner.log owner=(lhy,test)     --导两个用户
exp system/oracle@orcl file=lhy.dmp log=lhy.log owner=lhy                --导lhy用户


      3、导表

        导表与导用户类似,例如我们要导出用户名为lhy下的empdata表和orgdata表。

        下面两句语法,不同的是一个登陆的是system用户,一个是lhy用户,登录system用户导lhy用户的表的时候需要把表名写成“用户名.表名”(其实那个应该叫模式吧好像,不过习惯说是用户下的某某表),大概知道是这个意思就行。

        然后第二句的话直接登录lhy用户,所以导当前登录用户的表就不需要在表名前面加上用户名了。

exp system/oracle@orcl file=exptables.dmp log=exptables.log tables=(LHY.ORGDATA,LHY.EMPDATA)
exp lhy/lhy@orcl file=exptables.dmp log=exptables.log tables=(ORGDATA,EMPDATA)

        另外,如果是单个表特别大,不希望每次都导出所有数据的,我们可以通过查询的方式控制导出的数据集,例如我只希望导出empdata表yearno字段的值为2017的数据,在查询中,我们可以写

select * from empdata where yearno = '2017';

        然后,我们这个条件导出的语法就是

exp lhy/lhy@orcl file=empdata2017.dmp log=empdata2017.log tables=(EMPDATA) query=\" where yearno = '2017'\"

        4、exp常用参数

        (1)导出数据行(rows)

        默认为rows=y,如果只需要导出表结构而不需要导出表数据,可以设置rows=n。

        (2)数据缓冲区(buffer)

        buffer大概可以理解为控制导出时单次处理的最大数据量。在导出大批量数据的时候,相对调高buffer值会有效提高导出的速度。

        (3)转储文件最大大小(filesize)

        指定导出的单个dmp文件最大容量。如filesize=1024M。

        (4)直接路径 (direct)和IO记录的长度(recordlength)

        常规导出是走的常规路径,通过select语句查到表数据,通过buffer缓冲区等等的处理后再写入文件,而直接路径的会跳过sql语句处理这部分,不走buffer缓冲区,正常情况下速度会比通过常规路径导出快很多。

        在导出语法中加入direct=y即通过直接路径导出,另外设置recordlength参数也会对直接路径导出的速度有所影响,recordlength最大可设置为65535,一般都可以直接设置recordlength=65535。

        direct导出也有一定的限制,例如不支持表空间传输和上面的query查询导出。而且本地环境变量的NLS_LANG参数要跟数据库的字符集一致。

        关于直接路径和常规路径的内容可参考下面的这篇文章,讲的比较详细。访问量接近600W看的让人眼红!!

https://blog.csdn.net/leshami/article/details/9146023


(二)imp导入

        导入之前一般都需要保证存在表空间和用户,例如全库导入或者按用户导入,首先得在目标数据库存在这个用户,否则在导入数据的时候就会报这个用户不存在的错误。

        1、全库导入

        全库导入的跟导出的基本一样,就换了下命令

imp system/oracle@orcl file=orclAll.dmp log=orclAll.log full=y

        2、按用户导入

        按用户导入的会比导出时需要多两个参数,fromuser和touser,顾名思义,就是那个很有趣的哲学命题,我从哪里来?我要到哪里去?

imp system/oracle@orcl file=owner.dmp log=owner.log fromuser=lhy touser=lhy   --从原来的lhy用户导入到目标数据库的lhy用户
imp system/oracle@orcl file=owner.dmp log=owner.log fromuser=lhy touser=test  --从原来的lhy用户导入到目标数据库的test用户

        3、按表

        跟导出的基本一致,可导单表或者多表。

imp lhy/lhy@orcl file=exptables.dmp log=exptables.log tables=(ORGDATA,EMPDATA)  --可导入单表或者多表

        4、imp的一些常用参数

        (1)忽略创建错误(ignore)

        因为imp导入表数据的步骤是create table -> insert into -> create index等等,在导入的时候,如果某个表已经存在数据库中。导入在create table这步就会报错,然后默认跳过这个对象。

        如果我们需要进行数据导入,可添加参数ignore=y,这样的话就会忽略create的错误,把dmp中该表的数据insert 到目标数据库目标表中,如正常insert一样,遇到主键或约束之类的问题依然会报错,但不影响不冲突的那部分数据的导入。

        (2)导入数据行(rows)

        很多时候,我们往往只需要数据中的表结构部分,而不需要表数据,这种情况可通过设置参数rows=n不导入数据,只导入结构。

        (3)数据缓冲区(buffer)和提交(commit)

        commit的默认设定是n,但如果是大表的导入,commit=n的时候会在最后统一提交,耗用大量undo表空间,这种情况下建议设置commit=y,导入时对数据进行分批提交。

        但频繁的提交肯定会对性能有一定的影响,这时候我们需要合理设置一下数据缓冲区buffer的大小,因为commit是根据buffer的大小进行分批提交。


        匆匆忙忙再写下,exp-imp导异地数据库的不需要特殊处理,只需要配个本地服务名,能访问到数据库就可以进行导出到本地或者导入到数据库。expdp和impdp的话就麻烦一些,后面再讲。


        发现简单写了下exp-imp就已经写了那么多,expdp和impdp就分开另外一篇写吧,不凑到一起了。等写完了再补链接。