oracle 每天备份指定表的数据到另外一张备份表中

本文介绍了一种数据库备份与清理策略,通过创建存储过程自动将大量中转数据按月分表保存,仅保留最近7天的数据,其余数据备份并定期删除,确保数据可用性和存储效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为有一张中转数据的表,数据量特别大不能保存太久,但是最近几天的有可能要使用。所以只保留7天的数据量,其他的数据按月重新建表分开保存,用以备份。

首先创建备份的存储过程

CREATE OR REPLACE PROCEDURE P_DAYCLEAR IS
  V_TABLE_COUNT int;
  V_TABLE_NAME  VARCHAR2(100);
  V_YEAR_MONTH  VARCHAR2(100);
  v_sql         VARCHAR2(300);
  c_sql          VARCHAR2(300);
BEGIN

  select to_char(sysdate - interval '7' day, 'yyyyMM')
    into V_YEAR_MONTH
    from dual;
  V_TABLE_NAME := 'DSM_COM_INDEX_HIS_VALUE' || V_YEAR_MONTH;
  select count(*)
    into V_TABLE_COUNT
    from user_tables
   where table_name = V_TABLE_NAME;
--判断表是否已经存在了
  IF V_TABLE_COUNT = 0 THEN
    --建表
    c_sql :='create table  '||V_TABLE_NAME||' as select * from DSM_COM_INDEX_HIS_VALUE where 1=2 ';
    execute immediate c_sql ;
     commit;
  END IF;
  select to_char(sysdate - interval '6' day, 'yyyy-MM-dd')
    into V_YEAR_MONTH
    from dual;
  V_SQL := 'insert into  '||V_TABLE_NAME||' select *      from DSM_COM_INDEX_HIS_VALUE     where update_time < to_date(:1, ''yyyy-MM-dd'')';
           --插数据
   execute immediate  V_SQL USING V_YEAR_MONTH ;
  COMMIT;
  --删除数据
  V_SQL := ' delete from DSM_COM_INDEX_HIS_VALUE  where update_time < to_date(:1, ''yyyy-MM-dd'') ';
   execute immediate  V_SQL USING V_YEAR_MONTH ;
  COMMIT;

END P_DAYCLEAR;

然后创建定时任务 晚上执行

declare   
      job_id   pls_integer; 
begin
sys.dbms_job.submit(job => job_id,
                      what => 'P_DAYCLEAR();',
                      next_date => to_date('10-03-2018 03:00:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'TRUNC(sysdate+86400)');
commit;
end;

 

 

<think>嗯,用户明确提出了需要将Oracle数据中的一张数据复制到一张的具体需求,并且引用了insertselect语句。看来用户正在处理数据迁移或数据备份的工作。从引用资料来看,用户已经查阅了多种复制方法,包括全复制、选择性字段复制以及跨数据复制。但当前问题聚焦在单数据内的间复制,核心需求是高效安全地完成数据转移。注意到引用2提供了最贴近当前需求的解决方案:1.使用CREATETABLEAS创建新并复制全部数据2.使用INSERTINTOSELECT将数据追加到现有用户特意提到"insertselect",说明目标可能已经存在。需要重点讲解第二种方案的具体实现和注意事项。考虑到用户可能是DBA或开发人员,应该强调几个实用要点:-字段匹配的两种方案(全字段复制和字段映射)-避免主键冲突的处理方式-大复制时的性能优化建议-错误调试技巧需要特别注意引用5提到的跨数据复制方案虽然存在,但不适用当前场景,这点要明确区分说明。用户的问题描述很专业,说明对SQL有基础了解,可以适当使用术语。但也要准备解释字段映射这样的核心概念,避免用户实际执行时出错。</think> 在 Oracle 数据中将一张数据复制到一张,使用 `INSERT INTO ... SELECT` 语句是最常用且高效的方法。以下是具体操作方式及注意事项: --- ### 一、复制数据到 **新**(目标不存在) 若需要完全复制源数据 **并创建新**: ```sql CREATE TABLE 新名 AS SELECT * FROM 源名; ``` **示例**(复制 `employees` 到新 `employees_backup`): ```sql CREATE TABLE employees_backup AS SELECT * FROM employees; ``` **特殊场景**: ✅ **仅复制结构(不复制数据)**: ```sql CREATE TABLE 新名 AS SELECT * FROM 源名 WHERE 1=0; ``` --- ### 二、复制数据到 **已存在**(目标已创建) 使用 `INSERT INTO ... SELECT` 语法: ```sql INSERT INTO 目标名 [(列1, 列2, ...)] SELECT 列1, 列2, ... FROM 源名 [WHERE 条件]; ``` #### 1. **全字段复制** ```sql INSERT INTO 目标名 SELECT * FROM 源名; ``` > ⚠️ 要求:目标与源的 **字段数量、顺序、类型必须完全一致**。 #### 2. **部分字段复制** ```sql INSERT INTO 目标名 (目标列1, 目标列2) SELECT 源列1, 源列2 FROM 源名; ``` **示例**(复制 `employees` 的 `name`, `salary` 到 `backup_table`): ```sql INSERT INTO backup_table (emp_name, emp_salary) SELECT name, salary FROM employees; ``` #### 3. **复制时转换或过滤数据** ```sql INSERT INTO target_table (id, new_name, bonus) SELECT id, UPPER(name), salary * 0.1 FROM employees WHERE salary > 5000; ``` --- ### 三、常见问题解决方案 #### 1. **主键冲突** 若目标存在主键/唯一约束,重复数据会报错 `ORA-00001`。解决方案: ```sql -- 跳过重复数据(仅插入不冲突数据) INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(目标名(主键列)) */ INTO 目标名 SELECT * FROM 源名; ``` #### 2. **字段顺序不一致** 显式指定字段映射: ```sql INSERT INTO 目标 (字段A, 字段B, 字段C) SELECT 源字段C, 源字段A, 源字段B FROM 源; ``` #### 3. **跨数据复制**(不同Schema) 需添加Schema名: ```sql INSERT INTO schema2.target_table SELECT * FROM schema1.source_table; ``` #### 4. **大性能优化** ```sql INSERT /*+ APPEND */ INTO 目标 -- 使用直接路径插入(需开启事务) SELECT * FROM 源; COMMIT; -- 提交事务 ``` --- ### 四、重要注意事项 1. **事务一致性**:大操作建议手动提交事务(`BEGIN` / `COMMIT`),避免意外中断。 2. **权限检查**:用户需有源的 `SELECT` 权限和目标的 `INSERT` 权限。 3. **LOB字段**:若含 `CLOB/BLOB` 字段,需使用 `DBMS_LOB` 包特殊处理[^2]。 4. **空间预留**:确保目标空间足够,可提前执行 `ALTER TABLE ... ALLOCATE EXTENT`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值