EXP用法,导出不包含同义词

本文深入探讨了数据库迁移和备份的关键技术与方法,包括exp/imp导出导入、存储迁移、利用dataguard和rman进行迁移。详细介绍了各种迁移方式的操作步骤、优缺点,以及如何通过脚本自动化实现定期备份和迁移。

#################################################
EXP用法,导出不包含同义词
#################################################

==导出一个完整数据库[结构+数据]========
exp system/password file=/u01/20101115.dmp log=/u01/20101115.log full=y
==只导出数据库的结构而不导出里面的数据=====
exp system/password file=/u01/20101115.dmp log=/u01/20101115.log full=y rows=n
==导出用户admin的所有数据=========
exp system/password file=/u01/20101115.dmp log=/u01/20101115.log owner=admin
==如:同时导出admin和visitor两个用户的所有对象===
exp system/password file=/u01/20101115.dmp log=/u01/20101115.log owner=(admin,visitor)
==只导出一个Table,如只导出admin用户下面的testtable表=
exp admin/adminpassword file=/u01/20101115.dmp log=/u01/20101115.log tables=testtable
==如果需要导出多个表==================================
exp admin/adminpassword file=/u01/20101115.dmp log=/u01/20101115.log tables=(table1,table2,table3)
exp system/password file=/u01/20101115.dmp log=/u01/20101115.log tables=(admin.testtable,visitor.table1)


#################################################
IMP用法
#################################################

==导入一个完整数据库[结构+数据]============
imp system/password file=/u01/20101115.dmp #如果表存在,上面会报错
imp system/password file=/u01/20101115.dmp ignore=y #如果遇到表存在,则忽略
==导入到一个表=============================
imp system/password  file=/u01/20101115.dmp  tables=(admin.testtable)

################################################
脚本
################################################
======完全备份的SH文件:exp_comp.sh======

  rq=` date +"%m%d" `
  su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/export/db_comp$rq.dmp"

======累计备份的SH文件:exp_cumu.sh======

  rq=` date +"%m%d" `
  su - oracle -c "exp system/manager full=y inctype=cumulative file=/oracle/export/db_cumu$rq.dmp"

======增量备份的SH文件: exp_incr.sh======

  rq=` date +"%m%d" `
  su - oracle -c "exp system/manager full=y inctype=incremental file=/oracle/export/db_incr$rq.dmp"

====== root用户crontab文件 ==============

  /var/spool/cron/crontabs/root增加以下内容

  0 2 1 * * /oracle/exp_comp.sh

  30 2 * * 0-5 /oracle/exp_incr.sh

  45 2 * * 6 /oracle/exp_cumu.sh

  当然这个时间表可以根据不同的需求来改变的,这只是一个例子。

