{"id":4127,"date":"2022-02-04T23:04:37","date_gmt":"2022-02-04T23:04:37","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=4127"},"modified":"2022-08-06T07:49:22","modified_gmt":"2022-08-06T07:49:22","slug":"ora-00600-on-materialized-view-refresh","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/","title":{"rendered":"ORA-00600 on Materialized View Refresh"},"content":{"rendered":"<p>We hit ORA-12008 and ORA-00600 errors on materialized view refresh. The ORA-00600 error message were not directly related to the problem. A service request didn&#8217;t bear fruit &#8211; after getting some random action plans and inquiries for a couple of weeks, we decided to let it go. It was one of those cases where I had to use debugger to understand the root cause and find a workaround.<\/p>\n<p>It turned out, there are two serious problems in how Oracle handles MV refresh. One is that the population of meta data isn&#8217;t atomic &#8211; if the process breaks, it will leave inconsistent information. As a consequence, the subsequent refreshes will fail. The other is, that the error isn&#8217;t raised immediately upon the retrieval of the corrupt metadata. The program continues, instead, and will fail at some random point with a random error message, completely unrelated to the issue. In 21c it was ORA-00600, and in 19c we saw &#8220;ORA-01031: insufficient privileges&#8221;, even when the privileges were correctly set.<\/p>\n<h1>Metadata<\/h1>\n<p>A simple table and a materialized view (MV) are sufficient to reproduce the problem:<\/p>\n<pre><code>drop materialized view mv ;\ndrop table t;\n\ncreate table t (n number);\ncreate materialized view mv as select * from t ;<\/code><\/pre>\n<p>The information in the table sys.snap_refop$ is critical. That table is empty after creating the MV:<\/p>\n<pre><code>select sql_txt FROM sys.snap_refop$  \n  where operation# IN (21, 22)  \n    and sowner = user and vname = 'MV' ;\n\nno rows selected<\/code><\/pre>\n<p>The first refresh populates the table:<\/p>\n<pre><code>exec DBMS_MVIEW.REFRESH( LIST=&gt;'MV', atomic_refresh =&gt; false, out_of_place =&gt; TRUE);\n\nPL\/SQL procedure successfully completed.\n\nselect sql_txt FROM sys.snap_refop$  \n  where operation# IN (21, 22)  \n    and sowner = user and vname = 'MV' ;\n\nSQL_TXT\n--------------------------------------------------------------------------------\n\/* MV_REFRESH (CTB) *\/ CREATE TABLE \"U\".\"%s\"\n   (    \"N\" NUMBER\n   ) SEGMENT CREAT\n\nINSERT \/*+ APPEND *\/ INTO \"U\".\"%s\"  select * from t<\/code><\/pre>\n<p>The table contains two SQL statements. One is to create the table that underpins the MV. The other is an insert to populate it. The excerpts from the SQL trace below show that the subsequent refresh indeed reads the table and executes the retrieved commands:<\/p>\n<pre><code>@<a href=\"https:\/\/github.com\/tanelpoder\/tpt-oracle\/blob\/master\/ev.sql\">ev<\/a> 10046 1\n\nexec DBMS_MVIEW.REFRESH( LIST=&gt;'MV', atomic_refresh =&gt; false, out_of_place =&gt; TRUE);\n\n...\nSELECT operation#, cols, sql_txt FROM sys.snap_refop$  WHERE operation# IN (21, 22)        AND sowner = :1 AND vname = :2 AND instsite = :3  ORDER BY operation#\n...\n\/* MV_REFRESH (CTB) *\/\/* MV_REFRESH (CTB) *\/ CREATE TABLE \"U\".\"RV$705F\"\n   (    \"N\" NUMBER\n   ) SEGMENT CREATION DEFERRED\n  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255\n NOCOMPRESS LOGGING\n  TABLESPACE \"USERS_DAYT2CP\"\n...\n\/* MV_REFRESH (ITB) *\/INSERT \/*+ APPEND *\/ INTO \"U\".\"RV$705F\"  select * from t<\/code><\/pre>\n<p>In this case everyhing went well because sys.snap_refop$ contained both entries. But, as we shall see, if the second row is missing, the refresh will fail.<\/p>\n<h1>When things go wrong<\/h1>\n<p>I&#8217;m going to demonstrate this by crashing the process just before inserting the INSERT entry. For that purpose, I&#8217;m going to set a breakpoint on the Oracle C function rpisplu_internal (&#8220;recursive program interface switch user and parse&#8221;, according to <a href=\"http:\/\/orafun.info\/\">Frits Hoogland&#8217;s orafun<\/a>). Simply put, this function executes recursive SQLs under SYS user on user&#8217;s behalf. It receives the pointer to SQL text in the 5th argument (at least in Oracle 21.4, where I conducted this analysis). Since according to <a href=\"https:\/\/en.wikipedia.org\/wiki\/X86_calling_conventions\">x86 calling conventions<\/a>, the 5th argument is passed through the CPU registry R8, the following breakpoint will stop at the function entry and print the SQL text:<\/p>\n<pre><code>b rpisplu_internal if $_regex( (char *)$r8, \"(?i)insert.*snap_refop\")\ncommands 1\nx\/s $r8\nend<\/code><\/pre>\n<p>The stack trace on the breakpoint, when the second SQL text is just about to be inserted, looks as follows:<\/p>\n<pre><code>Breakpoint 1, 0x000000000432b680 in rpisplu_internal ()\n0x15f77a80 <kkzfrco2>:  \"INSERT INTO sys.snap_refop$ (sowner, vname, tabnum, operation#, cols, sql_txt, instsite, fcmaskvec, ejmaskvec, setnum)  VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)\"\n(gdb) bt 3\n#0  0x000000000432b680 in rpisplu_internal ()\n#1  0x0000000009ebb1ed in kkzfrc_ofp ()\n#2  0x0000000009eb9fb4 in kkzfrc ()<\/kkzfrco2><\/code><\/pre>\n<p>rpisplu_internal is called by kkzfrc_ofp. Oracle C function kkzfrc_ofp orchestrates the whole MV refresh and is called only once.<\/p>\n<p>We&#8217;ll continue the execution until hitting the breakpoint for the 2nd time.<\/p>\n<pre><code>0x15f77a80 <kkzfrco2>:  \"INSERT INTO sys.snap_refop$ (sowner, vname, tabnum,    operation#, cols, sql_txt, instsite, fcmaskvec, ejmaskvec, setnum)  VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)\"<\/kkzfrco2><\/code><\/pre>\n<p>The CREATE entry is already commited at that point:<\/p>\n<pre><code>select sql_txt FROM sys.snap_refop$\n  where operation# IN (21, 22)\n    and sowner = user and vname = 'MV' ;\n  2    3\nSQL_TXT\n--------------------------------------------------------------------------------\n\/* MV_REFRESH (CTB) *\/ CREATE TABLE \"U\".\"%s\"\n   (    \"N\" NUMBER\n   ) SEGMENT CREAT<\/code><\/pre>\n<p>I&#8217;m crashing the process on the breakpoint, so that the second SQL text (for INSERT) won&#8217;t be inserted:<\/p>\n<pre><code>(gdb) kill\nKill the program being debugged? (y or n) y\n[Inferior 1 (process 1849638) killed]<\/code><\/pre>\n<p>Since the inserts weren&#8217;t atomic, we ended up with an incomplete information in sys.snap_refop$.<\/p>\n<p>The subsequent refresh fails:<\/p>\n<pre><code>exec DBMS_MVIEW.REFRESH( LIST=&gt;'MV', atomic_refresh =&gt; false, out_of_place =&gt; TRUE);\nBEGIN DBMS_MVIEW.REFRESH( LIST=&gt;'MV', atomic_refresh =&gt; false, out_of_place =&gt; TRUE); END;\n\n*\nERROR at line 1:\nORA-12008: error in materialized view or zonemap refresh path\nORA-00600: internal error code, arguments: [kghstack_alloc], [kkzfrc_ofpBegin],\n[<span style=\"color:red\">18446603592378862232<\/span>], [], [], [], [], [], [], [], [], []\nORA-06512: at \"SYS.DBMS_SNAPSHOT_KKXRCA\", line 91\nORA-06512: at \"SYS.DBMS_SNAPSHOT_KKXRCA\", line 288\nORA-06512: at \"SYS.DBMS_SNAPSHOT_KKXRCA\", line 2601\nORA-06512: at \"SYS.DBMS_SNAPSHOT_KKXRCA\", line 3194\nORA-06512: at \"SYS.DBMS_SNAPSHOT_KKXRCA\", line 3481\nORA-06512: at \"SYS.DBMS_SNAPSHOT_KKXRCA\", line 3513\nORA-06512: at \"SYS.DBMS_SNAPSHOT\", line 16\nORA-06512: at line 1<\/code><\/pre>\n<p>ORA-00600 was generated in the Oracle C function kghstack_alloc, which allocates the memory on the stack. kkzfrc_ofpBegin ist the allocation reason. The allocation reason is the comment passed to the allocation function, and stored in the allocated memory chunk. The memory dump displays the allocation reason, which is useful for analyzing memory allocations long after the chunk was allocated.<br \/>\nThe number <span style=\"color:red\">18446603592378862232<\/span> looks suspicious because it looks neither as a plausible size in bytes nor as a pointer. First, we need to grasp what that number is. Let&#8217;s convert it in the hexadecimal notation:<\/p>\n<pre><code>printf '%X\\n' <span style=\"color:red\">18446603592378862232<\/span>\n<span style=\"color:red\">FFFF803BA42FCA98<\/span><\/code><\/pre>\n<p>We can see that the value was passed to kghstack_alloc as the second argument:<\/p>\n<pre><code>kghstack_alloc()+31  call     kgeasnmierr()        7FC4616FA060 ? 7FC4615A0050 ?\n6                                                  017A5F84C ? 000000258 ?\n                                                   000000001 00000000F\nkkzfrc_ofp()+11747   call     kghstack_alloc()     7FC4616FA060 ?\n                                                   <span style=\"color:red\">FFFF803BA42FCA98<\/span> <span style=\"color:blue\">015F6F32C<\/span> ?\n                                                   000000258 ? 000000001 ?\n                                                   00000000F ?\nkkzfrc()+19876       call     kkzfrc_ofp()         7FC45BD01FD0 000007078\n                                                   7FC461596800 000000258 ?\n                                                   000000001 ? 00000000F ?<\/code><\/pre>\n<p>This number is huge, but only if represented as an unsigned long integer. The other representation, as a signed long integer, looks more meaningfull:<\/p>\n<pre><code> p\/d <span style=\"color:red\">18446603592378862232<\/span>\n$2 = -140481330689384<\/code><\/pre>\n<p>It finally becomes obvious when we see the absolute value in the hexadecimal notation &#8211; it&#8217;s an address on the heap or on the stack:<\/p>\n<pre><code> p\/x 140481330689384\n$3 = 0x7fc45bd03568<\/code><\/pre>\n<p>Simply put, a negative heap (or stack) address was passed as the second argument to kghstack_alloc. It doesn&#8217;t make any sense to use negative addresses &#8211; this was just an error. Further, kghstack_alloc expects an unsigned long integer as the second argument. To understand the cause for that error, we have to look at the usual argument values for kghstack_alloc. In particular, we&#8217;re interested in the second argument. Out of curiosity, we might take a look at the third argument as well because <span style=\"color:blue\">015F6F32C<\/span> looks like a string.<\/p>\n<p>We can obtain all that information with the following breakpoint:<\/p>\n<pre><code># breakpoint on entry\nb kghstack_alloc \n\ncommands 2\n# print 2nd argument as unsigned long \np\/d <span style=\"color:red\">$rsi<\/span>\n# dereferenced string pointer in the 3th argument \nx\/s $<span style=\"color:blue\">rdx<\/span>\nend<\/code><\/pre>\n<p>The output is below:<\/p>\n<pre><code>Breakpoint 2, 0x0000000015347780 in kghstack_alloc ()\n$16 = <span style=\"color:red\">384<\/span>\n0x1707878c:     <span style=\"color:blue\">\"psdnam:parts\"<\/span>\n(gdb) c\nContinuing.\n\nBreakpoint 2, 0x0000000015347780 in kghstack_alloc ()\n$18 = <span style=\"color:red\">4000<\/span>\n0x165b3e34:     <span style=\"color:blue\">\"kzctxEUsrEnv: tmp ctx\"<\/span>\n(gdb) c\nContinuing.\n\nBreakpoint 2, 0x0000000015347780 in kghstack_alloc ()\n$19 = <span style=\"color:red\">84<\/span>\n0x16f2296c:     <span style=\"color:blue\">\"rpi role space\"<\/span><\/code><\/pre>\n<p>The string passed by the fourth argument looks like the allocation reason. The second argument is always a small positive integer (<span style=\"color:red\">384, 4000, 84<\/span>) that might be the requested allocation size. But when the error was thrown, kghstack_alloc received a negative pointer instead of the size in bytes.<\/p>\n<p>Now we can reconstruct what happened. The size passed to kghstack_alloc for the allocation reason kkzfrc_ofpBegin is calculated as a difference between two pointers. In case of error, the minuend was a null pointer that was left unchecked, so the difference was a negative value of the subtrahend.<\/p>\n<h1>Unhandled errors<\/h1>\n<p>The problem first appeared in the Oracle C function kkzdrro. kkzdrro is called by kkzfrc_ofp to select the information from the table sys.snap_refop$ and populates the structure which holds the text of both SQL statements. But since there was no insert statement, the pointer remained uninitialized. Unfortunately, the program didn&#8217;t stop and raise the error. It continued, instead, and threw a random error at some random point. In 21.4, the problem manifests itself as ORA-00600 in kghstack_alloc, but it can just as well be any other error message where the program can&#8217;t deal with the null pointer anymore.<\/p>\n<p>The analysis would have been much easier if only the developer had decided to throw an error immediately after retrieving the incomplete information. rpifch is another function in the recursive programming interface which we can use for tracking down the root cause. This function fetches the rows from sys queries executed on user&#8217;s behalf and is directly called by kkzdrro:<\/p>\n<pre><code>b rpifch\n\n(gdb) bt 3\n#0  0x000000000432c200 in rpifch ()\n#1  0x0000000009e53647 in kkzdrro ()\n#2  0x0000000009eba159 in kkzfrc_ofp ()<\/code><\/pre>\n<p>It returns an ORA- error code or 0 on good execution. It returned 1403 (&#8220;no data found&#8221;) when it tried to fetch the second row (INSERT command):<\/p>\n<pre><code>(gdb) p $rax\n$31 = 1403<\/code><\/pre>\n<pre><code>oerr ora 1403\n01403, 00000, \"no data found\"\n\/\/ *Cause: No data was found from the objects.\n\/\/ *Action: There was no data from the objects which may be due to end of fetch.<\/code><\/pre>\n<p>As I already mentioned, this error is ignored until the problem with the memory allocation on the stack. I ran pin debugtrace just to calculate the number of function calls between the ignored &#8220;no data error&#8221; and failed memory allocation on the stack:<\/p>\n<pre><code>sudo \/export\/home\/oracle\/workspace_vbnov\/pin-3.21-98484-ge7cd811fd-gcc-linux\/pin  -pid 1895209 -t source\/tools\/DebugTrace\/obj-intel64\/debugtrace.so<\/code><\/pre>\n<pre><code><span style=\"color:red\">3460965<\/span>: 121462970 Return 0x000000000432c235 21.4.0.0.211019_a\/bin\/oracle:rpifch+0x000000000035 returns: 0x57b\n...\n<span style=\"color:red\">3620569<\/span>: 127665538 Call 0x0000000009ebce1e 21.4.0.0.211019_a\/bin\/oracle:kkzfrc_ofp+0x000000002dde -&gt; 0x0000000015347780 21.4.0.0.211019_a\/bin\/oracle:kghstack_alloc(0x7fda927ce060, 0xffff80256d988aab, ...)<\/code><\/pre>\n<p>This number is immense &#8211; there have been ( <span style=\"color:red\">3620569<\/span> &#8211; <span style=\"color:red\">3460965<\/span> ) \/ 2 = 79802 function calls between the retrieval of the inconsistent information and raising the error. Some random error could have been raised anywhere. Whenever a null pointer remains unchecked and propagates it&#8217;s going to be difficult to identify the root cause.<\/p>\n<h1>Monitoring<\/h1>\n<p>This (now) known problem can be monitored with the following query:<\/p>\n<pre><code>SELECT sowner, vname FROM sys.snap_refop$  \n  WHERE operation# IN (21, 22)  \n  group by sowner,vname\n  having count(*) = 1 ;<\/code><\/pre>\n<h1>Workaround<\/h1>\n<p>As a workaround you can recreate the affected MVs, which will also delete the corrupted information in the snapshot table.<\/p>\n<h1>Summary<\/h1>\n<p>In the course of the first MV refresh, the Oracle process populates the table sys.snap_refop$ with two SQL commands that will be used in future refreshes. The first is CREATE TABLE, the other is INSERT. Unfortunately, these two inserts don&#8217;t happen in the same transaction. Consequently, if the process dies in-between, we might end up only with the first entry. The subsequent MV refresh isn&#8217;t able to handle this inconsistency. Moreover, the program doesn&#8217;t stop after not finding the expected information; it continues, instead, and breaks at some later random point with a random error message.<\/p>\n<p>I&#8217;ve provided the query to monitor these inconsistencies in the metadata. Should you encounter such a problem, recreate the MV as a workaround.<\/p>\n<h1>Updates<\/h1>\n<h2>February 18, 2022<\/h2>\n<p>The test case produces the same error message on the following Oracle versions:<\/p>\n<ul>\n<li>Solaris x86-64\/non-cdb: 19.10, 19.13<\/li>\n<li>Linux\/multi-tenant: 19.13, 21.4<\/li>\n<\/ul>\n<h2>March 25, 2022<\/h2>\n<p>The problem is reproducible in 21.5 as well.<\/p>\n<h2>March 28, 2022<\/h2>\n<p>I modified the breakpoint definition to make it a little bit easier to reproduce the problem. The breakpoint is ignored for the first time. At the second occurrence, kill is automatically invoked:<\/p>\n<pre><code>\nb rpisplu_internal if $_regex( (char *)$r8, \"(?i)insert.*snap_refop\") \ncommands 1\nx\/s $r8\nkill\nend\n\nignore 1 1<\/code><\/pre>\n<p>The expected output after the program stops at the breakpoint (answer the question to kill the process with &#8220;y&#8221;):<\/p>\n<pre><code>Breakpoint 1, 0x000000000432b680 in rpisplu_internal ()\n0x15f77a80 <kkzfrco2>:  \"INSERT INTO sys.snap_refop$ (sowner, vname, tabnum,          operation#, cols, sql_txt, instsite, fcmaskvec, ejmaskvec, setnum)  VALUES (:1,       :2, :3, :4, :5, :6, :7, :8, :9, :10)\"\nKill the program being debugged? (y or n) y\n[Inferior 1 (process 3844841) killed]<\/kkzfrco2><\/code><\/pre>\n<h2>August 6, 2022: Bug<\/h2>\n<p>Oracle Support filed the following bug for this problem:<br \/>\nBug 34383371 &#8211; INCASE OF FIRST REFRESH OF MVIEW WITH OUT_OF_PLACE=&gt; TRUE BREAKS THEN SUBSEQUENT MVIEW REFRESH MAY FAIL WITH ORA-00600: [KGHSTACK_ALLOC], [KKZFRC_OFPBEGIN]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oracle internals for understanding cryptic error messages during materialized view refresh <a href=\"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[36,46,50,51,5],"tags":[],"class_list":["post-4127","post","type-post","status-publish","format-standard","hentry","category-19c","category-21c","category-materialized-view","category-ora-00600","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ORA-00600 on Materialized View Refresh - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Oracle internals for understanding cryptic error messages during materialized view refresh\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ORA-00600 on Materialized View Refresh - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Oracle internals for understanding cryptic error messages during materialized view refresh\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-04T23:04:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-08-06T07:49:22+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"ORA-00600 on Materialized View Refresh\",\"datePublished\":\"2022-02-04T23:04:37+00:00\",\"dateModified\":\"2022-08-06T07:49:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/\"},\"wordCount\":1433,\"commentCount\":0,\"articleSection\":[\"19c\",\"21c\",\"materialized view\",\"ORA-00600\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/\",\"name\":\"ORA-00600 on Materialized View Refresh - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2022-02-04T23:04:37+00:00\",\"dateModified\":\"2022-08-06T07:49:22+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Oracle internals for understanding cryptic error messages during materialized view refresh\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/ora-00600-on-materialized-view-refresh\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ORA-00600 on Materialized View Refresh\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ORA-00600 on Materialized View Refresh - All-round Database Topics","description":"Oracle internals for understanding cryptic error messages during materialized view refresh","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/","og_locale":"en_US","og_type":"article","og_title":"ORA-00600 on Materialized View Refresh - All-round Database Topics","og_description":"Oracle internals for understanding cryptic error messages during materialized view refresh","og_url":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/","og_site_name":"All-round Database Topics","article_published_time":"2022-02-04T23:04:37+00:00","article_modified_time":"2022-08-06T07:49:22+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"ORA-00600 on Materialized View Refresh","datePublished":"2022-02-04T23:04:37+00:00","dateModified":"2022-08-06T07:49:22+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/"},"wordCount":1433,"commentCount":0,"articleSection":["19c","21c","materialized view","ORA-00600","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/","url":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/","name":"ORA-00600 on Materialized View Refresh - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2022-02-04T23:04:37+00:00","dateModified":"2022-08-06T07:49:22+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Oracle internals for understanding cryptic error messages during materialized view refresh","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/ora-00600-on-materialized-view-refresh\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ORA-00600 on Materialized View Refresh"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=4127"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4127\/revisions"}],"predecessor-version":[{"id":4315,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4127\/revisions\/4315"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=4127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=4127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=4127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}