# 06ex1.1. ログイン、リスナ、TNS、CDB・PDB、NLS ________________________________________ Oracle Database 2日でデータベース管理者 19c https://docs.oracle.com/cd/F19136_01/admqs/index.html Oracle Database Net Services管理者ガイド12cリリース1 (12.1) https://docs.oracle.com/cd/E57425_01/121/NETAG/toc.htm ________________________________________ ## 0. 概要 ________________________________________ ### 0.1. 前提知識 Windowsの場合の、環境変数とレジストリ値 - powershellからLinuxのprintenv相当操作 - Get-ChildItem Env: - reg query HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_XXXXXXXX\YYYY - 通常は、インストール時にレジストリに各値が用意される - 環境変数が宣言されていない場合、レジストリ値が環境変数代わりになる - 環境変数が宣言されていると、そちらの値を利用する 典型的な接続の要約 ```text client pc | server pc sqlplusなど <-------> listener <-------> db-service(db instance) tnsnames.ora | listener.ora ``` ________________________________________ ### 0.2. ネットワーク構成ツール - Net Configuration Assistant - Oracle Net Manager ________________________________________ ### 0.3. 設定ファイル 場所 - TNS_ADMINが設定されている場合、そのパス - $ORACLE_HOME/network/admin/ 種類 |ファイル |配置 |概要 |-------------|------------|------------------------------ |tnsnames.ora |クライアント|自由に定義する接続先エイリアス |sqlnet.ora |両方 |??? |listener.ora |サーバ |リスナの構成 |cman.ora |??? |??? - ________________________________________ ## 1. ログインと接続チェック ________________________________________ ### 1.1. 接続方法と形式 |種類 |形式 |特徴 |--------------------------------|-----------------------------------|------------------------------------------------ |OS認証(sysdba) |sqlplus / as sysdba |※1※2参照の事。サーバローカルからのみ可能 |サーバローカル認証 |sqlplus user/pass |listenerを経由しない。サーバローカルからのみ可能 |ローカルネーミング(TNSNAMES) |sqlplus user/pass@tns名 |tnsnames.oraを参照 |ディレクトリネーミング(LDAP) |sqlplus user/pass@tns名 |LDAP準拠のネーミング |簡易接続ネーミング(EZCONNECT※3)|sqlplus user/pass@host:port/service|tnsnames.oraを使わない※4 |外部ネーミング(NIS) |略 |略 ※1 Linuxの場合、install時に指定したosユーザグループに所属するosユーザから実行する必要がある (それ以外はパーミッションもパスも通っていない) Windowsの場合はHKEY_LOCAL_MACHINE…に設定されたレジストリ値を読むため、どのosユーザからでも接続できる ※2 user/passはOS認証が有効ならでたらめで良い。system/managerでもa/aでよく、sysでログインされる OS認証自体はsqlnet.oraのAUTHENTICATION_SERVICES値で有効・無効化可能 Windows、Linuxどちらでも通常インストールの初期構成では有効 ※3 NAMES.DIRECTORY_PATHでの指定名はEZCONNECTでもHOSTNAMEでもよい ※4 DBサービス名が未定義の場合はDB名 (通常はDB作成時に設定した値で、単一インスタンスなら同一) ________________________________________ ### 1.2. 接続チェック & 設定 リスナーチェック 1. from client pc - ping - tnsping.exe 2. on server pc - lsnrctl status - もしだめなら、Oracle Net Configuration Assistant 1. リスナーの構成 2. 追加 3. LISTENER クライアント側でtns使う場合 1. from client pc 1. Oracle Net Configuration Assistant 1. ネーミングメソッドの構成 2. ローカルネーミング(クライアントPCのtnsnames.oraで接続する) 2. Oracle Net Manager あるいは Oracle Net Configuration Assistant > ローカルネットサービス名構成 1. サービス・ネーミング 2. 追加 3. foo 4. tcp/ip 5. 192.168.3.251/1521 6. dev 7. テスト(foo/barで) 8. 保存 ※ リスナ、tnsnames.oraの詳細は各別項目も参考の事 ________________________________________ ## 2. リスナ ________________________________________ 動作に必須な値 1. 環境変数orレジストリ:ORACLE_HOME 2. 環境変数orレジストリ:ORACLE_SID 3. $ORACLE_HOME/binへのPATH 主な操作 ```bash lsnrctl status lsnrctl start lsnrctl stop ``` リスナ(とLREG)の挙動 - LREGは、DBインスタンス起動時に起動中のリスナへ紐づけをする - LREGは、60秒間隔で起動中のリスナと起動中のDBインスタンスの紐づけをする - リスナ起動時点では、既に起動しているDBインスタンスとの紐づけはされない - リスナ起動から60秒待てば、紐づけされてる listener.ora未定義でリスナを起動させたときの設定 ```text (ADDRESS=(PROTOCOL=tcp)(HOST=マシンのhostname値)(PORT=1521)) ``` その他補足 - Linux版の初期設定ではlistener.oraが構成されていない - Linux版の初期設定ではリスナが自動起動しない - マシンのhostname値で正常に動作するためには以下の2つが必要 - マシンのhost名があること - そのマシンのhostsのループバックアドレスにもhost名の値があること ________________________________________ ## 3. クライアントとTNS ________________________________________ ### 3.1. ダウンロードと用意 Scripting and Oracle Database https://blogs.oracle.com/opal/post/download-install-sql*loader-and-data-pump-in-3-steps 4 Oracle Database Instant Clientのインストール後の作業 https://docs.oracle.com/cd/E57425_01/121/MXCLI/post_inst_task.htm 要約 1. 各種ダウンロード・解凍・PATH通し 2. tnsnames.ora用意・TNS_ADMIN環境変数設定(a5sqlmk2もTNS経由で繋がるようになる) ※ Windows版のVer.21.3のexpdp、impdpには不具合があるようなので注意 ※ Oracle Databaseをインストールした環境ならクライアントも付属しているのでこの作業は不要 ※ 簡易接続ネーミングするなら、tnsnames.oraの構成は不要 ________________________________________ ### 3.2. tnsnames.ora 例 ```text foo_aws = ( DESCRIPTION = ( ADDRESS_LIST = ( ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.ap-northeast-1.rds.amazonaws.com)(PORT = 1521) ) ) ( CONNECT_DATA = (SERVICE_NAME = xxx) ) ) ``` ________________________________________ ## 4. CDB・PDB ________________________________________ 前提知識 ```text CDB=DBMS部分のこと。1つのインスタンスは1つのCDBが稼働する PDB=DB部分のこと。1つのCDB内には複数のPDBが稼働する。つまりSQL Severと同様の考え方になる 初期状態では、そのままデフォルト名でインストールしていると以下の2つのPDBが用意される PDB$SEED ORCLPDB ``` 従来との違い ```text 1. 従来の操作の大半は、PDBに対して行う。すなわちインスタンスそのものを制御する操作以外は、 全てPDBの領分である(データファイル、表領域、ユーザ、DBオブジェクト等) 2. sqlplus system/manager as sysdba は、CDBに繋がる 3. show con_name は、現在どれに接続しているかが分かる 4. show pdbs は、CDB内のPDBをリストアップする ステータスは、MOUNTED(停止中)、READ ONLY、READ WRITEのいずれか 5. alter session set container = orclpdb で、PDBに接続を切り替えられる(こちらに対して、データファイル、表領域、ユーザの追加、DDLやDMLをする) 6. alter database open ``` PDBを自動起動するようにするには ```text 自動起動したいPDBをオープンにしておき、以下を実行 alter pluggable database all save state; ``` ________________________________________ ## 5. 文字コード仕様 ________________________________________ ### 3.1. 文字コード、NLS、長さセマンティクス Databaseグローバリゼーション・サポート・ガイド https://docs.oracle.com/cd/E96517_01/nlspg/index.html 11.1.1 SQL*Plusクライアント https://docs.oracle.com/cd/F19136_01/sqpug/SQL-Plus-globalization-support.html#GUID-5488B922-A4F4-4B79-8198-3FC3054E8106 調査コマンド ```sql SELECT 'db' AS kbn, PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_NCHAR_CHARACTERSET', 'NLS_CHARACTERSET', 'NLS_LENGTH_SEMANTICS') UNION SELECT 'instance' AS kbn, PARAMETER, VALUE FROM NLS_INSTANCE_PARAMETERS WHERE PARAMETER IN ('NLS_NCHAR_CHARACTERSET', 'NLS_CHARACTERSET', 'NLS_LENGTH_SEMANTICS') UNION SELECT 'session' AS kbn, PARAMETER, VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER IN ('NLS_NCHAR_CHARACTERSET', 'NLS_CHARACTERSET', 'NLS_LENGTH_SEMANTICS'); -- 別途、control panel > システム > システムの詳細設定 > 環境変数 で NLS_LANGを確認のこと ``` 要約 ```text 1. 文字コード自体は、以下の3つの観点のみ 1. サーバー値。database値。DB作成後に変更できない - nls_database_parameters.nls_characterset - nls_database_parameters.nls_nchar_characterset 2. クライアント値。NLS_LANG値。クライアントのレジストリや環境変数 - SQLPLUSのデフォルトはAMERICAN_AMERICA.??? - 少なくともデフォルトでは、UTF8もSJISも正常に処理できない状態になる 3. database値とクライアント値が異なるとき、自動変換される 2. サーバ側のNLSは以下の3段階を持つ - nls_database_parameters - nls_instance_parameters - nls_session_parameters - ※ v$nls_parameters ならsession+dbの2つ値を確認できる 3. char、varchar2型は長さセマンティクスにcharかbyteかを選べる - 初期化パラメータ、レジストリ、環境変数にないなら、Byteがデフォルト 4. 3に関わらず、char、varchar2、nchar、nvarchar2の内部上限は4000Byte ``` 頻出設定方針 ```text ・Database character set > AL32UTF8 ・各国語キャラクタ・セット > AL16UTF16(デフォルトから変更しない) ・sqlファイルの文字コードはNLS_LANGに合わせる。NLS_LANGがUTF8ならUTF8ファイルにする ・ASCII文字しか想定しない列だけ、VARCHAR2にする ・全角を含む列は、そもそもNVARCHAR2にする ```