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のパスワードを設定]
```
ここだけでめっちゃ時間かかった。
ちなみにUbuntuはLinuxの人気ディストリビューション(Linuxの人気の配布形態)らしい。初心者におすすめだって。
◎さて次にカーネルパラメータを編集
[root@testuser ~]# MEMTOTAL=$(free -b | sed -n '2p' | awk '{print $2}')
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
◎オラクル専用のユーザー/グループを作成し、システムの環境設定
[root@testuser ~]# i=54321; for group in oinstall dba backupdba oper dgdba kmdba; do
done
[root@testuser ~]# useradd -u 1200 -g oinstall -G dba,oper,backupdba,dgdba,kmdba -d /home/oracle oracle
[root@testuser ~]# passwd 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
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されたデータは守る
この三つを守るためにいろんな工夫がされているみたい
OracleはDBMS(データ管理システム)でディスクからデータを読み込み処理をして、ディスクにデータを書き戻すという作業をしている
だから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がなんかちょっと違う感じになってて、調べてみたけど死にそう。言ってることはなんとなくわかるからとりあえずこんな感じでやってみる。うまくいくかは知らない。
参考
なんかいろいろ記事あさってたけど、なぜその書き方をしたのか、そのクエリを使用した理由を説明できたらちゃんとわかってることになるのかな〜?
いまはこのときはこれをつかうって感じで表面的にしかわかってない感じする
ちょっと意識してやってみよかな〜
次は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つは単体で使うよりも道具と組み合わせて使用するほうがよいがその道具についてはのちのち!
論理演算子
代表的な論理演算子に
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の機能として特別な意味を持つため列名などに使えない
大文字小文字の区別については会社やプロジェクトで決められたルールに従えばいいんでないかと書いてあった
データの種類を示す記法
SQL文の中に書き込まれたデータそのものを特にリテラルという
◎リテラル記述に関するルール
- 「'」でくくらず記述されたリテラルは数値情報として扱われる
- 「'」でくくられたリテラルは基本的に文字列情報として扱われる
- 「'」でくくられ、'2016-03-03'のような一定の形式で記述されたリテラルは日付情報として扱われる
たとえば「123」と「'123'」では意味が違う
前者は123(ひゃくにじゅうさん)という数量を表す数値データ
後者は123(いち・に・さん)という3つの文字の並びを表す文字列データ
列とデータ型
データベースの中には複数のテーブルがありテーブルは行と列から成り立っている
それぞれの列には名前が付いているがそれに加え列ごとに格納できるデータの種類を表すデータ型を定めることになっている
列にはデータ型で指定された種類の情報しか格納できない
利用可能なデータ型はDBMS製品によって違う
固定長と可変長
文字列型にはCHARとVARCHARがある
- 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
がある
書き方の順序としては
- 命令文を記述
- テーブル指定の部分を記述
- テーブル指定よりうしろの部分を記述
- テーブル指定より前の部分を記述(SELECT文のみ)
2章はだいたいこんな感じ〜
この記事書いたの大分前なのだけどその頃はASの必要性が全くわからなかった!
今は頻繁につかうから(ASとは書かないけど)結構使えるな〜くらいの認識にはなってきたかも!
次は3章操作する行の絞り込みだ!