Oracle Cloud Infrastructure DatabaseでOSをアップデートする

- <font color="red">2019/10/16 Oracle Linux 7対応の記述を増強。すべてのDBバージョンで新規作成はOracle Linux 7に統一</font>
- <font color="red">2019/07/23 Oracle Database 19c（Oracle Linux 7）対応</font>
- <font color="red">2019/05/31 東京リージョン対応</font>

# 1. はじめに
Oracle Cloud Infrastructure Database（以降DBaaS）は、DBバージョンやインスタンス作成時期によって、デフォルトではyumリポジトリを利用できないことがある。

デフォルトで利用できないときは、マニュアルに記載の手順に従って設定する必要がある。

またデフォルトで使用できるときでも、DBaaS固有のYumアップデートの作法を理解することが好ましい。

本エントリでは、手順を説明すると共に、さらに掘り下げて解説する。

**マニュアルの該当箇所**
[Updating a DB System - OS Updates](https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/updatingDB.htm)
[DBシステムの更新 - OSアップデート](https://docs.oracle.com/cd/E97706_01/Content/Database/Tasks/updatingDB.htm)

### 1-1. TL;DR

* <font color="red">~~OCIのDBaaSは、デフォルト状態ではOSをアップデートできない。~~少なくともOracle Linux 7はデフォルトで利用できるようになった</font>
* マニュアルに設定方法の記述はあるけれど表面的なので、内部の仕組みを掘り下げる

### 1-2. 前提条件

* Oracle Cloud Infrastructure Database（Oracle Linux 6.x, Oracle Linux 7.x）
* DBaaSインスタンスがプライベートサブネットにあるときは、Service Gatewayが構成されているか、NAT Gateway経由でInternetにアクセスできること
* DBaaSインスタンスがパブリックサブネットにあるときは、Service GatewayもしくはInternet Gatewayが構成されていること

# 2. yumリポジトリを利用できるように構成する

基本的にはマニュアルの手順に従って実施すること。ただし大きく違っている箇所があるときは、Oracle Cloudがアップデートされ、それに伴いマニュアルが更新されたと考えてほしい。

### 2-1. 現在のリポジトリを確認する
デフォルトのリポジトリ情報を確認する。repoファイルがないので有効になっているリポジトリが無い。

**Oracle Linux 6**

```shell-session
# yum repolist enabled
Loaded plugins: kernel-update-handler, security, ulninfo
repolist: 0
```

**Oracle Linux 7**

```shell-session
# yum repolist enabled
Loaded plugins: kernel-update-handler, ulninfo, versionlock
Excluding 240 updates due to versionlock (use "yum versionlock status" to show them)
repo id           repo name                                            status
ol7_UEKR4/x86_64  Latest Unbreakable Enterprise Kernel Release 4 for O     103+9
ol7_latest/x86_64 Oracle Linux 7Server Latest (x86_64)                 13207+733
repolist: 13310
```

### 2-2. Yum実行に必要なファイルを取得する

Yum実行に必要な**repoファイル**と**versionlockファイル**をObject Storageから取得する。

<font color="blue">Oracle Linux 7では、デフォルトでYumが使えるように設定されている。そのため**repoファイル**と**versionlockファイル**を取得しなくてもYumを利用できる。</font>

<font color="blue">ただし、versionlockファイルは定期的に更新されるようだ。そのため再ダウンロードを推奨する。</font>

#### 2-2-1. Linuxのバージョンを確認する

Oracle Linux 6とOracle Linux 7では手順が異なる。そのため、使用しているバージョンを確認する。

```shell-session
$ cat /etc/oracle-release
Oracle Linux Server release 7.5
```

**Oracle Linux 7だけの確認事項**

以下のカーネルバージョンを使用しているときは/etc/fstabも修正する必要がある。詳しい手順はマニュアルの「<a href="https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/updatingDB.htm">To update an OL7 OS on a DB system host</a>」を参照すること。

```shell-session
$ uname -r
4.1.12-124.27.1.el7uek.x86_64
```

#### 2-2-2. 現在のリージョンを確認する

ファイルの取得先を確認するために、現在のリージョンを確認する。東京リージョンでは`ap-tokyo-1`、Phoenixでは`phx`と表示される。

```shell-session
# curl -s http://169.254.169.254/opc/v1/instance/ |grep region
  "region" : "ap-tokyo-1",
```

PhoenixのURIは、`phx`ではなく`us-phoenix-1`であることに注意する。

<font color="blue">**ヒント**
Phoenixのように「指定するリージョン名」と「curlの結果」に違いがあると戸惑う。Object StorageのRESTエンドポイントは、以下のマニュアルで確認できるので、うまくいかないときは確認すること。</font>

[API Reference and Endpoints](https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apiref.htm)
上記ページで[Object Storage and Archive Storage]-[Swift API (for use with Oracle RMAN)]を展開

#### 2-2-3. repoファイルを取得する
URLの一部を自身のリージョンに変更してrepoファイルを取得する。

**Oracle Linux 6（東京リージョン）**

```shell-session
# wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/oci_dbaas_ol6repo -O /tmp/oci_dbaas_ol6repo
```

**Oracle Linux 7（東京リージョン）**

```shell-session
# wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/oci_dbaas_ol7repo -O /tmp/oci_dbaas_ol7repo
```

#### 2-2-4. versionlockファイルを取得する

同様の手順でversionlockファイルをダウンロードする。versionlockの仕組みはあとで使用する。

**Oracle Linux 6（東京リージョン）**

```
# wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/versionlock_ol6.list -O /tmp/versionlock.list.ol6
```

**Oracle Linux 7（東京リージョン）**

```
# wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/versionlock_ol7.list -O /tmp/versionlock.list
```

### 2-3. ダウンロードしたファイルのdiffを確認する

この作業は省略してよいが、参考までにデフォルトでインストールされているファイルと、ダウンロードしたファイルを比較してみよう。なお本文ではOracle Linux 7を使用している。

#### 2-3-1. repoファイルを比較する

 ```shell-session
diff -uNr /etc/yum.repos.d/public-yum-ol7.repo /tmp/oci_dbaas_ol7repo
```

今回実行したときは、すべてdiffになった。異なる点は、参照しているYumリポジトリのサーバーの違いである。

```
★デフォルトのファイル
baseurl=https://yum.oracle.com/repo/OracleLinux/OL7/latest/$basearch/
★新しくダウンロードしたファイル
baseurl=http://yum-nrt.oracle.com/repo/OracleLinux/OL7/latest/$basearch/
```

#### 2-3-2. versionlockファイルを比較する

diffを取ると、ダウンロードしたほうが新しい内容になっている。

```shell-session
diff -uNr /etc/yum/pluginconf.d/versionlock.list /tmp/versionlock.list
```

```:一部を抜粋
-0:kernel-uek-4.1.12-124.27.1.el7uek.*
+0:kernel-uek-4.1.12-124.29.3.1.el7uek.*　★こちらの方がバージョンが新しい
```

また作成時期の違うOracle Database 19c（Oracle Linux 7）同士を比較すると違う結果になった。このことから次のことがわかる。

* <font color="blue">repoファイルやversionlockファイルは定期的に更新される</font>
* <font color="blue">Yumを実行するときは、これらのファイルを更新してから実行した方がよい（とくにversionlockファイル）</font>


### 2-4. ダウンロードしたrepoファイルの中身を確認する

repoファイルを見ると、すべて```enabled=1```になっている。

```shell-session
# cat /tmp/oci_dbaas_ol7repo
--- ここから下がファイルの中身 ---
[ol7_UEKR4]
name=Latest Unbreakable Enterprise Kernel Release 4 for Oracle Linux $releasever ($basearch)
baseurl=http://yum-nrt.oracle.com/repo/OracleLinux/OL7/UEKR4/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1★

[ol7_UEKR4_archive]
name=Unbreakable Enterprise Kernel Release 4 for Oracle Linux $releasever ($basearch) - Archive
baseurl=http://yum-nrt.oracle.com/repo/OracleLinux/OL7/UEKR4/archive/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1★

[ol7_latest]
name=Oracle Linux $releasever Latest ($basearch)
baseurl=http://yum-nrt.oracle.com/repo/OracleLinux/OL7/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1★
```

もし```enabled=0```になっていたときは、次のコマンドで一括変更できる。

```
yum-config-manager --enable "*"
```

#### 2-4-1. repoファイルに書かれているホスト

repoファイル（/etc/yum.repos.d/*.repo）でYumリポジトリのホスト名を確認すると、サービスやリージョンによって異なることがわかる。リージョンごとのリポジトリ参照が推奨だが`yum.oracle.com`を参照していることもある。そのときは修正しよう。

| サービス | ホスト名 |
|:-:|:-:|
| Compute(Tokyo)  | yum-tokyo.oracle.com  |
| DBaaS(Tokyo) ダウンロード | yum-nrt.oracle.com |
| DBaaS(Tokyo) Oracle Linux 7デフォルト | yum.oracle.com |
| Compute(Phoenix)  | yum-phx.oracle.com  |
| DBaaS(Phoenix) ダウンロード | yum-phx.oracle.com |
| DBaaS(Phoenix) Oracle Linux 7デフォルト | yum.oracle.com |

<font color="blue">**ヒント**
ComputeにおけるYumリポジトリのホスト名は`yum$ociregion.oracle.com`のように変数で定義されている。変数の実体は`/etc/yum/vars/ociregion`に定義してあり、各リージョンのYumリポジトリを参照している。</font>

#### 2-4-2. yum.oracle.comとyum-nrt.oracle.comの違い

`nslookup`で調べると、yum-tokyoとyum-nrtは同じサーバーなのに対し、yum.oracle.comとは異なるサーバーである。

また前者は、OCI以外からアクセスできないようにホワイトリスト制御しているのに対し、yum.oracle.comはどこからでもアクセスできる。

```shell-session
# nslookup yum-nrt.oracle.com　★１
Server:         169.254.169.254
Address:        169.254.169.254#53

Non-authoritative answer:
yum-nrt.oracle.com      canonical name = yum-ap-tokyo-1.oracle.com.
Name:   yum-ap-tokyo-1.oracle.com
Address: 192.29.36.128

# nslookup yum-tokyo.oracle.com　★２は１と同じホストを指している
Server:         169.254.169.254
Address:        169.254.169.254#53

Non-authoritative answer:
yum-tokyo.oracle.com    canonical name = yum-ap-tokyo-1.oracle.com.
Name:   yum-ap-tokyo-1.oracle.com
Address: 192.29.36.128　

# nslookup yum.oracle.com　★こちらはまったく違うサーバ。AkamaiのCDNを利用している
Server:         169.254.169.254
Address:        169.254.169.254#53

Non-authoritative answer:
yum.oracle.com  canonical name = public-yum.oracle.com.edgekey.net.
public-yum.oracle.com.edgekey.net       canonical name = e10877.g.akamaiedge.net.
Name:   e10877.g.akamaiedge.net
Address: 104.85.241.187
```

下記のKnown Issuesでも触れているように、yum.oracle.comはOCIのService Gateway経由ではアクセスできない。Internet GatewayもしくはNAT Gatewayでアクセスする必要がある。

逆にyum-nrt.oracle.comやyum-phx.oracle.comなどのリージョンごとのリポジトリは、Service Gateway経由でもアクセスできる。

* [Known Issues:Issues with access to Oracle yum services through service gateway](https://docs.cloud.oracle.com/iaas/Content/knownissues.htm#sgw-image-yum)

### 2-5. repoファイルを配置する

repoファイルを/etc/yum.repos.d/にコピーして利用できるようにする。Oracle Linux 7は、デフォルトで`/etc/yum.repos.d/public-yum-ol7.repo`が配置されている。

**Oracle Linux 6**

```
# cp /tmp/oci_dbaas_ol6repo /etc/yum.repos.d/ol6.repo
```

**Oracle Linux 7**

Oracle Linux 7では、デフォルトでrepoファイルが存在する。このまま利用できるが、参照先がyum.oracle.comのときは、ダウンロードしたファイルに差し替えるか、文字列置換したほうがよいだろう。

1. repoファイルがあるか確認する。

```shell_session
# ls -l /etc/yum.repos.d/*repo
-rw-r--r-- 1 root root 10237  4月 10  2018 /etc/yum.repos.d/public-yum-ol7.repo
```

2.repoファイルをバックアップする。

```shell_session
# mv /etc/yum.repos.d/public-yum-ol7.repo  /etc/yum.repos.d/public-yum-ol7.repo.org
```

3.repoファイルをコピーする。

```shell_session
# cp /tmp/oci_dbaas_ol7repo /etc/yum.repos.d/ol7.repo
```

**ヒント:sedで参照先サーバーを変更する**

ダウンロードしたファイルを使う場合には不要だが、以下のsedコマンドでリージョンごとのYumリポジトリを参照するように変更できる。

```shell-session
sed -i -e "s/yum.oracle/yum-tokyo.oracle/" /etc/yum.repos.d/public-yum-ol7.repo
```

### 2-6. versionlockファイルを配置する

1. 次のコマンドを実行して、何も表示されないときはversionlockをインストールする。

```shell-session
# インストールされているか確認する。表示されたときはインストールされている。
rpm -q yum-plugin-versionlock

# 何も表示されないときだけインストールする。
yum install yum-plugin-versionlock -y
```

2.versionlockファイルをバックアップし、ダウンロードしたものと置換する。

```shell-session
cp /etc/yum/pluginconf.d/versionlock.list /etc/yum/pluginconf.d/versionlock.list-`date +%Y%m%d`
cp /tmp/versionlock.list /etc/yum/pluginconf.d/versionlock.list
```

### 2-7. Yumリポジトリにアクセスできることを確認する

リポジトリに正常にアクセスできることを確認する。初回はリポジトリ情報を取得するので少し時間がかかる。もし```enabled=1```になっていて表示できないときは、ネットワークの設定に問題がある。

```shell-session
# yum repolist enabled
Loaded plugins: ulninfo, versionlock
Excluding 302 updates due to versionlock (use "yum versionlock status" to show them)
repo id           repo name                                            status
ol7_UEKR4/x86_64  Latest Unbreakable Enterprise Kernel Release 4 for O     103+9
ol7_latest/x86_64 Oracle Linux 7Server Latest (x86_64)                 15445+851
repolist: 15548
```

ここまで終わればyum updateを実行して問題ない。次のセクションではversionlockファイルを調べてみる。

# 3. Hacking versionlock

Yumの設定が終わり、一通り使えるようになったので内部動作を調べてみる。

### 3-1. versionlockファイルを調べる

versionlockはアップデートするパッケージのバージョンを制限する機能である。詳細は以下のページや``` man yum-versionlock```や```man yum-versionlock.conf```を見るとして、ここではダウンロードしたファイルの中身を確認する。

[How to restrict yum to install or upgrade a package to a fixed specific package version? ](https://access.redhat.com/solutions/98873)


529行もあるので重要な部分を確認する。

```
# wc -l /etc/yum/pluginconf.d/versionlock.list
529 /etc/yum/pluginconf.d/versionlock.list
```

カーネル（kernel-uek）のエントリを確認する。

```
# grep -3 kernel-uek /etc/yum/pluginconf.d/versionlock.list
0:zookeeper-3.4.9-1.*
0:yum-plugin-security-1.1.30-17.0.1.el6_5.*
0:linux-firmware-20171128-56.git17e62881.0.2.el6.*
0:kernel-uek-firmware-4.1.12-124.24.5.el6uek.*
0:kernel-uek-4.1.12-124.24.5.el6uek.*
0:initscripts-9.03.53-1.0.3.el6_8.2.*
0:dcs-cli-18.3.3.0.0_LINUX.X64_190311-1.*
0:jre1.8-1.8.0_201-fcs.*
```

このコマンドでも同じものを表示できる。

```
# yum versionlock list | grep -3 kernel-uek
```

versionlockファイルの書式は以下のようになっている。EPOCHはRPMの新旧バージョンを比較する番号で、デフォルトは0である。0のときはバージョン番号やリリース番号でパッケージを比較する。しかしEPOCHが指定されているときにはEPOCHを使って比較する。

```
EPOCH:NAME-VERSION-RELEASE.ARCH
```

カーネル行を見てみよう。これはUEKの4.1.12-124.24.5まで利用できることを表す。

```
0:kernel-uek-4.1.12-124.24.5.el6uek.*
```

### 3-2. versionlock使用時のYumの動作を調べる

設定が終わり、一通りを理解できたところで、versionlockがどのように作用するのか確認する。

現在のカーネルを確認すると4.1.12-124.20.3になっている。したがってversionlockファイルに書かれている4.1.12-124.24.5までアップデートできる。

```
# uname -r
4.1.12-124.20.3.el6uek.x86_64
```

インストールされているカーネルを調べると、Computeと異なりUEKだけである。

```
# rpm -qa | grep kernel | sort
dracut-kernel-004-411.0.1.el6.noarch
kernel-headers-2.6.32-754.3.5.el6.x86_64
kernel-transition-2.6.32-0.0.0.3.el6.x86_64
kernel-uek-4.1.12-124.20.3.el6uek.x86_64
kernel-uek-firmware-4.1.12-124.20.3.el6uek.noarch
```

アップデート可能なパッケージを確認するとkernel-uekも含まれ、さらにバージョンもversionlockファイルに書かれた4.1.12-124.24.5になっている。

```
# yum check-update
Loaded plugins: kernel-update-handler, security, ulninfo, versionlock

iscsi-initiator-utils.x86_64      6.2.0.873-27.0.7.el6_9       ol6_latest
kernel-uek.x86_64                 4.1.12-124.24.5.el6uek       ol6_UEKR4_archive★この行
kernel-uek-firmware.noarch        4.1.12-124.24.5.el6uek       ol6_UEKR4_archive
ntp.x86_64                        4.2.6p5-15.0.1.el6_10        ol6_latest
ntpdate.x86_64                    4.2.6p5-15.0.1.el6_10        ol6_latest
```

リボジトリの最新は、どのバージョンまでリリースされているか確認する。ところがlist availableではversionlockの影響を受けてインストールできないものは表示されない。

```
# yum list available kernel-uek-4.1.12
Loaded plugins: kernel-update-handler, security, ulninfo, versionlock
Available Packages
kernel-uek.x86_64            4.1.12-124.24.5.el6uek            ol6_UEKR4_archive
```

yum updateinfoを使うと、リポジトリ上の最新は4.1.12-124.26.10であることがわかる。つまり最新は4.1.12-124.26.10であるが、PaaSとして検証済みなのは4.1.12-124.24.5までと推測できる。

```
# yum updateinfo list available | grep kernel-uek-4.1.12
ELSA-2018-4261 Important/Sec. kernel-uek-4.1.12-124.20.7.el6uek.x86_64
ELSA-2018-4265 Important/Sec. kernel-uek-4.1.12-124.21.1.el6uek.x86_64
ELBA-2018-4278 bugfix         kernel-uek-4.1.12-124.22.1.el6uek.x86_64
ELBA-2018-4281 bugfix         kernel-uek-4.1.12-124.22.2.el6uek.x86_64
ELSA-2018-4288 Important/Sec. kernel-uek-4.1.12-124.22.4.el6uek.x86_64
ELSA-2018-4299 Important/Sec. kernel-uek-4.1.12-124.23.1.el6uek.x86_64
ELSA-2018-4307 Important/Sec. kernel-uek-4.1.12-124.23.2.el6uek.x86_64
ELBA-2019-4314 bugfix         kernel-uek-4.1.12-124.23.4.el6uek.x86_64
ELSA-2019-4315 Important/Sec. kernel-uek-4.1.12-124.24.1.el6uek.x86_64
ELSA-2019-4510 Important/Sec. kernel-uek-4.1.12-124.24.3.el6uek.x86_64
ELSA-2019-4528 Important/Sec. kernel-uek-4.1.12-124.24.5.el6uek.x86_64
ELSA-2019-4531 Important/Sec. kernel-uek-4.1.12-124.25.1.el6uek.x86_64
ELSA-2019-4575 Important/Sec. kernel-uek-4.1.12-124.26.1.el6uek.x86_64
ELBA-2019-4587 bugfix         kernel-uek-4.1.12-124.26.3.el6uek.x86_64
ELSA-2019-4594 Important/Sec. kernel-uek-4.1.12-124.26.5.el6uek.x86_64
ELSA-2019-4596 Important/Sec. kernel-uek-4.1.12-124.26.7.el6uek.x86_64
ELSA-2019-4619 Important/Sec. kernel-uek-4.1.12-124.26.10.el6uek.x86_64★これ
```

versionlockファイルは定期的に更新されるようだ。なるべく新しいパッケージを使いたいならば、yum updateの際にversionlockファイルも新しく取得した方がよいだろう。

# 4. パッケージをアップデートする

いよいよ実際にパッケージをアップデートする。どの方法がよいのか考えてみたい。

### 4-1. パッケージのアップデート方法
 
パッケージをアップデートする方法は、以下の2つの選択肢がある。できるだけ安定度を求めるならば、最小限の後者が推奨である。ただし安定を求めて、なるべく変更を少なくしたほうがいいかというと、ときには例外があると思うのだが。

* アップデート可能なパッケージをアップデートする

```
# yum update
```

* 重要度が高いセキュリティフィックスが適用されているパッケージをアップデートする

```
# yum update-minimal --security 
```

先ほどcheck-updateで5つアップデートできることがわかったので、最少のパッケージだけをインストールしてみよう。するとntp関連だけがアップデートされることがわかる。

```
# yum update-minimal --security
Loaded plugins: kernel-update-handler, security, ulninfo, versionlock
No package matched to upgrade: kernel-uek-0:4.1.12-124.26.10.el6uek
No package matched to upgrade: kernel-uek-firmware-0:4.1.12-124.26.10.el6uek
Resolving Dependencies
--> Running transaction check
---> Package ntp.x86_64 0:4.2.6p5-12.0.1.el6_9.2 will be updated
---> Package ntp.x86_64 0:4.2.6p5-15.0.1.el6_10 will be an update
---> Package ntpdate.x86_64 0:4.2.6p5-12.0.1.el6_9.2 will be updated
---> Package ntpdate.x86_64 0:4.2.6p5-15.0.1.el6_10 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package       Arch         Version                      Repository        Size
================================================================================
Updating:
 ntp           x86_64       4.2.6p5-15.0.1.el6_10        ol6_latest       600 k
 ntpdate       x86_64       4.2.6p5-15.0.1.el6_10        ol6_latest        78 k

Transaction Summary
================================================================================
Upgrade       2 Package(s)

Total download size: 678 k
```

とはいえ2019年5月ころの変更情報でiscsi関連のパッケージを更新せよ的なリリースがあったような気がする。となるとiscsi-initiator-utilsも更新した方がいいことになる。このあたりは個別で調べろと言うことか。

と思い、--securityを付けないで実行すると、見事iscsi-initiator-utilsがインストール候補になった。

```
# yum update-minimal
Loaded plugins: kernel-update-handler, security, ulninfo, versionlock
No package matched to upgrade: kernel-uek-0:4.1.12-124.20.7.el6uek
No package matched to upgrade: kernel-uek-firmware-0:4.1.12-124.20.7.el6uek
Resolving Dependencies
--> Running transaction check
---> Package iscsi-initiator-utils.x86_64 0:6.2.0.873-27.0.3.el6_9 will be updated
---> Package iscsi-initiator-utils.x86_64 0:6.2.0.873-27.0.7.el6_9 will be an update
---> Package ntp.x86_64 0:4.2.6p5-12.0.1.el6_9.2 will be updated
---> Package ntp.x86_64 0:4.2.6p5-15.0.1.el6_10 will be an update
---> Package ntpdate.x86_64 0:4.2.6p5-12.0.1.el6_9.2 will be updated
---> Package ntpdate.x86_64 0:4.2.6p5-15.0.1.el6_10 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                 Arch     Version                    Repository    Size
================================================================================
Updating:
 iscsi-initiator-utils   x86_64   6.2.0.873-27.0.7.el6_9     ol6_latest   739 k
 ntp                     x86_64   4.2.6p5-15.0.1.el6_10      ol6_latest   600 k
 ntpdate                 x86_64   4.2.6p5-15.0.1.el6_10      ol6_latest    78 k

Transaction Summary
================================================================================
Upgrade       3 Package(s)
```

* 通常は`yum update`を実行する
* 変更差分を少なくしたいときは`yum update-minimal`を実行する

### 4-2. ローリングアップデート

アップデートしたカーネルを有効にするにはOSを再起動する必要がある。2ノードRAC環境はローリングアップデートに対応しているので、システムを停止しないでカーネルをアップデートできる。

ただしOSを再起動する前に、該当ノードのClusterwareを完全に停止する必要がある。


# 5. その他

### 5-1. Ksplice対応は？

KspliceとはOracle Linuxが提供するライブ・パッチング・システムで、RHELのkpatchに類似する機能である。Kspliceを使用すると、再起動すること無くカーネルアップデートなどを実現できる。

* オンプレミスの場合、Oracle Linux Premier Supportを契約し、必要な設定をすれば利用できる
* Oracle Cloud Infrastructure Computeの場合、Oracle Linuxを選択したときに限り、デフォルトでKspliceを利用できる
* Oracle Cloud Infrastrucutre Databaseの場合、作成時期によってはKspliceを利用できる

Kspliceを利用できるかは以下のコマンドで確認できる。次のようにaccesskeyが表示されればKspliceを利用できる。

```shell-session
# grep accesskey /etc/uptrack/uptrack.conf
accesskey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx（実際には英数文字列）
```

* [OCIでKspliceを使う Part1](https://qiita.com/yamada-hakase/items/81b3331e79d59b947509)
* [OCIでKspliceを使う Part2](https://qiita.com/yamada-hakase/items/b00a2495a03b539407aa)


### 5-2. PaaSはRHCK非対応

PaaSではUEKからRHCKへの変更をサポートしていない。そのため勝手にRHCKに変更しないこと。OCI-Cのときはexclude設定が入ってたので変更できなかったが、今回さわったイメージでは強引にインストールできてしまった。

# 6. まとめ

**基本**

* DBaaSのOSをアップデートするには、原則として事前の設定作業が必要
* 同一DBバージョンでも、インスタンス作成時期によってOracle Linux 6とOracle Linux 7のときがある。2019/10現在、すべての新規作成インスタンスはOracle Linux 7に統一
* versionlockによって、インストール／アップデートできるパッケージのバージョンを制限している
* アップデートしたカーネルを有効にするには、OSを再起動する必要がある（Ksplice非使用時）

**応用**

* versionlockファイルは定期的に更新されるので、パッケージアップデートの際には、先に更新することを検討する
* DBaaSはUEKカーネルだけをサポートしているのでRHCKに変更しない
* `yum update-minimal`を指定すると、アップデート差分を最少にできる
* RAC環境はローリングアップデートに対応している
* Kspliceはインスタンスの作成時期・種類によって使用できる

# 9. コピペ用まとめバージョン

東京リージョン用なので、他のリージョンでは適宜修正すること。

**Oracle Linux 6**

```shell_session
# repoファイルダウンロード
wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/oci_dbaas_ol6repo -O /tmp/oci_dbaas_ol6repo

# verionlockファイルダウンロード
wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/versionlock.list -O /tmp/versionlock.list

# repoファイルをコピー
cp /tmp/oci_dbaas_ol6repo /etc/yum.repos.d/ol6.repo

# Yumリポジトリの動作確認
yum repolist enabled

# versionlockをインストール
yum install yum-plugin-versionlock -y

# versionlockの設定ファイルを更新
cp /etc/yum/pluginconf.d/versionlock.list /etc/yum/pluginconf.d/versionlock.list-`date +%Y%m%d`
cp /tmp/versionlock.list /etc/yum/pluginconf.d/versionlock.list
```

**Oracle Linux 7**

```shell_session
# repoファイルダウンロード
wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/oci_dbaas_ol7repo -O /tmp/oci_dbaas_ol7repo

# verionlockファイルダウンロード
wget https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/dbaaspatchstore/DBaaSOSPatches/versionlock_ol7.list -O /tmp/versionlock.list

# repoファイルをコピー
mv /etc/yum.repos.d/public-yum-ol7.repo  /etc/yum.repos.d/public-yum-ol7.repo.org
cp /tmp/oci_dbaas_ol7repo /etc/yum.repos.d/ol7.repo

# Yumリポジトリの動作確認
yum repolist enabled

# versionlockの設定ファイルを更新
cp /etc/yum/pluginconf.d/versionlock.list /etc/yum/pluginconf.d/versionlock.list-`date +%Y%m%d`
cp /tmp/versionlock.list /etc/yum/pluginconf.d/versionlock.list
```