SQLite3 数据库或磁盘在 csv 导入时已满

SQLite3 database or disk is full on csv imports

此问题已在多个线程中进行了讨论,但 none 的建议似乎适用于我的情况。

我有一个非常大的 sqlite 数据库 (4Tb)。我正在尝试从终端导入 csv 文件

sqlite3 -csv -separator "       " /data/mydb.db ".import '|cat *.csv' mytable"

我间歇性地收到 SQLite3 数据库或磁盘已满 错误。重新运行出错后的命令一般都能成功。

一些注意事项:

  1. /data 有 3.2Tb 免费空间
  2. /tmp 有 1.8Tb 空闲空间。
  3. *.csv 占用大约 802Gb。
  4. /tmp 和 /data 都使用 ext4,最大文件大小为 16tb。
  5. 访问数据库的唯一进程是上面提到的进程。
  6. PRAGMA integrity_check returns 好的。
  7. 两者都测试 -sqlite3 --version - 3.38.1 2022-03-12 13:37:29 38c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbc and 3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837balt1
  8. OS - Ubuntu 20.04

对可能发生的事情有什么想法吗?

(除非有明确的理由说明为什么我超出了 sqlite 的限制,否则我宁愿避免建议我转向 client/server RDBMS。)

我没弄清楚,但是 someone else did,我很确定这会“修复它”,直到您达到 8TB 左右:

sqlite3 ... "PRAGMA main.max_page_count=2147483647; .import '|cat *.csv' mytable"

但是调用

sqlite3 ... "PRAGMA main.journal_mode=DELETE; PRAGMA main.max_page_count; PRAGMA main.max_page_count=2147483647; PRAGMA main.page_size=65536;VACUUM; import '|cat *.csv' mytable;"

应该允许数据库增长到 ~200TB,但是应用新 page_size 所需的 VACUUM 命令需要大量空闲 space 到 运行,并且可能会用很长时间 =/

好消息是您只需要 运行 一次并且它应该是对您的数据库的永久更改,您的下一次调用只需要 sqlite3 ... "import '|cat *.csv' mytable;"

值得注意的是,这可能会在 ~200TB 左右再次中断