从备份恢复截断的 Table

Restoring a Truncated Table from a Backup

我正在从导出的 csv 文件恢复 Oracle 数据库中被截断的 table 的数据。但是,我发现主键自动递增,并没有从备份文件中插入主键约束列的实际值。

我打算执行以下操作: 1.删​​除主键 2.导入table数据 3.在需要的列上添加主键约束

这是一个好方法吗?如果没有,推荐什么?谢谢

编辑:经过更多调查,我发现有一个触发器可以在要插入主键列的序列上生成 nextval。这就是困境的根源。因此,按照上述步骤并不能解决问题。它位于 table 上的触发器(and/or 序列)。这就解决了!

更容易将您的 .csv 文件用作外部文件 table 然后继续

  • 从外部 table
  • 创建 table your_table_temp 作为 select *
  • 检查新临时文件中的数据 table 以确保您知道主键的范围
  • 合并到新的 table

样本来自 here and here

CREATE TABLE countries_ext (
  country_code      VARCHAR2(5),
  country_name      VARCHAR2(50),
  country_language  VARCHAR2(50)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY ext_tab_data
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (
      country_code      CHAR(5),
      country_name      CHAR(50),
      country_language  CHAR(50)
    )
  )
  LOCATION ('Countries1.txt','Countries2.txt')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;

和合并

MERGE INTO employees e
    USING hr_records h
    ON (e.id = h.emp_id)
  WHEN MATCHED THEN
    UPDATE SET e.address = h.address
  WHEN NOT MATCHED THEN
    INSERT (id, address)
    VALUES (h.emp_id, h.address);

编辑:合并数据后,您可以删除临时文件 table,结果是您之前的 table 以及旧数据和新数据

编辑你提到“在导入过程中,主键列不是从文件插入,而是自动递增”。这只有在 table 上有触发器时才会发生,很可能,在每一行上插入之前。禁用触发器,然后进行导入。提交插入后重新启用触发器。

我使用了以下程序来解决它:

drop trigger trigger_name

将 table 数据导入目标 table

drop sequence sequence_name

CREATE SEQUENCE SEQ_NAME INCREMENT BY 1 START WITH start_index_for_next_val MAXVALUE max_val MINVALUE 1 NOCYCLECACHE 20 NOORDER

CREATE OR REPLACE TRIGGER "schema_name"."trigger_name"

before insert on target_table
for each row

begin
  select seq_name.nextval
  into :new.unique_column_name
  from dual;
end;