我想提取在
BLOB
数据库中存储为 DB2
的原始文件。
我使用了这个 DB2
命令:
EXPORT TO MyFile.DEL OF DEL LOBS TO . LOBFILE lob SELECT BLOB_COL
FROM MY_TABLE where REPORT_ID in
(select report_id from My_TABLE2 where CONDITION)
我得到一个
.blob
文件,其中包含所有文件的内容。
现在我想知道是否有一种方法可以将每个文件导出到单个文件中,而不是将它们聚集在同一个文件中。
这在 DB2 中可能吗?
在最新版本的 DB2 for LUW(至少从 v9.5 开始)中,可以通过指定
lobsinsepfiles
修饰符来实现:
EXPORT TO MyFile.DEL OF DEL LOBS TO . LOBFILE lob
MODIFIED BY lobsinsepfiles
SELECT ...
是的,您可以通过将关键字
lobsinsepfiles
添加到 EXPORT
语句中来将 LOB 存储在不同的文件中。 详情请看这里。还有一些选项可以指定如何构造单个文件名,我建议使用这些选项。
您的陈述如下:
EXPORT TO MyFile.DEL OF DEL LOBS TO . LOBFILE lob
MODIFIED BY lobsinsepfile
SELECT BLOB_COL FROM MY_TABLE where REPORT_ID in
(select report_id from My_TABLE2 where CONDITION)
ssh server.com
<login>
. /home/dbadminuser/sqllib/db2profile
db2 connect to DATABASE
cd /db/dbadminuser/db2backup/export
以 1 年为单位批量导出所有附件
db2 "export to ATTACHMENTS2023.del of del lobs to . modified by lobsinfile lobsinsepfiles select RECNO, SEQNO, FILENAME, ATTACHMENT from PCT.ATTACHMENT where ROW_UPDATE_DT BETWEEN '2023-01-01' AND '2024-01-01'"
压缩
tar cf - *2023* | gzip -9 > lob2023.tar.gz
清理
rm ATT*
使用安全复制 (scp) 下载文件
scp server.com:/db/dbadminuser/db2backup/export/*2023* ~/Downloads/db_backup/
所有下载完成后清理服务器上的其余部分:
rm *.tar.gz
提取档案。这是如何在 Linux 中完成的。
tar xzf lob2023.tar.gz
注意重命名“del”文件
mv ATTACHMENTS2023.del ATTACHMENT2023.csv
在其顶行添加列名称。
有很多更有效的方法可以做到这一点,我只是使用“vi”文本编辑器。
vi ATTACHMENT2023.csv
i for insert
new first line:
"RECNO","SEQNO","FILENAME","ATTACHMENT"
Esc for quit the insert mode
:wq for write and quit vi
在这里,我应该检查 ATTACHMENT.csv 中文件名的编码是否有“£”、“€”、“μ”、“û”、“ó”和其他特殊字符的错误显示。我后来修复了这些。
下载完成后,您将拥有一个包含 1 个 csv 文件和许多 lob1.001 至 lobn.nnn 的文件夹,其中“n”是您想要重命名的数字。在此表中,文件名位于“文件名”列中。
对于我的特殊需求,希望在单独的文件夹中拥有每个记录及其所有文件的文件夹结构,以记录编号_序列编号_文件名命名(因为2个文件可以具有相同的名称,但顺序不同): RECNO/RECNO_SEQNO_FILENAME
我使用 PowerShell(最新版本)自动执行此操作(是的,是的,还有其他更好的编程语言,我有时间为这项任务学习这一语言):
可能有更优化的方法来做到这一点,我只是使用了这个。
PS > Import-Csv .\ATTACHMENT2023.csv -Delimiter "," | ForEach-Object -Process {New-Item -Path "." -Name ($_.RECNO) -ItemType "directory"; Move-Item ($_.ATTACHMENT) -Destination (".\" + $_.RECNO + "\" + $_.RECNO + "_" + $_.SEQNO + "_" + $_.FILENAME)}