从备份恢复截断的 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
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;
我正在从导出的 csv 文件恢复 Oracle 数据库中被截断的 table 的数据。但是,我发现主键自动递增,并没有从备份文件中插入主键约束列的实际值。
我打算执行以下操作: 1.删除主键 2.导入table数据 3.在需要的列上添加主键约束
这是一个好方法吗?如果没有,推荐什么?谢谢
编辑:经过更多调查,我发现有一个触发器可以在要插入主键列的序列上生成 nextval。这就是困境的根源。因此,按照上述步骤并不能解决问题。它位于 table 上的触发器(and/or 序列)。这就解决了!
更容易将您的 .csv 文件用作外部文件 table 然后继续
- 从外部 table 创建 table your_table_temp 作为 select *
- 检查新临时文件中的数据 table 以确保您知道主键的范围
- 合并到新的 table
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;