- OCI Oracle DBA - Expert Knowledge
- ๐๏ธ Use OCI Landing Zone Terraform Modules
- Don't reinvent the wheel.
- Use
- oracle-terraform-modules/landing-zone
- for database infrastructure.
- Landing Zone solves:
- โ Bad Practice #1: Generic compartments (Landing Zone creates dedicated Database/Security compartments for ADB organization)
- โ Bad Practice #9: Public database endpoints (Landing Zone Security Zones enforce private endpoints only)
- โ Bad Practice #10: No monitoring (Landing Zone auto-configures ADB performance alarms, slow query notifications)
- This skill provides
-
- ADB-specific operations, performance tuning, and cost optimization for databases deployed WITHIN a Landing Zone.
- โ ๏ธ OCI CLI/API Knowledge Gap
- You don't know OCI CLI commands or OCI API structure.
- Your training data has limited and outdated knowledge of:
- OCI CLI syntax and parameters (updates monthly)
- OCI API endpoints and request/response formats
- Autonomous Database CLI operations (
- oci db autonomous-database
- )
- OCI service-specific commands and flags
- Latest OCI features and API changes
- When OCI operations are needed:
- Use exact CLI commands from this skill's references
- Do NOT guess OCI CLI syntax or parameters
- Do NOT assume API endpoint structures
- Load
- oci-cli-adb.md
- for ADB management operations
- What you DO know:
- Oracle Database internals (SQL, PL/SQL, performance tuning)
- General cloud concepts
- Database administration principles
- This skill bridges the gap by providing current OCI CLI/API commands for Autonomous Database operations.
- You are an Oracle Autonomous Database expert on OCI. This skill provides knowledge Claude lacks: ADB-specific behaviors, cost traps, SQL_ID debugging workflows, auto-scaling gotchas, and production anti-patterns.
- NEVER Do This
- โ
- NEVER use ADMIN user in application code
- -- WRONG - application uses ADMIN credentials
- app_config
- =
- {
- 'user'
- :
- 'ADMIN'
- ,
- 'password'
-
- admin_pwd}
- -- RIGHT - create app-specific user with least privilege
- CREATE
- USER
- app_user IDENTIFIED
- BY
- :password
- ;
- GRANT
- CREATE
- SESSION
- ,
- SELECT
- ON
- schema
- .
- *
- TO
- app_user
- ;
- Why critical
-
- ADMIN has full database control, audit trail shows all actions as ADMIN (no accountability), ADMIN can't be locked/disabled without breaking automation.
- โ
- NEVER scale without checking wait events first
- -- WRONG decision path: "CPU is high โ scale ECPUs"
- -- RIGHT decision path:
- 1. Check v$system_event for top wait events
- 2. High 'CPU time' wait โ Bad SQL, need optimization (DON'T scale)
- 3. High 'db file sequential read' โ Missing indexes (DON'T scale)
- 4. High 'User I/O' sustained โ Scale storage IOPS OR auto-scaling
- 5. Only scale ECPUs if: CPU wait sustained + SQL already optimized
- Cost impact
- Scaling 2โ4 ECPU = $526/month increase. If root cause is bad SQL, wasted $526/month. โ NEVER assume stopped ADB = zero cost Stopped Autonomous Database charges: โ Compute: $0 (stopped) โ Storage: $0.025/GB/month continues โ Backups: Retention charges continue Example: 1TB ADB stopped for 30 days Storage: 1000 GB ร $0.025 = $25/month (CHARGED!) Better for long-term idle (>60 days): 1. Export data (Data Pump) 2. Delete ADB 3. Restore from backup when needed โ NEVER forget retention on manual backups (cost trap)
WRONG - manual backup with no retention (kept forever)
oci db autonomous-database-backup create \ --autonomous-database-id $ADB_ID \ --display-name "pre-upgrade-backup"
Cost: $0.025/GB/month FOREVER
RIGHT - set retention
oci db autonomous-database-backup create \ --autonomous-database-id $ADB_ID \ --display-name "pre-upgrade-backup" \ --retention-days 30 Cost trap: 1TB manual backup ร $0 .025/GB/month ร 12 months = $300 /year waste โ NEVER use SELECT * in production queries -- WRONG - fetches all columns, heavy network/parsing SELECT * FROM orders WHERE customer_id = :cust_id ; -- RIGHT - specify needed columns SELECT order_id , total_amount , status FROM orders WHERE customer_id = :cust_id ; Impact: 50 - column table , fetching 5 needed columns - SELECT * : 50 columns ร 1000 rows = 50 k data points - Explicit: 5 columns ร 1000 rows = 5 k data points ( 90 % reduction ) โ NEVER ignore SQL_ID when debugging slow queries -- WRONG - "my query is slow, tune the database" ALTER SYSTEM SET optimizer_mode = 'FIRST_ROWS' ;
Affects ALL queries!
-- RIGHT - identify specific SQL_ID, tune that query SELECT sql_id , elapsed_time / executions / 1000 AS avg_ms , executions FROM v$ sql WHERE executions
0 ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY ; Then tune specific SQL_ID ( not entire database ) โ NEVER use ROWNUM with ORDER BY (wrong results) -- WRONG - ROWNUM applied BEFORE ORDER BY (wrong top 10) SELECT * FROM orders WHERE ROWNUM <= 10 ORDER BY created_at DESC ; -- RIGHT - FETCH FIRST (Oracle 12c+) SELECT * FROM orders ORDER BY created_at DESC FETCH FIRST 10 ROWS ONLY ; โ NEVER scale auto-scaling ADB without checking current behavior ADB Auto-Scaling Gotcha: - Base ECPU: 2 - Auto-scaling: Scales 1-3x (2 โ 6 ECPU max) - Cost: Charged for PEAK usage during period
WRONG - enable auto-scaling then forget about it
Cost surprise: Base 2 ECPU ($526/month) โ Peak 6 ECPU ($1,578/month)
RIGHT - set max ECPU limit in console
- Max ECPU = 4 (2ร base, not 3ร)
- Cost control: Peak 4 ECPU ($1,052/month) max
- Performance Troubleshooting Decision Tree
- "Queries are slow"?
- โ
- โโ Is it ONE query or ALL queries?
- โ โโ ONE query slow
- โ โ โโ Get SQL_ID from v$sql (top by elapsed_time)
- โ โ โโ Check execution plan:
- โ โ SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));
- โ โ โโ Full table scan? โ Add index
- โ โ โโ Wrong join order? โ Use hints or SQL Plan Management
- โ โ โโ Cartesian join? โ Fix query logic
- โ โ
- โ โโ ALL queries slow (system-wide)
- โ โโ Check wait events:
- โ SELECT event, time_waited_micro/1000000 AS wait_sec
- โ FROM v$system_event
- โ WHERE wait_class != 'Idle'
- โ ORDER BY time_waited_micro DESC
- โ FETCH FIRST 10 ROWS ONLY;
- โ
- โ โโ Top wait: 'CPU time' โ Optimize SQL OR scale ECPU
- โ โโ Top wait: 'db file sequential read' โ Missing indexes
- โ โโ Top wait: 'db file scattered read' โ Full table scans
- โ โโ Top wait: 'log file sync' โ Too many commits (batch)
- โ โโ Top wait: 'User I/O' โ Scale storage IOPS or auto-scale
- โ
- โโ When did slowness start?
- โโ After schema change? โ Gather stats (DBMS_STATS)
- โโ After data load? โ Gather stats + check partitioning
- โโ After version upgrade? โ Check execution plan changes
- โโ Gradual over time? โ Data growth, need indexing/partitioning
- ADB Cost Calculations (Exact)
- ECPU Scaling Cost
- License-Included pricing: $0.36/ECPU-hour
- BYOL pricing: $0.18/ECPU-hour (if you have Oracle licenses)
- Monthly cost = ECPU count ร hourly rate ร 730 hours
- Examples:
- 2 ECPU: 2 ร $0.36 ร 730 = $526/month
- 4 ECPU: 4 ร $0.36 ร 730 = $1,052/month
- 8 ECPU: 8 ร $0.36 ร 730 = $2,104/month
- BYOL (50% off):
- 2 ECPU: 2 ร $0.18 ร 730 = $263/month
- 4 ECPU: 4 ร $0.18 ร 730 = $526/month
- Storage Cost
- Storage pricing: $0.025/GB/month (all tiers: Standard, Archive)
- Examples:
- 1 TB: 1000 GB ร $0.025 = $25/month
- 5 TB: 5000 GB ร $0.025 = $125/month
- CRITICAL: Storage charged even when ADB stopped!
- Auto-Scaling Cost Impact
- Scenario: Base 2 ECPU with auto-scaling enabled (1-3ร)
- Without auto-scaling:
- 2 ECPU ร $0.36 ร 730 = $526/month (fixed)
- With auto-scaling (spiky load):
- - 50% of time: 2 ECPU = $263
- - 30% of time: 4 ECPU = $315
- - 20% of time: 6 ECPU = $315
- Monthly cost: $893 (70% increase)
- When auto-scaling makes sense:
- - Spiky load (not sustained high)
- - Want to avoid manual scaling
- - Cost increase acceptable (up to 3ร)
- SQL_ID Debugging Workflow
- Step 1: Find problem SQL_ID
- SELECT
- sql_id
- ,
- elapsed_time
- /
- executions
- /
- 1000
- AS
- avg_ms
- ,
- executions
- ,
- sql_text
- FROM
- v$
- sql
- WHERE
- executions
- >
- 0
- AND
- last_active_time
- >
- SYSDATE
- -
- 1
- /
- 24
- -- Last hour
- ORDER
- BY
- elapsed_time
- DESC
- FETCH
- FIRST
- 10
- ROWS
- ONLY
- ;
- Step 2: Get execution plan
- SELECT
- *
- FROM
- TABLE
- (
- DBMS_XPLAN
- .
- DISPLAY_CURSOR
- (
- '&sql_id'
- )
- )
- ;
- Step 3: Analyze plan issues
- TABLE ACCESS FULL
- on large table โ Missing index
- NESTED LOOPS
- with high cardinality โ Wrong join method
- HASH JOIN OUTER
- โ Consider index join
- Step 4: Create SQL Tuning Task
- DECLARE
- task_name VARCHAR2
- (
- 30
- )
- ;
- BEGIN
- task_name :
- =
- DBMS_SQLTUNE
- .
- CREATE_TUNING_TASK
- (
- sql_id
- =
- >
- '&sql_id'
- ,
- task_name
- =
- >
- 'tune_slow_query'
- )
- ;
- DBMS_SQLTUNE
- .
- EXECUTE_TUNING_TASK
- (
- task_name
- )
- ;
- END
- ;
- /
- -- Get recommendations
- SELECT
- DBMS_SQLTUNE
- .
- REPORT_TUNING_TASK
- (
- 'tune_slow_query'
- )
- FROM
- DUAL
- ;
- Step 5: Implement fix
- Recommendation: Add index โ Create index
- Recommendation: Use hint โ Test with hint, then SQL Plan Baseline
- Recommendation: Gather stats โ
- EXEC DBMS_STATS.GATHER_TABLE_STATS
- ADB-Specific Behaviors (OCI Gotchas)
- Auto-Scaling Limits
- Auto-scaling rules (cannot change):
- - Minimum: 1ร base ECPU
- - Maximum: 3ร base ECPU
- - Scaling trigger: CPU > 80% for 5+ minutes
- - Scale-down: CPU < 60% for 10+ minutes
- - Time to scale: 5-10 minutes
- Example: Base 2 ECPU
- - Can scale: 2 โ 4 โ 6 ECPU
- - Cannot scale: Beyond 6 ECPU (hard limit)
- - Cost: Pay for peak usage each hour
- ADMIN User Restrictions
- In Autonomous Database, ADMIN user:
- โ Can: Create users, grant roles, DDL operations
- โ Cannot: Create tablespaces (DATA is auto-managed)
- โ Cannot: Modify SYSTEM/SYSAUX tablespaces
- โ Cannot: Access OS (no shell, no file system)
- โ Cannot: Use SYSDBA privileges (not available in ADB)
- For applications:
- - ADMIN: Only for database setup/maintenance
- - App users: Create dedicated users with minimal grants
- Service Name Performance Impact
- ADB provides 3 service names per database:
- | Service | CPU Allocation | Concurrency | Use For |
- |---------|---------------|-------------|---------|
- | HIGH | Dedicated OCPU | 1ร ECPU | Interactive queries, OLTP |
- | MEDIUM | Shared OCPU | 2ร ECPU | Reporting, batch jobs |
- | LOW | Most sharing | 3ร ECPU | Background tasks, ETL |
- Cost: All service names use same ECPU pool (no extra cost)
- Performance: HIGH is faster but limits concurrency
- Gotcha: Using HIGH for background jobs wastes resources
- Backup Retention (Automatic vs Manual)
- Automatic backups (free, included):
- - Frequency: Daily incremental, weekly full
- - Retention: 60 days default (configurable 1-60)
- - Cost: Included in ADB storage cost
- - Deletion: Automatic after retention period
- Manual backups (charged separately):
- - Frequency: On-demand
- - Retention: FOREVER (until you delete)
- - Cost: $0.025/GB/month
- - Deletion: Manual only
- Cost trap: 10 manual backups ร 1TB ร $0.025/GB/month = $250/month
- Recommendation: Use automatic backups, manual only for long-term archival
- Version-Specific Features (Know Which ADB Version)
- Feature
- 19c
- 21c
- 23ai
- 26ai
- When to Use
- JSON Relational Duality
- -
- -
- โ
- โ
- Modern apps (REST + SQL)
- AI Vector Search
- -
- -
- โ
- โ
- RAG, semantic search
- JavaScript Stored Procs
- -
- -
- -
- โ
- Node.js developers
- SELECT AI
- -
- -
- โ
- โ
- Natural language โ SQL
- Property Graphs
- -
- โ
- โ
- โ
- Fraud detection, social
- True Cache
- -
- -
- -
- โ
- Read-heavy workloads
- Blockchain Tables
- -
- โ
- โ
- โ
- Immutable audit log
- Upgrade path
-
- 19c โ 21c โ 23ai โ 26ai
- Downgrade
-
- NOT supported (cannot go back)
- Recommendation
-
- Test in clone before upgrading production
- Common ADB Errors Decoded
- Error Message
- Actual Cause
- Solution
- ORA-01017: invalid username/password
- Wallet password wrong OR expired credentials
- Re-download wallet, check password
- ORA-12170: Connect timeout
- Network issue OR wrong service name
- Check NSG rules, verify tnsnames.ora
- ORA-00604: error at recursive SQL level 1
- Automated task failed (stats gather, space mgmt)
- Check DBA_SCHEDULER_JOB_RUN_DETAILS
- ORA-30036: unable to extend segment
- Tablespace full (DATA auto-managed)
- ADB auto-extends, if error persists โ contact support
- ORA-01031: insufficient privileges
- ADMIN user trying restricted operation
- Use ADMIN only for allowed operations (see restrictions)
- Advanced Operations (Progressive Loading)
- SQLcl Direct Database Access
- WHEN TO LOAD
- sqlcl-workflows.md
- :
- Need to execute SQL queries directly via Bash
- Want to get execution plans, wait events, or active sessions
- Performing SQL tuning tasks (DBMS_SQLTUNE)
- Exporting/importing data with Data Pump
- Generating DDL for schema objects
- Example
-
- Finding top SQL by elapsed time
- sql admin/password@adb_high
- <<
- EOF
- SELECT sql_id, elapsed_time/executions/1000 AS avg_ms
- FROM v\
- $sql
- WHERE executions > 0
- ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
- EXIT;
- EOF
- Do NOT load
- for:
- Standard troubleshooting advice - covered in this skill's decision trees
- Cost calculations - exact formulas provided above
- Anti-patterns - NEVER list covers common mistakes
- OCI CLI for ADB Management
- WHEN TO LOAD
- oci-cli-adb.md
- :
- Need to provision, scale, or delete ADB instances
- Creating backups or clones (full vs metadata)
- Downloading wallet files
- Changing configuration (auto-scaling, license type, version upgrades)
- Batch operations across multiple ADBs
- Example
-
- Scale ADB from 2 to 4 ECPUs
- oci db autonomous-database update
- \
- --autonomous-database-id ocid1.autonomousdatabase.oc1
- ..
- xxx
- \
- --cpu-core-count
- 4
- \
- --wait-for-state AVAILABLE
- Example
- Create metadata clone (70% cheaper - schema only, no data) oci db autonomous-database create-from-clone \ --source-id ocid1.autonomousdatabase.oc1 .. xxx \ --display-name "dev-schema" \ --db-name "DEVSCHEMA" \ --clone-type METADATA \ --wait-for-state AVAILABLE Do NOT load for: SQL operations (use SQLcl instead) Performance analysis (v$sql queries covered in this skill) Cost formulas (exact calculations provided above) OCI Autonomous Database Best Practices (Official Oracle Documentation) WHEN TO LOAD oci-adb-best-practices.md : Need comprehensive ADB architecture and design patterns Understanding ADB workload types (ATP, ADW, APEX, JSON) Implementing production-grade ADB deployments Need official Oracle guidance on ADB features and limitations Planning migrations to ADB from on-premises Oracle Do NOT load for: Quick SQL_ID debugging (workflow in this skill) Cost calculations (exact formulas above) Common gotchas (NEVER list covers them) When to Use This Skill Performance issues: Slow queries, high CPU, scaling decisions Cost optimization: ECPU sizing, stopped ADB charges, backup retention Debugging: SQL_ID workflow, wait events, execution plans Auto-scaling: When to enable, cost impact, limits Version planning: Feature comparison (19c vs 26ai), upgrade timing Security: ADMIN restrictions, user setup, service name selection