CentOS7にOracle12cをインストールする 準備編

 

ただいまOracleMasterBronz12cDBAの合格目指してお勉強中。

 

Linuxのお勉強はそれが終わってからなんだけど

白本に載ってる環境を構築してみることになったので

VirtualBoxでCentOS7を起動してOracle12cをインストール

 

その経過と困ったこと

わすれるのでメモメモ

 

まず必要なパッケージをインストール

[root@testuser ~]# yum -y install binutils compat-libcap1 gcc gcc-c++ glibc glibc.i686 glibc-devel glibc.i686 ksh libaio libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ libstdc++l7.i686 libstdc++-devel libstdc++-devel.i686 compat-libstdc++-33 compat-libstdc++-33.i686 libXi libXi.i686 libXtst libXtst.i686 make sysstat 

 

なんだけどそもそもいまこれ[testuser@localhost ~]#

rootユーザーって、どうすればいいの・・・

suでユーザー切り替えすればいいっていろんなところに書いてあるからしたけど
passwordしらない・・・

調べ方が悪いのか良い記事に出会えない・・・

最終的に

Ubuntuは初期状態ではrootが使えない(パスワード未設定)ようになっている」

という記事をみつけてUbuntuとか知らないけど試しにやってみたらいけた(´•ω•̥`)

```
$ sudo su -
Pssword:(自分のパスワード)
# passwd
[rootのパスワードを設定]

```

ここだけでめっちゃ時間かかった。

ちなみにUbuntuLinuxの人気ディストリビューションLinuxの人気の配布形態)らしい。初心者におすすめだって。

 

さて次にカーネルパラメータを編集

[root@testuser ~]# MEMTOTAL=$(free -b | sed -n '2p' | awk '{print $2}')

[root@testuser ~]# SHMMAX=$(expr $MEMTOTAL / 2)
[root@testuser ~]# SHMMNI=4096
[root@testuser ~]# PAGESIZE=$(getconf PAGE_SIZE)
 
ここまではよかった。
 
[root@testuser ~]# cat >> etc/sysctl.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmmax = $SHMMAX
kernel.shmall = `expr \( $SHMMAX / $PAGESIZE \) \* \( $SHMMNI / 16 \)`
kernel.shmmni = $SHMMNI
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF 
 
これなに。どうすればいいの。どこまでがなんなの。
cat >> etc/sysctl.conf << EOFのままだとなんか怒られるから
とりあえずいろいろ調べてcat etc/sysctl.confとかしたけど結局だめだった(これ意味あったのだろうか・・・)
わかる人にみてもらってvimを使って設定してもらった。
これはLinuxの勉強したらわかるっぽいので今回はおいておくよ
 
それから
[root@testuser ~]# sysctl -p
 
なんかこれも出力おかしいねって言われたけど
原因は不明です。
一応ちゃんとできはした。

 

オラクル専用のユーザー/グループを作成し、システムの環境設定

 

[root@testuser ~]# i=54321; for group in oinstall dba backupdba oper dgdba kmdba; do

groupadd -g $i $group; i=`expr $i + 1`
done

[root@testuser ~]# useradd -u 1200 -g oinstall -G dba,oper,backupdba,dgdba,kmdba -d /home/oracle oracle 


[root@testuser ~]# passwd oracle

[root@testuser ~]# mkdir -p /u01/app/oracle 

[root@testuser ~]# chown -R oracle:oinstall /u01/app 

[root@testuser ~]# chmod -R 775 /u01 

[root@testuser ~]# vi /etc/pam.d/login

 

session required pam_namespace.so

session    required     pam_limits.so
session    optional     pam_keyinit.so force revoke

[root@testuser ~]# vi /etc/security/limits.conf 
最終行に追記
oracle soft nproc 2047
oracle  hard  nproc   16384
oracle  soft  nofile  1024
oracle  hard  nofile  65536
oracle  soft  stack   10240
oracle  hard  stack   32768

  viはvimのことを指していて、編集できるようにするためのもの

Linuxはやく勉強しなきゃ〜

 

最後にOracle用の環境設定

作業は「Oracle」ユーザーで行うから

[root@testuser ~]# su oracle

で切り替え

 

[root@testuser ~]# vi ~/.bash_profile

 

この二つを最終行に追加

umask 022
export ORACLE_BASE=/u01/app/oracle

 

[oracle@localhost ~]$ mkdir tmp

 

これでインストール準備完了〜

 

参考はここ

https://www.server-world.info/query?os=CentOS_7&p=oracle12c&f=1

http://linux40.hateblo.jp/entry/20070903/1188797994

お世話になりました。

めっちゃ長かった〜

続きはまた今度。寝る〜。

 

Oracle12c ターミナルでの使い方 メモ

Oracle12c ターミナルでの使い方

docker psで現在の状況を確認

 STATUSがUpになっていたら

 sqlplus system/manager@localhost:1521/orcl

 を実行

dockerをstopさせる

docker stop d32cce0f7605

 このあと

docker ps

 で確認すると何も表示されない

dockerをstartさせる

docker ps -a

 で

d32cce0f7605

 を見つける

docker start d32cce0f7605

 でdockerをstartさせる

使い終わったら

docker stop d32cce0f7605 

 でdockerをストップさせる

sqlplusがないと言われた場合

source ~/.bashrc

 を入力

Docker手順

docker手順

ステータスの確認

docker-machine ls

・nameがoracle-xe-11gのstateの欄を確認する

stateがrunningだった場合実行する

docker-machine stop oracle-xe-11g

olacleが動くためのdockerコンテナを動かすdockermachineを起動する

docker-machine start oracle-xe-11g

環境変数を適用する

eval "$(docker-machine env oracle-xe-11g)"

dockerコンテナを起動する

docker run -d -p 49162:22 -p 49163:1521 wnameless/oracle-xe-11g
sqlplus system/oracle@localhost:1521/xe
alter user system account unlock;

Dockerコンテナに接続して作業する場合

docker-machine内のdockerコンテナを起動するホストマシンに接続する

 docker-machine ssh oracle-xe-11g

dockerコンテナに接続

ssh root@localhost -p 49162

パスワード

admin

Are you sure you want to continue connecting (yes/no)? yes

成功

root@f8a87db3745b:~#

Oracleユーザーにスイッチ

su oracle

sqlplusにログイン

sqlplus system/oracle

Oracleのしくみ1

 

今回から 小田圭二/著 の絵で見てわかるOracleの仕組み アーキテクチャと動作を徹底図解

という本で勉強したことをのせていきます〜

 

一章

IOとディスクの関係

 

まずOracleで重視されていることが三つあって

  • 並列処理を可能にし、高スループットも実現
  • レスポンスを重視
  • COMMITされたデータは守る

この三つを守るためにいろんな工夫がされているみたい

 

OracleDBMS(データ管理システム)でディスクからデータを読み込み処理をして、ディスクにデータを書き戻すという作業をしている

だからOracleとディスクは切っても切れない関係なんだって

 

そのディスクはめちゃくちゃ回転速度がはやくて

データを読み書きするために頭出しというのをしないといけないのだけど、これがシーク

で、欲しい情報が回転してくるまで待つのを回転待ち時間という

 

でもディスクだと時間がかかるし、メモリのほうが断然はやいらしい。ちなみにメモリはCOMMIT前のデータを保持している

 

データの読み書きの方法にシーケンシャルアクセスというのがあって、これは先頭から間を抜かさずにデータの読み書きをする

フルスキャンのときにメモリにデータがないとシーケンシャルアクセスが発生する

これめっちゃ時間かかるから、メモリにあるインデックスを使うと必要な箇所だけ読めばいいから便利!

でも必要な箇所がディスク上で連続していることはほとんどないからヘッドというのを動かして飛び飛びにアクセスする

これがランダムアクセス

ランダムアクセスはシークと回転待ちに時間をさくから非効率らしい

 

あとCOMMITされたデータは守るっていうところ

Oracleのプロセスが異常終了してもデータを失ってはいけないからデータ変更後にCOMMITを入力するとOracleはデータをディスクに書き出している

ここを高速に処理するための仕組みもあるけどそれは後々!

 

こんな感じかな〜

本は詳しい絵も載っててわかりやすかったし内容ももっと詳しく書いてありました〜おすすめ◎

 

SQL入門 4章 :)

 

今日はスッキリわかるSQL入門(中山清喬・飯田理恵子著)4章〜 

検索結果の加工

 

SELECT文だけに可能な修飾というのがあるらしいからとりあえずかいておく〜

 

◎DISTINCT

  • SELECT文に付加すると結果表の中で内容が重複している行があれば取り除いてくれる
  • データの種類を取得したいとき役にたつ
  • DISTINCT修飾だけはSELECT文の最初に記述する必要があるので注意!

 

◎ORDER BY

  • SELECT文の最後にORDER BY句を記述すると指定した列の値を基準として検索結果を並び替え取得できる
  • 昇順にする場合はASC、降順にする場合はDESCを指定(ちなみに初期値は昇順)
  • ORDER BY句に文字列を指定するとDBMSに設定された照合順序(文字コード順、アルファベット順など)を基準として並び替えられる

ORDER BY句における列指定に列番号を用いる場合、SELECT文の選択列リストの記述を修正すると並び替えの結果にも影響が及ぶので注意!

 

◎LIMIT

  • LIMIT句には全部で何件のデータを取得するのかを整数値で指定
  • OFFSETは先頭からではなくデータの途中から数えたい場合に任意で指定する

LIMIT句は ORDER BY句と併用されることが多い機能だがLIMIT句だけでも使用可能

 

集合演算子

 

集合演算とはSELECT命令によって抽出した結果表を1つのデータの集合ととらえ、その結果同士を足し合わせたり、共通部分を探したりといったさまざまな演算を行ってくれる

 

◎UNION

2つのSELECT文をUNIONでつないで記述すると、それぞれの検索結果を足し合わせた結果(和集合)が返される

UNIONでは重複行を1行にまとめるのに対しUNION ALLでは重複行をすべてそのまま返す

 

◎EXCEPT/MINUS

ある集合と別の集合の差である差集合を求める

OracleDBではMINUSをつかう

差集合はどの集合を基準とするかによって結果が変わるのでSELECT文の順番に注意が必要 

 

◎INTERSECT

2つのSELECT文に共通する行を集めた積集合を求める

 

4章はこんな感じかな。

 

ORDER BY句のASC(昇順)ってつけなくても昇順になるのになんであるんだろ。

 

  いまMySQL使ってるんだけど、MySQLではこの章のEXCEPTが使えないのと、INTERSECTがなんかちょっと違う感じになってて、調べてみたけど死にそう。言ってることはなんとなくわかるからとりあえずこんな感じでやってみる。うまくいくかは知らない。

参考

qiita.com

codezine.jp

 

なんかいろいろ記事あさってたけど、なぜその書き方をしたのか、そのクエリを使用した理由を説明できたらちゃんとわかってることになるのかな〜?

いまはこのときはこれをつかうって感じで表面的にしかわかってない感じする

ちょっと意識してやってみよかな〜

 

次は5章 式と関数

 

SQL入門 3 :)

 

今日はスッキリわかるSQL入門(中山清喬・飯田理恵子著)3章〜

操作する行の絞り込み

 

WHERE句の大切さ

・WHEREから始まるのをWHERE句という

・WHEREを使うと処理対象となる行の絞り込みができる

・テーブル内すべての行を更新したり削除するのってなかなかないから、WHERE句を重宝するらしい

 

◎WHERE句の基本

  • 処理対象行の絞り込みに用いる(WHEREを指定しない場合すべての行が処理対象)
  • SELECT,UPDATE,DELETE文で使用可(INSERT文では使ったらダメ)
  • WHEREのうしろには条件式を記述

 

WHEREのうしろには条件式と呼ばれる式しか書けない

 

条件式とはその結果が必ず真か偽になる式のこと

DBMSは1行ずつ順番に条件にあうかチェックしていくから真か偽になる式しかかいちゃいけないらしい

 

◎基本的な比較演算式

条件式は=とか<>とかの記号を含んだ式になるのがほとんどなんだけど

これらの記号を比較演算子といって、その記号の左右にある値を比較して記号の意味が正しければ真、正しくなければ偽に化ける(SQLの実行によって演算子などが別の値に変化すること)役割をもっている

 

◎NULL

なにもない、未定義なことをしめす。ゼロとも異なる

列の値がNULLであることを判定するにはIS NULL演算子、NULLでないことを判定するにはIS NOT NULL演算子をつかう

 

◎LIKE演算子

パターンマッチング(文字列があるパターンに合致しているかをチェックすること)に使う

パターンマッチングを行うと部分一致の検索(◯◯という文字列を一部に含むか?という判定)が簡単にできる

パターン文字列に使用できる文字には主に

%:任意の0文字以上の文字列

_(アンダースコア):任意の1文字

がある

 

◎BETWEEN演算子

ある範囲内に値が収まっているかを判定

値が「値1以上かつ値2以下」の場合真になる

値がちょうど値1や値2の場合も真になる

 

◎IN/NOT IN演算子

IN演算子:値がカッコ内に列挙した複数の値(値リスト)のいずれかに合致するかを判定する

NOT IN演算子:カッコ内に列挙した値のどれとも合致しないことを判定するのに使う

 

◎ANY/ALL演算子

複数の値と大小を比較したい場合使う

必ずその直前に比較演算子をつけて利用すること

この2つは単体で使うよりも道具と組み合わせて使用するほうがよいがその道具についてはのちのち!

 

論理演算子

  • WHERE句で条件式を使用するとき、1つの条件式ではうまく行を絞り込めない場合があるかも。そんなときに論理演算子を用いて、複数の条件式を組み合わせることができる!

代表的な論理演算子

AND演算子(2つの条件式の両方が真の場合だけ真となる)

OR演算子(2つの条件式のどちらかが真ならば真となる)

がある

ANDとORは両辺に条件式を必要とする演算子である

一方、右辺しか必要としないNOT演算子もある。これは右辺の条件式の結果が、真は偽に、偽は真に逆転する

 

条件式はカッコでくくると評価の優先順位があがる

数学でそんなんあったきがする。。

 NOT/AND/OR/の順で演算子が評価されるらしい。

 

◎主キーの必要性

 

主キーがあると特定の行を認識できる

そもそも行を区別できないということはある特定の行だけを指定して操作することができないことを意味する

完全に重複した行が存在するとそのうちのある行だけを区別、識別することはできないので、ある行だけを操作するということもできないから

テーブルの中に重複した行が格納されるのを避けるべき!!

 

「この値を指定することである1行を完全に特定できる」という役割を担う列のことを主キーという

主キーが持つ特性

・必ず何らかのデータが格納される(NULLではない)

・他の行と値が重複しない

すべてのテーブルは主キーとなるような列を必ず持つべきである

 

例えば社員情報を管理するために社員テーブルを作ろうと考える過程で「氏名」「性別」などに加え「社員番号」という列を作ることは自然

自然に登場して主キーの役割を果たせる列は自然キーと呼ばれる

もし自然キーがないなら無理やり主キーを作るのが一般的

これを人工キーや代替キーという

また、氏名住所生年月日など複数の列を1つの主キーとして扱うものを複合主キーという

 

3章はこんな感じ

 

ANY/ALL演算子とNOT演算子まともに使ったことないんだよなあ

また復習しなおすことになりそう。

 

次は4章検索結果の加工だ〜

 

 

SQL入門 2章 :)

 

今日はスッキリわかるSQL入門(中山清喬・飯田理恵子著)2章

基本文法と4大命令

 

まずはSQLの基本ルールから!

 

SQLに共通する基本ルール1

  • 文の途中に改行を入れることができる
  • 行の先頭や途中に半角の空白を入れることができる

これで読みやすいSQL文を書ける〜

ちなみに文の終了はセミコロンで表す;(複数SQL文を続けて書くとき使える)

 

SQLに共通する基本ルール2

  • ハイフン2つ(--)から行末まではコメントになり無視される
  • /*から*/まではコメントになり無視される

解説とかコメントを書き込める

チームで作ってるときとか便利

 

SQLに共通する基本ルール3

  • SELECTやWHEREなどの命令に使う単語はSQLとして特別な意味を持つ「予約語」である
  • 予約語を記述する際は大文字と小文字の区別なし
  • テーブル名や列名に予約語を利用することはできない

SELECTやWHEREなどの一部の単語はSQLの機能として特別な意味を持つため列名などに使えない

大文字小文字の区別については会社やプロジェクトで決められたルールに従えばいいんでないかと書いてあった

 

データの種類を示す記法

SQL文の中に書き込まれたデータそのものを特にリテラルという

 

リテラル記述に関するルール

  • 「'」でくくらず記述されたリテラルは数値情報として扱われる
  • 「'」でくくられたリテラルは基本的に文字列情報として扱われる
  • 「'」でくくられ、'2016-03-03'のような一定の形式で記述されたリテラルは日付情報として扱われる

たとえば「123」と「'123'」では意味が違う

前者は123(ひゃくにじゅうさん)という数量を表す数値データ

後者は123(いち・に・さん)という3つの文字の並びを表す文字列データ

 

列とデータ型

データベースの中には複数のテーブルがありテーブルは行と列から成り立っている

それぞれの列には名前が付いているがそれに加え列ごとに格納できるデータの種類を表すデータ型を定めることになっている

列にはデータ型で指定された種類の情報しか格納できない

利用可能なデータ型はDBMS製品によって違う

 

固定長と可変長

文字列型にはCHARVARCHARがある

  • CHAR型は固定長の文字列データを扱うデータ型でたとえばCHAR(10)と指定されている列ではあらかじめ10バイトの領域が確保されていて格納するデータは常に10バイト。だから10バイトにみたないときは文字列の右側に空白が追加されぴったりに調節される
  • VARCHAR型を指定された列は、入力された文字列に合わせて領域が確保されるから空白を追加したりはしない。でもVARCHAR(10)と指定されてたら11バイトの文字列は格納できない

CHAR型は郵便番号とか、格納するデータの桁数が決まってるときがよくて

VARCHAR型は氏名とか、格納するデータの桁数が変動するときよい

 

SQLの命令体系

SQLではSELECT,UPDATE,DELETE,INSERTの4つの命令でほとんどのデータ操作ができちゃう

この4つのSQL命令はDML(Data Manipulation Language)と総称されている

このDMLにいろんな装飾をして複雑なデータを扱っていく

 

◎SELECT文の基本構造

  • データベースとデータのやり取りをするにあたり最も頻繁に使われる
  • テーブルから目的のデータを指定して取得する役割

・SELECTの後ろには取得したい列名

・2行目はデータを取得するテーブルを指定するためFROM句を必ず指定

・以降は必要に応じWHEREによる修飾やその他の修飾を記述

 

SELECT文における列名やテーブル名などの指定ではそれぞれの記述の後ろにAS+任意のキーワードをつけることで別名を定義できる。これ省略できることが多いらしいしOracleだと書いたらだめらしい

別名をつけるメリットとしては

・結果表における列のタイトルを任意のものに変更できる

・わかりにくい列名や長い列名でもわかりやすく短くできる

ってなってたけどメリットというか便利らしいということしかわからん

 

◎UPDATE文の基本構造

  • すでにテーブルに存在するデータを書き換える

・UPDATEのうしろに更新したいデータがあるテーブル名を記述

・2行目に更新したい列名とその列に書き込むデータを記述するSET句を

・ある特定の行のみ書き換えたいときはWHEREを使って目的の行を指定(基本的にWHEREは必ず一緒) 

 

◎DELETE文の基本構造

  • すでにテーブルに存在する行を削除するための命令

行をまるごと削除してしまう機能で、特定の列だけを指定することはできない

・DELETE文では列名指定がいらないから1行目のDELETEのうしろにはなにも記述しない

・2行目はデータを取得するテーブルを指定するためFROM句を必ず指定

・WHEREをつけないと全部の行が消えるので基本的にWHEREは必ず一緒

 

 ◎INSERT文の基本構造

  • テーブルに新しいデータを追加する
  • テーブルの行を指定するWHEREはないがどこにどのようなデータを追加するのかを指定する

・INSERTのあとINTOをつけ、データを追加するテーブル名を記述

・テーブル名のうしろにカッコでくくってデータを追加する列名を指定(そのテーブルのすべての列に値を追加する場合2行目はまるごと省略できる)

・3行目はVALUES句といい2行目に記述した列名に対応するデータの値を指定する 

 

4つの命令を分類すると

検索系:SELECT

更新系:UPDATE,DELETE,INSERT

となる

もうひとつの分類の仕方で

既存系:SELECT,UPDATE,DELETE

新規系:INSERT

 がある

 

書き方の順序としては

  1. 命令文を記述
  2. テーブル指定の部分を記述
  3. テーブル指定よりうしろの部分を記述
  4. テーブル指定より前の部分を記述(SELECT文のみ)

 

2章はだいたいこんな感じ〜

この記事書いたの大分前なのだけどその頃はASの必要性が全くわからなかった!

今は頻繁につかうから(ASとは書かないけど)結構使えるな〜くらいの認識にはなってきたかも!

 

次は3章操作する行の絞り込みだ!