SQLiteexception数据库磁盘映像格式错误

时间:2018-03-29 15:47:26

标签: sql sqlite diskimage

我对SQLite数据库有一个奇怪的错误:You can download it here

每次我尝试在表格中插入一些东西" CurrencyTransactions"它失败了,因为一个名为7的新列无缘无故地出现了。

weird 7 column

我试图放弃桌子但是

drop table fail

我跑了PRAGMA integrity_check,但我发现了这个错误

pragma integrity fail

然后我尝试导出.sql文件并在新的数据库中再次导入,但

1)如果我只导入结构,它运行正常,我不再拥有7

2)如果我导入条目,则失败并显示以下错误: 这意味着:"流程#74中的错误:不是错误"

import entries fail

要完成,我还尝试了this solution,但创建的新数据库是空的。

我该怎么办?我真的需要保存这些条目。

1 个答案:

答案 0 :(得分:1)

我建议使用数据库浏览器。

  1. 文件/导出/数据库到SQL文件。
  2. 全选(适用于所有表格)
  3. 除了导出所有内容之外的其他选项
  4. 保存文件。
  5. 关闭数据库。
  6. 打开一个新数据库,例如nadekobotfix.db。 (可以是同名但位置不同)

    • 注1-6需要一分钟左右(不到60k)。
  7. 根据以下方面的努力工作: -

  8. 您可能需要删除/忽略第一行和最后一行(BEGIN TRANSACTION;和后续COMMIT;

    由于约束,您可能无法直接运行生成的SQL(尝试使用约束失败)。

    您需要从文件中复制部分,并根据约束(外键)强加的层次结构运行。如果您有CHECK约束,则可能需要考虑这些因素。 (没有触发器担心)。

    • 正在运行SELECT * FROM sqlite_master WHERE type = 'table' AND instr(sql,'CHECK');不返回任何内容,因此没有 CHECK 约束。

    索引可以/应该保留到最后(因为它们在生成的SQL中)。

    一个部分将包含一个表的create语句以及insert语句。

    您可能希望创建表格(部分)的电子表格,以便在完成后将其标记为关闭。

    • 以下查询可以提供帮助,因为NA可以先完成

      • SELECT CASE WHEN instr(sql,'FOREIGN KEY') THEN 'FK' ELSE 'NA' END AS fkey, name,sql FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite%' ORDER BY instr(sql,'FOREIGN KEY')
    • 您可以从数据库浏览器中导出单个表格,以便SQlite在完成后将其标记为关闭。

    您可能希望定期执行 integrity_check

    如果这样做(您可能需要对SQL进行调整),那么您可以重命名旧数据库,然后重命名新数据库(或者移动旧数据库,如果使用相同的数据库名称则复制新数据库)。

    您可能希望留意: -

      

    除少数例外情况外,通常不会对损坏的数据库进行分析   帮助确定出了什么问题。一种更好的避免方法   "危险",我们发现,是阅读和理解   https://www.sqlite.org/howtocorrupt.html

         
        

    * in database main *     页面10628:btreeInitPage()返回错误代码11

      
         

    这表明页面标题严重损坏了SQLite   完全不能解释这个页面。一个可能的原因:第10628页   已被归零。你能看一下该页面的十六进制转储吗? (记得   那个SQLite编号以1开头的页面,所以页面的开头   是pgsz * 10627,其中pgsz是页面大小。)    - D. Richard Hipp

    “btreeInitPage() returns error code 11”

    需要进行样品调整

    Reminders 表有一个名为When的列,这是一个SQL关键字(不可取的列名IMO),因此INSERT生成的SQL不会包装列名,所以你会得到错误。

    即。 : -

    CREATE TABLE IF NOT EXISTS `Reminders` (
        `Id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        `ChannelId` INTEGER NOT NULL,
        `IsPrivate` INTEGER NOT NULL,
        `Message`   TEXT,
        `ServerId`  INTEGER NOT NULL,
        `UserId`    INTEGER NOT NULL,
        `When`  TEXT NOT NULL,
        `DateAdded` TEXT
    );
    INSERT INTO `Reminders` (Id,ChannelId,IsPrivate,Message,ServerId,UserId,When,DateAdded) VALUES (1270,367886754973351936,1,'Birthday Day',318127386367623170,367886754973351936,'2018-05-03 22:07:48.1860996','2018-03-18 22:07:48.186101'),
     (1271,248278722656993281,1,'to remind Chanmi to remind Jayos to DeagleMomoka',318127386367623170,248278722656993281,'2018-05-05 22:08:58.4915565','2018-03-18 22:08:58.4915582'),
     (1376,170240129414201344,1,'timely',318127386367623170,170240129414201344,'2018-03-29 09:00:29.4476776','2018-03-28 09:00:29.447679'),
     (1377,373301201158144000,1,'timely',318127386367623170,373301201158144000,'2018-03-29 09:50:14.1631563','2018-03-28 09:50:14.1631577'),
     (1378,248278722656993281,1,'timely',318127386367623170,248278722656993281,'2018-03-29 11:24:27.0250275','2018-03-28 11:24:27.025029'),
     (1379,421433212716318721,1,'to timely',318127386367623170,421433212716318721,'2018-03-29 19:21:17.7465563','2018-03-28 19:21:17.7465584'),
     (1380,346513954966863872,1,'t',318127386367623170,346513954966863872,'2018-03-29 19:42:23.4758798','2018-03-28 19:42:23.4758816'),
     (1381,272735316002209792,1,'t!daily',318127386367623170,272735316002209792,'2018-03-29 21:01:47.5616218','2018-03-28 21:01:47.5616236'),
     (1382,298272937243312132,1,'timely',318127386367623170,298272937243312132,'2018-03-29 23:18:02.8826873','2018-03-28 23:18:02.8826891'),
     (1383,332340162774302720,1,'t',318127386367623170,332340162774302720,'2018-03-30 01:55:21.4704139','2018-03-29 01:55:21.4704156'),
     (1384,367165474246754314,1,'tatyahaksodoeo',318127386367623170,367165474246754314,'2018-03-30 03:46:18.8805182','2018-03-29 03:46:18.8805196'),
     (1385,290086674761908225,1,'timely',318127386367623170,290086674761908225,'2018-03-30 07:02:33.4115303','2018-03-29 07:02:33.4115321'),
     (1386,168064128500367360,1,'timely',318127386367623170,168064128500367360,'2018-03-30 07:19:09.1915867','2018-03-29 07:19:09.1915885');
    

    必须更改为使用(方括号,单引号或双引号或重音符号可用于括起/包装/引用有问题的关键字): -

    .......INSERT INTO `Reminders` (Id,ChannelId,IsPrivate,Message,ServerId,UserId,[When],DateAdded) ......
    
    • 同样表 SelfAssignableRoles 将GROUP关键字作为列名。
    • 同样,表格 Permissionv2 和表格 StartupCommand 将INDEX关键字作为列名称。

    潜在问题

    作为一项练习,我尝试过上述操作,并设法从71个表中获得67个(70个表中的66个,因为 sqlite_sequence 是自动创建的)。

    但是,分会表与 DiscordUser 表之间似乎存在问题。我相信他们之间有一个循环的参考。因此, WaifuInfo WaifuUpdates 依赖于 DiscordUser 表,而 WaifuItem 依赖于 WaifInfo < / strong>即可。此处提到的表格尚未成功复制。

    一句警告。如果您尝试使用现有约束创建俱乐部 DiscordUser ,您可能最终会遇到必须存在的情况。

    e.g。如果 DiscordUser 存在但分会则不存在

    DROP TABLE IF EXISTS `DiscordUser`;
    

    导致: -

    no such table: main.Clubs: DROP TABLE IF EXISTS `DiscordUser`;
    

    如果您随后使用以下方法创建分会并尝试使用非常基本(无约束)的DROP: -

    CREATE TABLE IF NOT EXISTS `Clubs` (ID INTEGER PRIMARY KEY);
    DROP TABLE IF EXISTS `DiscordUser`;
    

    结果很好: -

    Query executed successfully: DROP TABLE IF EXISTS `DiscordUser`; (took 1ms)
    

    现在尝试使用以下方式删除俱乐部: -

    --CREATE TABLE IF NOT EXISTS `Clubs` (ID INTEGER PRIMARY KEY);
    --DROP TABLE IF EXISTS `DiscordUser`;
    DROP TABLE IF EXISTS `Clubs`;
    

    并且您不能 DiscordUser 按照以下方式存在: -

    no such table: main.DiscordUser: DROP TABLE IF EXISTS `Clubs`;
    
    • 我已尝试关闭数据库,以防它出现缓存问题,但行为仍然存在。

    因此,我强烈建议您仔细查看约束用法并确保在尝试复制所有表之前纠正问题(我猜这可能是其中的一部分)腐败的原因,但为什么/如何超越我。)

    P.S。我使用的方法是(1-6): -

    然后是7: -

    运行sqlite_master查询,从上面选择所有单元格并复制,然后将结果拖放到电子表格中(除非您尝试使用分隔符,否则可以删除sql列,因为创建被截断)。

    1. 在编辑器中打开导出的文件(我使用的是NotePad ++)。
    2. 在SQL浏览器中打开一个新数据库(从现在起将其称为 DBB ),用于SQLite。
    3. 在EXEC SQL选项卡的DBB中,输入PRAGMA integrity_check,运行以进行检查。
    4. 创建新标签(用于下一个SQL)。
    5. 切换到电子表格并复制未标记为已完成的第一个表名。
    6. 切换到编辑器,在EXISTS copied_table_name
    7. 上找到
    8. 选择该部分(即CREATE语句沿着并包括要插入的最后一行,注意对于较大的表可能是一种痛苦,因此可能更容易为这些表创建单独的导出)。将选择内容复制到剪贴板。
    9. 粘贴到空标签中并运行。
    10. 如果好的话
        DBL中的
      • 单击以为下一个
      • 创建新选项卡
      • 切换到电子表格并将表标记为DONE
      • 转到5。
    11. 如果不行则那么
      • 如果您可以通过更改SQL修复SQL(例如列名称需要封闭/包装/引用)来解决问题,然后转到9.
      • 如果问题是由约束引起的,那么请转到5,但选择导致约束的表。
    12. 确定DiscordUser / Club表的问题在于Clubs.Ownerid需要DiscordUser。因此,如果没有相关的Discord用户(id为1,2,7,14和32),则无法添加俱乐部。一些DiscordUsers是俱乐部成员,所以他们需要俱乐部存在。

      我所做的是为俱乐部所有者加载DiscordUsers行,将其ClubId更改为null。加载俱乐部。更新DiscordUsers的ClubId,使他们成为之前俱乐部的成员(即取消null)并加载其余近600个Discordusers(不包括那些已经加载的)。

      这是我用于该部分的SQL(除了Discorduser,Clubs和3个waifu表之外,所有其他表都已成功创建并加载)。

      INSERT INTO `DiscordUser` (Id,AvatarId,Discriminator,UserId,DateAdded,Username,ClubId,LastLevelUp,NotifyOnLevelUp,LastXpGain,TotalXp,IsClubAdmin,CurrencyAmount) VALUES 
       -- ClubId was 6 changed to null
       (1,'6d5212a0f5e862d57c8ffc6f254a2e85','1458',299779864045682689,'2017-10-07 18:02:04.8287878','Anubis',NULL,'2018-03-27 02:22:26.362966',0,'2017-11-17 01:19:14.0313957',7056,1,280),
       -- Owns a club but not in a club
       (2,'3b37e0f635706f81fdde2b6de9889283','9810',181200115539640321,'2017-10-07 18:04:39.767728','AnnaHime',NULL,'2018-01-02 02:27:38.8011863',0,'2017-11-16 01:29:49.0371488',429,0,360),
       -- ClubId null was 3
       (7,'612c67b6eb57d8806dcc92ed45b3a6d0','0396',177502331582021639,'2017-10-07 18:11:09.7830603','Tsuchimursu',NULL,'2018-03-28 17:45:53.7399883',0,'2017-11-17 15:53:59.084885',18156,1,4725),
       -- ClubId null was 4
       (14,'b2dd362171277337294de325bf92ad6a','3267',215597863441268737,'2017-10-07 18:45:54.8092675','LaLa☆Star',NULL,'2018-01-14 20:52:15.7531274',0,'2017-11-08 19:00:22.7778305',2061,1,286),
       -- ClubId null was 5
       (32,'667f4d802b977c4d4be974e35ae63c55','2593',251689019929395200,'2017-10-08 00:58:16.6089546','username',NULL,'2018-03-28 07:27:34.9348084',0,'2017-11-17 20:02:14.0283998',4704,1,1188),
       -- ClubId was 2 changed to NULL
       (91,'0adb399c9f2cd94370038e2452ab8c8d','6790',346513954966863872,'2017-10-13 05:48:51.7788964','mayoi',NULL,'2018-03-24 02:50:06.8970518',0,'2017-11-17 20:01:29.0692552',7635,1,515)
       ;
      
      INSERT INTO `Clubs` (Id,DateAdded,Discrim,ImageUrl,MinimumLevelReq,Name,OwnerId,Xp,Description) VALUES 
       (2,'2017-11-14 07:39:57.5091592',1,'https://lh3.googleusercontent.com/_7WKFouxTx1fdFpnmmuykDAd5SoiiJOPzHdRmXKOmRRZhV5Ba4V_kZct5ooVjQ9BuzU=w300',5,'We ⤠waifus',91,40137,'Love your waifus short & tall, big & small, cute as dolls, we love ''em all!'),
       (3,'2017-12-11 07:00:59.3762914',1,'',30,'Den of Faes',7,11607,NULL),
       (4,'2017-12-11 07:03:59.093402',1,'',5,'Skeleton Enthusiasts',14,657,NULL),
       (5,'2017-12-11 07:05:56.9111719',1,'',5,'Saki''s Juice',32,2610,NULL),
       (6,'2017-12-22 04:46:24.7271709',1,'',5,'nap pile',1,24870,'For the sleeping beauties and the wandering insomniacs who enjoy a good night sleep.')
       ;
      UPDATE `DiscordUser` SET ClubId = 6 WHERE Id=1;
      UPDATE `DiscordUser` SET ClubId = 3 WHERE Id=7;
      UPDATE `DiscordUser` SET ClubId = 4 WHERE Id=14;
      UPDATE `DiscordUser` SET ClubId = 5 WHERE Id=32;
      UPDATE `DiscordUser` SET ClubId = 2 WHERE Id=91;
      
      -- LOAD Remaining DiscordUser rows (note incomplete)
      INSERT INTO `DiscordUser` (Id,AvatarId,Discriminator,UserId,DateAdded,Username,ClubId,LastLevelUp,NotifyOnLevelUp,LastXpGain,TotalXp,IsClubAdmin,CurrencyAmount) VALUES 
       --(1,'6d5212a0f5e862d57c8ffc6f254a2e85','1458',299779864045682689,'2017-10-07 18:02:04.8287878','Anubis',6,'2018-03-27 02:22:26.362966',0,'2017-11-17 01:19:14.0313957',7056,1,280),
       --(2,'3b37e0f635706f81fdde2b6de9889283','9810',181200115539640321,'2017-10-07 18:04:39.767728','AnnaHime',NULL,'2018-01-02 02:27:38.8011863',0,'2017-11-16 01:29:49.0371488',429,0,360),
       (3,'a3cd92d397ad357834d0e6c9f10bfc59','0429',145356302347010048,'2017-10-07 18:04:49.786657','Rebel Lucy',NULL,'2018-03-26 12:55:21.1149964',0,'2017-11-17 22:21:24.0263741',6876,0,3600),
       (4,'7225dccaab1c93896657a61e18595378','5286',84689434536050688,'2017-10-07 18:05:44.765554','scarletflame234',NULL,'2018-03-28 22:56:28.7427437',0,'2017-11-17 23:21:41.4446535',13368,0,288),
       (5,'c1316bc0673f4a2709b3ce550ed54395','0760',303279191116480514,'2017-10-07 18:06:39.7664015','zachary',NULL,'2018-03-02 03:48:43.4817755',0,'2017-11-17 18:44:14.1082867',210,0,50),
       (6,'2ed95eae7c3088c46b23e71578dacc42','8801',161369834314137601,'2017-10-07 18:07:04.7672808','Kou',NULL,'2018-03-07 06:24:32.3405246',0,'2017-11-17 23:20:00.0648699',2640,0,55),
       --(7,'612c67b6eb57d8806dcc92ed45b3a6d0','0396',177502331582021639,'2017-10-07 18:11:09.7830603','Tsuchimursu',3,'2018-03-28 17:45:53.7399883',0,'2017-11-17 15:53:59.084885',18156,1,4725),
       (8,'5b1d239935ab4dd6d3eee98954601d52','9859',179093512610906113,'2017-10-07 18:13:54.7939334','TheCorty',NULL,'2017-11-12 12:07:36.4752178',0,'2017-11-12 23:47:26.4744132',2460,0,205), ...........
      
      • 注意 - LOAD Remaining DiscordUser行中的SQL无法正常工作,因为它仅用于显示ID&#39; 1,2并且已经注释掉了7个,因为它们已经被装载了,应该是第14,32和91行,另外还应该包含600行。

      注意我还加载了未完成的3个waifu表,以便可以检索所有数据(假设没有因为损坏而丢失)。 PRAGMA integrity_check;返回OK。