# 常见问题汇总

## 如何指定使用组件的版本？

您可在部署配置文件中使用版本声明。例如，如果您使用的是 OceanBase-CE 3.1.0 版本，可以指定以下配置：

```yaml
oceanbase-ce:
  version: 3.1.3
```

## 如何指定使用特定版本的组件？

您可在部署配置文件中使用 `package_hash` 或 `tag` 声明。 如果您给自己编译的 OceanBase-CE 设置了 `tag`，您可以使用 `tag` 来指定。如：

```yaml
oceanbase-ce:
  tag: my-oceanbase
```

您也可以通过 `package_hash` 来指定特定的版本。当您使用 obd mirror 相关命令时会打印出组件的 `md5` 值，这个值即为 `package_hash`。

```yaml
oceanbase-ce:
  package_hash: 589c4f8ed2662835148a95d5c1b46a07e36c2d346804791364a757aef4f7b60d
```

## 我修改了 OceanBase-CE 的代码，需要修改启动流程怎么办？

您可修改 `~/.obd/plugins/oceanbase-ce/` 下的启动相关插件。比如您为 3.1.0 版本的 OceanBase-CE 添加了一个新的启动配置，可以修改 `~/.obd/plugins/oceanbase-ce/3.1.0/start.py`。

## 如何在离线模式下更新 OBD 本地镜像？

当您安装 OBD 的机器不能连接公网，却需要更新 OBD 或其他组件时，您可按以下步骤进行操作：

1. 在一台可以连通公网的机器下载好您需要的 RPM 包。

2. 将 RPM 包拷贝到安装有 OBD 的机器中。

3. 通过 `obd mirror clone` 命令将新的 RPM 包加到 local mirror 中。

此处以更新本地仓库中的 OBD 镜像为例：

```shell
# 先在一台可以连通公网的机器上下载 OBD 最新的 RPM 包
# 最新的 RPM 包链接可以在对应的组件的 git 仓库中的 release note 或 OceanBase 开源官网（https://open.oceanbase.com/softwareCenter/community）中获得
wget https://github.com/oceanbase/obdeploy/releases/download/vx.x.x/ob-deploy-x.x.x-xxx.rpm
# 将下载好的 RPM 包拷贝到安装有 OBD 的机器（obd_server）上
sh ob-deploy-x.x.x-xxx.rpm obd_server:~
# 将下载好的镜像加入到 local 中
obd mirror clone ob-deploy-x.x.x-xxx.rpm
# 关闭远程镜像源
obd mirror disable remote
```

## 如何升级 OBD？

升级 OBD 有以下两种方式，您可根据您的实际情况进行选择：

* 如果您的机器可以连通公网或者您配置的 mirror 中有用于更新的 OBD 的 RPM 包，您可直接使用 `obd update` 命令升级 OBD。当您升级完成后可以使用命令 `obd --version` 查看版本，确认是否升级成功。

* 如果您的机器不能连通公网且您配置的 mirror 中没有用于更新的 OBD 的 RPM 包，请先通过 `obd mirror clone` 命令将用于更新的 OBD 的 RPM 包添加到 local mirror 中，之后再使用 `obd update` 命令升级 OBD。

下面展示在离线模式下，如何在 CentOS7 系统中将 OBD 升级到最新版本：

```shell
# 先在一台可以连通公网的机器上下载 OBD 最新的 RPM 包
# 最新的 RPM 包链接可以在 git 仓库中的 release note 或 OceanBase 开源官网（https://open.oceanbase.com/softwareCenter/community）中获得
wget https://github.com/oceanbase/obdeploy/releases/download/vx.x.x/ob-deploy-x.x.x-xxx.rpm
# 将下载好的 RPM 包拷贝到安装有 OBD 的机器（obd_server）中
sh ob-deploy-x.x.x-xxx.rpm obd_server:~
# 在 OBD 机器上执行以下命令完成升级
# 1.将下载好的镜像加入到 local 中
obd mirror clone ob-deploy-x.x.x-xxx.rpm
# 2.关闭远程镜像源
obd mirror disable remote
# 3.升级
obd update
```

## 如何使用 OBD 升级 OceanBase 数据库？

使用 OBD 升级 OceanBase 数据库有以下两种方式，您可根据您的实际情况进行选择：

* 如果您的机器可以连通公网或者您配置的 mirror 中有用于更新的 OceanBase 数据库的 RPM 包，您可直接使用 `obd cluster upgrade` 命令升级 OceanBase 数据库。

* 如果您的机器不能连通公网且您配置的 mirror 中没有用于更新的 OceanBase 数据库的 RPM 包，请先通过 `obd mirror clone` 将用于更新的 OceanBase 数据库的 RPM 包添加到 local mirror 中，之后再使用 `obd cluster upgrade` 命令升级 OceanBase 数据库。

下面展示在离线模式下，如何在 CentOS7 系统中使用 OBD 将 OceanBase-CE V3.1.1 升级到 V3.1.2：

