zoukankan      html  css  js  c++  java
  • 数据泵使用笔记与相关shell

    数据泵特性简介

    性质
    与RMAN物理备份文件不同,数据泵只是在数据层面的逻辑备份/恢复或者叫导出/导入工具

    适用范围
    同机异库、异机异库、跨平台导出/导入(windows与linux平台数据互导)

    特点
    与RMAN对平台、Oracle补丁版本都要求一致不同,数据泵使用更灵活
    1直接导出/入全库 full=y
    2按用户 schemas=nc50
    3表空间 tablespaces=nc_data01
    4表 tables=fczl,crm_bd_house
    5自定义查询
    6也可只导出表结构
    7加并行参数进行
    8常用的是导全库、按用户、按表、按查询条件等,按表空间的不常用,因为生产环境表空间的数据文件中可能还存有其他表空间的数据
    会在导入时会出现依赖其他表空间而失败

    基本语法
    expdp scott/tiger directory=dump_dir dumpfile=example.dmp
    [full=Y/N] -->全库,默认为N
    [tablespaces=#] -->指定表空间(导出多个用逗号分割)
    [tables=#] -->指定表(导出多个用逗号分割)
    [query=#] -->查询结果集
    [parallel=#] -->并行
    [logfile=#] -->存储命令行中日志内容

    impdp scott/tiger directory=dump_dir dumpfile=example.dmp
    [full=Y/N] -->全库,默认为N
    [tables=#] -->指定表(导出多个用逗号分割)
    [query=#] -->查询结果集
    [parallel=#] -->并行
    [logfile=#] -->存储命令行中日志内容
    [remap_tablespace=#1:#2] -->将原表空间#1内容转存到当前库的表空间#2中
    [remap_tablespace=#1:#2] -->将要导入对象的原用户#1替换为当前库的用户#2

    使用步骤
    创建磁盘目录(检查空间、权限) -> 数据库中创建目录对象与磁盘目录关联 -> 授权导出/入用户对目录对象的读写权限

    1创建磁盘目录
    SQL> ho mkdir -p /ora/dump

    2创建目录对象与磁盘路径相关联,导入/出文件、日志文件都存储在此路径中
    SQL> create directory dump_dir as '/ora/dump';
    Directory created.

    3授权用户读写权限
    SQL> grant read,write on dump_dir to scott;
    grant read,write on dump_dir to scott

    4查看目录对象
    SQL> select directory_name,directory_path from dba_directories;

    自动导出并自动恢复到异机的shell示例
    #!/bin/bash
    cd /home/oracle
    cat <<Help
    Use for export schema data with expdp tool
    Help

    #仿c#/java语言定义枚举函数,用于将字符转为数字便于记忆
    function enum()
    {
    declare -i enum_num=0
    case $1 in
    "get_dumpdir")
    enum_num=1
    ;;
    "exec_expdp")
    enum_num=2
    ;;
    esac
    return $enum_num
    }

    #自定义函数执行不同情况下的sqlplus
    function execsqlplus()
    {
    enum $1
    case $? in
    "1")
    sqlstat="select directory_path from dba_directories where
    directory_name='EXPDP_DUMP';"
    ;;
    "2")
    sqlstat="ho expdp scott/tiger directory=expdp_dump dumpfile=scott_schema.dmp schemas=scott"
    ;;
    esac

    sqlplus -s / as sysdba > result.log <<EOF
    set heading off feedback off
    ${sqlstat}
    EOF
    }

    execsqlplus get_dumpdir

    dumpdir=`cat result.log | grep '^[^$]'`

    #检查目录不存在则创建并授权
    if [ ! -d $dumpdir ];then
    mkdir $dumpdir
    chmod 777 $dumpdir
    echo "mkdir"
    fi

    #检查目录写权限
    if [ ! -w $dumpdir ];then
    chmod +w $dumpdir
    fi

    #导出前删除原文件
    dumpfile="$dumpdir"/scott_schema.dmp
    if [ -f $dumpfile ];then
    rm -f $dumpfile
    fi

    #开始导出
    execsqlplus exec_expdp

    shell与sqlplus交互情景:
    shell中使用sqlplus两种方式:

    1直接使用sqlplus命令,适用范围:

    a取标量数值(如统计行数)
    #!/bin/bash
    sqlplus -s / as sysdba <<EOF
    col sqlcnt new_value bashcnt #此句为将sqlplus变量与shell变量关联起来
    select count(*) sqlcnt from dba_segments; #此时将值赋给sqlcnt,也同时赋给了与其关联的bashcnt
    exit bashcnt
    EOF

    SQL>echo $? --此处的$?即为exit bashcnt的值,这种方式只能是获取数值,因为exit后只通跟正负整数,不能跟小数或字符

    b取多行多列数
    #!/bin/bash
    sqlplus -s / as sysdba > result.log <<EOF
    set heading off feedback off
    select * from dba_segments;
    exit
    EOF

    通过数据重定向>将结果集的列名信息过滤,只将纯数据写入result.log文件中
    再通过读取result.log取出结果集
    第一种:
    result=`cat result.log | grep ^[^$]` --过滤空行后其他行
    for a in $result;do
    echo $a
    done

    第二种
    cat result.log | while read line
    do
    echo $line
    done

    第三种
    declare -i resultcnt
    resultcnt=`cat result.log | grep ^[^$] | wc -l` --过滤空行后的总行数

    for((i=1;i<=$resultcnt;i++));do
    a=`cat result.log | sed -n ''${i}'p'` --在字符串中引用变量:'${i}'或''$i''
    echo $a
    done

    2将sqlplus语句整体包含在``字符中,用在取字符
    result=`sqlplus -s / as sysdba <<EOF
    select directory_path from dba_directories where directory_name='EXPDP_DUMP';
    exit 0
    EOF`

    echo $result --$result即为directory_path的内容,可为单行或多行

  • 相关阅读:
    IOS开发银行系统的四舍五入的算法
    线程通信之初认识
    多线程同步机制练习之银行存钱
    解决线程安全问题方式三:loke锁
    使用同步机制解决单例模式中的懒汉式的线程安全问题
    (对于继承Thread类)线程安全问题解决方式二:同步静态方法
    (对于实现Runnable接口)线程安全问题解决方式二:同步方法
    (对于继承Thread类)线程安全问题解决方式一:同步代码块
    (对于实现Runnable接口)线程安全问题解决方式一:同步代码块
    三个窗口卖票(实现Runnable方式创建线程)之线程安全问题
  • 原文地址:https://www.cnblogs.com/doclaim/p/3168694.html
Copyright © 2011-2022 走看看