如何自动化导出AWS Oracle RDS的schema并上传S3、删除旧转储文件
Oracle RDS Schema 自动导出、上传S3及本地清理方案
核心实现逻辑
把手动执行的三个步骤封装为Oracle存储过程,可按需搭配定时任务实现全自动化:
- 调用DBMS_DATAPUMP导出指定Schema的dmp文件
- 调用RDS原生包上传文件到指定S3桶
- 自动删除本地导出的dmp和日志文件
1. 创建自动化存储过程
替换代码中占位符后直接在对应库执行即可:
CREATE OR REPLACE PROCEDURE AUTO_EXPORT_SCHEMA_TO_S3 AS v_hdnl NUMBER; v_dump_file VARCHAR2(100); v_log_file VARCHAR2(100); v_task_id VARCHAR2(100); BEGIN -- 生成带时间戳的文件名,避免重名覆盖 v_dump_file := 'ICO_AV_PRD_OWR_dump_'||to_char(sysdate,'yyyymmdd_hh24miss')||'.dmp'; v_log_file := 'ICO_AV_PRD_OWR_dump_'||to_char(sysdate,'yyyymmdd_hh24miss')||'.log'; -- 步骤1:导出指定Schema v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null, version=>12 ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => v_dump_file, directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => v_log_file, directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file ); -- 替换为实际要导出的Schema名,示例为ICO_AV_PRD_OWR DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''ICO_AV_PRD_OWR'')'); DBMS_DATAPUMP.START_JOB(v_hdnl); -- 等待导出完成,避免未生成文件就执行上传,可根据Schema大小调整等待时长 DBMS_LOCK.SLEEP(60); -- 步骤2:上传文件到S3,p_bucket_name替换为你的实际S3桶名 SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => '替换为你的实际S3桶名', p_directory_name => 'DATA_PUMP_DIR' ) INTO v_task_id FROM DUAL; -- 等待上传完成,避免未上传完成就删除文件,可根据文件大小调整等待时长 DBMS_LOCK.SLEEP(120); -- 步骤3:删除本次生成的转储文件和日志文件 utl_file.fremove('DATA_PUMP_DIR',v_dump_file); utl_file.fremove('DATA_PUMP_DIR',v_log_file); EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001,'自动化导出失败,错误信息:'||SQLERRM); END AUTO_EXPORT_SCHEMA_TO_S3; /
注意:如果不需要保留历史导出文件,可在上传S3步骤指定只传本次生成的文件,避免目录下的旧文件重复上传。
2. 权限配置(执行前必须完成)
执行存储过程的用户需要提前授予以下权限:
- 数据泵导出权限:
GRANT DATAPUMP_EXP_FULL_DATABASE TO 你的用户名; - UTL_FILE操作权限:
GRANT EXECUTE ON UTL_FILE TO 你的用户名; - RDS管理包执行权限:
GRANT EXECUTE ON RDSADMIN.RDSADMIN_S3_TASKS TO 你的用户名; - 确保RDS实例关联的IAM角色配置了S3桶的写入权限,否则会上传失败。
3. 配置定时任务(按需启用)
如果需要定时自动执行,可通过Oracle自带的DBMS_SCHEDULER创建定时任务,示例为每天凌晨2点执行一次:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'DAILY_EXPORT_ICO_AV_PRD_OWR_TO_S3', job_type => 'STORED_PROCEDURE', job_action => 'AUTO_EXPORT_SCHEMA_TO_S3', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY;BYHOUR=2;BYMINUTE=0;BYSECOND=0', enabled => TRUE, comments => '每天凌晨2点自动导出ICO_AV_PRD_OWR Schema到S3' ); END; /
结果验证
- 存储过程测试:直接执行
EXEC AUTO_EXPORT_SCHEMA_TO_S3;查看是否报错,同时检查S3桶是否有对应文件 - 定时任务状态查询:
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME = 'DAILY_EXPORT_ICO_AV_PRD_OWR_TO_S3' ORDER BY ACTUAL_START_DATE DESC;
内容的提问来源于stack exchange,提问作者Loneya
相关产品推荐
相关产品推荐

