现在的位置: 首页 > 综合 > 正文

Utilities之EXP&IMP小结-续3-总结

2013年10月12日 ⁄ 综合 ⁄ 共 1899字 ⁄ 字号 评论关闭

    0. 首先理解下exp&imp的工作原理,这个工具通过导出导入二进制的数据文件来实现数据库的逻辑上的备份与恢复,是oracle database专门的工具,exp出来的文件只能通过imp来读取,只能在oracle database之间执行导出和导入;可以在服务器端执行导出导入工作,也可以在客户端执行,在客户端执行的时候是通过sqlnet来实现网络连接操作的。
    
    1. 经典的使用场景如下:
    小数据量的备份与恢复,通过不要使用这个工具完成超过50GB数据量的导出和导入,速度上会让你感到蛋疼的很,这个情况下选择其的方式比如RMAN是上上之选;
    在不同的操作系统平台之间迁移数据;
    导出、删除、重新导入以便重组数据消除碎片;
    在数据库升级的场景中,如果通过dbua无法自动完成升级的情况下,通过这个工具或许可以帮助你完成最后的数据库升级工作;
    一个意想不到的功能就是用来检测数据是否可用可读;
    一个很常见的功能就是在不同数据库之间迁移表空间。
    实际上,自从oracle database 10g之后推出的新的导出导入工具:expdp\impdp数据泵工具之后,原来的exp\imp工具的用途和应用场景就非常有限了,但是不排除:
    需要从一个使用exp导出的备份中恢复数据;
    在10g之前的版本完成导出导入工作。
    上述两个场景中还是需要使用exp&imp套件来完成工作。

    2. 如果提高导出导入性能和速度:
    2.1. 导出:
    设置更大的BUFFER参数值,比如设置到4Mb,那么就输入BUFFER=40000000;
    结合使用DIRECT=Y和RECORDLENGTH=64436参数;
    停止其他不是必须的连接到数据库的应用和程序,同时可以考虑停止操作端的不是必须的应用和程序以便释放系统资源;
    可以同时进行多个导出操作,这样能够并行的工作,但是需要注意的是最好将每个导出会话导出文件指向不同物理磁盘驱动器以避免写入的争用;
    另外避免使用网络磁盘或者文件系统写入导出文件。
    
    2.2. 导入:
    设置更大的BUFFER参数值,比如设置到100Mb,那么就输入BUFFER=100000000;
    将创建索引的工作放到数据导入之后进行,这个步骤可以通过参数INDEXFILE来辅助完成;
    如果你需要在服务端完成导入,那么请将导入文件放到不同与数据库数据文件所在的物理磁盘来分离读写操作,避免IO的读取和写入的争用;
    停用数据库的归档功能(如果你已经启用的该功能的话);
    不要导入统计信息,设置参数STATISTICS=NONE;
    设置参数COMMIT=Y;
    在某些情况下,设置更大的DB_CACHE_SIZE、LOG_BUFFER(需要重启DB)参数和使用更大的回滚段(足够大到你最大的表)。
    
    3. 如何监控导入速度
    3.1. 可以尝试一下这个脚本
    SELECT
        SUBSTR(sql_text, INSTR(sql_text,'INTO "'),30) table_name
      , rows_processed
      , ROUND( (sysdate-TO_DATE(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60,1) minutes
      , TRUNC(rows_processed/((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60)) rows_per_minute
    FROM
        sys.v_$sqlarea
    WHERE
          sql_text like 'INSERT %INTO "%'
      AND command_type = 2
      AND open_versions > 0;
    3.2. 使用参数feedback

    4. 可能遇到的错误:
    ORA-00001: Unique constraint
    解决办法:导入了重复的数据行记录,可以使用参数IGNORE=YES跳过重复的数据导入.
    ORA-01555: Snapshot too old
    重新执行导出操作,使用参数CONSISTENT=N;或者检查是否有其他的数据库用户在操作导出数据表。
    ORA-01562: Failed to extend rollback segment
    创建足够大的回滚段或者使用COMMIT=Y以便完成导入操作。

-The End-    
    

抱歉!评论已关闭.