+86 135 410 16684Mon. - Fri. 10:00-22:00

亚马逊AWS-为oracle类型的RDS数据库部署数据

亚马逊AWS-为oracle类型的RDS数据库部署数据

亚马逊AWS-为oracle类型的RDS数据库部署数据

关于为RDS部署数据,导入导出等操作,更多详细内容可参见[官方文档]。

为RDS部署数据,有一点需要注意,RDS数据库只打开了1521端口,所以所有操作都只能通过1521端口的数据库连接进行。

1 导出数据

在源数据库中:

可以查看下目录结构:

--查看数据库目录:
select * from dba_directories t;

给用户授权:

--授权
grant read, write on directory data_pump_dir to SOURCE_USER;
grant execute on dbms_datapump to SOURCE_USER;

主要是授予用户操作目录权限及执行数据泵权限。

数据导出:

说明一下,一般来说使用数据泵impdp导出的语句是这样的(操作系统命令行执行):

expdp SOURCE_USER/SOURCE_USER schemas=SOURCE_USER dumpfile=expdp.dmp directory=DATA_PUMP_DIR;

但RDS要求使用内置的存储过程进行数据导出,语句如下:

--数据导出:
DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'tab1.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'exp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''SOURCE_USER'')');
DBMS_DATAPUMP.start_job(hdnl);
END;
/

这里需要修改的地方:
tab1.dmp:导出文件的名字。
exp.log:日志文件的名字。
SOURCE_USER:要导出的SCHEMAS的名字,对应impdp命令中schema参数的值,也就是要导出的数据库的用户名。

注意,一定要使用内置的存储过程来导出,而不要使用impdp导出,否则导入的时候会出现问题。导出之后可以查看日志文件确定是否成功导出。

2 在目标数据库中创建表空间、用户,并授权

在目标数据库,也就是RDS数据库中:

--创建表空间:
create tablespace TESTDB;

--创建用户
create user DEST_USER identified by DEST_USER default tablespace TESTDB;

--给用户授权
grant connect, resource, dba to DEST_USER;

3 导入数据

在源数据库中:

--建立dblink
create database link to_rds connect to DEST_USER identified by DEST_USER
using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)(PORT=1521))(CONNECT_DATA=(SID=orcl)))';

--查看dblink
select * from dba_db_links;

注意将HOST对应的位置设置为服务器IP地址或域名。

--复制库文件到RDS库:
BEGIN
   DBMS_FILE_TRANSFER.PUT_FILE(
     source_directory_object       => 'DATA_PUMP_DIR',
     source_file_name              => 'EXPDP.DMP',
     destination_directory_object  => 'DATA_PUMP_DIR',
     destination_file_name         => 'EXPDP_COPIED.DMP', 
     destination_database          => 'to_rds' 
   );
END;
/

--导入库(操作系统命令行执行,而不是数据库SQL命令行):
impdp DEST_USER/DEST_USER@ORCLRDS REMAP_SCHEMA=SOURCE_USER:DEST_USER DUMPFILE=EXPDP_COPIED.DMP DIRECTORY=DATA_PUMP_DIR full=y;

--删除dblink
drop database link TO_RDS;

可以看到,将数据文件从源数据库复制到目标数据库使用了一个系统内置的DBMS_FILE_TRANSFER程序包,用到了里面的过程PUT_FILE。里面各个参数的意义也不难理解,注意“destination_database”是dblink的名字。

再说明一下导入语句的各个参数:

  • REMAP_SCHEMA:如果导出时的用户,与现在要导入的用户不一样,则需要通过这个参数指定一下。
  • DUMPFILE:要导入的文件。
  • DIRECTORY:导入文件的路径。

4 清除无用文件

导入数据后,如果RDS上有不再需要保留的文件,可以通过命令进行删除。下面的语句可列出 DATA_PUMP_DIR 中的文件:

select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime; 

删除DATA_PUMP_DIR目录中不再需要的文件:

exec utl_file.fremove('DATA_PUMP_DIR','[file name]');  

例如,以下命令可删除名为“test_dbms_lob.txt”的文件:

exec utl_file.fremove('DATA_PUMP_DIR','test_dbms_lob.txt'); 

oracle授权时“with admin option”与“with grant option”的区别

oracle中授权使用:

grant create session to testuser;

如果说这里被授予的权限“create session”是鱼,那“testuser”只能说是饿不死,还不能说吃得饱,或者说只修了身还没有养家经营的手段。

oracle授权中也有“渔”,这个渔决定了被授权用户是否能将权限继续授权给其他用户。只不过这里的oracle把“渔”细化了,分为两个:

with admin option

使用with admin option,被授权用户可将所获得的权限再次授予其它用户或角色,而且取消授权时不级联。例如:

grant create session to user_a with admin option;

则用户user_a用户拥有了“create session”权限,然后用户user_a操作:

grant create session to user_b;

则user_b也拥有了“create session”权限。
如果系统管理员要回收user_a的权限,则user_b的权限仍然保留,但管理员可以显式回收user_b的权限:

revoke create session from user_b;

with grant option

使用with grant option。被授权用户可将所获得的权限再次授予其它用户或角色,并且权限的取消是级联的。级联的意思是,如果user_a使用“with grant option”语句将权限又授予了user_b,当管理员回收user_a的权限时,则user_b的权限也会被回收。但管理员不可以显式回收用户user_b的权限。