概要
- Nexus Repositoryで500エラーが返ってくるようになり、OrientDbを再作成して復旧させた
- ※同じような事象が再度発生し、以前と同じ方法では復旧せず別の方法で解決した内容を追記(2020/05/06)
環境
- sonatype Nexus Repository Manager 3.4.0
- 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の復旧を試してみたが…
# 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)にアップデートした上で、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の回答の中に「.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エラーが出続けてしまい立ち上がらなくなってしまった。