Did you ever wanted to find out the differences between two Oracle database releases? Today, I am super-super excited. Especially, since this was a long journey. And I have to thank our entire team, Rodrigo especially but also Bill and all the others working and helping here. THIS is the tool many of you have looking for since years. It is time now, ORAdiff is live – compare two Oracle Database and Patch releases.

What is ORAdiff?
This tool is made for you. It allows you to compare two Oracle releases to each other. And not only core releases but also patch levels with or without OJVM for those of you who have a Support contract. You will logon with your Oracle SSO user. And then you can start compare releases, e.g. 19.16.0 to 19.20.0.
Historically, the tool’s idea started from Rodrigo’s efforts on his blog dissecting Oracle patch releases. But that is a lot of information – and it was hard to compare things to each other. The idea got born to put this into an APEX app which allows access to almost everything, and find out about changes in between two Oracle (patch) releases. Especially Rodrigo put a ton of work into this – and we at Oracle use it internally already for a while.
Further down in this blog post I give you some typical examples. But there is much more you can do for sure.
Where do you start?
Simply access
– then logon with your SSO user. That’s it.
In addition, you will find a new tile in the What’s New page in the Oracle Database documentation soon.
What can you do with it?
Let me describe some typical scenarios.
Is this patch included in an RU?
This is a question I get at least once per week. And ORAdiff has the answer quickly for you. Just today I looked up for a customer whether 34910877 will be included in 19.20.0 since Support diagnosed this as the root cause for an issue.
Go to: INCLUDED FIXES ==> SEARCH FIXES and input the bug number, in my case: 34910877. Then hit RETURN. And there you go:

Good news, this fix is included in 19.20.0. And since RUs are cumulative, it will be in all future RUs for 19c as well.
Do privileges disappear? Or are there any new ones?
Another common question (and sometimes, pitfall) are privs disappearing, sometimes for security reasons. Ask ORAdiff, it will tell you.
Choose PRIVILEGES ==> SYSTEM PRIVILEGES. Then as next step choose your source and your target release, for instance 19.16.0 and 19.20.0 as you see below in the screen shot. And you will see by default System Privileges added. See also the source where this is coming from: DBA_SYS_PRIVS.

But that’s the privileges being added. But are there any removed?
Click on the “Removed” tab next to “Added” – and you will see that no privs got removed.
Any new parameters?
And what is the most often asked question you are having? Any new parameters with the new patch release. Let us just change to another menu item, PARAMETERS ==> INITIALIZATION PARAMETERS. Please recognized that your releases chosen before stay. You don’t have to adjust this.

