AWS相关问题

AWS相关问题
1.1dump导入RDS
需要源数据库能访问rds的1521端口,它们之间的网络需要打通
1.2 传dump
需要在源数据库建立dblink到rds
create database link TO_UAT_RDS connect to SINGLIFE_UAT identified by D8F2dP43 using 'singlife_uat_rds';
利用oracle的包传dump
BEGIN
DBMS_FILE_TRANSFER.PUT_FILE(
source_directory_object => 'EXPDP_DIR',
source_file_name => 'expdp_sg_ls_tar2_1802031909.dmp',
destination_directory_object => 'DATA_PUMP_DIR',
destination_file_name => 'expdp_sg_ls_tar2_1802031909.dmp',
destination_database => 'TO_UAT_RDS'
);
END;
/
select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime; --查看rds上DATA_PUMP_DIR下的文件

impdp singlife_uat/D8F2dP43@singlife_uat_rds logfile=singlife_uat_`date +%y%m%d%H%M`.log REMAP_SCHEMA=sg_ls_tar2:singlife_uat REMAP_TABLESPACE=sg_ls_tar_tbs:users DUMPFILE=expdp_SG_LS_TAR2_1803032042%U.dmp DIRECTORY=DATA_PUMP_DIR TRANSFORM=OID:N;

1.3 导入后会缺少权限,利用下面语句赋权
exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS','SINGLIFE_UAT');
exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TAB_PRIVS','SINGLIFE_UAT');

赋权之后 plsql编译无效项还是会存在,这时候需要拿命令编译下
alter PROCEDURE P_GRANT_PRIVI compile;


exec pkg_ls_db_tools.p_create_table('t_document_email','create table t_document_email(list_id NUMBER(19) NOT NULL, document_id NUMBER(19) NOT NULL, doc_print_id NUMBER(19) NOT NULL, party_id NUMBER(19) NOT NULL, agent_id NUMBER(19), toPartyId NUMBER(19), ccPartyId NUMBER(19), send_to VARCHAR2(1000) NOT NULL, cc_to VARCHAR2(1000), subject VARCHAR2(2000), content VARCHAR2(4000), file_path VARCHAR2(1000), insert_time DATE , status NUMBER(1) default 0, log_desc VARCHAR2(4000))');
执行package
ORA-20100: create table t_email_cfg(list_id NUMBER(19) NOT NULL, send_email VARCHAR2(1000) NOT NULL, receive_email VARCHAR2(1000), mail_server VARCHAR2(100) NOT NULL, port NUMBER(5), user_name VARCHAR2(100), password VARCHAR2(100))
ORA-01031: insufficient privileges
ORA-06512: at "SINGLIFE_UAT.PKG_LS_DB_TOOLS", line 62
ORA-06512: at "SINGLIFE_UAT.PKG_LS_DB_TOOLS", line 76
ORA-06512: at line 2


但是手动创建table可以创建的。
手动创建只需要resource角色,不需要显示的create table权限
grant create table to singlife_uat;
在执行package就可以了

所以最好在rds上把我们创建owner用户的执行的赋权sql都执行一遍

之前AWS的RDS-oracle 大家都是需要从内部oracle服务器打通与RDS的网络,建立db-link导入,
现在可以直接从EC2导入了!
OP看到RDS是oracle的申请,会默认在EC2上安装oracle-client(配置$ORACLE_HOME,PATH,tnsnames.ora),
1.安装oracle-client时会报缺包以及swap
缺包部分:
yum -y install gcc-c++ libaio-devel elfutils-libelf-devel libstdc++-devel compat-libstdc++-*

Swap 部分:
dd if=/dev/zero of=/swapfile bs=1024 count=4194304
mkswap /swapfile
swapon /swapfile

安装以下perl组件:
yum -y install perl
yum -y install perl-DBI
yum -y intall perl-DBD
wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.22.tar.gz
tar -zxf DBD-Oracle-1.22.tar.gz
cd DBD-Oracle-1.22
perl Makefile.PL
make
make install
以上需要的软件安装完毕。
2.OP在RDS上建tablespace用户赋权赋权RDS的dump directory
3.TS跑脚本导入已经上传到EC2的dmp文件,导出方式是expdp
example:
perl transfer_file_to_rds.pl exp_argo_us_demo20180530.dmp

脚本内容(红色部分为需要按照RDS信息修改的):
========================================================================================================================
use DBI;
use warnings;
use strict;

# RDS instance info
my $RDS_PORT=1521;
my $RDS_HOST="ias.com";
my $RDS_LOGIN="iasa/opwd";
my $RDS_SID="IASA";

#The $ARGV[0] is a parameter you pass into the script
my $dirname = "DATA_PUMP_DIR";
my $fname = $ARGV[0];

my $data = "dummy";
my $chunk = 8192;

my $sql_open = "BEGIN perl_global.fh := utl_file.fopen(:dirname, :fname, 'wb', :chunk); END;";
my $sql_write = "BEGIN utl_file.put_raw(perl_global.fh, :data, true); END;";
my $sql_close = "BEGIN utl_file.fclose(perl_global.fh); END;";
my $sql_global = "create or replace package perl_global as fh utl_file.file_type; end;";

my $conn = DBI->connect('dbi:Oracle:host='.$RDS_HOST.';sid='.$RDS_SID.';port='.$RDS_PORT,$RDS_LOGIN, '') || die ( $DBI::errstr . "\n");

my $updated=$conn->do($sql_global);
my $stmt = $conn->prepare ($sql_open);
$stmt->bind_param_inout(":dirname", \$dirname, 12);
$stmt->bind_param_inout(":fname", \$fname, 12);
$stmt->bind_param_inout(":chunk", \$chunk, 4);
$stmt->execute() || die ( $DBI::errstr . "\n");

open (INF, $fname) || die "\nCan't open $fname for reading: $!\n";
binmode(INF);
$stmt = $conn->prepare ($sql_write);
my %attrib = ('ora_type','24');
my $val=1;
while ($val> 0) {
$val = read (INF, $data, $chunk);
$stmt->bind_param(":data", $data , \%attrib);
$stmt->execute() || die ( $DBI::errstr . "\n") ; };
die "Problem copying: $!\n" if $!;
close INF || die "Can't close $fname: $!\n";
$stmt = $conn->prepare ($sql_close);
$stmt->execute() || die ( $DBI::errstr . "\n") ;
=======================================================================================================================
4.TS登入RDS,查看传输是否成功:
sqlplus iasa_demo/iasa_demopwd@IASA

SQL> select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by FILENAME;

FILENAME
--------------------------------------------------------------------------------
TYPE FILESIZE MTIME
---------- ---------- ---------
IMPORT.LOG
file 121 31-MAY-18

datapump/
directory 4096 01-JUN-18

exp_argo_us_demo20180530.dmp
file 1369264128 31-MAY-18

5.TS导入数据:
impdp iasa_demo/iasa_demopwd@IASA DIRECTORY=DATA_PUMP_DIR dumpfile=exp_argo_us_demo20180530.dmp remap_schema=argo_us_demo:iasa_demo remap_tablespace=argo_us_demo_tbs:iasa_demo_tbs logfile=impdp20180601.log

猜你喜欢

转载自www.cnblogs.com/Andy-Shi/p/10918008.html
AWS