【问题标题】:DB2 backup and restore db table preserving foreign key constraints保留外键约束的 DB2 备份和恢复数据库表
【发布时间】:2012-08-15 03:38:54
【问题描述】:

我目前在我的开发机器上为 db2 测试备份和恢复数据库表时遇到问题。从来没有完全成功。尽管我能够在删除并重新创建表后恢复所有数据,但我无法重置外键约束,因为我收到 SQL 错误,抱怨键不匹配。以下是我的具体步骤,我确定不完全正确,但它最终会恢复 5423 行数据:

过程

  1. 将 ixf 消息导出到 /export/home/dale/cmets.ixf /export/home/dale/msg.txt select * from .cmets

    注意:步骤 1 将 5423 行数据导出到某个位置

  2. 删除表 .cmets

  3. 从 /export/home/dale/cmets.ixf 的 ixf create 导入到 .cmets

    注意:此处的第 3 步创建了表,但不插入任何数据行

  4. 将客户端从 /export/home/dale/cmets.ixf 中被 identityoverride 修改的 ixf 加载到 .cmets 中

    注意:在这一步之前,我可以在重新创建的 db 表中插入 5423 行数据

  5. alter table .cmets 添加 FOREIGN KEY (cmets_id) REFERENCES .news (article_key)

    注意:这里 alter table 失败,因为 db2 抱怨某些 cmets_id 与 article_key 不匹配

有人可以在这里帮助我解决我的问题吗?提前致谢

【问题讨论】:

  • 没有真正回答您的问题,但您为什么要使用导出进行“备份和恢复”?导出并不是真正的备份。
  • 嗨 Matthew,它实际上是一个表的备份,而不是整个数据库。这只是我的方法,我认为这不是正确的方法。但是,我非常有信心在 db2 中会有更合适的方法来在表级别进行备份和恢复,但不知道它是什么。干杯
  • 请发布您从第 5 步得到的实际错误消息。

标签: reference foreign-keys db2 backup restore


【解决方案1】:

我找到了我的问题以及上面的 cmets 的解决方案,

  1. user980717 解决了我将错误的列设置为外键的第一个问题
  2. 对于我的第二个问题,即“SQL0668N Operation not allowed for reason code “1” on table “tablename”。SQLSTATE=57016”,我需要运行以下命令“set integrity for niwps.cmets immediate checked”以确保数据满足表中定义的所有约束。感谢所有努力帮助我解决问题的人。干杯

【讨论】:

    【解决方案2】:

    该错误意味着您 IMPORT 到 Comments 表中的某些行引用了 News 表中不存在的行。

    您可能没有正确形成约束。列名“comment_id”听起来像是 Comments 表的主键。您需要与 News 表的主键匹配的外键。它也可能被称为“article_key”或“article_id”。

        ALTER TABLE Comments
          ADD FOREIGN KEY( article_key)
            REFERENCES News( article_key);
    

    如果“comment_id”确实不是“Comments”表的主键,那么问题在于没有同时备份和恢复News和Comments表。

    您可以将 News 表与 Comments 表一起导出和导入,或者使用类似这样的方式删除引用缺失新闻行的 Comments

        DELETE FROM Comments
          WHERE comments_id NOT IN (
            SELECT article_key
              FROM News
          )
    

    在执行此操作之前,您可能想尝试列出将被上述查询删除的评论

        SELECT * 
          FROM Comments
          WHERE comments_id NOT IN (
            SELECT article_key
              FROM News
          )
    

    【讨论】:

    • 感谢您回答我的问题。我刚刚发现,当我在第 4 步之前执行第 5 步时,它以某种方式工作,但是在执行 select * from cmets 时出现以下错误执行操作时发生错误:原因代码“1 不允许操作” " 在表 "NIWPS.NEWS_COMMENTS_COPY".. SQLCODE=-668, SQLSTATE=57016, DRIVER=3.57.82
    • 同理。您正在导入的内容(在 cmets.ixf 中)指的是不存在的新闻行。你能回答这两个问题吗? 1)News表的主键是什么(可能是“article_id”)。 2) 评论中有名为“article_id”的列吗? (我的猜测是肯定的)。如果是这样,您需要使用我在上面指定的 ALTER TABLE 语句。将 FOREIGN KEY(cmets_id) 更改为 FOREIGN KEY(article_id)
    • 谢谢,我明白你的意思了。但是,当我在 FOREIGN KEY 中将 comment_id 更改为 article_key 时,当我从 cmets 执行另一个 select * 时,我得到了同样的错误。表“NIWPS.COMMENTS”上的原因代码“1”不允许操作。SQLCODE=-668, SQLSTATE=57016, DRIVER=3.57.82。回答上面的问题,主键是comment_id,而不是article_key(也就是说,cmets表中有一个article_key字段,但不是主键)。
    • 有没有办法让 db2 只备份和恢复一个表,只保留参照完整性?为什么做这件事这么难?这么普遍的需求,为什么 db2 不能满足这个需求呢?这对其他数据库如Oracle和SQL来说也是一个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多