Nexus RepositoryのOrientDBを復旧させた話※追記あり

# 概要
- Nexus Repositoryで500エラーが返ってくるようになり、OrientDbを再作成して復旧させた
- ※同じような事象が再度発生し、以前と同じ方法では復旧せず別の方法で解決した内容を追記(2020/05/06)

# 環境
- [sonatype Nexus Repository Manager 3.4.0](https://hub.docker.com/layers/sonatype/nexus3/3.4.0/images/sha256-ecc5f91483f2f604f9f148ee9195d93259bb77a0d2c297bfba8db6de9fef28ac)
- docker
- linux

# 発端
- Nexusへのファイルアップロードが突然できなくなった。
    - 起動はしているのに、アップロードができない。

```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.339 s
[INFO] Finished at: 2020-01-06T01:30:50Z
[INFO] Final Memory: 10M/239M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: Failed to deploy artifacts: Could not transfer artifact jp.hoge.fuga:api:jar:1.0.1-20200106.013045-1 from/to remote-repository (https://example.com/nexus/repository/maven-api-snapshots/): Failed to transfer file: https://example.com/nexus/repository/maven-api-snapshots/jp/hoge/fuga/api/1.0.1-SNAPSHOT/api-2.10.1-20200106.013045-1.jar. Return code is: 500, ReasonPhrase: Server Error. -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
```

- ログを見ると、中で使っているDB(OrientDB)でエラーとなっている

```
2020-01-06 01:30:44,913+0000 WARN  [qtp637974386-634] admin org.sonatype.nexus.repository.httpbridge.internal.ViewServlet - Failure servicing: PUT /nexus/repository/maven-api-snapshots/jp/hoge/fuga/api/1.0.1-SNAPSHOT/api-2.10.1-20200106.013045-1.jar
com.orientechnologies.orient.core.exception.OStorageException: Error during transaction commit
	DB name="component"
2020-01-06 01:30:44,913+0000 ERROR [qtp637974386-621] admin com.orientechnologies.orient.core.storage.impl.local.paginated.OLocalPaginatedStorage - $ANSI{green {db=component}} Exception `6C3A2748` in storage `component`
java.lang.NullPointerException: null
```

# やったこと
- 同じような事象に陥っている方の記事があったので、この通りにOrientDBの復旧を試してみたが…
    - [Sonatype Nexus (3.12) が orientdb が壊れたとかで起動しなくなったら](https://qiita.com/knjname/items/202d9bfdaa63fa85b0ea)

```
# docker-compose run --rm nexus_service sh
sh-4.2$ 
sh-4.2$ java -version
sh: java: command not found
```

- 何と、当該バージョンのNexusには、javaがインストールされていなかった…
- ということで、一旦上記記事の方と同じバージョン([3.12.0](https://hub.docker.com/layers/sonatype/nexus3/3.12.0/images/sha256-31d785e67cae714663642a17957af316d1536038e9d974372cd6910401f6d108))にアップデートした上で、OrientDBの復旧手順をやってみた。

```
# docker-compose run --rm nexus_service sh
sh-4.2$ 
sh-4.2$ java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
sh-4.2$ 
sh-4.2$ # ↑よかった、javaがインストールされている！！
sh-4.2$ 
sh-4.2$ whoami
nexus
sh-4.2$ 
sh-4.2$ pwd
/
sh-4.2$ cd /opt/sonatype/nexus/
sh-4.2$ 
sh-4.2$ java -jar ./lib/support/nexus-orient-console.jar
OrientDB console v.2.2.34 (build f340442755a31eabc91b87cb3ef99eda5cee6ebd, branch 2.2.x) https://www.orientdb.com
Type 'help' to display all the supported commands.

orientdb> ### 以下コマンドのみ、結果略 ###
orientdb> CONNECT 'plocal:/nexus-data/db/analytics' admin admin
orientdb> EXPORT DATABASE analytics-export
orientdb> DROP DATABASE
orientdb> CREATE DATABASE 'plocal:/nexus-data/db/analytics'
orientdb> IMPORT DATABASE analytics-export.json.gz
orientdb> DISCONNECT
orientdb> exit

sh-4.2$ exit
# # コンテナ再起動
# docker-compose down
# docker-compose up -d
```

- 無事復旧できた。
    - 今回壊れていたのはcomponent DBのみだったので、他のDBの再作成は行っていない。

# やったこと その2 ※2020/05/06追記
- 今度はNexusそのものが起動しなくなっており、ログを見るとやはりOrientDBでエラーとなっていた。
- 前回同様のことを行ったが、途中DBへの接続でエラーとなり先進めできず。(今回壊れていたのはconfig DB)
    - エラーとなったコマンド：`CONNECT 'plocal:/nexus-data/db/config' admin admin`
- [stackoverflow](https://stackoverflow.com/questions/42951710/orientdb-corruption-state-in-nexus-repository-version-3-2-0-01)の回答の中に「.wal」ファイルを削除するという解決策があったので試してみた。

```
# docker-compose run --rm nexus_service sh
sh-4.2$ 
sh-4.2$ cd /nexus-data/db/
sh-4.2$ 
sh-4.2$ ls
OSystem  accesslog  analytics  audit  component  config  frozen.marker  model.properties  security
sh-4.2$ 
sh-4.2$ ### 復旧対象(config)のバックアップを取る ###
sh-4.2$ cp -r -p config config-bk
sh-4.2$ 
sh-4.2$ ls
OSystem  accesslog  analytics  audit  component  config  config-bk  frozen.marker  model.properties  security
sh-4.2$ 
sh-4.2$ ### configにはwalファイルがたくさん ###
sh-4.2$ ls config/*.wal
config.12913.wal
config.12914.wal
config.12915.wal
………以下略………

sh-4.2$ 
sh-4.2$ ### walファイルをすべて削除 ###
sh-4.2$ rm config/*.wal
sh-4.2$ 
sh-4.2$ 
sh-4.2$ diff config config-bk
Only in config-bk: config.12913.wal
Only in config-bk: config.12914.wal
Only in config-bk: config.12915.wal
………以下略………

sh-4.2$ 
sh-4.2$ ### この後は前回と同様 ###
sh-4.2$ cd /opt/sonatype/nexus/
sh-4.2$ 
sh-4.2$ java -jar ./lib/support/nexus-orient-console.jar

OrientDB console v.2.2.34 (build f340442755a31eabc91b87cb3ef99eda5cee6ebd, branch 2.2.x) https://www.orientdb.com
Type 'help' to display all the supported commands.

orientdb> 
orientdb> CONNECT 'plocal:/nexus-data/db/config' admin admin

Connecting to database [plocal:/nexus-data/db/config] with user 'admin'...
2020-03-24 12:16:30:289 WARNI {db=config} Storage 'config' was not closed properly. Will try to recover from write ahead log...
2020-03-24 12:16:30:296 WARNI {db=config} Restore is not possible because write ahead log is empty.OK

orientdb {db=config}> 
orientdb {db=config}> ### 接続できた！ ###
orientdb {db=config}> ### 以下コマンドのみ、結果略 ###
orientdb {db=config}> EXPORT DATABASE config-export
orientdb {db=config}> DROP DATABASE
orientdb> CREATE DATABASE 'plocal:/nexus-data/db/config'
orientdb {db=config}> IMPORT DATABASE config-export.json.gz
orientdb {db=config}> DISCONNECT
orientdb> exit

sh-4.2$ exit
# ### コンテナ再起動 ###
# docker-compose down
# docker-compose up -d
```

# 原因
- いまだに不明。

# 失敗したこと
- Nexus3.4.0でjavaがインストールされていなかったので、自力でインストールして上記手順を実施したところ、root実行してしまったため、コンテナ起動時にPermissionエラーが出続けてしまい立ち上がらなくなってしまった。

# 参考
- https://qiita.com/knjname/items/202d9bfdaa63fa85b0ea
- https://stackoverflow.com/questions/42951710/orientdb-corruption-state-in-nexus-repository-version-3-2-0-01
- https://issues.sonatype.org/browse/NEXUS-14174