CentOS7.2へのLaravel5.4インストール

CentOS7.2へのLaravel5.4インストールをやってみました。

 

自分のやり方がもしかしたらおかしかったのかもしれないが、いろいろとつまづいたので、備忘録に残します。

 

このやり方も、もしかしたら間違っているかもしれないので、もし変なところがあったら指摘コメントをいただけると幸いです。

 

●まず、CentOSを最小構成でインストールしておく。

 ※環境はVMWare Player上にしました。

 

 

 

SELinuxをOFF

※これやっとかないと、インストール後のブラウザアクセスで500エラーになります。apacheのエラーログに

PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0

PHP Fatal error:  Unknown: Failed opening required '/home/laravel/project/public/index.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0

が出ます。

 

・とりあえずOFF
setenforce 0

・リブート後も反映されるように設定ファイル編集しておく。
vi /etc/selinux/config
disabledに変更し保存
SELINUX=disabled

 

 

●FirewalldをOFF
・とりあえず停止
systemctl stop firewalld

自動起動設定を停止しておく。
systemctl disable firewalld

 

 


●PHP7インストール
通常だとCentOS7.2はPHP5.4が標準インストールされるが、laravel5.4はPHP5.6以上が必要。PHP7をインストールするために、リポジトリを追加する。


yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

・PHP7をインストール。
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-xml
※この時同時にApacheもインストールされるらしい。

 


●composerインストール
composerを取得し、PATHが通る場所に置いておく。ここでは/usr/localbin。

curl -sS https://getcomposer.org/installer | php

mv composer.phar /usr/local/bin/composer

 

 

 

●Laravelインストール

どうもzipが必要らしい。入れておく。
yum install zip unzip

インストールはlaravel用に準備したアカウントで行う。ここではlaravel。
useradd laravel
passwd laravel

apacheがのぞけるようにパーミッションを変更。
chmod 777 /home/laravel


ここでlaravelユーザでログインしなおす

プロジェクトディレクトリを作成し、そこにlaravelをインストール。
mkdir /home/laravel/project
composer create-project laravel/laravel:5.4 /home/laravel/project

 

 


●日本語化
なんだかわからないけど日本語化。

cd /home/laravel/project

composer require laravel-ja/comja5:~1

./vendor/bin/comja5 -f
./vendor/bin/comja5 -a


composer global require laravel-ja/comja5:~1

※ どうも、PHPのソースコメントが日本語化されるっぽい。

 

 

 

デバッグモードがtrueの時にコンパイル済みコアファイル削除
php artisan optimize

※プロジェクトディレクトリの.envファイルの中にあるAPP_DEBUGがデバッグモード。install直後はtrueになっていた。

 

 

 

Apache用にパーミッション変更

