2012-04-30 18 views
2

在Teradata的,我一直在做备份的表的方法是这样的:Teradata:如何备份使用标识列的表?

create table xxx_bak as xxx with data

伟大的作品,但我刚刚发现,这并不与标识列的表工作。

我需要一个备份方法,可以复制一个表的数据完好无损,这样我就可以回滚它,以防万一我搞砸了一些数据。

回答

0

了一年半之后,我终于找到了一个漂亮的解决这个问题:

create table mydb.mytablebackup as 
(select * from (select * from mydb.mytable) x) 
with data; 

一定要限定最内层的子查询,否则它将无法工作。

+0

注意。这会将表格的PI更改为第一列,这可能会导致表格偏斜和处理速度缓慢。您也应该复制原始表的PI&分区定义。那么这将是一个快速的AMP本地合并。 – dnoeth

+0

@dnoeth好词。但是,新表将永远不会被实际使用,仅仅是为了保存备份数据而给出的一个例外。如果原始资料出现问题(例如,您对错误的列进行大规模更新,删除错误的记录等),则可以清除原始表并将其中的所有数据重新插入到原始表中备份表。但是,您的观点很重要,以防有人删除原始表并将备份表重命名为原始表名,以便实际上成为实时数据的新家。 – oscilatingcretin

+0

即使您不使用该副本,由于后台处理和重新分配,创建该副本的速度仍然会很慢。你不应该使用这个副本作为原始表的替换,因为不仅索引和标识丢失了,还有所有NOT NULL和CHECK约束,只是比较两个SHOW TABLE的结果。 – dnoeth

0

这包括3个步骤:

1. SHOW TABLE orig_Table; (*Get the DDL*) 

2. Replace orig_Table with bkp_Table name 

3. INSERT INTO bkp_Table SELECT * FROM orig_Table; 
+0

如果我必须回滚表格,我该怎么办?不会插入备份表中会导致标识列的新数字序列?如果是这样,我无法进行更新连接,因为主键不匹配。 – oscilatingcretin

+0

在这种情况下,对于备份表,请勿使用标识列。使用十进制。因此,来自标识列的值进入具有相同值的正常列 – emaillenin

1

如果你只是想表的副本,你可以创建一个具有相同的结构,但没有使键列标识列。然后您可以从原始表格中插入。但是,您无法从备份中插入旧表中,同时保留相同的密钥。

使用相同的密钥进行备份的方法是使用归档/恢复工具ARCMAIN。

备份这样的:

logon my_server/my_user, my_password; 
archive data tables (my_database.my_table), release lock, file=backup_file; 

恢复这样的:

logon my_server/my_user, my_password; 
restore data tables (my_database.my_table), release lock, file=backup_file;