未雨绸缪,数据保护之NBU介质备份
摘要:华为GaussDB目前已支持NBU介质的备份与恢复,本文主要描述了华为GaussDB数据库和NetBackup对接进行备份、恢复的配置方法与性能调优方法。
一、简介
企业要想避开自然灾难和站点中断的影响,必须将数据副本远程备份至异地机器中。 这样当生产站点发生重大灾难事故时候,本地的生存存储与备份存储数据可能都会丢失,此时需要从异地备份存储上恢复数据,从而保证数据不丢失。Netbackup 是目前金融行业使用最广的备份软件之一(简称NBU),是Veritas(赛门铁克)主要产品 。华为GaussDB目前已支持NBU介质的备份与恢复,本文主要描述了华为GaussDB数据库和NetBackup对接进行备份、恢复的配置方法与性能调优方法。
二、NBU部署方式
当前GaussDB NBU备份方案支持两种部署架构,分别为侵入式部署于非侵入式部署。
NBU侵入式部署
当GaussDB所在集群支持NBU系列软件安装时,部署方式采用NBU侵入式部署,部署结构如下图:
NBU侵入式部署方案可以借阅 【GaussDB对接NBU备份环境配置指南】
具体使用方法如下:
注意:
- --media-destination: 该参数为NBU policy名称
- --metadata-destination: 元数据目录(本地路径)
- --prior-backup-key: 该参数为增量备份依赖的备份集
- --backup-key: 该参数指定恢复备份集
1、全量备份:
python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination /data1/roachbackup/metadata --parallel-process 3
2、增量备份
python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/roachbackup/metadata --parallel-process 3 --prior-backup-key 20200912_083324
3、全量/增量恢复
python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination /data1/roachbackup/metadata --backup-key 20200912_083324
4、单表备份
python $GPHOME/script/GaussRoach.py -t backup --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990
5、单表恢复
python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990 --backup-key 20190826_151600
6、多表备份
python $GPHOME/script/GaussRoach.py -t backup --master-port 9500 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/omm/table.list
7、多表恢复
python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 9500 --media-destination $GAUSSHOME/roachbackup/mediadata --media-type nbu_policy --metadata-destination $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/apdba/table_list.txt --backup-key 20190511_183652 -
8、数据库级备份
python $GPHOME/script/GaussRoach.py -t backup --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU
9、数据库级恢复
python $GPHOME/script/GaussRoach.py -t restore --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU --backup-key key 20190511_193122
NBU非侵入式部署
当前NBU系列软件只支持x86机器,NBU非侵入式部署则支撑NBU系列软件无法在ARM、欧拉系统安装的场景。如下图所示,假如已有3节点GaussDB集群,Roach备份工具将本节点的集群数据通过TCP发送到远端NBU Media Server机器。每台NBU Media Server上面同时安装NBU Client,并部署Roach client组件,后者接收集群内Roach进程发来的备份数据,不落盘方式通过XBSA接口转发给本机的NBU Client,完成NBU备份。恢复流程也类似,只是数据流相反。
Roach client插件安装:
从DWS管控面的连接管理界面下载Roach client组件包到集群本地,然后拷贝出来。如下:
useradd omm
passwd omm # 输入密码
su - omm
cd /data/omm/ # 变更为本地安装目录, 将Roach client安装tar包拷贝至此目录下
mkdir roach_client
tar -zxvf GaussDB-8.1.0-REDHAT-x86_64bit-RoachClient.tar.gz -C roach_client
cd /data/omm/roach_client/bin/
source roach_client_env
./roach_client -p ip:8888 -H 0/0 -D -l roach_client.log # ip为当前部署roach_client机
ps -ef | grep roach_client # 启动后检查roach_client是否启动成功
注意:/roach_client -p ip:8888 -H 0/0 -D -l roach_client.log
其中ip为当前部署roach_client机器, 8888为roach_client开放端口,用于沙箱内集群各节点和NBU Media Server之间TCP通信传输备份文件 ; -l 为指定日志路径
备份方式:
注意:
- --media-destination: 该参数为NBU policy名称
- --metadata-destination: 元数据目录(本地路径)
- --nbu-on-remote:该参数指定部署方式为NBU非侵入式部署
- --nbu-media-list: 该参数指定NBU Media Server的ip清单,按行输入ip地址
- --client-port: 该参数指定Roach client插件的对外开放通信端口
- --prior-backup-key: 该参数为增量备份依赖的备份集
- --backup-key: 该参数指定恢复备份集
1、全量备份:
python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination /data1/roachbackup/metadata --parallel-process 3 --nbu-on-remote --nbu-media-list /home/Ruby/media.txt --client-port 8888
2、增量备份
python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/roachbackup/metadata --parallel-process 3 --nbu-on-remote --nbu-media-list /home/Ruby/media.txt --client-port 8888 --prior-backup-key 20200912_083324
3、全量/增量恢复
python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination /data1/roachbackup/metadata --backup-key 20200912_083324 --nbu-on-remote --nbu-media-list /home/Ruby/media.txt --client-port 8888
4、单表备份
python $GPHOME/script/GaussRoach.py -t backup --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990 --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000
5、单表恢复
python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990 --backup-key 20190826_151600 --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000
6、多表备份
python $GPHOME/script/GaussRoach.py -t backup --master-port 9500 --media-destination nbu_policy --media-type NBU --metadata-destination $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/omm/table.list --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000
7、多表恢复
python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 9500 --media-destination $GAUSSHOME/roachbackup/mediadata --media-type nbu_policy --metadata-destination $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/apdba/table_list.txt --backup-key 20190511_183652 --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000
8、数据库级备份
python $GPHOME/script/GaussRoach.py -t backup --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000
9、数据库级恢复
python $GPHOME/script/GaussRoach.py -t restore --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU --backup-key key 20190511_193122 --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000
三、NBU流程概述
备份数据流
NBU 一般涉及NBU Master Server、NBU Media Server、NBU client,属于一个three-trie结构。
本章节主要介绍NBU进程工作原理,方便使用者、开发者了解NBU备份流程,排查问题。
下图中为通过备份所涉及的数据流向
基本备份过程:
1、启动备份方式:
- 当 nbpem 服务检测到某项作业到了启动时间时,将开始进行预定的备份操作。nbpem会检查到了启动时间的预定客户机备份的策略配置。
- 如果管理员在 NetBackup 管理控制台中选择了手动备份选项,将开始进行即时手动备份。这会使 bprd 联系 nbpem,然后 nbpem 将处理管理员所选择的策略、客户机和日程表。
- 当客户机上的用户通过该客户机上的用户界面(或者通过 bpbackup 或xbsa系列接口)启动备份或回复时,将开始进行用户控制的备份或回复操作。这将调用该客户机的 XBSA程序,该程序向主服务器上的请求后台驻留程序 bprd发送请求。当前Roach NBU介质备份采用这种启动方式。
2、接收备份任务: 响应进程(bprd)接收到客户端的备份请求,
- bprd: request manager请求管理器:
bprd是Master Server的守护进程,bprd进程主要负责对客户机请求作出响应,并将并向nbjm发出 job请求,用于提交备份并获取job ID。
3、将请求转发个策略执行管理器nbpm
- nbpem: policy execution manager策略执行管理器
策略执行管理器服务 (nbpem) 执行以下操作:
a. 通过nbproxy从 bpdbm 中获取策略列表, 查询到有效的备份policy的是否存在;
b、向 nbjm 提交当前已到预定启动时间的所有作业(按照schedule执行时间的策略)。
4、为备份job分配资源
a、nbjm(job manager作业管理器)接收到任务后,nbjm首先会与bpjobd通信,将此job添加至job列表中,此时在Activity Monitor中该job以queue状态可见。b、nbjm通过nbrb 请求资源,nbrb负责分配资源以响应来自 nbjm 的请求。并从 nbemm (企业介质管理器服务)获取物理资源,并管理逻辑资源,如多路复用组、每个客户机的最多作业数、每个策略的最多作业数。 当nbrb进程从nbemm获取到所需资源时,会返回通知nbjm资源已分配。
b、当nbrm资源分配完成后,nbjm会调用 image database 创建临时快照文件,此时该job会在Activity Monitor中该job以active状态可见。
5、开始备份
a、当job处于active状态后,nbjm通过bpcompatd与NBU Media Server上的客户端服务(bpcd)进行连接,其中bpcompatd服务通过专用小交换机(PBX)和NetBackup旧式网络服务(vnetd)创建连接。b、bpcd进程是NBU Media Server上的守护进程,允许Master Server或NBU Client启动程序。bpcd接收到连接后会启动Netbackup 备份恢复管理器(bpbrm)。
b、bpbrm进程服务通过PBX与vnetd与NBU client机器上的bpcd进程建立连接,启动NBU client机器上的bpbkar,其中bpbkar负责生成备份image,并将image数据发送至NBU Media Server上的bpdrm,对于每个备份或恢复job,都会在NBU Media Server上启动一个bpbrm实例用于传输image数据。bpdrm进程会启动磁带/磁盘管理进程bptm,对于磁盘介质,bptm直接与磁盘通信。对于磁带介质,bptm保留驱动器并向逻辑磁带接口守护程序(ltid)发出安装请求。 ltid服务调用机械手驱动器守护程序(txxd,其中xx根据所使用的机械手的类型而异)。 txxd守护程序将安装请求传达给机械手控制守护程序(txxcd),后者将安装介质。
6、结束备份
bpbkar服务通过bptm发送备份数据,以将其写入介质存储或磁盘存储。 备份完成后,将通知nbjm并将消息发送到bpjobd。此时job在“Activity Monitor”中显示为“done”。 nbjm服务还会将作业退出状态报告给nbpem,nbpem将重新计算作业的下一个到期时间。
四、XBSA相关接口
NBU软件提供的libxbsa64.so动态库(实现了标准的XBSA系列接口),将本地数据传送到NBU服务器,然后由NBU服务器负责落盘到磁带介质上。 GaussDB的专用备份工具Roach,负责调用libxbsa64.so库将本地数据库文件备份到远端NBU服务器。 本章节则主要针对开发者,介绍XBSA系列接口。
备份相关接口
备份过程中涉及的XBSA相关接口主要如下:
- BSAQueryApiVersion:该接口用于确定Netbackup XBSA接口的当前版本。
- BSAInit:该接口用于对XBSA应用程序进行身份验证,与NetBackup XBSA接口建立session会话,并为调用者的后续API调用建立环境。注意,BSAInit不支持嵌套创建session会话。
- BSABeginTxn:
该接口用于创建一个事物,这里的事物和数据库事物概念相似,BSABeginTxn()调用向NetBackup XBSA接口指示作为原子单位执行的一个或多个操作的开始,即所有操作将成功或没有成功。可以将一个动作假定为为特定目的而进行的单个函数调用或一系列函数调用。
例如,一个BSACreateObject()调用后跟多个BSASendData()调用并以BSAEndData()调用终止可以被视为单个操作。 在正常使用中,BSABeginTxn()调用总是与随后的BSAEndTxn()调用耦合。如果在事务期间调用BSATerminate(),则事务中止。
注意,BSABeginTxn不支持嵌套创建事物。
- BSACreateObject:
BSACreateObject调用在NetBackup中创建一个XBSA对象。 该调用将启动NetBackup XBSA接口与NetBackup服务器之间的通信。然后可以将XBSA对象数据传递到内存缓冲区中。BSACreateObject调用中的dataBlockPtr参数允许调用者获取有关NetBackup XBSA接口所需的缓冲区结构的信息。
- BSASendData:
BSASendData()将字节数据流发送到缓冲区中的NetBackup XBSA接口。如果要发送的字节数据流很大,则可以多次调用BSASendData()。此调用只能在BSACreateObject()或另一个BSASendData()调用之后使用。
- BSAEndData:
调用方在调用BSACreateObject之后调用零次或多次BSASendData,当前备份文件传输完毕后调用BSAEndData,用于通知Netbackup服务器当前文件传输结束
- BSAEndTxn:
BSAEndTxn与BSABeginTxn耦合使用,以标识将被视为事务的API调用或一组API调用。。
- BSATerminate:
BSATerminate调用终止与NetBackup XBSA接口的会话,该接口由BSAInit调用对应,释放当前session会话获取的所有资源。如果在事务内调用BSATerminate(),则事务中止。
恢复相关接口
恢复过程中涉及的XBSA相关接口主要如下:
- BSAQueryObject:
BSAQueryObject调用从NetBackup XBSA界面启动有关NetBackup XBSA对象文件的信息请求。查询结果由查询描述符中指定的搜索条件确定。在BSA_ObjectDescriptor(由objectDescriptorPtr参数引用)中返回满足查询搜索条件的第一个XBSA对象的XBSA对象描述符。
- BSAGetData:
BSAGetData从NetBackup XBSA接口请求XBSA对象文件数据。在BSAGetObject()调用之后或在其他BSAGetData调用之后使用此调用。
五、问题定位
使用Roach工具NBU备份发生故障时,可通过以下思路进行问题定位
NBU管理控制界面activity monitor可显示相关的备份、恢复job。 job类型分为三类:
- 蓝色站立人性:表示该次备份/恢复操作已成功执行完毕;
- 绿色跑步人形:表示该次备份/恢复操作正在执行;
- 红色x形:表示该次备份/恢复操作失败,可根据Status查询NBU官方文档获取错误相关原因;
例如上图中失败job返回码为13,则可根据文档信息定位排查原因
若NBU界面无失败job,则一般问题出现在了Roach侧,可根据Roach日志进行定位。
六、参数调优
Roach工具目前支持两种NBU部署结构,分别为NBU侵入式部署于NBU非侵入式部署,两种部署方式的参数调优分别如下:
1、通用参数调优
- Maximum concurrent jobs
此值指定了对应存储单元上最大作业数量,取值范围为1-256,
例如准备将三个备份作业发送到存储单元,并将“最大并发作业数”设置为两个。前两个作业开始,而第三个作业等待。
- Maximum vault jobs:
此属性指定在master server上允许活动的最大活跃job数量。如果达到了允许活动的job限制,则将后续的kob排队,并且它们状态在“活动监视器”中显示为“已排队”。此属性设置范围为1~200, 当备份过程并发job数大大超过200,则master server会出现瓶颈,造成任务排队耗时。此时应考虑部署多Master Server模式。
设置NET_BUFFER_SZ :
在应用Netbackup备份数据到带库时,有一个NET_BUFFER_SZ参数,决定media server与client之间数据传输的缓冲池大小,该参数值默认为32032 bytes,以文件形式保存于%Install_Path/netbackup/目录下。通常默认值都较小,如果希望修改该参数值,则直接修改%Install_Path/netbackup/NET_BUFFER_SZ即可,例如:
host-192-168-241-40:/usr/openv/netbackup # echo 65536 > /usr/openv/netbackup/NET_BUFFER_SZ
host-192-168-241-40:/usr/openv/netbackup # more /usr/openv/netbackup/NET_BUFFER_SZ
65536
设置一个足够大的NET_BUFFER_SZ某些情况下能够有效提高备份的速度,推荐在server/client端都设置该参数。
2、NBU侵入式部署调优
- Maximum jobs per client:
此值设定每个NBU client发送的并行处理任务数,通常Roach与并行参数相对性,一般设置为DN数+CN数为最佳。
3、NBU非侵入式部署调优
- Maximum jobs per client:
此值设定每个NBU client发送的并行处理任务数,通常Roach与并行参数相对性,一般设置为
(DN数+CN数)*(Roach client 服务的Roach agent)个数为最佳。
4、超时设置
超时属性适用于选定的Master server、Media Server以及NBU client
- Client connect timeout:
此选项指定服务器连接客户端时等待的秒数。默认值为300s。一般Roach备份业务中,建议此值设置为3600s或者更高。此选项适用于NBU Master Server、NBU Media Server、NBU Client。
- Client read timeout:
此选项指定用于客户端读取超时的秒数。此选项适用于NBU Master Server、NBU Media Server。默认值为300s,如果服务器在客户端在此超时时间内没有从客户端得到响应,则备份/恢复任务失败,报错误码13。特别是针对于NBU Job复用场景,文件间隔传输时间超过此值,则备份/恢复任务失败。建议此值设置为3600s或者更高。
- Media server connect timeout
此选项用于指定Master Server连接Media Server的等待超时描述,默认值为300s。建议此值设置为3600s。此选项适用于NBU Master Server、NBU Media Server。
未雨绸缪,数据保护之NBU介质备份的更多相关文章
- 1.6 NBU Catalog备份还原
用户的数据保存到了磁盘或者磁带中,并且是安全的,NBU所在的机器还有可能发生故障,需要重新安装或者将NBU部署到其他的机器中继续使用. 在这种情况下,如何让NBU知道用户已经存在的备份策略和存储单元配 ...
- NBU显示备份成功,但实际是无备份成功
从3月18日开始到4月3日是备份失败的 GROUPSIZE 7 OPERATION BACKUPDATABASE "DBADB" SQLHOST "yicatong&qu ...
- NBU客户端备份失败,报错error 48 client hostname could not be found
今天在做备份时发现了这个报错.经过ping, nslookup, bpclntcmd命令检查没有发现连接或域名解析存在问题. 参考文档http://www.symantec.com/docs/TECH ...
- 1.4 NBU配置备份策略(Policy)
1.4 配置备份策略(Policy) 一个备份策略由四部分组成. Attributes(属性) Policy是否Active Policy类型 由此Policy产生的任务的优先级 使用的Storage ...
- nbu异地备份实施前,数据收集日志
1.修改bp.conf配置文件显示重删率 BPDBJOBS_COLDEFS = JOBID 5 true BPDBJOBS_COLDEFS = TYPE 7 false BPDBJOBS_COLDEF ...
- NBU是最牛逼的备份软件
NBU是最牛逼的备份软件 TSM是IBM的备份 好好看看几个厂商 VERITAS 公司下的NBU入门级备份有BEHP的备份软件有DPIBM的是TSMCommvault也非常牛逼这都是做到了小机AI ...
- Oracle数据库备份、灾备的23个常见问题
为了最大限度保障数据的安全性,同时能在不可预计灾难的情况下保证数据的快速恢复,需要根据数据的类型和重要程度制定相应的备份和恢复方案.在这个过程中,DBA的职责就是要保证数据库(其它数据由其它岗位负责) ...
- Oracle备份之RMAN
1.备份:物理备份时文件层次的备份,逻辑备份时数据层次的备份,物理备份为主,逻辑备份作为补充.物理备份分为用户管理备份和RMAN备份,前者使用SQL命令和OS的cp命令进行文件备份,后者使用RMAN工 ...
- nbu恢复 oracle10g rac asm 到单实例asm(恢复某个表空间)
一 检验条件 二 准备工作 1 创建相关目录 mkdir -p /oracle/admin/orcl/adumpmkdir -p /oracle/admin/orcl/bdumpmkdir -p /o ...
随机推荐
- javascript布局转换
javascript布局转换是将原有的浮动布局通过JS里面的javascript属性 offsetLeft 和offsetTop默认值来给元素设置绝对定位. 原来的:缺点--我们想给网页中的图片添加拖 ...
- BUUCTF 不一样的flag writeup
感谢BUUCTF提供的学习平台 https://buuoj.cn 题目:不一样的flag 工具:x64dbg 这是一道内存的迷宫题,迷宫是402000处的字符串 根据经验,这应该(a行*b列)的字符, ...
- 关于Java集合框架,这篇讲的还算不错了,建议大家看看!
集合框架 为什么要用集合而非数组: 虽然数组是保存一组对象最有效的方式,但是数组具有固定尺寸,但在写程序时并不知道将需要多少个对象.而集合能够自动地调整自己的尺寸. 打印数组时,必须使用Arrays. ...
- ABBYY FineReader 与资源管理器的集成使用
ABBYY FineReader 15(Windows系统)与 Windows 资源管理器的集成使用后,在不打开软件的情况下,可通过右击启动快捷菜单开启. 通过与Windows资源管理器的集成,用户可 ...
- 怎么在word里编辑插入数学公式?
大学时代我们都有一个共同的噩梦--高数.每次上完高数课都有一些数学公式.可是我们最难的就是想用电脑在word中做笔记的时候该怎样用word插入公式.Word中自有的公式太少,新公式又太难输入.这也是一 ...
- 怎么用Camtasia给视频添加片头片尾
有许多朋友现在喜欢自己拍摄一些小视频,现在不管是在抖音还是在B站,我们看到的大部分视频都有UP主自己制作的片头或片尾.片头做的好,甚至会有人因为片头而关注UP主,能吸引更多的人来观看视频. 所以,如果 ...
- NOIP2012 解题报告
TG Day1 T3 开车旅行 1. 预处理出从每座城市两人分别会到达的两座城市. 用 set 可以轻松实现. 2. 用倍增优化 DP 令 \(f_{i,j,k}\) 表示从城市 \(j\) 出发,行 ...
- 【树形dp】【CF161D】distance on a tree + 【P1352】没有上司的舞会
T1题面: 输入点数为N一棵树 求树上长度恰好为K的路径个数 (n < 1e5, k < 500) 这是今天的考试题,也是一道假的紫题,因为我一个根本不会dp的蒟蒻只知道状态就一遍A掉了- ...
- 线性代数中的线性方程组(chapter 1)
目录 线性代数中的线性方程组 线性方程组 行化简解法和阶梯型矩阵 向量方程 矩阵方程$Ax = b$ 线性代数中的线性方程组 第一章从线性方程组的角度,通过解线性方程组,开始解释数学矩阵,以及和线性代 ...
- java12(eclipse断点调试)
选择结构switch 1.格式: switch(整型数据){ case 值A:System.out.println("");break; case 值B:System.out.pr ...