```shell
# 请先确认您的 OBD 版本，如果版本低于 V1.2.1，请先更新 OBD 的版本
# 在一台可以连通公网的机器上下载 OceanBase-CE RPM 包
# 最新的 RPM 包链接可以在 git 仓库中的 release note 或 OceanBase 开源官网（https://open.oceanbase.com/softwareCenter/community）中获得
wget https://github.com/oceanbase/oceanbase/releases/download/v3.1.2_CE/oceanbase-ce-3.1.2-10000392021123010.el7.x86_64.rpm
# 将下载好的 RPM 包拷贝到安装 OBD 的机器（obd_server）中
sh oceanbase-ce-3.1.2-10000392021123010.el7.x86_64.rpm obd_server:~
# 在 OBD 机器上执行以下命令完成升级
# 1.将下载好的镜像加入到 local 中
obd mirror clone oceanbase-ce-3.1.2-10000392021123010.el7.x86_64.rpm
# 2.关闭远程镜像源
obd mirror disable remote
# 3.升级
obd cluster upgrade <deploy name> -c oceanbase-ce -V 3.1.2
```

### 报错处理

您可能会遇到 `Too many match` 的报错，这时只需在 `Candidates` 上选择一个 `hash` 即可。比如：

```shell
obd cluster upgrade <deploy name> -c oceanbase-ce -V 3.1.2 --usable 7fafba0fac1e90cbd1b5b7ae5fa129b64dc63aed
```

## 如何升级 obproxy 到 obproxy-ce 3.2.3？

由于开源 OBProxy 组件在 V3.2.3 之后正式更名为 obproxy-ce，所以您需在 OBD 的执行用户下 [执行脚本](2.how-to-upgrade-obproxy-to-obproxy-ce-3.2.3.md) 修改 meta 信息。而后使用以下命令进行升级。

```shell
obd cluster upgrade <deploy name> -c obproxy-ce -V 3.2.3
```

OBD 从 V1.3.0 开始仅支持使用 obproxy-ce 的组件名部署 V3.2.3 及之后版本的 OBProxy。但若您是使用 `obd update` 命令将 OBD 从低版本升级到 V1.3.0 及以上版本，仍支持使用 obproxy 组件名安装 V3.2.3 之前版本的 OBProxy（即：OBD 从 V1.3.0 开始不再提供 obproxy 插件库，但如果本地插件库中存在 obproxy 的插件库，则会被保留）。

> **说明**
>
> * 如果 OBD 升级后发现旧插件无法使用，可直接通过 RPM 包安装旧版本 OBD 进行覆盖。
>
> * 如果您安装的是新版本 OBD，但想使用 obproxy，也可安装 V1.3.0 之前版本的 OBD，在完成 obproxy 的部署后执行 `obd update` 命令升级 OBD，或安装新版本的 OBD 进行覆盖。

## 使用 OBD 升级 OBProxy 出现异常如何解决？

若您在升级 OBProxy 过程中出现如下问题：

```bash
Stop obproxy ok
Start obproxy ok
obproxy program health check ok
Connect to obproxy x
```

即 OBD 机器无法连接 OBProxy，可能原因有以下两种：

1. proxysys 禁用了非 127.0.0.1 的 IP 访问，导致 OBD 所在的机器不能建连，这种情况下请先执行如下命令连接到 proxysys：

   ```bash
   obclient -h<obproxy_ip> -uroot@proxysys -P<obproxy_post> -p<obproxy_pwd>
   ```

   > **说明**
   >
   > 若您在连接 proxysys 时，使用自己设置的 proxysys 密码无法连接，请尝试将密码设置为空或者 `proxysys` 进行连接。

   之后执行 `alter proxyconfig set skip_proxy_sys_private_check = true` 命令。

2. proxysys 的密码与 OBD 中存储的不一致，这种情况下请先执行上述命令连接到 proxysys ，之后执行命令 `alter proxyconfig set obproxy_sys_password = <obproxy_pwd>` 修改 proxysys 密码。

   您可将其密码修改为空（即 `obproxy_sys_password = ''`），或使其与 OBD 配置文件中存储的密码一致。

若排查后发现不是由上述两条原因引起的异常，您可到官网 [问答区](https://open.oceanbase.com/answer) 进行提问，会有专业人员为您解答。

## OBD 升级后无法启动 OBProxy 服务如何解决？

OBD 升级后会初始化 OBProxy 的密码，若您设置了 `obproxy_sys_password`，则需执行如下命令连接到 proxysys：

```bash
obclient -h<obproxy_ip> -uroot@proxysys -P<obproxy_post> -p<obproxy_pwd>
```

> **说明**
>
> 若您连接 proxysys 时，使用自己设置的 proxysys 命令无法连接，请尝试使用空密码或者 `proxysys` 进行连接。

之后使用命令 `alter proxyconfig set obproxy_sys_password = ''` 将 proxysys 的密码设置为空，或者使其与配置文件中 `obproxy_sys_password` 的密码保持一致。
