zoukankan      html  css  js  c++  java
  • 数据库导入导出expdp,impd/ORA-24247: ACL问题

    数据库操作

    (1)数据库导入导出expdp,impdp

    在导入导出数据库的时候,经常会用到exp和imp,在数据量小的情况下可以随意使用,但是当数据量大,表中数据有百万,千万条的时候,就要等好久好久好久。。
    oracle官方肯定也考虑到了这样的问题,于是出现了expdp和impdp,这是oracle 10g版本出的一个新功能,使用数据泵导入导出数据,据官方推荐说使用数据泵导入导出会比普通的导入导出快十倍,可以说是非常强大了。
    首先连接到数据库,使用cmd执行以下命令

    sqlplus /nolog
    conn / as sysdba
    

    数据库泵的步骤(以下是在数据库所在的电脑上操作)

    导出数据
    • (a)创建DIRECTORY
      即在数据库所在电脑上创建一个文件夹,用来存放导出的dmp文件
    create directory expdp_dmp as 'F:/dmpfile'
    
    • (b)授权
      给当前数据库用户赋予读写文件的权限
    grant read,write on directory expdp_dmp to salespa;
    

    查看权限

    SELECT privilege, directory_name, DIRECTORY_PATH FROM user_tab_privs t, all_directories d
     WHERE t.table_name(+) = d.directory_name ORDER BY 2, 1;
    
    • (c)执行导出
    expdp SALESPA/SALESPA@SALESPA  directory=expdp_dmp dumpfile=salespa.dmp
    
    导入数据(DOS窗口中执行
    impdp E43001/E43001 directory=expdp_dmp dumpfile=salespa.dmp remap_schema=salespa:E43001  transform=OID:N
    

    REMAP_SCHEMA 该参数的含义是将一个用户的的数据迁移到另外一个用户,如上从salespa用户迁移到 E43001用户上。
    transform 在导入数据的时候,之前的数据库中可能存在type,把一个Object从一个schema导入到另外一个schema的时候(在同一个数据库上),如果这个OID也保持不变的话,那么就会出现多个Object共享同一个object id的问题,会出现invalid object identifier。
    设置transform 参数为OID:N,意思是新创建的表或这个类型会赋予新的OID,而不是dmp文件中包含的OID的值。

    参考博客地址:
    数据库导入导出exp和expdp以及imp和impdp的区别
    ORACLE EXPDP命令使用详细
    ORA-02304: ORACLE导入TYPE

    (2)cmd执行sql文件

    往数据库中插入数据量较大时,例如几万,十几万条的时候,使用PLSQL工具的时候就会卡死。这里就要在命令行中执行sql语句。

    //1.首先连接到要连的数据库  192.168.xxx.xxx为数据库所在ip地址
    sqlplus scott/scott@orcl
    or
    sqlplus scott/scott@192.168.xxx.xxx:1521/orcl
    //2.@+“sql文件放置的路径”
    SQL> @C:people.sql
    

    (3)查看Oracle数据库表空间的使用率

    SELECT C.TABLESPACE_NAME,
           A.BYTES / 1048576 MEGS_TOTAL,
           (A.BYTES - B.BYTES) / 1048576 MEGS_USED,
           B.BYTES / 1048576 MEGS_FREE,
           (A.BYTES - B.BYTES) / A.BYTES * 100 PCT_USED,
           B.BYTES / A.BYTES * 100 PCT_FREE
      FROM (SELECT TABLESPACE_NAME,
                   SUM(A.BYTES) BYTES,
                   MIN(A.BYTES) MINBYTES,
                   MAX(A.BYTES) MAXBYTES
              FROM SYS.DBA_DATA_FILES A
             GROUP BY TABLESPACE_NAME) A,
           (SELECT A.TABLESPACE_NAME, NVL(SUM(B.BYTES), 0) BYTES
              FROM SYS.DBA_DATA_FILES A, SYS.DBA_FREE_SPACE B
             WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
               AND A.FILE_ID = B.FILE_ID(+)
             GROUP BY A.TABLESPACE_NAME) B,
           SYS.DBA_TABLESPACES C
     WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
       AND A.TABLESPACE_NAME = C.TABLESPACE_NAME
     ORDER BY 6;
    

    查看所有表空间大小

    select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;
    

    手动修改表空间的大小

    查看表空间的目录
    select * from dba_data_file
    
    更改表空间的大小为30G
    alter database datafile 'E:APPLABOGUESTSALESPASALESPA_INDEX.DBF' resize 30720
    

    (4)ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝

    • 创建访问控制列表
    BEGIN
     DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
      acl          => 'email_server.xml',  --这里为任意的文件名,用于删除时标识
      description  => 'ACL for 123.125.50.112',
      principal    => 'PRODUCE', --此为将来要进行操作的用户
      is_grant     => TRUE, 
      privilege    => 'connect');
    END;
    
    • 将用户或角色添加到访问控制列表中
    BEGIN
     DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
      acl          => 'email_server.xml',  --和创建访问控制列表中的acl名相同
      principal    => 'PRODUCE', --要添加的用户
      is_grant     => TRUE, 
      privilege    => 'resolve');
    END;
    
    • 给网络分配访问控制列表(ACL与邮件服务器相关联)
    BEGIN
     DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
      acl          => 'email_server.xml',  --和创建访问控制列表中的acl名相同
      host         => '123.125.50.112', --主机名,域名,ip地址或分配的子网
      lower_port   => '25',
      upper_port   => NULL);
    END;
    
    • 查询创建的ACL
    SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
    SELECT acl,
           principal,
           privilege,
           is_grant,
           TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
           TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
      FROM dba_network_acl_privileges;
    
    • 删除ACL
    BEGIN
      DBMS_NETWORK_ACL_ADMIN.drop_acl(acl => 'email_server.xml');
    COMMIT;
    END;
    

    (5)解锁被锁的表

    在调试程序的时候,有时debug忘记点结束,又去数据库中操作表,很有可能会造成锁表,无法对该表进行操作。以下是查看被锁的表和解锁表的语句。

    select a.object_name,b.session_id,c.serial#,c.username,c.command,c.machine,c.lockwait
    from all_objects a,v$locked_object b,v$session c where a.object_id=b.object_id and c.sid=b.session_id;
    
    alter system kill session'SID,serial# ';
    
  • 相关阅读:
    curl获取HTTP返回状态码
    存储过程中如何实现从数组获取数据
    ElasticsearchParseException: malformed, expected settings to start with 'object', instead was [VALUE_STRING]
    【并发编程】如果让你用三个线程循环打印ABC,你有几种写法?
    【基础】IdentityHashMap
    【基础】ThreadPoolExecutor
    【算法】快速排序
    【Java8新特性Stream】list转map
    【算法】华为南研所-括号匹配
    windows sourceTree 密码错误
  • 原文地址:https://www.cnblogs.com/ghq120/p/9824416.html
Copyright © 2011-2022 走看看