数据库迁移的几种方式:

  一、exp/imp:

  这也算是最常用最简单的方法了,一般是基于应用的owner级做导出导入。

  操作方法为:在新库建立好owner和表空间,停老库的应用,在老库做exp user/pwd owner=XXX file=exp_xxx.dmp log=exp_xxx.log buffer=6000000,传dmp文件到新库,在新库做imp user/pwd fromuser=XXX touser=XXX file=exp_xxx.dmp log=imp_xxx.log ignore=y.

  优缺点:优点是可以跨平台使用;缺点是停机时间长,停机时间为从exp到网络传输到新库,再加上imp的时间。

  二、存储迁移:

  这种情况下,数据文件、控制文件、日志文件、spfile都在存储上(一般情况下是裸设备),我们可以直接把存储挂到新机器上,然后在新机器上启动数据库。

  操作方法:将老库的pfile(因为里面有指向裸设备的spfile链接),tnsnames.ora,listener.ora,密码文件传到新库的对应位置。将存储切至新机,或者用文件拷贝或dd的方式复制数据文件,启动数据库。

  优缺点:优点是该迁移方式非常简单,主要的工作是主机工程师的工作,dba只需配合即可,停机时间为当库、切存储、起库的时间。缺点是要求新老库都是同一平台,是相同的数据库版本。

  三、利用data guard迁移:

  用dg我们不仅可以用来做容灾,物理的dg我们还可以作为迁移的方式。

  操作方法:略。

  注意switch over之后,可以将dg拆掉,去掉log_archive_dest_2、FAL_SERVER、FAL_CLIENT、standby_file_management参数。另外还要注意如果用rman做dg,注意手工添加tempfile。

  优缺点:优点是停机时间短,停机时间为switch over的时间。缺点:主机必须双份、存储必须双份。

  四、用rman做迁移:

  rman比较适合于跨文件系统的迁移,如同平台下的不同文件系统。

  操作方法:

  ◆1.停第三方的归档备份,如legato或dp

  ◆2.backup数据库:

  run {

  allocate channel t1 type disk;

  backup full format '$DIR_BAK/UNDOTBS1_2_%d_%s_%p.bak' datafile 2;

  ……

  release channel t1;

  }

  ◆3.备份控制文件alter database backup controlfile to '/tmp/mydb.ctl';并到新数据库用rman恢复:restore controlfile from '/arch/sd168.ctl';

  ◆4.restore备份文件:

  run {

  allocate channel t1 type disk;

  restore datafile 2;

  releasechannel t1;

  }

  ◆5.传归档日志,并且对归档进行做recover:recover database until sequence = 归档的序号 thread = 1;

  ◆6.对数据库open resetlogs:RMAN>sql 'alter database open resetlogs';

  ◆7.alter tablespace temp add tempfile 'XXXXXX' size XXM reuse;

  优缺点:优点是可以跨文件系统,停机时间少。缺点是要时刻关注这归档日志,做recover的时候一个都不能少!

 

