DBA Blogs
A Picture Is Worth A Thousand Words: Dashboards To The Rescue
Building an application in the age of AI assisted development is only half the battle.
With an APEX application hosted on OCI, monitoring resource consumption is vital, because with the free tier you cannot exceed certain volumes of requests, whether they are REST requests or emails or notifications.
A well-crafted dashboard, beyond just eye-catching aesthetics, can help you spot problems that might otherwise go unnoticed until the application runs out of resources and stops working.
The position of the big blue circle shows there is something wrong with the embedding calls Spotting anomalies at a glance:A prime example of a dashboard's utility is how it highlights hidden inefficiencies and runaway processes.
In the API requests visualization, in the lower left portion of the image, a massive blue circle was dominating the chart, immediately drawing my attention.
- The big blue bubble instantly signals an anomaly in the system's traffic pattern.
- The position of its centre on the Y axis compared to the position of other types of requests over the week reveals that the application is currently executing a disproportionate number of embedding requests to the LLM.
- Looking at the chart I could immediately start investigating the rogue document processing procedure.
SELECT
-- Chronological X: 6 = 6 days ago, 0 = Today
to_char(w.request_date,'Day') as dy,
(trunc(w.request_date) - trunc(sysdate)) as x_value,
nvl(regexp_substr(w.url,'(http(s)?:/)(/([^/]+))+',1,1,'c',4), 'UNKNOWN') as series,
count(*) as requests, -- Y-axis
sum(elapsed_sec) as elapsed, -- Bubble radius
to_char(w.request_date,'Day') || '
Requests: ' || count(*) || '
Time: ' || sum(elapsed_sec) as custom_tooltip
FROM apex_webservice_log w
WHERE w.request_date >= trunc(sysdate) - 6 and w.request_date < trunc(sysdate) + 1
GROUP BY to_char(w.request_date,'Day'),
(trunc(w.request_date) - trunc(sysdate)),
nvl(regexp_substr(w.url,'(http(s)?:/)(/([^/]+))+',1,1,'c',4), 'UNKNOWN')
ORDER BY x_value desc, series;
Dashboards can bridge the gap between hundreds of log entries in an APEX internal view and the need to extract and present the significant information in an efficient and concise way.
Last but not least, AI can suggest the critical resources to monitor and how to best represent the information with a chart if you are short of ideas.
Defending Your PL/SQL Code: Why Anchoring with %TYPE Saves the Day
You are loading an associative array and you are getting the following error:
ORA-06502: PL/SQL: value or conversion error:
associative array key violates its type constraints
image created by Google GeminiWhen I asked Gemini for this error message it said it had to do with a null value in the key but this is false, if the key value is null you'll get a different error message:
ORA-06502: PL/SQL: value or conversion error: NULL index table key value And there is also another interesting fact, if you explicitly assign an array element indexed by varchar2(n), in this fashion:
g_arr('') := 'something';
no error whatsoever, the whole array is wiped out, as if you executed g_arr.delete, and it's not clear to me if this is a bug or expected behavior.
So let's see the real reason for "associative array key violates its type constraints":
Create table config (config_key varchar2(50), config_value varchar2(500));
insert into config values('some_key', 'some value');
insert into config values('some_key_with_a_long_name', 'some other value');
declare
type t_associative_array is table of varchar2(500) index by varchar2(10);
g_arr t_associative_array;
k varchar2(50);
begin
FOR rec in (select config_key, config_value from config)
LOOP
g_arr(rec.config_key) := rec.config_value;
END LOOP;
k := g_arr.first;
WHILE k IS NOT NULL LOOP
DBMS_Output.PUT_LINE ('''' || k || ''':''' || g_arr(k)||'''');
k := g_arr.NEXT(k);
END LOOP;
end;
/
And bum!
ORA-06502: PL/SQL: value or conversion error:
associative array key violates its type constraints
The problem is that you declared the associative array key to be INDEX BY VARCHAR2(10), but the value coming from table is longer.
This type of problems can easily happen when you add new values over time whose length can be longer than original ones and you were a bit lazy when you wrote the code, declaring some variables with explicit data types to save some typing.
To avoid surprises you can rewrite the script as follows:
declare type t_associative_array is table of config.config_value%type
index by config.config_key%type; g_arr t_associative_array; k config.config_key%type; begin FOR rec in (select config_key, config_value from config) LOOP g_arr(rec.config_key) := rec.config_value; END LOOP; k := g_arr.first; WHILE k IS NOT NULL LOOP DBMS_Output.PUT_LINE ('''' || k || ''':''' || g_arr(k)||''''); k := g_arr.NEXT(k); END LOOP; end;
/
This time it will output the values without errors.
'some_key':'some value' 'some_key_with_a_long_name':'some other value' Statement processed.
Is this error specific for associative array key ?
Yes it is, if the problem is in the length of the value, you will get this error instead:
ORA-06502: PL/SQL: value or conversion error: character string buffer too smallThis distinction is good because it pinpoints the root cause of the problem.
Last but not least: watch out for the column and variable length semantics!
If you store the keys containing some variable length characters and you defined the associative array using byte semantics using explicit data types, you could incur in the same errors and be confused as the length of the key or the value seem to be within the valid range.
The best solution, and best practice by the way, is to define the array and the variables as shown above, referring to the table columns definition.
Striim MDR on PostgreSQL: Fixing striimsecuritytable does not exist
Striim won’t start on a new PostgreSQL MDR? If postgres owns the striim schema, here’s how to find it and fix the issue.
The post Striim MDR on PostgreSQL: Fixing striimsecuritytable does not exist appeared first on DBASolved.
A Practical Guide to Oracle Regex
If you've ever pulled thousands of rows into an application just to check whether a product code looks right, this post is for you. Oracle's built-in regular expression functions let you validate, search and tidy text right where the data lives, so you don't need extra string-handling code in every app that touches the table.
Oracle gives you one condition and four functions:
REGEXP_LIKEA true/false test, used in WHERE clauses and constraints
REGEXP_COUNTHow many times a pattern shows up
REGEXP_INSTRThe position where a match starts (or ends)
REGEXP_SUBSTRThe matching text itself
REGEXP_REPLACEThe string with matches swapped for something else
Each accepts an optional match-parameter string. The useful flags are i (ignore case), c (respect case), n (let the dot match a newline), m (treat each line as its own line for anchors) and x (ignore spaces in the pattern).
CREATE TABLE stock_items (
sku VARCHAR2(20),
item_desc VARCHAR2(100),
supplier_email VARCHAR2(80),
delivery_date VARCHAR2(10),
handling_note VARCHAR2(200)
);
INSERT INTO stock_items VALUES
('BRK-0215', ' Heavy duty brake rotor 330mm ', 'accounts@brakeworks.example.com.au', '07/03/2026',
'<note>fragile</note><note>keep dry</note>');
INSERT INTO stock_items VALUES
('ROT-1180B', 'Rotor rotor bolt kit', 'sales@boltbarn.example.com.au', '19/11/2026',
'<note>pallet only</note>');
COMMIT;
1. Guarding the door with a CHECK constraint
Say every SKU must be three capital letters, a hyphen, four digits, and optionally one trailing capital letter. One constraint handles it for every application:
ALTER TABLE stock_items ADD CONSTRAINT ck_sku_shape
CHECK (REGEXP_LIKE(sku, '^[A-Z]{3}-[0-9]{4}[A-Z]?$', 'c'));
The anchors ^ and $ force the whole value to fit the pattern, and the c flag keeps lowercase letters out. Results:
BRK-0215 accepted ROT-1180B accepted brk-0215 rejected (lowercase) BRK0215 rejected (no hyphen) BRK-215 rejected (only three digits) BRK-0215BB rejected (two trailing letters)2. Counting words
SELECT item_desc,
REGEXP_COUNT(item_desc, '\w+') AS word_count
FROM stock_items;
For 'Rotor rotor bolt kit' this returns 4. It's a quick way to flag descriptions that are too short to be useful.
To get each supplier's domain, capture it in a group and ask for that group with the sixth argument:
SELECT REGEXP_SUBSTR(supplier_email, '@(\S+)$', 1, 1, NULL, 1) AS supplier_domain FROM stock_items;
brakeworks.example.com.au boltbarn.example.com.au
The @ is matched but left out of the result, because only the bracketed group is returned.
SELECT REGEXP_INSTR('Rotor kit 330mm', '\d') AS first_digit,
REGEXP_INSTR('Rotor kit 330mm', '\d+', 1, 1, 1) AS just_after_number
FROM dual;
FIRST_DIGIT JUST_AFTER_NUMBER
----------- -----------------
11 14
The fifth argument, 1, asks for the position immediately after the match instead of its start.
Our first row has leading, trailing and doubled spaces:
SELECT REGEXP_REPLACE(TRIM(item_desc), '\s{2,}', ' ') AS tidy_desc
FROM stock_items;
' Heavy duty brake rotor 330mm ' becomes 'Heavy duty brake rotor 330mm'. Any run of two or more whitespace characters collapses into one space.
A back reference lets you reuse what a group captured. Here we convert Australian-style dates (DD/MM/YYYY) to ISO format:
SELECT delivery_date,
REGEXP_REPLACE(delivery_date,
'^(\d{2})/(\d{2})/(\d{4})$',
'\3-\2-\1') AS iso_date
FROM stock_items;
07/03/2026 2026-03-07 19/11/2026 2026-11-19
Rows that don't fit the pattern pass through unchanged, so test for that before trusting the output.
Back references also catch accidental repeats, such as "Rotor rotor":
SELECT sku FROM stock_items WHERE REGEXP_LIKE(item_desc, '(^| )(\w+) \2( |$)', 'i');
Group 2 captures a word, and \2 demands the same word straight after it. This flags ROT-1180B.
By default, quantifiers grab as much as they can. Adding ? makes them take as little as possible:
SELECT REGEXP_SUBSTR(handling_note, '<note>.*</note>') AS greedy,
REGEXP_SUBSTR(handling_note, '<note>.*?</note>') AS lazy
FROM stock_items
WHERE sku = 'BRK-0215';
GREEDY LAZY ---------------------------------------------- --------------------- <note>fragile</note><note>keep dry</note> <note>fragile</note>
Greedy runs to the last closing tag, while lazy stops at the first.
Gotchas worth remembering- Character classes need two sets of brackets. Write
[[:upper:]]+, not[:upper:]+. The inner pair names the class and the outer pair makes it a list. - Don't assume Perl, Python or JavaScript syntax carries over. Oracle supports shortcuts like
\d,\wand\s, but not word-boundary markers (\b) or lookaheads. - Escape literal metacharacters. To match a real dot or bracket, use
\.or\(. - Mind performance. A regex condition on a large column usually can't use an ordinary index. If a pattern query is hot, consider a function-based index or a cheaper pre-filter such as
LIKE. - Multibyte text works, but write characters directly. Oracle matches on encoded bytes rather than
\uXXXXescapes.
Start with a constraint on your messiest column, since that's where the payoff is quickest. Then add REGEXP_SUBSTR and REGEXP_REPLACE to your reporting queries. Once you've written a few patterns, you'll find a lot of application-side string handling can simply be deleted.
RAG Time with APEX for #JoelKallmanDay
What is the best approach when it comes to execute a semantic search for RAG (Retrieval Augmented Generation) in OllAPEX ?
OllAPEX is an Oracle APEX workbench designed for local LLM integration via Ollama, with semantic search over documents (such as Oracle skills repositories or excerpts from Oracle documentation) amongst other functions.
The main purpose of semantic search report applied to the Oracle Skills or other Oracle documents is to test a search before implementing a RAG mechanism inside OllAPEX itself.
The Real-World Context: Semantic Search in OllAPEXIn OllAPEX, semantic search allows users to query vector-embedded markdown files directly from an APEX interface.
[ User Input Topic / Query ]
│
▼
ollapex.semantic_search(:TOPIC, ...)
│
▼
JSON_TABLE (Extract Top N Chunks)
│
▼
Join with OLLAPI_DOCUMENT_CHUNKS & UPLOADS
│
▼
[ Render Results in a report ]
The underlying SQL query calls a PL/SQL vector search function ollapex.semantic_search(), parses the returning JSON payload via JSON_TABLE, and joins the parsed rows with document chunk metadata tables (ollapi_document_chunks and ollapi_uploads_for_embedding). Here is the user-facing application displaying semantic search results for queries over chunks of Oracle skills in markdown format:
picture #1, semantic search report
The initial version of the query behind the report looked like this:
picture 2, semantic search query
And its execution plan:
picture 3, execution plan for the initial semantic search query
Then I thought: how can I ensure that the CTE is executed only once as I don't want that the prompt embedding function is called more times than necessary ?
To ensure the vector search function in the CTE executes only once, I added a /*+ MATERIALIZE */ hint:
picture 4, query with MATERIALIZE hint added
And this is the execution plan that I got:
picture 5, execution plan for the semantic search query with MATERIALIZE
As you see the cost is slightly increased and now there is a FULL scan on the temporary table created by the MATERIALIZE hint. No big deal but it doesn't look like an improvement to me.
But wait, is this the best way to tackle this problem?
In the end if I want to be sure that the embedding function is executed only once and there are no dependencies from what follows, then I am better off separating the embedding phase from the search phase:
dynamic action doing the embedding before running the reportSo when the user clicks on the search button, a dynamic action performs the embedding on user's prompt and returns the results as a JSON array (CLOB).
The final query eventually uses the vector to perform the semantic search:
Since there are no vector indexes defined (yet), the execution plan remains identical to that of picture 3, thus performing a so-called "exact" similarity search but now I am 100% sure that the embedding request will be performed just once.
Have a nice #JoelKallmanDay, remembering Joel, Scott and Carl.
Database Space Usage
Oracle Spatial Studio
Striim 5.4.2 on macOS: Using Oracle Instant Client 26ai Drivers
Running Striim 5.4.2 on macOS against Oracle 26ai? Swap the bundled 21 drivers for Instant Client jars and set NATIVE_LIBS.
The post Striim 5.4.2 on macOS: Using Oracle Instant Client 26ai Drivers appeared first on DBASolved.
Before the Ice Cream Melts: Catching Refrigeration Trouble Early with Oracle AI Data Platform
A refrigerated truck rarely fails with a bang. It drifts. The trick is noticing the drift while the cargo is still safe.
A Tuesday Night on the HighwayPicture a fleet of refrigerated trucks carrying vaccines, dairy, and frozen food overnight. Each truck produces a steady stream of readings: cargo temperature, compressor current, door-open time, vibration, and fuel use. Those readings usually sit in separate places, such as telematics portals, maintenance systems, and spreadsheets.
When someone has to hunt across all of them, problems get found late. This post sketches how a fleet operator could use Oracle Cloud Infrastructure (OCI) and Oracle AI Data Platform to connect those signals and move from reacting to predicting. It is an adapted scenario based on a published Oracle reference approach for industrial IoT, not a customer case.
The Cast of Oracle Services Oracle AI Data PlatformThe backbone. It brings ingestion, processing, storage, analytics, and AI into one connected foundation, so raw truck telemetry becomes curated data that other teams can reuse.
OCI StreamingThe intake pipe. Spark publishes sensor events to it through its Apache Kafka-compatible endpoint, which moves high-volume readings toward processing.
Spark on OCIThe cleanup crew. It validates and enriches incoming data and standardizes timestamps, units, and measurements, so a Fahrenheit reading from one truck and a Celsius reading from another do not get mixed up.
Oracle Analytics CloudThe control room screen. Dispatchers and maintenance planners see trends, anomaly flags, and forecasts in shared dashboards.
Oracle Fusion Data IntelligenceThe memory. It can combine maintenance history and work-order data with the operational picture, so a strange reading can be compared with what was last repaired on that unit.
Following One Reading from Truck to Technician- Sense. Sensors on the trailer capture temperature, compressor behavior, and door activity.
- Stream. Events flow into OCI Streaming through the Kafka-compatible endpoint.
- Prepare. Spark checks, enriches, and standardizes the data.
- Store. Object Storage and data-lake layers keep both current and historical readings.
- Learn. Models flag unusual behavior and forecast where signals are heading.
- Show and alert. Dashboards and notifications reach the people who can act.
Good predictions depend on good data first. The machine learning only works if the pipeline underneath it is reliable and consistent.
Smarter Than a Fixed AlarmA simple threshold alarm only fires after the temperature crosses a line. Anomaly detection looks at patterns across signals, such as a compressor drawing more current while the cargo temperature creeps upward. That pattern can deserve attention even though no single reading has crossed a limit yet.
Forecasting adds time. If a signal is expected to keep moving the wrong way, planners get a chance to schedule a check at the next depot instead of dealing with a spoiled load on the road.
What a Good Alert Looks LikeAn alert can name the affected signal, the truck or trailer, and the time of the event. The people receiving it should treat it as a prompt to look closer, not as proof that something has broken. They confirm against the dashboard trend, decide whether to inspect, and record what they decided.
Two Screens That Do the Heavy Lifting Fleet health view in Oracle Analytics CloudDashboards can combine sensor trends, anomaly indicators, forecasts, maintenance dates, and work-order readiness. One page answers the question: which trailers need eyes on them first?
Maintenance context in Fusion Data IntelligenceTeams can identify units with higher anomaly rates, compare predicted maintenance dates with scheduled ones, and review asset trends. That helps with prioritizing work and with efforts to limit unplanned downtime.
Ask Questions in Plain LanguageThe same curated data can feed AI-assisted reporting. A manager could ask which routes showed the most door-open anomalies this week and explore possible causes without waiting for a separate report. Oracle also notes that Oracle Analytics Cloud data models can be reached through supported MCP clients for natural-language and developer workflows. The MCP tools are described as a preview feature, so review the documentation before testing.
Five Things to Settle Before Launch- Data rules. Agree on expected ranges, units, timestamp conventions, and what happens when a sensor goes quiet.
- Who owns each alert. Name the responsible team, severity levels, notification channel, and escalation path.
- Model upkeep. Track false alarms and misses, watch for drift, and decide when to retrain or roll back.
- Access control. Consider least-privilege access, OCI IAM policies, compartment boundaries, encryption, network controls, and audit logging.
- A human in the loop. Decide how alerts get verified, how decisions are recorded, and how outcomes are reviewed.
Start by reading the documentation for OCI Streaming, Oracle AI Data Platform, Oracle Analytics Cloud, and Oracle Fusion Data Intelligence. Then test the pipeline, access controls, model monitoring, and response workflow against your own fleet and your own cargo rules.
The TakeawayThe value is not in collecting more data. It is in connecting what you already collect so the right person sees the right signal early enough to act. Done well, that points toward fewer unplanned breakdowns, steadier cargo quality, and calmer nights for dispatch.
Will Oracle AI Database be renamed again to Oracle SI Database?
how to find lock blockers and lock waiters in RAC
DBMS_DST.get_latest_timezone_version
How can I set JOB_CREATOR to the job owner when creating a Scheduler job in another schema?
Application Root uninstall issues
Reg career path
Calling Oracle Apex from Oracle Forms without User ID and Password Authentication
Moving data from one partition to another partition of the same table -Best methods
Fit Before Fame: Picking the Right AI Model for the Job You Actually Have
Leaderboards tell you who won a contest. They do not tell you who will survive your Monday morning workload.
The Trap of Starting With a Model Name
A lot of AI projects kick off by checking rankings and picking whatever is trending. The result often shines in a demo, then stumbles when real volume, many simultaneous users, and hard business deadlines show up. A sturdier approach starts somewhere else entirely: with the work. What must the system produce, how quickly, how accurate must it be, and how much human review already happens afterward?
What follows is a practical way to answer those questions, drawn from a large request-for-proposal (RFP) automation effort that ran on Oracle Cloud Infrastructure Generative AI.
Write Down the Constraints FirstBefore touching an optimizer or shortlisting a model, put numbers and facts behind these questions:
- How many items need processing in one batch or one day?
- What turnaround time is acceptable?
- How much human checking still follows the model's answer?
- How tightly must answers stay anchored to source documents?
- What level of concurrency will production realistically see?
Honest answers here cut the options down faster than any benchmark ever will.
Training Methods: Match the Tool to the TerrainThe optimizer that adjusts weights during training shapes how long training takes, how stable it is, and how good the result becomes. Think of it as choosing a vehicle for the road ahead.
Steady and predictable suits smaller models and tabular data. Adaptive step sizing suits big transformer-style models. History-aware methods suit data that unfolds in sequence.
Simple, stable updates are a good fit when predictable behavior matters more than raw speed. Adaptive methods tune their own step sizes, which tends to speed up convergence on large transformer models and often lowers total compute cost. Methods that weigh recent history can help when the data has a strong sequential flavor.
Even if your organization only consumes a pre-trained model, this still matters. Upstream training choices shape how the model behaves on your data, so look at the algorithm family alongside your intended production use.
Choosing a Model for Your WorkloadThere is no universal winner. Retrieval-heavy tasks that must stay faithful to internal documents lean toward models built for grounded generation. High-volume batch jobs that can tolerate a few gaps lean toward throughput-focused models. Multimodal needs, long-document analysis, or on-premises customization each point somewhere different.
A reliable test: take a representative slice of your real workload, run it on two or three candidates, and measure both quality and elapsed time under the same network and concurrency conditions production will have.
A Real Test Run: What the RFP Project RevealedIn the evaluated project, a large set of enterprise questions was processed across different network paths, shared and dedicated infrastructure, and single-user and concurrent loads.
One model gave thoroughly grounded answers but needed about ninety minutes per batch. A second model finished the same volume in a fraction of that time, and most of its responses were still usable after a short human review that the existing process already included.
Surprises Along the Way- More concurrent users did not always mean more total throughput. Rate limits in the managed service sometimes made serialized runs the more efficient choice.
- Many "not found" answers came from missing content in the knowledge base, not from the model.
- Detailed regional instructions in prompts sometimes caused language drift. Simpler, clearer prompts gave steadier results.
The team picked the faster model. Downstream review already covered coverage gaps, and the shorter cycle meant more batches per day. Workflow fit decided it, not a universal ranking.
Let the Constraints Shape the ArchitectureOnce the operational needs are clear, the surrounding design falls into place. Routing logic, retrieval settings, fallback handling, and concurrency limits become deliberate choices instead of afterthoughts. Swapping models without revisiting these pieces rarely fixes the real problem.
Teams that begin with the outcome they need, the latency they can live with, and the review steps already in place usually reach a working system sooner than teams that begin with a favorite model.
Your Next Five Moves- Document volume, latency target, and review process for your specific use case.
- Run a side-by-side comparison on a representative sample, under realistic network and load conditions.
- Check data coverage and retrieval quality before blaming the model for gaps.
- Treat prompt wording and concurrency settings as dials you can tune, not fixed constants.
- Measure end-to-end cycle time and human effort, not just model-level scores.
Enterprise AI works when the tools and methods line up with the work that must get done. The strongest systems scale reliably inside the operational environment they live in, no matter which model sits at the center.
Capture VS Code requests to Ollama using MITM reverse proxy
Using mitmdump, we can create a reverse proxy in front of a local Ollama instance (which runs on port 11434) and record the incoming traffic:
Bash
mitmdump --mode reverse:http://localhost:11434 -p 11435 -w ~/Documents/ollama_requests.logBy pointing your VS Code extension to localhost:11435 instead of the default port, all HTTP traffic is silently intercepted and saved to your log file.
Next, we convert this binary log into a human-readable format, cranking up the detail level to capture the full request payloads:
Bash
mitmdump -r ollama_requests.log --set flow_detail=3 > today.txtNow you have a raw text file containing every prompt and system instruction sent by VS Code. The final step is to feed today.txt back into an LLM. You can ask it to summarize your daily coding activity, analyze the hidden system prompts injected by your extensions, or extract recurring development patterns. It is a fantastic way to reverse-engineer how AI assistants structure their context.
One Database, Many Countries: Inside Oracle Globally Distributed AI Database
What if your data could live in the right country, survive a regional outage, and still look like one database to your application?
The Idea in Plain WordsOracle Globally Distributed AI Database is a single logical database that spreads and replicates data across nodes, regions, and countries. Developers work with it as one database. Behind the scenes, Oracle decides where each piece of data lives.
Oracle positions it for always-on architectures, high performance, and data residency rules. Applications keep the converged capabilities of Oracle AI Database, including relational, AI vector, JSON, Graph, and Spatial data.
Where You Can Run ItOracle lists several deployment options:
- Globally Distributed Autonomous AI Database on OCI, a fully automated option.
- Globally Distributed Exadata Database on Exascale Infrastructure on OCI.
- Oracle AI Database services on OCI in multicloud environments.
- Oracle AI Database Enterprise Edition in your own data center.
The capabilities are built into Oracle AI Database Enterprise Edition, so the same approach works wherever it is deployed.
Sharding Without the Manual WorkSharding means splitting data across several databases. Doing it by hand is painful. Oracle says its service automates sharding and resharding, and rebalances data to keep workloads even.
Oracle describes six data distribution methods. One example is composite sharding, which uses two levels of sharding with different methods and keys. The goal is to place data close to where it is needed for low latency, availability, or residency.
Raft Replication for Fast FailoverRaft is a consensus protocol for replicating logs across nodes. Oracle uses it in an active-active-active design. Its stated goals are failover within seconds and no data loss during outages.
Raft replication is available with Oracle AI Database 26ai. Oracle also says Globally Distributed AI Database can be used with Oracle Database 19c to gain Raft replication. Oracle Data Guard can be added as another replication choice on the Autonomous service.
Data Residency Made PracticalMany regulations say certain data must stay in a given country. With this database, you set policies by geography for data, replicas, backups, and encryption keys. Specific shards can sit in-country while the application tier stays central.
Oracle quotes Munich Re HealthTech saying the service helps them meet residency rules by distributing data across countries, transparently to application users.
No Code ChangesOracle says existing Oracle AI Database applications can start using a distributed database without modification. The client drivers support it natively, and developers keep strong consistency and full SQL.
Where It Fits- Global apps that need low latency for users on every continent.
- Financial systems that cannot afford to lose transactions.
- Regulated industries with strict in-country storage rules.
- AI workloads that combine vector search with business data.
- List which data must stay in which country.
- Choose a sharding key that matches how your data is accessed.
- Pick a replication method for your failover and consistency needs.
- Test failover and resharding under realistic load.
- Verify current feature and version support in Oracle's documentation.
Globally Distributed AI Database aims to give teams global scale, high availability, and residency control without rewriting applications. Oracle's claims are strong, so run your own workload tests to confirm them for your environment.




