Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将表从转储文件导入Oracle数据库时遇到问题_Oracle_Dump_Impdp - Fatal编程技术网

将表从转储文件导入Oracle数据库时遇到问题

将表从转储文件导入Oracle数据库时遇到问题,oracle,dump,impdp,Oracle,Dump,Impdp,这是我第一次使用转储文件,我在这方面非常初学者 所以, 我有包含表的转储文件,需要将这些表导入Oracle数据库 以下是我的客户端生成转储文件的方式: 有几个类别(比如人力资源、财务、销售等),对于每个类别,他都进行SQL查询(其中每个查询都与一个表相关)。让我们用一个我们称之为A的类别继续推理 对于A类别,他为所有查询的结果生成转储文件。所以我们有类似的东西: A类: 表1 表2 表3 表4 生成的转储文件(dmp文件的数量取决于数据的大小): 分类a_01.dmp 类别a_02

这是我第一次使用转储文件,我在这方面非常初学者

所以, 我有包含表的转储文件,需要将这些表导入Oracle数据库

以下是我的客户端生成转储文件的方式:

  • 有几个类别(比如人力资源、财务、销售等),对于每个类别,他都进行SQL查询(其中每个查询都与一个表相关)。让我们用一个我们称之为A的类别继续推理

  • 对于A类别,他为所有查询的结果生成转储文件。所以我们有类似的东西:

    A类:

    • 表1
    • 表2
    • 表3
    • 表4
生成的转储文件(dmp文件的数量取决于数据的大小):

  • 分类a_01.dmp
  • 类别a_02.dmp
  • 分类a_03.dmp
  • 类别a_04.dmp
  • 分类a_05.dmp
所以我们不知道哪个表包含在哪个转储文件中。我需要的是将各个表导入到Oracle数据库中

这就是我所做的。在命令提示中:

C:\"path">sqlplus / as sysdba
SQL> alter session set "_ORACLE_SCRIPT"=true;
SQL> Grant dba to my_user;
SQL> CREATE DIRECTORY Dir_Name AS 'G:\Dir_Name';  -- This is where I copied all the dmp files and the logs
通常我需要创建一个表空间,但根据我掌握的信息,我在任何地方都找不到需要导入的表的表空间名称,因此,我要做的是编写import语句行,等待它返回错误,指出它找不到表空间“X”,然后创建表空间“X”,并重复import语句行,如下所示(如果您知道我如何在不进行创建的情况下找到需要创建的表空间的名称,请告诉我):

在这之后,我得到了两个病例结果:

  • 该表已成功加载:x行从x中加载!好的,没什么好说的

  • 我得到这个错误:

  • ORA-02374:加载表“SYSADM”“表1”时发生转换错误
    ORA-12899:列COL_1的值太大(实际值:19,最大值:18)

    因此,这里我要做的是返回到sql developer并删除(与下面的#b链接)使用缺少的数据创建的表_1,并在提示符命令中执行以下操作:

    步骤1:我只导入元数据:

    C:\> impdp my_user/pswd DIRECTORY=Dir_Name DUMPFILE=CategorieA_.%U.dmp CONTENT=METADATA_ONLY TABLES=SYSADM.table_1 LOGFILE=file_name
    
    步骤2:然后返回sql developer以扩展列的大小:

    步骤3:然后返回命令提示符仅导入数据:

    impdp my_user/pswd DIRECTORY=Dir_Name DUMPFILE=CategorieA_.%U.dmp CONTENT=DATA_ONLY TABLES=SYSADM.table_1 LOGFILE=file_name
    
    在这里,如果您对如何导入表而不获取此列大小错误消息有任何建议,那就太好了

    到目前为止,没有任何阻碍,我总能找到办法继续前进,即使这需要花费太多的时间

    现在,当我这样做时,我还收到了两个案例:

  • 一切都很好,它的工作非常完美

  • (b) 在想要删除在SQLDeveloper中创建的表之前,我一直收到一条错误消息,说该表不存在

  • 好的,我试着进一步执行这三个步骤,在执行步骤1之后,我得到以下错误消息:

    错误:ORA-39151:表“SYSADM”。“表_1”存在。由于表_exists_的跳过操作,将跳过所有相关元数据和数据

    怎么可能呢?Oracle说它不存在,同时在命令提示符下说它存在

    解决这个问题的办法是什么

    谢谢你,如果你一直读到这里,我知道它很长,但它只是为了让你明白,这样你就可以清楚地看到问题是什么

    我希望你能帮我做这件事


    提前感谢

    此错误是由导出数据的数据库的字符集与您的数据库不匹配引起的

    ORA-02374:加载表“SYSADM”“表1”时发生转换错误

    处理这一问题的一种方法是:

  • 捕获导入将创建的DDL。使用
    sqlfile
    参数,例如
    sqlfile=Dir\u Name:CategorieA\u 01.dmp
    。事实上,您有这么多转储文件显然意味着这一步可能有点恶心;也许您可以在这里使用通配符-我不知道,我从未尝试过
  • 梳理生成的DDL文件,查看引用了哪些表空间并创建它们
  • 您还可以提取CREATE TABLE语句。编辑表定义,将所有VARCHAR2列的字节语义替换为CHAR。创建表
  • 然后只导入数据。仅使用CONTENT=data\u运行impdp
  • 步骤的替代方法是:

  • 仅导入表结构。使用CONTENT=METADATA\u only参数
  • 使用ALTERTABLE语句修改导入的表结构,以切换到CHAR语义。也许这是更繁琐的选项


  • 如果您经常与此客户打交道,您建议他们以更合理的方式进行导出。可能每个表有一个文件,也可能只有一个文件。所有这些不利于任何人。

    此错误是由于导出数据的数据库的字符集与您的数据库不匹配造成的

    ORA-02374:加载表“SYSADM”“表1”时发生转换错误

    处理这一问题的一种方法是:

  • 捕获导入将创建的DDL。使用
    sqlfile
    参数,例如
    sqlfile=Dir\u Name:CategorieA\u 01.dmp
    。事实上,您有这么多转储文件显然意味着这一步可能有点恶心;也许您可以在这里使用通配符-我不知道,我从未尝试过
  • 梳理生成的DDL文件,查看引用了哪些表空间并创建它们
  • 您还可以提取CREATE TABLE语句。编辑表定义,将所有VARCHAR2列的字节语义替换为CHAR。创建表
  • 然后只导入数据。仅使用CONTENT=data\u运行impdp
  • 步骤的替代方法是:

  • 导入表结构alter table Table_1 modify (COL_1 VARCHAR2(50));
    impdp my_user/pswd DIRECTORY=Dir_Name DUMPFILE=CategorieA_.%U.dmp CONTENT=DATA_ONLY TABLES=SYSADM.table_1 LOGFILE=file_name