expdpで「ORA-31634: ジョブはすでに存在します」になる

Oracleのバックアップにexpdpを使用している。expdpを実行したところ「ORA-31634: ジョブはすでに存在します」と「ORA-31664: デフォルト設定時に一意のジョブ名を構成できません」と見慣れないエラーが表示される。

以下のSQLでDATAPUMP_JOBSにあるジョブ名を確認する。

> select * from DBA_DATAPUMP_JOBS ORDER BY JOB_NAME
>
> OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE DEGREE ATTACHED_SESSIONS DATAPUMP_SESSIONS
> SYSTEM SYS_EXPORT_SCHEMA_01 EXPORT                         SCHEMA                         NOT RUNNING 0 0 0
> SYSTEM SYS_EXPORT_SCHEMA_02 EXPORT                         SCHEMA                         NOT RUNNING 0 0 0
>... 

なんと・・・SYS_EXPORT_SCHEMA_01~99まで、全部で99個のジョブが溜まっている。実はexp先の容量不足から一部スキーマのバックアップに失敗していた時期があって、どうやらその時に失敗したexpdpのジョブが消えること無く溜まっていたらしい。

こういう時にはexpdpにattachオプションを指定して起動し、コマンプロンプトからkill_jobを実行すれば良い。でも残念ながら下記のようなエラーになってしまい、既存ジョブにアタッチする事が出来ない。

 C:\>expdp SYSTEM/****@ORA attach=SYS_EXPORT_SCHEMA_01

Export: Release 11.2.0.1.0 - Production on 金 6月 21 09:43:34 2019

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
ORA-39002: 操作が無効です
ORA-39000: ダンプ・ファイル指定が無効です
ORA-31640: ダンプ・ファイル"C:\dmp\XXX.dmp"を読取りのためにオープンできません
ORA-27041: ファイルをオープンできません。
OSD-04002: ファイルをオープンできません
O/S-Error: (OS 2) 指定されたファイルが見つかりません。 

既存ジョブにアタッチできないので、仕方なく以下のSQLでジョブを廃棄することにする。

> DROP TABLE SYS_EXPORT_SCHEMA_01;
> ...
> DROP TABLE SYS_EXPORT_SCHEMA_99; 

これで溜まっていたジョブが削除されたので、expdpは正常に戻った。

「VBAを覚えようと思うんだけど」と聞かれた話の続き

日付をまたいで「『VBAを覚えようと思うんだけど』と聞かれた話」の続きなど。

VBAを進められない理由・・・それは2025年以降、Microsoft Officeが月額制ライセンスのみとなることで、どのパソコンにもExcelが入っている時代が終わりそうだからだ。現在のMicrosoft Officeのライセンスは大きく分けて2種類、月額制ライセンスと買切りライセンスにわけられる。このうち買切りライセンスはOffice 2019を最後のバージョンとして2025年10月にサポートが終了する。

Microsoft Officeの買切りライセンスにはユーザーライセンスとデバイスライセンスの2種類に分かれる。ユーザーライセンスは使うユーザが同じなら複数台にインストールできるが、1台のPCを複数人で共有するなら人数分のライセンスが必要だ。デバイスライセンスはインストールするPCの台数分購入する必要があるが、1台のPCを複数人で共有してもOKだ。

対して月額制ライセンスはユーザーライセンスしか用意されていない。 PCの台数より従業員の人数の方が多いという職場は少なくない。小売業とか、製造業とか。1台のPCを10人程度で共有していた場合、デバイスライセンスだったら5万円で済んだのが、月額制ライセンスだと5年で50万円くらいに膨れ上がる。この金額増を避けるためMicrosoft Officeを全部のPCにはインストールしなくなると考えている。

一般家庭向けだと法人ライセンスより高くて年間1万2千円。4人家族なら年間4万8千円。現在はプレインストールモデルのOffice Personalを1万7千円の価格差で買えるから大抵の人はインストールしている。ライセンス料が5年で24万円と言われたら、利用頻度の低いだろう一般家庭は躊躇するのではなからろうか。海外だともうちょっと安いファミリー向けライセンスもあるらしいのだが、そうだとしても結構厳しい。

僕は 上記の理由から2025年になるとMicrosoft Officeの利用が減り、比較的安いコストで使える互換製品に移る動きが再び起こると思っている。互換OfficeソフトはMicrosoft Officeのファイルをほぼ問題なく扱うことが出来る。だがVBAだけは互換ソフトで動作しない。今むやみにVBAでプログラムを作りすぎると、5年後に追い詰められる予感がするのだ。

「VBAを覚えようと思うんだけど」と聞かれた話

事務系の同僚女子に「VBAを覚えようと思うんだけど」と言われて唸ったことがある。

ITリテラシーの高い従業員が増えることや、業務が効率化されること自体は喜ばしいのだが、ことVBAだけは手放しで勧められないのだ。

VBAはVisual Basicという言語が元になっている。このVisual Basicは1998年発売の6.0を最後に、2008年4月にサポートを終了している。Office製品の一部として提供されているためセキュリティアップデートこそ提供されているが、機能面では更新されていない。20年前で進化が止まっている。

そのためVBAでは、新しいバージョンのDB利用や、WEBサービスとの連携に無理が出ているのだ。MicrosoftのSQLServerで扱うデータ型の一部は取り扱えないし、WEB APIを呼び出そうとすると恐ろしく冗長なコードを書かざる得ない。

さらにVBAはインターネットが普及してセキュリティが重要視される以前の設計なので、セキュリティ面がどうしても弱い。標準では電子署名なしのマクロを実行できないように設定されているのは、セキュリティ的に弱く攻撃の対象にされやすいためだ。

セキュリティ面ではVBAを電子署名必須として運用するか、それが出来ないなら社内から無くしたいのが実情だ。でも実態は彼方此方で活用しているので、止めるに止められないので、セキュリティ担当者は困っていたりする。

ではどうしたら良いかというと、実は代案がない。ExcelやWordのファイルを扱うことができて、ライセンス料がかからず、平易に学習できて、完璧に日本語化されていて、どのWindowsパソコンでもそのまま動かせる言語・・・というのが見当たらない。

というわけで、VBAに関する愚痴でした。ちなみに私自身は、VBAを使って、新規にはマクロを作らないことにしています。 新たに作るときにはC#+Closed XMLで書きます。もしくはPower Query+Excelの数式だけで作ります。

Microsoftにも早く今後のLoadmapを考えてほしい。

WEBサーバーの移行をしました

ようやく重い腰を上げて、サーバーのバージョンを更新しました。

これに伴ってクラウドベンダーをScalewayからVultrに切り替えました。
VultrもScalewayと同じく、月額250円前後~で格安VPSを提供しています。

Vultrの最大のメリットは日本にDCを持っている事。 Scalewayのほうが若干ですがサーバー性能・・・特にSSDの性能は高いのですが、待てど暮らせどEU以外にDCが作られる様子がないのですよね。Cloudflareと併用することでネットワークの距離に起因する応答速度の問題はクリアできていましたが、SSHなど保守作業においてレスポンスが遅いのは如何ともしがたく、 Vultrに写ることにしました。

今回はサーバーを再構築するにあたり、漸くDocker Composeベースで環境を構築することにしました。Docker Compose良いですね。現状で動かしているのはWordpressとGitbucketだけなんですが、公式イメージがDockerHubに上がっているような環境については、殆ど何もすることがなく環境を構築できるのは便利ですね。

加えてMongoDBや.NET Core環境も動作させたいのですが、流石にメモリ1GBのプランでは厳しいかな。