亚马逊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的权限。