chmod -R a+w storage/*
chmod -R a+w bootstrap/cache

 

 

 

Apacheの設定
・ドキュメントルート変更
vi /etc/httpd/conf/httpd

DocumentRoot "/home/laravel/project/public"
<Directory "/home/laravel/project/public">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>


httpdを再起動
systemctl restart httpd

 

・ブラウザでアクセスしてみたら、やっと出た。ここまで来るのにまる1日。実際のサイト作りはまた今度書きます。

 

 

f:id:ponkotsu_engine:20170211164812p:plain

VMWare Playerでプロキシ経由のRubyOnRails環境構築

Ruby on Railsの試験環境をVMWare Playerで作っていて、プロキシ周りでいろいろと躓いたので、備忘録に残しておきます。

 

●やりたいこと

 ・GETリクエストで適当なパラメータを投げたら、それに応じた内容のHTMLを返すこと

 ・投げたパラメータによって、タイムアウトを起こしたり、任意のHTTPステータスコードを返すようにすること

 

 

 

 

VMWare OS環境の準備: CentOS6.7

VMWare PlayerにNAT設定でCentOS6.7がすでにインストールされているものとします。
※VMWarePlayerのNAT設定は、C:\users\all users\vmware\vmnetnat.cnfに記述します。
(例)22番のSSHポートをホストPCの8822に、80番のhttpポートをホストPCの8880ポートにマッピングする場合・・・
8822 = 192.168.58.129:22
8880 = 192.168.58.129:80

反映するためにおそらくPCの再起動が必要です。

 

 


rubyのインストール

・必要なパッケージのインストール
yum -y install readline-devel git gcc zlib zlib-devel openssl openssl-devel sqlite sqlite-devel libffi-devel readline gcc-c++ glibc-headers libyaml-devel


・rbenvインストールに必要なプロキシ設定
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080


・rbenv をインストール(clone)する
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv


・PATH に追加
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile


・.bash_profile に追加
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile


環境変数を有効化
exec $SHELL -l


・rbenvのバージョン確認

rbenv --version
rbenv 0.4.0-74-g95a039a


ruby-build を インストール(clone)する
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


・プロキシ設定
echo 'proxy = "https://proxy.hogehoge.net:8080/"' >> ~/.curlrc
echo 'http_proxy = http://proxy.hogehoge.net:8080/' >> /etc/wgetrc


ruby-buildのプロキシ設定
vi /root/.rbenv/plugins/ruby-build/bin/ruby-build
http_head_curl() {
curl -qsILf "$1" >&4 2>&1
}
http_get_curl() {
curl -q -o "${2:--}" -sSLf "$1"
※これらの-qオプションを取り除く


ruby の最新版を確認
rbenv install --list
このように表示される。
Available versions:
1.8.6-p383
1.8.6-p420
1.8.7-p249
:
:
2.0.0-p195
2.0.0-p247
2.0.0-p353 ← こいつが2.0系の最新版っぽい
2.0.0-preview1
:


ruby のインストール
rbenv install -v 2.3.0


・再読み込み
rbenv rehash


rubyバージョンを確定
rbenv global 2.3.0


・バージョンの確認
ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]


・テスト用rubyで動作確認
こんな内容でhello.rbを作って動かしてみる。
puts 'Hello, world!'

ruby hello.rb
→Hello, world! と表示されればOK。

 

 


Railsのインストール


gem update --system

gem install --no-ri --no-rdoc rails

gem install bundler

rbenv rehash

・インストールバージョンの確認
rails -v
Rails 4.2.6

 

 

 

Railsアプリケーション作成
・アプリケーションを配置するディレクトリに移動
cd /root/pgm/ruby/testRails


・アプリケーション作成
rails new アプリケーション名(ここではtestRails)


cd testRails

 

 

●WEBricks起動
ここではApacheではなく、Railsに含まれている簡易WebサーバWEBricksを使います。

gem install uglifier

vi Gemfile
gem 'therubyracer', platforms: :ruby ←コメントを外す


bundle install

 


・WEBRicks起動
rails server -p 80 -b 192.168.58.129 ←明示的にIP指定しないとだめです。
=> Booting WEBrick
=> Rails 4.2.6 application starting in development on http://192.168.58.129:80
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-04-13 03:42:06] INFO WEBrick 1.3.1
[2016-04-13 03:42:06] INFO ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-04-13 03:42:06] INFO WEBrick::HTTPServer#start: pid=70530 port=80


・試しにアクセスしましょう。
http://ホストPCのIP:8880/
アクセスすると、RubyOnRailsのトップページが出ます。
About your application’s environment をクリックすると、インストール環境の情報が見れます。

 

 

●静的コンテンツ
rubyアプリケーションディレクトリのpublicの下に置くと、静的コンテンツとして閲覧可能となります。
/root/pgm/ruby/testRails/public

ログ・・・/root/pgm/ruby/testRails/log/development.log

DB・・・/root/pgm/ruby/testRails/db
RailsでDBを使う場合は、デフォルトはここにSQLiteが配置されます。

 

 

 

●コントローラ作成

rails generate controller testRails

(Railsアプリケーションのルート)/app/controllers/testRails_controller.rbがコントローラ本体に関する記述がされたファイルです。
ここにメソッドを記述していきます。

def launch
arg = params[:rocket]
if arg == "apollo"
render "testRails/apollo"
elsif arg == "shuttle"
sleep(10)              ←タイムアウトをシミュレーションする場合
render "testRails/SpaceShuttle"
else
render "testRails/h2a", status: 500  ←ステータスコードを任意のものにする場合
end
end

 


●ルーティング作成
呼び出しとアクションの紐づけを行います。
(Railsアプリケーションのルート)/config/routes.rb

編集します。下の内容の場合、http://ホスト名/rocket にアクセスすると先ほど作成したlaunchメソッドを動かします。


get 'rocket' => 'testRails#launch'


・WEBRicks起動(※停止するときにはCtrl-Cです)
rails server -p 80 -b 192.168.58.129

もしエラーが出たらrake routes でチェックします。
rake routes
ArgumentError: You should not use the `match` method in your router without specifying an HTTP method.

 


●ビューテンプレートの作成

(Railsアプリケーションのルート)/app/views/testRails

ここにxxx.html.erbファイルを作っていきます。
testRails_controller.rbで"testRails/apollo"と記載しましたので、
apollo.html.erbで適当なHTMLテンプレート等を作成します。jsonをレスポンスとして返したいのならjsonファイルをそのまま置けばいいです。

 

これで、
http://ホスト名/testRails?rocket=apollo
http://ホスト名/testRails?rocket=shuttle
にアクセスすれば、それぞれ作成したViewテンプレートで表示されるはずです。

 

 

 

一番躓いたのは、プロキシでした。なかなか社内環境でプロキシがないところって、ないですからね。ちゃんちゃん。

 

 

 

 

Windows2003でLDAPS通信

Windows2003ServerでLDAP over SSLを行う。ldapはAD問い合わせにも使えるプロトコルだ。ADのユーザやグループを問い合わせたり、ldap認証リクエストをやりとりする。しかし、ldapのままでは暗号化されていないため、たとえば認証などに使うとなるとまずいし、問い合わせ結果応答には重要な個人情報なども含まれるため、実際に業務で使う場合にはSSL化は必須だ。今日はこれをWindows2003で行う段取りについてのお話。

 

SSL化するためには証明書が必要になる。Windowsで手軽にオレオレ証明局を立てればよい。Windows2003サーバーで証明局を立てる場合には証明書サービスをインストールする。

Windows2008だとAD CAサービスだったかな。しかし2003を使っている企業もまだまだ多い。ここでは2003のCAで苦労した点をいくつかまとめる。

 

 

CAにはいくつか種類がある。

 

・エンタープライズのルートCA

・エンタープライズの下位CA

スタンドアロンのルートCA

スタンドアロンの下位CA

 

エンタープライズは、アクティブディレクトリが必須だ。エンタープライズCAを構築すると、そのドメインに参加しているコンピュータに自動的にそのルート証明書がクライアントのログイン時に配布される。ユーザはなにもしなくても自分のクライアントマシンのルート証明書ストアにCA証明書が勝手に放り込まれる。スタンドアロンCAにはこの機能はない。

 

ではスタンドアロンCAは役に立たないのかと言うと、そんなことはない。単純な話、ドメインコントローラのない環境でも使えるということだ。ドメインコントローラは組んでないけどADサーバを立てている環境などではこちらが使える。ただし証明書の自動配布などはしてくれないが。

 

 

今回はエンタープライズCA。ドメインコントローラをプライマリとバックアップで冗長化しているケース。

 

証明書サービスのインストールは、コントロールパネルのプログラムの追加と削除から実行する。インストールを実行するユーザはAdministratorだ。たしかNetworkAdminかDomainAdminである必要があったような気がするが詳細は忘れた。プログラムの追加と削除を開き、Windowsコンポーネントのインストールをクリックすると、インストールが始まる。

 

CAの種類の選択、ここではエンタープライズのルートCAだ。次に、証明局(CA)のCommonNameを指定する。ほとんどの場合はドメインFQDNを指定すればいいだろう。たとえばドメインが[example.com]だったら、そのまま[example.com]でよい。というか、CNは見分けがついて他と重複していなければなんでもよい。さらに、ここで証明局の有効期間を指定するのだが、なるたけ長期間にした方がよい。思い切って99年とかでもよい。普通の証明書は長くても2,3年くらいが普通だが、このインストール時に指定する期間は「CAとしての期間」なので、これが短いと話にならない。

 

インストール中にはインストールメディアをドライブに入れておく必要がある。ここでよくあるのが、SP(ServicePack)のバージョンによるエラーだ。Windows2003ではSP2まで出ているが、SP1購入しWindowsUpdateでSP2を適用したような場合には、SP1のメディアしかない。そうすると、インストールの途中で、

 

「XXXXXのファイルが見つかりません」

 

といったエラーに出くわす。こういう場合に役立つのが、SPダウンロードだ。ここでは現時点で普通にMicrosoftのサイトから入手できるものを例に説明する。

 

http://www.microsoft.com/ja-jp/download/details.aspx?id=41

 

まずここからSPのexeをダウンロードする。その後、コマンドラインから

WindowsServer2003-KB914961-SP2-x86-JPN.exe -x

と入力しコマンド実行すると、ファイルを展開だけしてインストールまではやらない展開モードで起動してくれる。展開先を指定し実行すると、そこにi386という名前のフォルダが生成され、その中にServicePackの全ファイル群が解凍される。

 

これを準備しておいて、先ほどの証明書サービスインストール途中で「xxxxxxのファイルが見つかりません」のダイアログが表示されたら、そこで展開したi386のフォルダを指定してやる。すると、ほとんどの場合、そこに「xxxxx.xx_」とファイル名末尾がアンダーバーになっているファイルがあり、それが目的のファイルだ。これで99%解決するだろう。

 

 

証明書サービスがインストールされると、その時点ですでにエンタープライズルートCAのサービスが立ちあがっている。ここでクライアントPCがそのドメインにログオンすると、裏で自動的にADがクライアントPCにルート証明書を配布してくれる。

 

ルート証明書とは何か?詳細は証明書のサイトを見てもらえばいいが、証明書は信頼のつながりで成り立っている。A社はB社にA社の信頼性を保証してもらい、B社はさらにC社にB社の信頼性を保証してもらう。こうしてトラストツリーが出来上がるわけだが、その頂点にいるのがルートCAだ。ルートCAにはその上がない。行き止まりだ。だからルートCAは絶対に信頼できるものでなければならない。世界でもその数は限られていて、サイバートラストやベリサインが有名だ。しかし、わざわざお金をかけてまで保証していらんという場合には、自己証明つまりオレオレCAもありだ。商用でECなどに使うことはできないが、たとえばADでLDAP認証通信をSSL暗号化するLDAPS(Ldap over SSL)に必要なサーバー証明などの場合には、オレオレでも十分だ。

 

Windows2003でLDAPSを実現する場合、ひとつ注意しなくてはならないことがある。それは、証明書サービスをインストールしてCA証明書ができあがるだけではダメで、サーバーの再起動が必要ということだ。

 

Windows2003では、ActiveDirectoryのDomainServiceがサービスとしてOSから分かれていない。そのため、ActiveDirectoryに紐づけた証明書をDomainServiceは認識してくれない。再起動しない限り、そこにある証明書に気づいてくれないのだ。

 

再起動すれば、LDAPS通信ができるようになる。確認するためには、ldp.exeというツールが便利だ。これは単純にOSインストールした状態では存在しないものだが、Windows 2003 Serverのサポートツールをインストールすれば、C:\Program Files\SupportTools\配下にインストールされる。ちなみにサポートツールはインストールメディアのSUPPORT\TOOLS配下にインストーラがあり、特にどこかからダウンロードしたりする必要はない。

 

インストールしたらldp.exeを起動しよう。2003の場合は英語メニューだったような気がする。メニューのConnectionからConnectを選択し、ホスト名にlocalhost、ポート番号は636、SSLにチェックをつけてOKクリックすると、特にエラーが出なければ正常にLDAPS通信ができている。もし何らかの問題があって通信できない場合にはエラーダイアログが出るだろう。その場合は、サーバー再起動を忘れていないか、あるいはファイアウォールで636を閉じていないかなどを確認することになるだろう。

 

 

なお、再起動すると、再起動前にはなかった証明書がひとつ増えている。mmcの証明書スナップインで確認できる。ファイル名を指定して実行でmmc実行し、スナップインの追加で「証明書」、コンピュータアカウントのローカルコンピュータの証明書を選び、スナップインに追加する。ここで「個人」の証明書ストアを見てみよう。名前がそのサーバのFQDNになっている証明書がひとつ増えているはずだ。その有効期限を見てみよう。1年間になっているはずだ。Windowsの証明書サービスでは、発行するサーバー証明書の有効期限はデフォルトで1年になっている。この値はレジストリ変更で変えることも可能だが、それはまた今度にしよう。

 

 

 

 

vmware playerにCentOS 6.2をインストール

仕事でLinuxを使うことになった。Linuxは学生時代によく使ったが、それ以来長いことあまりメインで使うことはなく、家で気が向いたときにちょっと触る程度だったので、ちょっと不安があった。

久しぶりに環境を構築するかとやってみたら、まあ世の流れの速い事よ。VMWareは無償版が普通に入手できるようになっているし、FedoraCentOSとかいうのに変わってるし。

というわけで、我が家のWindows7-64bitマシンに、VMware Player4.0をインストール。vmware playerのダウンロードにはvmwareへの登録が必要。

http://www.vmware.com/jp/products/desktop_virtualization/player/overview.html

インストールは、普通にダウンロードしたexeを実行してイエスマンになれば難なく完了。ただし、CPUが対応していないぞとか叱られる場合もある。Pentium4とかだとVMwarePlayer4が動かないようで、そういう場合には、VMwarePlayer3.4あたりを持ってくればよかろう。

そして今度はインストールするLinuxのDVDイメージファイルを取得する。今回は現時点でCentOS最新の6.2を理研ミラーサイトから持ってきた。

ftp://ftp.riken.jp/Linux/centos/6.2/isos/x86_64/
CentOS-6.2-x86_64-bin-DVD1.iso

ISOファイルがたくさんあるが、Live~とかファイル名についてるやつは、HDDインストールタイプではなくCD上で起動するタイプなので要注意。bin~のやつを選ぶ。ちなみにうちは64bitマシンなので、アーキテクチャx86_64となる。もし32bitならi686になるはず。

ダウンロードしたら、いよいよvmware playerを起動する。

・「新規仮想マシンの作成」をクリック

20120704002627

・先ほどダウンロードしたCentOSのインストーライメージを使って、直接イメージからインストールすることができる!昔はわざわざフロッピー作ってたのに・・・時代を感じます。

ここで、なにやら「簡易インストール」という文字が表示されています。一部のLinuxにだけ対応しているようですが、とにかくインストールが開始されたら完全に全自動で全てやってくれる、恐ろしく親切なモードです。ちなみにCentOS6.2のイメージインストールでは、簡易インストール以外のインストールが出来ませんでした。まあ、困りゃしないんだけど、昔インストールに苦労した時代を知っているので、なんとなく複雑な気分。

20120704002628

・初期ユーザアカウントを作ります。これ、管理者(root)権限ユーザになるので要注意です。rootはrootで別に作られまして、なぜかここで設定したパスワードがこのアカウントにもrootにも適用されます。いいのかこれで本当に。

20120704002629

・マシン名を適当につけます。これはホスト名ではない、単にvmware上での識別名だし後でなんぼでも変えられるので問題なし。

20120704002630

・インストールした後のOS仮想ディスクを1ファイルとして持たせるか、複数分散させるか。私はコピーが楽だという理由で1ファイルにするようにしていますが、実運用でどっちがいいのかは知りません。誰か知ってたら教えてください。

20120704002631

・ここで「ハードウェアをカスタマイズ」してみましょう。

20120704002632

・ここでは割り当てるメモリやCPUを変えることができます。メモリは沢山あればあるに越したことないけど、うちは8GB積んでて今後vmware上でたくさん動かす予定なので、とりあえずこいつには1GB割り当てました。

20120704002633

・そしてプロセッサつまりCPU。最近のintel系は物理的にCPUチップが1つでも、中身はコアが複数あるのが普通なので、自分のマシンのCPUに合わせて、ここは増やしたら楽しいかも。うちは8コアなので2つ割り当ててみました。

20120704002634

・あと重要なのはネットワーク。vmware playerはデフォルトではNATになる模様。宅内ではきちんと1マシンに1つのプライベートアドレスを割り当てたいので、うちはNATではなくブリッジに変更。

20120704002635

・これでパラメータ設定は完了。

20120704002636

・「完了」を押したら、インストールが始まります。

20120704002637

なんと・・・インストール中になにも聞かれません。あれ、ホスト名は?IPアドレスは??ネットマスクは??インストールするパッケージは???勝手にどうしてくれるの??VMWare Toolsは???すげーというかなんというか・・・これに頼っていたらエンジニアとしてはダメかも・・・

20120704002638

20120704002639

・そんなこんなで、気がついたらXウィンドウのログイン画面。ここでひとつささやかなオチがある。

 昔はXというと、/etc/X11R6/配下のややこしいxinitrcなどを編集したりしたものだが、Cent6.2はインストールしたらもう完全に普通にXが使える。で、このままログインすると、ウィンドウマネージャとしてはGNOMEが起動するのだが、メニューが全て英語。英語得意な人はいいけどオレはダメなので、昔なら環境変数LANG=ja_JP.eucかなんかしたところだが、Cent6.2では、このログイン画面でそれを切り替えられる。

20120704002640

20120704002641

・さて、ログインしてktermを立ち上げようかなと思ったら、メニューにそれっぽいのがないので、デスクトップで右クリックしてみたら、「端末の中に開く」とある。まさかこれかと思ったらこれだよ。ps -eで見たら「gnome-terminal」というのがあったので、たぶんこれだろう。早速起動。

20120704002642

あれ。なんかプロンプトに「デスクトップ」とカタカナで表示されてる。これってもしかして、カレントディレクトリ名称がカタカナってことか?

20120704002643

ってPWDコマンドで確認したら間違いない。念のため自分のホームディレクトリをls -Faしてみると・・・

20120704002644

ほかにもたくさんある~・・・・・なんとまあ、昔のLinuxなら日本語フォルダ名称は禁じ手だったのに。

うまく扱えるようになったのかね。そういや、LANGはUTF8になってました。マルチバイトに強くなったんだね。

・さて、ではインストールされているパッケージを見てみる。

と、ここでつまづいた。rpm -qa | moreをやりたかったのだが、コマンドリダイレクトの「|」が打てない。キーボードの設定だ。たぶんjp106ではない設定になっているんだろう。ここで昔なら/etc/X11R6/xinitrcなどを見たりしたような記憶があるが、今はもう違う。普通に画面で見て設定変更できる。

20120704002646

今日はこんなところにしておこう。明日はインストールパッケージの確認をしようっと。





やっとできたshutdown / startup!!!

shutdownについて、大きく理解が進展。

まず、WindowsマシンにおけるOracleインスタンスについて。

こちらのサイトが非常に参考になった。
http://www.shift-the-oracle.com/config/startup-oracle.html

Windowsマシンでは、Oracle.exeはサービスのプロセスとして存在する。そのプロセスの中で、インスタンスは1つのスレッドとして存在するらしい。つまり、Oracleサービスが立ち上がっている状態で、インスタンスをスレッド起動したり停止したりする。なので、サービスが起動していなければ、インスタンスは起動できないし停止もできない。

先日、shutdownを実行したのに、なぜかサービスは起動したままだった、というのは、このことだったのだ。




そしてもうひとつ。
sqlplusからshutdownを実行した時の動作について。

コマンドプロンプトから

shutdown normal

とすると、画面が固まり、受け付けなくなってしまった。
同時に別コマンドプロンプトを開いてsqlplus接続しようとすると、リスナーが新規接続を拒否しているエラーが出て接続すらできない。

なんででしょうと職場のDBAに聞いたら、一発で解決した。

shutdown には、normal、transactional、immediate、abortの4種類のオプションがある。詳細は上記のサイトに譲るが、ようは、normalだと、生きているセッションがある限り、shutdownシーケンスが始まってくれないのだ。

夜間バッチなどで普通に使用するのは immediate だという。
ためしにやってみた。

 SQL> conn sys/password@orcl as sysdba
 接続されました。
 SQL> shutdown immediate
 データベースがクローズされました。
 データベースがディスマウントされました。
 ORACLEインスタンスがシャットダウンされました。
 SQL>

ちゃんと制御が戻ってきました!!

では、今度はstartupをやってみよう。

 SQL> startup
 ORA-12528: TNS:リスナー: 該当するインスタンスはすべて、新規接続をブロックしています
 SQL>

うーむ。また壁にぶつかった。さっきのサイトを見てみる。

startupは、OS認証でと書いてある。ああなるほど。つまりインスタンスはアイドル状態にあるから、インスタンス認証はできない、つまりOracleのsysでは接続できないってことだ。当たり前っちゃ当たり前だね。

というわけで、OS認証つまり、Win2000Serverの管理者権限でログインをしてみる。

 D:\>sqlplus /nolog
 SQL*Plus: Release 10.1.0.2.0 - Production on 日 9月 11 10:47:22 2011
 Copyright (c) 1982, 2004, Oracle. All rights reserved.
 SQL> conn Administrator/password as sysdba
 ERROR:ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました
 SQL>

ネットワーク系のエラーが出た。もしかして、別マシンからログインしようとしてるからかな。試しにサーバにログインしてやってみる。


 C:\>sqlplus /nolog
 SQL*Plus: Release 10.1.0.2.0 - Production on 土 9月 10 18:45:45 2011
 Copyright (c) 1982, 2004, Oracle. All rights reserved.
 SQL> conn Administrator/password as sysdba
 Connected.
 SQL>

やったね!うまくいきました。これでstartupしてみよう。

 SQL> startup
 ORACLE instance started.
 Total System Global Area 171966464 bytes
 Fixed Size 787988 bytes
 Variable Size 145750508 bytes
 Database Buffers 25165824 bytes
 Redo Buffers 262144 bytes
 Database mounted.
 Database opened.
 SQL>

やった〜!!!!!
やっとできました。

なるほどね。Windows環境においては、Oracleのサービスは起動したままで、OS管理者権限でsqlplus接続した状態で、shutdown または startup を実行する、ってことですね。

次は、startupの各ステージである、unmount, mount, open それぞれでなにがどう進んでなにが出来てなにが出来ないのかを試してみようと思っています。

shutdownてなんなんだよ〜!2

OracleインスタンスにSYSDBAで接続した状態で

shutdown normal

を実行しても、Windowsサービス上で見ると、サービス自体は「開始」状態となっている。

そこで、Windowsサービス上で「OracleServiceORCL」を停止した状態で、

sqlplus /nolog
connect sys/orcl@orcl as sysdba

を実行してみた。すると・・・

ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました

だって。ネットで検索。

http://www.shift-the-oracle.com/oerrs/ora-12560.html

ううむ。Windows限定だが、サービスがちゃんと起動していないとこのエラーが出て接続できないらしい。これってやっぱりリスナーのエラーだよね。

つまり、サービスとしては常に起動していないとSYSDBA接続できず、つまりSTARTUPも出来ない。SHUTDOWNする時には当然サービスは起動しているだろうけど、実際にSHUTDOWNを実行すると、そのシーケンスの中でリスナーが接続を切ってしまう。

すごい矛盾だらけのような気がするのだが・・・まだ勉強が足りないようだ。精進します。

materialized view

名前がカッコイいよね。マテビューとか略す人多いけど、オレは略したくないよ。

materialized view は、実体を持つビューで、普通のビューはアクセスを受けるとビューsqlが走るが、マテリアライズドビューは、実体データを持つので、sqlが走らずに済む。チューニングに困った時にビューをマテリアライズドビューに置き換えるのはよく使う手だ。

でも気をつけないといかんこともあり。

ただ作っただけではインデックスがない。別途create indexしてやらないと使い物にならないだろう。あと、元表への更新が発生したときに、どういうタイミングでマテリアライズドビューに反映させるか。もしリアルタイムなら、エンタープライズエディションでないとだめ。後で追記する。