2

私は MySQL での経験が豊富で、現在は Oracle から始めています。しかし、私が区別するのに苦労している同様の概念を使用しているため、Oracle でデータベースが何であるかを理解するのは本当に難しいと思います。mysql では、「データベース」という単純な概念があり、複数のデータベースが混在するのではなく、

  • SCHEMA コンセプト (TABLESPACES で論理的に分割されたユーザーのワークスペース)
  • TNS および SID/サービスの概念
  • CONNECTION の概念 (ODBC 定義と SQLDeveloper の両方で)

私はまだ読んでいるので、それらの純粋な定義は尋ねませんが、最も近い Oracle の概念で mysql データベースをどのようにマッピングできるかについてのガイダンスです。

4

1 に答える 1

1

これは、開発者の観点から得られる情報です。私は Oracle について多くのことを知っているわけではありませんが、現在運用中のいくつかのアプリケーションを Oracle にデプロイするというかなり重要な作業を行いました。

データベース

データベースは、Oracleの用語では、ディスク上に存在し、まとまりのある単位として管理されるファイルのグループです。データベースには、ログイン、ロール、テーブル、インデックス、一時スペース、トランザクション ログなど、ほとんどすべてが含まれています。これを作成することは、Oracle では重要なタスクです。基本的に、マシンへの直接アクセス (SSH または Windows リモート デスクトップなど) が必要です。DBA がインストール中に作成し、それがサーバーがホストする唯一のものになるのはよくあることです。MySQL、PostgreSQL、および SQL Server とは異なり、このレベルを基本的なグループ化に実際に使用することはできません。たとえば、各開発者に独自のデータベースを提供することは、再作成のオーバーヘッドのために一般的ではありません。

スキーマ

Oracleスキーマは、ユーザーと名前空間という 2 つの目的を混同します。

  • 各スキーマはユーザーであり、資格情報 (パスワード、Active Directory のユーザー) に関連付けることができます。すべてのアカウントはデータベース固有であることに注意してください。複数のデータベースにログインできるユーザーを作成する方法はありません (両方のデータベースを同じ LDAP サーバーに向けるか、何らかの外部サービスを使用する以外に)。

  • スキーマは、オブジェクト (テーブル、ビュー、プロシージャ、およびインデックスなど) を含む名前空間としても機能し、スキーマ名を明示的に使用して、参照しようとしているオブジェクトを正確に修飾できます。たとえば、私が と言った場合、Oracle は が所有するテーブルMYOWNER.MYTABLEを探します。すべて同じオブジェクトの複数のコピーが必要な場合、これはそれらをグループ化するのに最も簡単なレベルであり、データベースの開発者ごとのコピーを持つのに最適なレベルになります。MYTABLEMYOWNER

2 つの概念を手動で分割するのが一般的です。スキーマをロックアウトしてログインできないようにすることができ、そのオブジェクトに対する権限を別のユーザーに付与することができます。ただし、スキーマ全体に権限を付与する方法がないため、これは面倒です。各オブジェクトは、特定のユーザーまたはロールに明示的に付与する必要があります。また、ユーザーが自分以外の特定のスキーマでオブジェクトを作成するように強制する方法もありません。権限は、ユーザー自身のスキーマでオブジェクトを作成するか、任意のスキーマでグローバルに作成するためだけに付与できます。

余談ですが、PostgreSQL と SQL Server では、スキーマは名前空間であり、ユーザーではありません。

表領域

テーブルスペースは、データとメタデータ (テーブル定義など) の両方を含む、格納する必要があるすべてのものを含むディスク上のファイルのセットです。1 つのデータベースで複数のテーブルスペースを使用でき、スキーマ内のさまざまなオブジェクトをさまざまなテーブルスペースに配置することもできます。テーブルスペースは 1 つまたは複数のファイルにすることができますが、それらは 1 つの論理ユニットとして管理されます。オブジェクトの作成時に表領域が指定されていない場合、各スキーマにはそのオブジェクトのデフォルトの表領域があります。データベース間でそれらを共有することは、不可能か前代未聞のどこかです。

実際には、テーブルスペースを気にせず、デフォルトの構成をそのままにしておくのが一般的です。デフォルトはUSERS、1 つのファイルで名前が付けられた 1 つのテーブルスペースであり、データベース内のすべてのスキーマのデフォルトのテーブルスペースです。これらを変更する場合は、通常、各スキーマのデフォルトを設定し、ディスク容量が問題になるまでそれについて考えることはありません。

