> For the complete documentation index, see [llms.txt](https://docs.erathos.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.erathos.com/connectors/databases/oracle.md).

# Oracle

Find out how to connect Oracle to your data warehouse effortlessly.

The available connections between databases and the Erathos platform are through **Open Connection**, **Static IP** and **SSH tunnel**.

### Connecting Oracle:

1. Log in to your Erathos account
2. Select Oracle as connector
3. Name your connection
4. Fill in the following form with the required information:
   * **db\_host** — the hostname or IP address of your Oracle database
   * **db\_port** — the listener port (`1521` by default, `1522` on Oracle Autonomous Database)
   * **db\_name** — the Oracle **service name** (Erathos connects using a service name, not a SID). On Oracle Cloud this is usually the fully qualified name, including the PDB name and the VCN's DNS domain, e.g. `PDB.sub09061234567.myvcn.oraclevcn.com`
   * **db\_user** and **db\_password** — the database credentials Erathos should use

You can optionally fill in:

* **db\_schema** — restricts extraction to a single schema. When left empty, Erathos will discover tables, views and materialized views across every schema the credentials can see (excluding Oracle's built-in system schemas, such as `SYS`, `SYSTEM`, `XDB`, `CTXSYS`, etc.)
* **db\_role** — only required if the supplied credentials must connect with an elevated Oracle connect role, such as `SYSDBA` or `SYSOPER`. Leave this empty for a regular (non-privileged) connection.
* SSH tunnel fields — **ssh\_host**, **ssh\_user**, **ssh\_password** (or an **SSH private key**), **ssh\_port** and **ssh\_keepalive\_interval**, if you choose to connect through an SSH tunnel/bastion.

{% hint style="info" %}
Erathos always attempts to connect over an encrypted **TCPS** connection first and automatically falls back to plain **TCP** if the database doesn't have TCPS configured. No wallet file upload is required.
{% endhint %}

Don't forget to click on **Save and close** to advance to the next steps of the integration.

With this connection created you can seamlessly move your Oracle data to data-warehouses such as BigQuery, Redshift or Databricks.

### Finding your connection details in Oracle Cloud (OCI)

The steps to gather the host, port and service name depend on whether your database is an **Autonomous Database** or a **DB System** (VM, Bare Metal or Exadata).

#### Autonomous Database (ADB-S / ADW / ATP)

1. In the OCI Console, go to **Oracle Database** > **Autonomous Database** and select your database instance.
2. Click **DB Connection**, then open the **Connection Strings** tab.
3. Pick any of the listed connection strings (e.g. the `_high` or `_medium` profile) and use it to fill in:
   * **db\_host** and **db\_port** (`1522`) from the `host`/`port` shown in the connect descriptor.
   * **db\_name** with the full `service_name` shown in the same connect descriptor (it already includes the VCN's DNS domain, e.g. `PDB.sub09061234567.myvcn.oraclevcn.com`).
4. Under **Network**, configure an **Access Control List (ACL)** allowing connections either from Erathos' static IP or from any IP.
5. With an ACL configured, you can toggle **Mutual TLS (mTLS) authentication** to **off** on the same Network settings page. This lets Erathos connect over TLS without requiring a client wallet, matching how the connector authenticates.

#### DB Systems (Base Database / VM / Bare Metal / Exadata)

1. In the OCI Console, go to **Oracle Database** > **DB Systems**, select your DB system, then select the database.
2. Under **DB Connection**, copy the **Host Name/IP** into **db\_host** and the **Port** (`1521` by default) into **db\_port**.
3. For **db\_name**, use the fully qualified service name shown there — it's the PDB/service name followed by the subnet and VCN DNS domain (e.g. `PDB.sub09061234567.myvcn.oraclevcn.com`), not just the short service or database name. If it's not shown on that page, you can confirm it by running `SELECT SYS_CONTEXT('USERENV','SERVICE_NAME') FROM DUAL;` on the database, or by checking the subnet's DNS domain name under **Networking > Virtual Cloud Networks > your VCN > Subnets**.
4. Make sure the DB system's **Virtual Cloud Network (VCN)** security list or network security group allows inbound traffic on the database port:
   * From Erathos' static IP, if you restrict allowed IPs to your database.
   * From any IP, if you have a database open to the internet.
   * If the DB system only has a private IP, use the **SSH tunnel** connection method through a bastion/jump host that Erathos can reach, filling in the ssh\_host, ssh\_user and ssh\_password (or SSH private key) fields.
5. DB Systems typically only expose a plain TCP listener (no TCPS) unless you've configured one yourself — this is fine, Erathos automatically falls back to TCP in that case.

### Database user and permissions

Erathos only needs read access. We recommend creating a dedicated, read-only database user:

```sql
CREATE USER erathos_reader IDENTIFIED BY "<strong-password>";

-- Required to establish a connection
GRANT CREATE SESSION TO erathos_reader;

-- Lets Erathos read table/column/primary-key metadata from the data
-- dictionary views (ALL_OBJECTS, ALL_TAB_COLUMNS, ALL_CONSTRAINTS, ALL_CONS_COLUMNS)
GRANT SELECT_CATALOG_ROLE TO erathos_reader;

-- Lets Erathos read the actual table/view data
GRANT SELECT ANY TABLE TO erathos_reader;
```

If you'd rather scope access to specific schemas or tables instead of granting `SELECT ANY TABLE`, grant `SELECT` explicitly on each object you want to sync, and set the **db\_schema** field described above so Erathos only introspects that schema:

```sql
GRANT SELECT ON schema_name.table_name TO erathos_reader;
```

{% hint style="warning" %}
Without `SELECT_CATALOG_ROLE` (or equivalent grants on the `ALL_*` dictionary views), Erathos will not be able to discover tables, columns or primary keys, even if `SELECT` has been granted on the underlying tables.
{% endhint %}