<think>我们正在处理一个关于数据库对象导出权限的问题。用户提到“对象由JHPB导出是当前用户”,这暗示在导出操作中,对象的所有者显示为JHPB(可能是另一个用户或系统账户)而是执行导出操作的用户。这通常与数据库权限配置或导出工具设置有关。根据引用内容,我们注意到一些与权限和配置相关的线索:1.引用[1]提到JDK版本和环境变量配置问题,说明环境配置当会导致工具无法正常工作。2.引用[2]强调更新Java版本和检查环境配置,避免已知的编码问题。3.引用[3]展示了一个编程示例,其中涉及文件操作和权限(如CreateFileA、ReadFile),这提醒我们权限问题可能出现在底层文件操作中。4.引用[4]解决了导出乱码问题,通过正确设置HTTP响应头,说明配置细节的重要性。结合这些引用,我们推断:-用户可能使用了一个数据库导出工具(如Oracle的exp/expdp、SQLServer的导出向导等)。-导出过程中,对象的所有者(owner)被错误地显示为JHPB(可能是数据库中的一个高权限账户),而是当前登录用户。-原因可能包括:a.导出工具运行时使用了固定的高权限账户(JHPB)连接数据库。b.当前用户没有足够的权限访问自己的对象,导致系统使用代理账户(JHPB)访问。c.数据库配置中设置了默认代理或权限继承。解决思路:1.检查导出命令/脚本:确认是否显式指定了用户名(如JHPB)连接数据库。2.检查环境配置:如数据库连接字符串、默认账户设置。3.验证当前用户的权限:确保当前用户在数据库中有访问所需对象的权限。4.调整导出设置:在导出工具中指定正确的用户架构。具体步骤:1.**检查导出命令**:如果使用命令行工具(如Oracle的expdp),检查命令中是否包含`USERID=JHPB/...`。应改为当前用户的账户。2.**检查图形工具设置**:如果在图形界面(如SQLDeveloper)中导出,检查保存的连接配置是否使用了JHPB账户。3.**验证数据库权限**:以当前用户登录数据库,执行:```sqlSELECTowner,object_nameFROMall_objectsWHEREobject_name='你的表名';--查看对象实际所有者```如果对象属于JHPB,则当前用户需要被授权访问该对象(或使用同义词)。4.**修改默认连接**:如果导出工具默认使用JHPB,需修改连接配置文件(如tnsnames.ora、工具内保存的连接配置)。5.**代理权限问题**:如果数据库使用代理认证(如Oracle的代理用户),确保当前用户有通过代理访问的权限。如果问题仍未解决,可尝试:-使用当前用户重新创建对象(如果可行),使其归属当前用户。-联系数据库管理员调整权限配置。**相关问题**:1.如何检查Oracle数据库中用户的对象权限?2.数据库导出工具(如expdp)如何指定导出特定用户的表?3.什么是数据库代理用户?如何配置?4.如何将数据库对象的所有权从一个用户转移到另一个用户?</think>### 为什么对象由JHPB导出而非当前用户? 在数据库或系统操作中,对象导出显示为 **JHPB(可能是系统账户或高权限账户)** 而非当前用户,通常由以下原因导致: --- #### 一、核心原因分析 1. **权限继承机制** - 当当前用户权限足时,系统自动使用更高权限的代理账户(如JHPB)执行操作 - 例如:当前用户缺少`EXP_FULL_DATABASE`权限时,Oracle会使用SYSDBA账户代理导出 2. **环境配置问题** - **环境变量配置错误**:如`ORACLE_SID`指向了JHPB管理的实例(引用[1][2]环境配置问题) - **连接串指定账户**:导出工具配置文件(如`tnsnames.ora`)默认使用JHPB账户 - **JDK版本兼容性**:旧版JDK可能导致权限识别异常(引用[2] JDK版本问题) 3. **对象所有权限制** ```sql SELECT owner FROM dba_objects WHERE object_name='YOUR_TABLE'; ``` 若对象实际属于JHPB,即使当前用户有访问权,导出时仍显示原始所有者 --- #### 二、解决方法 > **关键:确保当前用户有直接操作权限** 1. **显式指定用户导出** 在导出命令中强制声明当前用户: ```bash expdp CURRENT_USER/password@db SCHEMAS=CURRENT_USER ``` 2. **修正环境配置** - 检查环境变量: ```bash echo $ORACLE_SID # 确保指向目标实例 ``` - 更新连接配置:修改`tnsnames.ora`中的`CONNECT_DATA`段指定当前用户 3. **权限修复(需DBA协助)** ```sql GRANT EXP_FULL_DATABASE TO CURRENT_USER; -- 授予导出权限 GRANT SELECT ANY TABLE TO CURRENT_USER; -- 授予对象访问权 ``` 4. **所有权转移(慎用)** ```sql ALTER TABLE your_table OWNER TO CURRENT_USER; -- PostgreSQL示例 ``` 5. **兼容性处理** - 降级JDK到稳定版本(引用[2]方案) - 添加编码声明避免乱码干扰权限判断(引用[4]编码解决方案) --- #### 三、预防措施 1. **权限验证脚本** ```sql SELECT * FROM session_privs WHERE privilege LIKE '%EXP%'; ``` 2. **环境隔离** 使用Docker容器限定运行环境(避免全局配置污染) 3. **操作日志检查** 通过数据库审计日志定位权限切换点: ```sql SELECT os_username, db_username FROM dba_audit_trail; ``` --- ### 相关问题 1. 如何在Oracle中查看当前用户的完整权限列表? 2. 导出数据库时出现"ORA-31631: privileges are required"错误如何解决? 3. 同JDK版本对数据库连接权限有哪些影响? 4. 如何安全地将数据库对象所有权转移到新用户? > 提示:若问题持续,建议检查操作系统级别的账户映射关系(如Linux的`oracle`用户组配置),或提供具体数据库类型及导出工具日志进一步分析。 [^1]: JDK和环境变量配置当导致工具异常 [^2]: JDK版本兼容性问题引发权限识别错误 [^4]: 编码设置错误可能间接影响权限判定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值