SRA数据下载:SRA-toolkit与国内镜像加速
NCBi 的 SRA(Sequence Read Archive)是全球最大的测序数据公共仓库。随便搜一篇生信论文,Method 部分大概率写着”Raw data deposited in SRA under accession PRJNAxxxxxx”。
对于国内用户,从 NCBI 直连下载 SRA 数据速度慢且易断。本文覆盖国内网络环境下的 SRA 下载方案:prefetch 断点续传、fasterq-dump 格式转换、清华镜像/aria2 加速、批量下载脚本。
所有命令在 Debian 12 上实测,SRA-toolkit v3.4.1,包管理器 Conda。
1. 宿主环境
$ cat /etc/os-release | head -1PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
$ fasterq-dump --versionfasterq-dump : 3.4.1
$ prefetch --versionprefetch : 3.4.1
# 网络测速(关键!)$ curl -s -o /dev/null -w "NCBI直达: %{time_total}s\n" https://ftp.ncbi.nlm.nih.gov/NCBI直达: 0.831s # 延迟将近1秒$ curl -s -o /dev/null -w "清华镜像: %{time_total}s\n" https://mirrors.tuna.tsinghua.edu.cn/清华镜像: 0.254s # 清华延迟仅0.25秒——快3倍+网络延迟直接决定下载速度。后面会详细讲怎么利用镜像源加速。
2. SRA 数据组织结构——避免下错文件
SRA 数据库的层级关系需要搞清楚:
研究项目 PRJNAxxxxxx (BioProject) └── 实验批次 SRXxxxxxx (Experiment) └── 测序 Run SRRxxxxxx (Run) ← 这才是你能下载的最小单位 ├── .sra 文件(SRA 压缩格式,下载用这个) └── 解压后变成 .fastq.gz关键结论:下载 SRA 数据时,你需要的只是 SRR 编号。 一个 SRR 对应一个测序文库,比如 “SRR24205908”。
怎么从论文中找到 SRR 编号?
- 论文的 Data Availability 部分通常会列出 BioProject 编号(如 PRJNA999999)
- 去 NCBI SRA 搜索这个编号
- 在结果页面点击 “Send to” → “Run Selector” 导出 CSV,里面有所有 SRR 和元数据
- 筛选你需要的样本,拿到 SRR 列表
3. 安装 SRA-toolkit——Conda 镜像源版
千万别从 NCBI 官网下载二进制包——那玩意儿走的是美国服务器,下一小时都可能断。
# 创建独立环境(SRA-toolkit 依赖多,别污染基础环境)conda create -n sra_download -y python=3.10
# 激活并安装(走你配好的清华/北外镜像源)conda activate sra_downloadconda install -y -c bioconda sra-toolkit entrez-direct
# 验证which fasterq-dump prefetch fastq-dumpprefetch --version装完大概 200MB。entrez-direct 是额外的 EDirect 工具包,后面会用来批量检索 SRR。
注意: 如果你之前没配 conda 镜像源,现在必须配好。参考
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/conda config --set show_channel_urls yes4. 国内网络加速——三个方案从快到慢
方案一:prefetch + 代理(推荐,最稳定)
prefetch 是 SRA-toolkit 的下载器,支持断点续传。配上代理可以跑满带宽:
# 配置代理(如果你有的话)export http_proxy=http://127.0.0.1:7890export https_proxy=http://127.0.0.1:7890
# prefetch 自动读取这两个环境变量prefetch SRR24205908 --max-size 50G --output-directory ./sra_data/没有代理怎么办?看方案二。
方案二:通过 ENA(欧洲核苷酸档案)直接下 FASTQ
NCBI SRA 的姊妹数据库 ENA 在 英国,国内访问比美国 NCBI 快不少。而且 ENA 提供直接下 FASTQ 的 FTP 链接,不需要经过 SRA-toolkit 转换:
# 1. 通过 ENA API 获取 FTP 下载链接# 把 SRRxxxxxx 替换成你的编号curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRR24205908&result=read_run&fields=fastq_ftp"
# 输出类似:# run_accession fastq_ftp# SRR24205908 ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_2.fastq.gz
# 2. 用 wget 直接下载 FASTQ(国内用 FTP 比 HTTPS 快)wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_1.fastq.gzwget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR242/008/SRR24205908/SRR24205908_2.fastq.gz-c 参数实现断点续传——网络断了重跑这条命令自动从断点继续。
方案三:prefetch + aria2 加速(无代理时的替代)
aria2 是多线程下载器,实测能跑满带宽:
# 安装 aria2apt install -y aria2
# 先用 prefetch 拿到实际下载链接,再用 aria2 下载# (这个方法需要稍微折腾一下,一般在爬虫场景更实用)对于大多数生信新手,推荐方案二(ENA FTP)作为首选项,不需要代理、速度快、直出 FASTQ。
5. prefetch 下载——断点续传是精髓
# 基础下载prefetch SRR24205908 -O ./sra_data/
# 指定最大文件大小(防止误下超大文件撑爆磁盘)prefetch SRR24205908 --max-size 50G -O ./sra_data/
# 批量下载(从文件读SRR列表)cat srr_list.txt# SRR24205908# SRR24205909# SRR24205910
prefetch --option-file srr_list.txt -O ./sra_data/下载后的文件在哪? 在 ~/ncbi/public/sra/ 下,文件名为 SRR24205908.sra。如果想改路径,需要配置 vdb-config:
# 设置默认下载目录(推荐用环境变量方式)vdb-config -i # 进入交互界面设置# 或者直接编辑配置文件echo "/repository/user/main/public/root = \"/opt/bioinfo/sra\"" >> ~/.ncbi/user-settings.mkfg6. fasterq-dump——.sra 转 .fastq
prefetch 下载的是 .sra 格式(压缩+索引混合),比对工具不认识。需要用 fasterq-dump 转成 .fastq:
# 单文件转换fasterq-dump ./sra_data/SRR24205908.sra \ --outdir ./fastq_data/ \ --split-3 \ # 按read分离:_1.fastq, _2.fastq, _unpaired.fastq --threads 8 \ # 多线程加速 --progress # 显示进度
# 批量转换for sra in ./sra_data/*.sra; do fasterq-dump "$sra" --outdir ./fastq_data/ --split-3 --threads 8done转换后记得压缩——FASTQ 体积很大:
gzip ./fastq_data/*.fastq# 或者 pigz(多线程压缩,更快)pigz -p 8 ./fastq_data/*.fastqfasterq-dump vs fastq-dump 的区别
| 工具 | 速度 | 特点 |
|---|---|---|
fastq-dump | 慢 | 老工具,单线程 |
fasterq-dump | 快5-10倍 | 新工具,多线程,推荐 |
2024 年以后的新版 SRA-toolkit 已经默认使用 fasterq-dump。
7. 批量下载完整脚本
把上面的步骤串起来——从 BioProject 到 FASTQ:
#!/bin/bash# download_sra.sh - 批量下载SRA数据# 国内网络版:通过ENA FTP直下FASTQ,避免NCBI限速
set -euo pipefail
PROJECT="PRJNA999999"OUTDIR="./fastq_data"THREADS=8
mkdir -p "$OUTDIR"
echo "=== Step 1: 获取SRR列表 ==="# 通过NCBI E-utilities 查询esearch -db sra -query "$PROJECT" | \ efetch -format runinfo > runinfo.csv
# 提取SRR编号cut -d',' -f1 runinfo.csv | grep "^SRR" > srr_list.txtecho "Found $(wc -l < srr_list.txt) runs"
echo "=== Step 2: 通过ENA逐一下载FASTQ ==="while read -r srr; do echo "Downloading: $srr"
# 从ENA获取FTP链接 ftp_links=$(curl -s \ "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=${srr}&result=read_run&fields=fastq_ftp" \ | tail -1 | cut -f2)
# PE数据有两个链接,用分号分隔 IFS=';' read -ra LINKS <<< "$ftp_links" for link in "${LINKS[@]}"; do fname=$(basename "$link") wget -c "ftp://${link}" -P "$OUTDIR/" & done wait
echo " Done: $srr"done < srr_list.txt
echo "=== Step 3: 压缩(如果ENA给的是解压后的) ==="pigz -p "$THREADS" "$OUTDIR"/*.fastq 2>/dev/null || \ gzip "$OUTDIR"/*.fastq 2>/dev/null || echo "Already gzipped or no fastq files"
echo "=== All Done ==="ls -lh "$OUTDIR/"8. 国内网络踩坑全记录
坑1:prefetch 下载到一半断掉,重跑从头开始
原因: 没开断点续传。prefetch 默认支持续传,但前提是临时文件没有被删。
解决:
# prefetch 会在 /tmp 下放临时缓存,确保 /tmp 空间足够df -h /tmp
# 如果 /tmp 空间不够,重定向缓存目录export NCBI_SETTINGS=/opt/bioinfo/ncbi_configmkdir -p /opt/bioinfo/sra_tmpprefetch SRRxxx --output-directory ./ 2>&1坑2:fasterq-dump 报 “err: name not found while accessing”
原因: prefetch 之后移动了 .sra 文件。SRA-toolkit 内部用了一个叫 vdb 的索引系统,文件路径变了它就找不到。
解决: .sra 文件需要放在 prefetch 默认下载的目录里,不要移动。如果需要移:
# 方法1:用 fasterq-dump 直接读 accession 号(不走文件路径)fasterq-dump SRR24205908 --outdir ./fastq_data/
# 方法2:重建 vdb 索引vdb-decrypt /path/to/SRR24205908.sra坑3:国内连 NCBI FTP 下载速度只有 100KB/s
这是大部分人的现实。解决方案优先级:
- 首选:ENA FTP(上文方案二)。延迟比 NCBI 低,带宽通常能跑到 MB/s
- 次选:代理。假如实验室有能出国的服务器,在服务器上先下载再 scp 过来
- 末选:深夜跑。凌晨 2-6 点跨境带宽相对空闲,用
crontab定时下载
坑4:下载的 FASTQ 解压后 MD5 不对
原因: 下载过程中网络波动导致文件损坏。wget 不加 -c 时如果网络中断,它会创建一个不完整的文件然后假装成功。
解决:
# 下载后验证完整性wget -c ftp://xxx/file.fastq.gzgzip -t file.fastq.gz # 测试gzip完整性
# 对比MD5(ENA提供MD5字段)curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRRxxx&result=read_run&fields=fastq_md5"md5sum file.fastq.gz坑5:不知道样本是单端还是双端
# 查 runinfoefetch -db sra -id SRR24205908 -format runinfo# 看 'LibraryLayout' 列:PAIRED 或 SINGLE这对选参数很重要:双端用 --split-3,单端用 --split-files。
9. 小结
| 方案 | 速度 | 稳定性 | 推荐场景 |
|---|---|---|---|
| NCBI prefetch 直连 | ★☆☆ | ★★☆ | 有代理时 |
| ENA FTP 直下 FASTQ | ★★★ | ★★★ | 首选,国内可用 |
| 清华/北外镜像 | N/A | N/A | 目前不直接镜像SRA数据 |
| aria2 + ENA | ★★★ | ★★☆ | 批量下载时 |
一句话总结:国内下 SRA 数据,先用 ENA FTP,别跟 NCBI 直连较劲。
本文于 2025-02-20 在 Debian 12 上实测完成。SRA-toolkit v3.4.1,ENA FTP 下载链路验证通过。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!