Now click on the new parameter listed, xml_handling_of_invalid_chars, and it takes you directly to the Oracle documentation.
And there is so much more to query and play with.
Start and let us know what you think.
Will it get refreshed automatically?
Rodrigo automated almost everything. But since this is hosted in an enclosed environment in Oracle Autonomous Database, please expect a few days after a release update or patch bundle gets published until it is visible to you. No need to open an SR – we just need to wait for the official release to be available before we can do the magic.
Will it be extended?
Yes, this is not the end of the story. We plan to load also 9i and 10g information into the system as soon as time allows. And gradually, we may also add some new features. So please stay tuned and watch out on our blogs for news about ORAdiff.
Kudos and thanks a lot to Rodrigo and the entire team!!
Further Links and Information
–Mike
I love it. that will also help to learn new stuff on new versions. thanks to everyone who spend time on this.
Hi Mike,
I just checked it and its really a cool tool. Should be very useful.
Regards,
Thiru
Thanks – and we hope so 🙂
Cheers,
Mike
Quarterly RUs include ACFS/CRS(OCW)/DB/etc RUs. If you can show fixes separately for each patch type, it would be terrific. For example, Oracle included patch 34718455 in ACFS RU 19.19 causing soft lockup errors on some RHCK 8.7 systems: Postpatch errors applying 19.19 RU on RHEL 8.7 (kernel 4.18.0-425.10.1 and later) (Doc ID 2944243.1). It is one of the examples when the proposed enhancement can be useful.
Well, that would be wonderful – but patches are not labeled in such categories. We would really LOVE to do this – but it is not possible at this stage.
Cheers,
Mike
I take inventory.xml from each RU (e.g. ACFS RELEASE UPDATE 19.18.0.0.0 (34768569) and ACFS RELEASE UPDATE 19.19.0.0.0 (35050325)) and compare it to one another to get the list of patches added/removed in a certain RU (e.g. to compare ACFS RU 19.18 vs ACFS RU 19.19 / OCW RU 19.18 vs OCW RU 19.19, et cetera). The patches have no such label as you said, but each RU has a list of patches it contains – it is listed in inventory.xml of each RU and can be compared.
Hi Mike,
I was just messing around and on the left pain, under the “Fixed Objects”=>”X$ Tables”, X$DIAG_ALERT_EXT is listed as removed in 23c developer edition (I compared with 19.20). as far as I know, this is the base array for v$diag_alert_ext view. I just logon to my 23c DE and x$diag_alert_ext is still there and still base array for v$diag_alert_ext.
is that a wrong result on the application or x$diag_alert_ext on 23c will be replaced with something else?
thanks
Hi Mustafa,
I checked with Beta-3.
At first, the information in oradiff is always correct since it reads what is actually there. It is only based on what it finds in a REAL database of this release.
Secondly, I checked, and X$DIAG_ALERT_EXT disappears in 23c.
Thirdly, now the fun part.
The view exists in 23c:
DBMS_METADATA.GET_DDL('VIEW','V_$DIAG_ALERT_EXT')--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "SYS"."V_$DIA
G_ALERT_EXT" CONTAINER_DATA
("ORIGINATING_TIMESTAMP", "NORMALIZED_TIMESTAMP",
"ORGANIZATION_ID", "COMPONENT_ID", "HOS
T_ID", "HOST_ADDRESS", "MESSAGE_TYPE", "
MESSAGE_LEVEL", "MESSAGE_ID", "MESSAGE_G
ROUP", "CLIENT_ID", "MODULE_ID", "PROCES
S_ID", "THREAD_ID", "USER_ID", "INSTANCE
_ID", "DETAILED_LOCATION", "UPSTREAM_COM
P_ID", "DOWNSTREAM_COMP_ID", "EXECUTION_
CONTEXT_ID", "EXECUTION_CONTEXT_SEQUENCE
", "ERROR_INSTANCE_ID", "ERROR_INSTANCE_
SEQUENCE", "MESSAGE_TEXT", "MESSAGE_ARGU
MENTS", "SUPPLEMENTAL_ATTRIBUTES", "SUPP
LEMENTAL_DETAILS", "PARTITION", "RECORD_
ID", "FILENAME", "LOG_NAME", "PROBLEM_KE
Y", "VERSION", "CON_UID", "CONTAINER_ID"
, "CONTAINER_NAME", "ATTENTION_ID", "ID_
SUFFIX", "OPERATION_ID", "CAUSE_TEXT", "
ACTION_TEXT", "ORACLE_PROCESS_ID", "DATA
BASE_ID", "SQL_ID", "SESSION_ID", "IMPAC
T_ID", "IMPACT_SCOPE", "TARGET_USER", "C
ALL_STACK", "FLAGS", "URGENCY", "START_V
ERSION", "SECURITY_LABEL", "CON_ID") AS
select
"ORIGINATING_TIMESTAMP",
"NORMALIZED_TIMESTAMP",
"ORGANIZATION_ID",
"COMPONENT_ID",
"HOST_ID",
"HOST_ADDRESS",
"MESSAGE_TYPE",
"MESSAGE_LEVEL",
"MESSAGE_ID",
"MESSAGE_GROUP",
"CLIENT_ID",
"MODULE_ID",
"PROCESS_ID",
"THREAD_ID",
"USER_ID",
"INSTANCE_ID",
"DETAILED_LOCATION",
"UPSTREAM_COMP_ID",
"DOWNSTREAM_COMP_ID",
"EXECUTION_CONTEXT_ID",
"EXECUTION_CONTEXT_SEQUENCE",
"ERROR_INSTANCE_ID",
"ERROR_INSTANCE_SEQUENCE",
"MESSAGE_TEXT",
"MESSAGE_ARGUMENTS",
"SUPPLEMENTAL_ATTRIBUTES",
"SUPPLEMENTAL_DETAILS",
"PARTITION",
"RECORD_ID",
"FILENAME",
"LOG_NAME",
"PROBLEM_KEY",
"VERSION",
"CON_UID",
"CONTAINER_ID",
"CONTAINER_NAME",
"ATTENTION_ID",
"ID_SUFFIX",
"OPERATION_ID",
"CAUSE_TEXT",
"ACTION_TEXT",
"ORACLE_PROCESS_ID",
"DATABASE_ID",
"SQL_ID",
"SESSION_ID",
"IMPACT_ID",
"IMPACT_SCOPE",
"TARGET_USER",
"CALL_STACK",
"FLAGS",
"URGENCY",
"START_VERSION",
"SECURITY_LABEL",
"CON_ID"
from x$diag_ALERT_EXT
And of course, I can query: x$diag_ALERT_EXT
So, let me check what is happening here.
Cheers,
Mike
Hi Mike,
I found another beauty in this app 🙂 comparing 19.20 and 21.11, in initialization parmeters, “read_only” parameter is listed as newly added but it does not in the documentation (when you click, url is not working too), it is not in 23c documentation either. So, we have a new source for parameters 🙂 I didn’t know about read_only parameter. thanks again.
Hi Mustafa,
this was a doc bug which has been fixed by now (our doc writers use oradiff as well):
https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/READ_ONLY.html#GUID-CDB2436A-7C36-4C94-95C6-C72A67F64C18
Cheers,
Mike
Thanks for this post. Also thanks to the team who developed this really useful utility. Just yesterday I had to find out if a one-off patch is now rolled into 19.20 and this utility made it so much easier than going through the entire bug fix list.
Very useful, great !
Now that in oradiff you have the inventory of all files in each release, it would be so nice if we could generate some kind of inventory of an existing oracle installation and upload it to oradiff. Then the tool should say if your installation is ok or not. Sometimes it happens that, after patching or after errors during patching or people messing around in an oracle home, that files are missing or ownerships or permissions are not correct anymore. Usually you notice this during the next patching cycle when things start to fail. If we could do a validation that guarantees that an oracle_home is 100% ok, that would give a lot of confidence. Especially on ODA, where you should not manually touch any files. But in pratice I often see people have been doing things on the ODA and the principle (when ODA was launched) that “all ODA’s in the world are identical” (if they are on the same patch level), is rarely true. If you have a reference in oradiff about how a valid oracle_home (db and grid) looks like, and we could compare our oracle_home with it, that would be so nice.
Hi Geert,
we have this internally already in beta stage. But rolling this out externally will be a challenge.
You would upload “your data” to an Oracle system, and an incredible amount of security and compliance audits need to be done on our side beforehand. In short, yes, we have this in our mind – but at the moment I can’t tell you whether we’ll be able to offer this as a service for customers directly.
Thanks 🙂
Mike
Hi, this is a really useful tool, thanks to everyone who spent time on it.
Sometimes it will be really helpful to look up any changes specific to init parameters, or to privs/roles.
But do you think it would be possible to generate a single report of all of the Object Types? So when we are considering an upgrade we can print off a list of all the changes and scan through them to see if there is anything eye catching for our organisation.
Just a thought, thanks very much
Hi Manfred,
you can already see the changes of a given parameter.
Go to: SEARCH PARAMETER under the PARAMETER section in the left menu.
Then search for any given parameter.
Once the parameter gets displayed, you will have a “Show Default Value” switch below.
Toggle it to see default changes across the releases.
For the objects list, please drop me an email (mike.dietrich …. oracle.com) so I can understand better what exactly you are looking for.
Thanks,
Mike
Hi Mike, Does this require any management packs and is the usage free without limitations against Standard Edition DBs?
No limitations, no license.
Cheers,
Mike
Where can I download ORADiff ? Thanks
You can’t download it 🙂
https://oradiff.oracle.com
is the web address.
Cheers,
Mike
Hi Mike. Thank you for this post.
Let me ask you a question.
When I click Oracle Database Home in ORAdiff, I cannot transition to the documentation site. Does this mean Oracle can’t publish what’s being sourced?
I’m wondering what it’s source, so I asked a question.
Best Regards,
Yoshi
Hi Yoshi-san,
please give me a detailed description what you have done, and what you are missing.
Are you clicking on a specific file in the ORACLE DATABASE HOME tab? This will open a pop-up windows which shows the file but doesn’t link to the documentation. Parameters do link to the doc.
Please drop me an email or use the oradiff-int slack channel.
Cheers,
Mike
Mike, Thanks I figured out after I posted that I need to use URL and I am good.
In the parameters section, the link behind the invalid XML characters gives 404 error. Super excited for this!
Hi Natalie,
can you please:
a) check again – Rodrigo pushed out a version with a good number of fixes
b) if it happens still, give me a bit more precise description so I can tell him about the error
Thanks,
Mike
Hi Mike,
I remember attending Jorge’s presentation in 2021 about detecting malicious changes in Oracle’s DB structure (e.g., someone modified SYS.DBA_USERS view to hide a hacked user or modified a SYS internal package to hide a rootkit). It would be nice if ORADiff would provide hashes for every SYS provided object for out-of-the-box clean install 19.x version for download. I could then download the file, import the contents in my database and compare them with my computed hashes. Finding SYS objects that have been tinkered with would be really easy.
Best Regards,
Samo
Hi Samo,
trust me, Rodrigo has some extra ideas. And one of them will go into this direction.
The trouble is: We need to allow you to upload your database information with your hashes – and “upload” means an extra security approval on our side which usually takes months.
Cheers,
Mike
Hi,
I’m talking about the exact opposite of that. I’m suggesting that OraDiff provides hashes of dictionary objects (what “Oracle provides” in certain version, e.g., 19.21) so I can download and compare with “what I have” in my database. I fail to see the reason to upload my database information to your side for that?
Regards,
Samo
Got it, Samo!
I will share with the team.
Thanks,
Mike
Hello,
we are going to migrate from a database in version 12.1.0.2 to version 19c so we want to identify if in our baseline or code we find deprecated or obsolete functions with this tool we could get to that level of detail ?
thanks
You need to do a manual check right now – it has no option (at the moment) to upload the spec of your database and get such topics flagged.
But we are working on this.
The challenge is that we need a complete new security approval check for this as soon as we allow you to upload anything.
That is more complex than building it.
Cheers,
Mike