我们的bigzilla安装有几GB数据,没有服务器管理员。 我有对bugzilla的web管理访问权限,并希望得到所有附件(带有原始名称和bug#)。
我知道数据库的大规模导出为XML,但可能之后必须解析附件。
我可以请求访问服务器,然后take a look访问bug数据库中的attachments
表,但是,再次,我将不得不以某种方式解码附件数据。所以,
如何一次性导出所有Bugzilla的错误附件?
也许某些桌面客户端具有此功能?或者someboday有一个脚本来创建tarball?
答案 0 :(得分:0)
我不知道现有的工具,但是这里有一些从数据库中提取数据的有用参考(如果您或其他人确实制作了工具,请在此链接。)
附件文件名位于链接的attachments
表中,该表还指定了错误编号。
https://dev.mysql.com/doc/refman/5.0/en/select-into.html - 从数据库中写入文件。
你也可以使用bugzilla webservice,虽然这可能会很慢:http://www.bugzilla.org/docs/4.0/en/html/api/Bugzilla/WebService/Bug.html#attachments
答案 1 :(得分:0)
我使用下面的内容构建了一个单独的sql文件,可以执行该文件来获取文件。提示:注意文件名中的特殊字符
select concat('SELECT ad.thedata into DUMPFILE \'e:/temp/attachments/'
, a.bug_id
, '___'
, ad.id
, '___'
, replace(a.filename,'\'','')
, '\' FROM bugs.attachments a, bugs.attach_data ad where ad.id = a.attach_id'
, ' and ad.id = '
, ad.id
,';') into outfile 'C:/Temp/attachments.sql'
from bugs.attachments a, bugs.attach_data ad where ad.id = a.attach_id;
答案 2 :(得分:0)
我需要查看是否已经有满足相同要求的脚本,然后出现在这里。由于我不理解纯SQL答案,因此我继续创建自己的Python脚本。如果将来有人需要它,就在这里,
脚本将基于作为参数给出的列名创建目录。我不检查参数,因为这是一个快速而肮脏的脚本。
[wizard @ work]$ ./fetch_attach_from_bugzilla.py bug_id
[wizard @ work]$ ls
16 18 19 21 23 24 26 fetch_attach_from_bugzilla.py
[wizard @ work]$
[wizard @ work]$ cat fetch_attach_from_bugzilla.py
#!/usr/bin/python
import binascii;
import MySQLdb;
import os;
import sys;
conn = MySQLdb.connect(host='',user="",passwd="",db="bugs");
r = conn.cursor();
r.execute('select bug_id from bugs');
bug_ids = r.fetchall();
for bug_row in bug_ids:
bug_id = bug_row[0];
cmd = 'select attachments.filename,attachments.mimetype, bugs.' + sys.argv[1] + ', attach_data.thedata from attachments left join attach_data on attachments.attach_id = attach_data.id left join bugs on bugs.bug_id = attachments.bug_id where attachments.bug_id = ' + str(bug_id);
r.execute(cmd);
for adata_row in r.fetchall():
if not os.path.isdir(os.path.join(os.getcwd(),str(adata_row[2]))):
os.mkdir(str(adata_row[2]));
f = open(os.path.join(os.getcwd(),str(adata_row[2]),adata_row[0]), "wb+")
f.write(adata_row[3]);
f.close();
r.close;
conn.close;
[wizard @ work]$