takt@Wiki

Oracle

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン
  • Oracleサービス起動失敗の対応方法その1
コマンドプロンプトで、set ORACLE_SID=xxxxの後、
#emctl start dbconsole
とすると、対話的に起動が出来るので、エラーの確認が出来ます。

  • Oracleのログイン方法
【SQLPLUS username/passward<@sid> <@script_file_name>】
#SQLPLUS SCOTT/TIGER
#SQLPLUS SCOTT/TIGER@LOCALDB
#SQLPLUS SCOTT/TIGER@LOCALDB @C:/TEMP/CREATE.SQL

  • ロールの権限付与
【GRANT roll_name TO username;】
#GRANT SYSDBA, CONNECT, RESOURCE TO SCOTT;

  • ユーザーの作成
【CREATE USER username IDENTIFIED BY password;】
#CREATE USER TESTUSER IDENTIFIED BY TEST;

  • EXPORT
【exp username/password@sid file=exp01.dmp】
#exp "TESTUSER/PASS@TOK file=exp01.dmp tables=(JOB, TOKU)"

  • IMPORT
【imp username/password@sid file=exp01.dmp】
#imp "TESTUSER/PASS@TOK file=exp01.dmp tables=(JOB, TOKU)"

  • 表の一覧
# select * from tab;

  • 表の項目一覧
# desc 表名;(;は省略可)

  • インデックスの一覧
# select * from user_ind_columns;
※指定した表のインデックスのみ、表示することもできます。
# select column_name from user_ind_columns where table_name = '表名';

  • ユーザ一覧
# select username from user_users;

  • DBリンク
接続設定データベースリンクを張る側で定義する。(tnsnames.ora の設定)
# ORAC10 =
# (DESCRIPTION = 
#   (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.0.200) (PORT = 1521))
#   (CONNECT_DATA = (SID = ORAC10))
# )

データベースリンクの作成
※参照したい側で行う
# create database link DB_LINE_NAME 
#   connect to USER identified by PASS using 'tns:TARGET_TNS_NAME';
(ここでは、ORAC10になる)

更新がある場合、(アクセスしやすいようにシノニムを設定)
# create synonym TABLE_NAME for SCHEMA.TABLE_NAME@DB_LINK_NAME;

  • データベースの文字コード
# select * from NLS_DATABASE_PARAMETERS where PARAMETER = 'NLS_NCHAR_CHARACTERSET';

  • 管理ツールのデフォルトのユーザ
ユーザの種類 ユーザ名 パスワード
データベース管理者 sys change_on_install
データベース管理者 system manager
テストユーザ scott tiger

  • SQLPlusによるエラー出力
# set serveroutput on

  • ロックの強制解除
表ロック、行ロックが掛かってしまった場合は、
そのロックを掛けたユーザーのセッションを切断することで、ロックの解除が可能です。

/* ①セッション情報取得 */
SELECT
SID, -- セッションID
SERIAL# -- シリアルナンバー
FROM
V$SESSION
WHERE
OSUSER = 'ユーザー名'
;

/* ②上記で取得したセッションを切断する */
ALTER SYSTEM
KILL SESSION
'上記SQLで取得したSID, 上記SQLで取得したSERIAL#'
;

  • 親子関係TBLのデッドロック

ログを確認したところどうもdelete文でデットロックが起きたようです。
しかしながら、どんなに目を凝らしてもdelete文でデットロックが発生する作りにはなってません・・・

しょうがないので開発環境で問題のSQLを投げてみます。
幸い問題のSQLはトレースログから確認できています。
SQLを直接実行するくらいは簡単です。

あっさりデットロック!

どうも調べてみると親子関係のあるテーブルで子テーブルを削除する際、Oracleが親テーブルにテーブルロックをかけることが判明!
テーブルロックをかけてこられては、プログラム側からの対応はちょっと面倒です。
簡単に回避するのには子テーブルのFK(フォーリンキー)に
インデックスを張れば回避できるくさいです。

パフォーマンスチューニング(SQL)
  • SQLの計測
#alter system flush shared pool;
共有プール内バッファを空にする
#set timing on;
実行時間経過を表示する
#set autotrace on;
実行したSQLの実行統計、実行パスを表示する

目安箱バナー