- 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 = 'ユーザー名'
;
SELECT
SID, -- セッションID
SERIAL# -- シリアルナンバー
FROM
V$SESSION
WHERE
OSUSER = 'ユーザー名'
;
/* ②上記で取得したセッションを切断する */
ALTER SYSTEM
KILL SESSION
'上記SQLで取得したSID, 上記SQLで取得したSERIAL#'
;
ALTER SYSTEM
KILL SESSION
'上記SQLで取得したSID, 上記SQLで取得したSERIAL#'
;
- 親子関係TBLのデッドロック
ログを確認したところどうもdelete文でデットロックが起きたようです。
しかしながら、どんなに目を凝らしてもdelete文でデットロックが発生する作りにはなってません・・・
しかしながら、どんなに目を凝らしてもdelete文でデットロックが発生する作りにはなってません・・・
しょうがないので開発環境で問題のSQLを投げてみます。
幸い問題のSQLはトレースログから確認できています。
SQLを直接実行するくらいは簡単です。
幸い問題のSQLはトレースログから確認できています。
SQLを直接実行するくらいは簡単です。
あっさりデットロック!
どうも調べてみると親子関係のあるテーブルで子テーブルを削除する際、Oracleが親テーブルにテーブルロックをかけることが判明!
テーブルロックをかけてこられては、プログラム側からの対応はちょっと面倒です。
簡単に回避するのには子テーブルのFK(フォーリンキー)に
インデックスを張れば回避できるくさいです。
テーブルロックをかけてこられては、プログラム側からの対応はちょっと面倒です。
簡単に回避するのには子テーブルのFK(フォーリンキー)に
インデックスを張れば回避できるくさいです。
パフォーマンスチューニング(SQL)
- SQLの計測
#alter system flush shared pool; 共有プール内バッファを空にする #set timing on; 実行時間経過を表示する #set autotrace on; 実行したSQLの実行統計、実行パスを表示する