Category: ‘Oracle’

SYSTEMユーザについて

2013年2月18日 Posted by PURGE

SYSユーザについては、前章にて記述。
では、SYSTEMユーザとは何でしょうか?

SYSTEMユーザ とは、SQL*Plusや他ツールで使用されるビュー等を所有し、DBAロールを持ち、SYSDBA権限が必要な操作を除く、ほとんど全ての操作が可能なユーザである。

つまり、SYSDBA権限の無いユーザでしょうかね。そもそも、SYSDBA権限でしか操作できない操作とは何でしょうか?

基本的に、DBが動作している上では、このユーザで十分なのでしょう。
STARTUP / SHUTDOWN は必要ないでしょうから。

SYSユーザとSYSDBA権限

2013年2月18日 Posted by PURGE

Oracleへ、OS認証にて、SYSユーザにてログインする場合の接続コマンド。

connect / AS SYSDBA

OS認証が機能しない環境では、下記が接続コマンド。

connect sys/****** as sysdba

この辺の知識も甘い。

ちなみに、下記ログインユーザの確認方法。

show user
ユーザは"SYS"です

SYSDBA権限について

2013年2月18日 Posted by PURGE

SYSDBA権限についての整理。今更ながらではあるが、SYSDBA権限とはなんでしょうということの整理です。

SYSDBA権限とは、システム権限の一つであるが、特殊な権限とされる。
この権限は、データベース作成/起動/停止/バックアップ・リカバリ等を行えるデータベース管理用の権限である。

  1. STARTUP / SHUTDOWN
  2. ALTER DATABASE OPEN/ MOUNT / BACKUP
  3. ATTER DATABASE CHARACTER SET
  4. CREATE / DROP DATABASE
  5. ALTER DATABASE ARCHIVELOG
  6. ALTER DATABASE RECOVER

 

デフォルトでは、SYSDBA権限を持つのはSYSユーザのみである。
GRANT文にて、通常ユーザにSYSDBA権限を付与することができる。

但し、その場合はSYSDBA権限は有効にならないので、ログイン時に as sysdba をコマンド引数に指定する必要がある。
ということである。

ちなみに、SYSDBA とは、権限であるので、ユーザでないことは言うまでもない…。

SQL*Loaderについて

2013年2月18日 Posted by PURGE

今更ながらSQL*Loaderについての覚え書き。

$ sqlldr userid=xxx/xxxx control=xxx.ctl log=xxx.log

■制御ファイルのサンプル

LOAD DATA
CHARACTERSET UTF8  --取込ファイルの文字コード
INFILE *
INTO TABLE member
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(member_id, last_name, first_name, age)

CHARACTERSETオプションは、LOAD DATA の後に付けないとエラーになる。
■ロードする場合に良く使用されるSQL関数

to_date('')
to_char(sysdate, 'MM-DD-YYY HH24:MI:SS')
substr('', 3, 5)
decode('A', 'B', 'C')
rtlim('', '')
ltlim('', '')

Spring Batch JobRepository使用時のシーケンスエラー

2012年10月23日 Posted by PURGE

MySQL では動作するのだが、Oracleに移行した途端にエラー。
シーケンスが無いとのこと。

どうやら、MySQLの場合は、下記をテーブルとして実装しても動作するのだが、Oracleだとシーケンスとして作成する必要があるようだ。

MySQLだと下記でも動作する。

CREATE TABLE BATCH_STEP_EXECUTION_SEQ (
	ID BIGINT NOT NULL
);

CREATE TABLE BATCH_JOB_EXECUTION_SEQ (
	ID BIGINT NOT NULL
);

CREATE TABLE BATCH_JOB_SEQ (
	ID BIGINT NOT NULL
);

INSERT INTO BATCH_STEP_EXECUTION_SEQ VALUES(0);
INSERT INTO BATCH_JOB_EXECUTION_SEQ VALUES(0);
INSERT INTO BATCH_JOB_SEQ VALUES(0);

Oracleでは、Tableではなく、Sequenceを定義。

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 CYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 CYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ MAXVALUE 9223372036854775807 CYCLE;

こちらを参考にした。

OracleリサイクルBINの削除

2012年10月17日 Posted by PURGE

Oracleで、リサイクルBIN(BIN$w/40spiFy6rgQAB/AQAZGg==$0)のようなゴミテーブルが見えることがあると思います。
一覧表示等する場合に、結構邪魔だったりします。

そんなときは、下記のコマンドで。

PURGE RECYCLEBIN;

ちなみに、そのままリサイクルBINに入れたくない場合は、下記のコマンドらしい。

DROP TABLE テーブル名 PURGE;

おそらくやらないと思うけど。

StatsPackの使用準備。

2012年7月26日 Posted by PURGE

StatsPackを使用してみようと試みる。

SQL> @$ORACLE_HOME/rdbms/admin/spcreate.sql

しかしエラー。
どうやら、X$KCBFWAIT というviewを参照する権限がないらしい。

... Creating views
create or replace view STATS$X_$KCBFWAIT as select * from X$KCBFWAIT
                                                          *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません

sysdba権限で接続してみる。
しかし、OSユーザが oralceユーザでないとsysdba権限がダメらしい。

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
に接続されました。
SQL> connect / as sysdba
ERROR:
ORA-01031: 権限が不足しています。

どうやら、OSのoracleユーザでないと怒られるようだ。
今まで、普通に何となく知っているつもりでOracleに接してきた。そのつけあってちょっとハマる。
反省。

su oracle

こんどはOSのユーザを変えて、systemユーザでログイン。そして sysdbaとして接続。

[oracle@work]$ sqlplus system/xxxxx

SQL*Plus: Release 11.2.0.1.0 Production on 木 7月 26 14:49:17 2012
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
に接続されました。
SQL> connect / as sysdba
接続されました。

気を取り直して再度実行。

SQL> @$ORACLE_HOME/rdbms/admin/spcreate.sql

しかしまたエラー。
どうやら先程のスクリプト実行が中途半端で、ユーザだけ残ってしまったようだ。

... Creating PERFSTAT user
create user perfstat
            *
行1でエラーが発生しました。:
ORA-01920: ユーザー名'PERFSTAT'は他のユーザー名またはロール名と競合しています
Oracle Database 11g Release 11.2.0.1.0 - 64bit Productionとの接続が切断されました。

迷わず、drop user。

SQL> drop user perfstat cascade;
ユーザーが削除されました。

そして、$ORACLE_HOME/rdbms/admin/spcreate.sql を実行。
PERFSTATユーザが作られるので、パスワードとか表領域とか一時表領域とか尋ねられる。

SQL> @$ORACLE_HOME/rdbms/admin/spcreate.sql

Choose the PERFSTAT user's password
-----------------------------------
Not specifying a password will result in the installation FAILING

perfstat_passwordに値を入力してください: xxxxxx
perfstat
Choose the Default tablespace for the PERFSTAT user
---------------------------------------------------
Below is the list of online tablespaces in this database which can
store user data.  Specifying the SYSTEM tablespace for the user's
default tablespace will result in the installation FAILING, as
using SYSTEM for performance data is not supported.

Choose the PERFSTAT users's default tablespace.  This is the tablespace
in which the STATSPACK tables and indexes will be created.

TABLESPACE_NAME                CONTENTS  STATSPACK DEFAULT TABLESPACE
------------------------------ --------- ----------------------------
DATA1                          PERMANENT
INDEX1                         PERMANENT
SET_DTL                        PERMANENT
SET_HST                        PERMANENT
SET_HST2                       PERMANENT
SET_IDX                        PERMANENT
SET_RP                         PERMANENT
SET_SWK                        PERMANENT
SET_TMP                        PERMANENT
SYSAUX                         PERMANENT *
USERS                          PERMANENT

Pressing <return> will result in STATSPACK's recommended default
tablespace (identified by *) being used.

default_tablespaceに値を入力してください:

Using tablespace SYSAUX as PERFSTAT default tablespace.


Choose the Temporary tablespace for the PERFSTAT user
-----------------------------------------------------
Below is the list of online tablespaces in this database which can
store temporary data (e.g. for sort workareas).  Specifying the SYSTEM
tablespace for the user's temporary tablespace will result in the
installation FAILING, as using SYSTEM for workareas is not supported.

Choose the PERFSTAT user's Temporary tablespace.

TABLESPACE_NAME                CONTENTS  DB DEFAULT TEMP TABLESPACE
------------------------------ --------- --------------------------
TEMP                           TEMPORARY *

Pressing <return> will result in the database's default Temporary
tablespace (identified by *) being used.

temporary_tablespaceに値を入力してください:

Using tablespace TEMP as PERFSTAT temporary tablespace.

すると、実行される。

... Creating PERFSTAT user
... Installing required packages
... Creating views
... Granting privileges
NOTE:
SPCUSR complete. Please check spcusr.lis for any errors.

SQL>
SQL> --
SQL> --  Build the tables and synonyms
SQL> connect perfstat/&&perfstat_password
接続されました。
SQL>
SQL> set showmode off echo off;

…省略…

... Creating STATS$SNAPSHOT_ID Sequence

順序が作成されました。
シノニムが作成されました。
... Creating STATS$... tables
表が作成されました。
シノニムが作成されました。
1行が作成されました。
1行が作成されました。

…省略…

NOTE:
SPCTAB complete. Please check spctab.lis for any errors.
SQL> --  Create the statistics Package
SQL> @@spcpkg
SQL> Rem
SQL> Rem    densor.uk   03/31/93 - Modified
SQL> Rem    cellis.uk   11/15/89 - Created
SQL> Rem
SQL>
SQL> set echo off;
Creating Package STATSPACK...

パッケージが作成されました。

エラーはありません。
Creating Package Body STATSPACK...

パッケージ本体が作成されました。

エラーはありません。

NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.
SQL>

うまくいったようだ。

sqlplus 整形覚え書き

2012年7月25日 Posted by PURGE

sqlplus で画面を整形するコマンドの覚え書き。

set lines 180 --1行の幅
set num 10    --列の表示幅(Number型の列)
set pages 50  --1ページ行数

tnsnames.ora と listener.ora

2012年7月17日 Posted by PURGE

上記ネットワーク設定ファイルは時々混乱するので覚え書き。

tnsnames.ora は、Oracle Net Managerツールで表示されるところの、サービス・ネーミングで設定されるファイル。主にローカル側にて、接続先となるサーバ情報を設定するファイル。

TNSNAME =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = myHost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = myDB)
    )
  )

listener.ora は、Oracle Net Managerツールで表示されるところの、リスナーで設定されるファイル。主にサーバ側にて、接続を受け入れる場合の設定ファイル。

LISTENERNAME =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  )
ADR_BASE_MYLISTENER = C:\oracle\product\11.2.0\client_1\log

余談であるが、Oracle Net Manager と Oracle Net Configration Assistant のツール群も時々用途を混乱してしまう。

CASE文のUPDATE

2012年6月26日 Posted by PURGE

今まで特に意識的には使用していなかったCASE文

UPDATE TARGET_TBL
SET COL1 = 
(CASE COL2
  WHEN 201103 then 201203
  WHEN 201102 then 201202
  ELSE 201201
 END
);