実例

これらについては具体的に質問されていませんが、データベースへの接続について説明する前に、それらを理解する必要があります。

インスタンスは、接続をリッスンするサーバー上で実行されている実際のプロセスです。データベースと同様に、データベース サーバーに直接アクセスしてセットアップする必要があります。サーバー上に複数または単一のものを持つことができます。データベースごとに 1 つあるのが一般的です。

インスタンスは、 SIDまたはサービス名の 2 つの方法で識別できます。SID は単一のインスタンスを識別しますが、サービス名は複数のインスタンスを参照できるエイリアスです。それがどのように機能するかの詳細は、通常は重要ではありません。接続するには、それらについて知る必要があることを知っておいてください。

接続中

クライアントから接続するには、接続記述子が必要です。これは、ホスト、ポート、および SID またはサービス名のいずれかを含むごちゃ混ぜの文字列です。たとえば、次のようになります(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orclservice)))。より複雑になることもありますが、それが基本的な形です。サービス名の代わりに SID を使用するにはSERVICE_NAME=orclserviceSID=orclinstance. 代わりに、次のような「EZ コネクト」と呼ばれる新しい、よりコンパクトな形式もありますmyoracleserver:1521/orclservice。基本パラメータのみをサポートします。

TNSは「Transparant Network Substrate」の略で、データベースとの通信に使用されるネットワーク スタック全体で構成されています。全体として気にする必要はほとんどありません。

よく遭遇するのはTNS 名です。TNS 名は、接続記述子の別名です。それらはクライアントマシン上のプレーン テキスト ファイルに格納され、通常はマシン全体にグローバルです。ファイルにあるマッピングの例を次に示しますmydatabase=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=orcl)))。私の経験では、ほとんどの場合、実際には TNS 名に煩わされることを完全に避けて、接続記述子を直接使用することができます。

接続識別子は、接続記述子の代わりになるものです。これは、完全な接続記述子、EZ 接続記述子、TNS 名、またはその他のいくつかのものにすることができます。ただし、一般的には、サーバーと、接続するサーバー上の特定のデータベースを識別します。

これらすべてを念頭に置いて、接続はもう少し簡単になります。概念的には、他のデータベースとほとんど同じです。それらについて混乱を招く可能性があるのは、前述のようにスキーマとして接続することです。「ユーザー名」はスキーマ名であり、スキーマにはパスワードまたはその他の形式の認証を関連付けることができます。接続文字列は、他のデータベースと同様に、クライアント ソフトウェアによって異なります。SQL*Plus (Oracle のコマンド ライン クライアント) の場合、接続文字列は次のようになります[USERNAME]/[PASSWORD]@[connect identifier]。したがって、ユーザーがMY_SCHEMA、パスワードがPASS、サーバーが上記のような場合、次のようになります

MY_SCHEMA/PASS@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=orclinstance)))

.NET アプリケーションの場合、次のようになります。

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=orcl)));User Id=MY_SCHEMA;Password=PASS

これは他のデータベースとよく似ています。その厄介なサーバー情報が表示される場所はどこでも、それを任意の接続識別子 (TNS 名など) に置き換えることができることに注意してください。

SQL Developerに関する限り、「接続」は実際には単なる保存された接続文字列です。ODBC は他のデータベースと同様に接続します。必要なのは、適切な接続文字列とドライバーだけです。

運転手

The drivers can be a pain point in Oracle, depending on language. I believe Java has some decent stand alone clients, but other languages generally depend on the binary version. The binary version does have an installer that puts the binaries on PATH, but the installer is pretty difficult to use and best avoided. When I can, I avoid installing the client and make use of what's called "instant client". Usually, if you can get the instant client binaries in a place where the app can find them, they just work. If not, then it's preferable to just prepend PATH in memory for your application than to modify it globally for your machine.

たまたま .NET を使用して開発している場合は、Oracleの NuGet で ODP.NET プロバイダーを使用してください。完全な .NET で記述されているため、ネイティブ バイナリを扱う必要がありません。

概要

要するに:

  • データベースはサーバー設定の一部です
  • スキーマはユーザーであり、データベースを分割する方法でもあります
  • テーブルスペースは、データベースを保持する物理ファイルです
  • TNS 名は、クライアント側での便宜的な命名にすぎません
  • SID/サービス名は、接続時に使用される単なる名前です

個人的には、この取り決めは複雑すぎると思います。

于 2013-07-16T19:18:51.097 に答える