{"id":8083,"date":"2016-05-28T20:13:33","date_gmt":"2016-05-28T18:13:33","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/"},"modified":"2016-05-28T20:13:33","modified_gmt":"2016-05-28T18:13:33","slug":"learning-and-troubleshooting-follow-the-path","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/","title":{"rendered":"Learning and troubleshooting: Follow the path"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nYou query a simple table to get its rows. Did you ever ask yourself how oracle knows which blocks to read from disk? Let&#8217;s question everything and follow the path to dictionary, bootstrapping, spfile,&#8230; up to GPnP profile.<br \/>\n<!--more--><br \/>\nIf you want to read the rows that are stored in a table, you have to read from the segment extents. <\/p>\n<h3>Segment Extents<\/h3>\n<p>How do you find those extents? You need to get the extent list from the tablespace header, and some information from the segment header<\/p>\n<p>Where is the segment header? This is recorded in the dictionary. For a table it is in SYS.TAB$<\/p>\n<p>Here is the definition that you can see in ?\/rdbms\/admin\/dcore.bsq which is run at CREATE DATABASE time<\/p>\n<pre><code>\ncreate table tab$                                             \/* table table *\/\n( obj#          number not null,                            \/* object number *\/\n  dataobj#      number,                          \/* data layer object number *\/\n  ts#           number not null,                        \/* tablespace number *\/\n  file#         number not null,               \/* segment header file number *\/\n  block#        number not null,              \/* segment header block number *\/\n<\/code><\/pre>\n<p>TAB$ has all table definition and the TS#, FILE# and BLOCK# identifies uniquely the block where the segment header is. TS# identifies the tablespace. FILE# identifies the datafile within the tablespace. And BLOCK# is the offset within that file (there is only one block size for a tablespace). This is the physical identifier of a segment.<\/p>\n<p>Let&#8217;s take SCOTT.EMP as an example<\/p>\n<pre><code>\nSQL&gt; select object_id,object_type,data_object_id from dba_objects where owner='SCOTT' and object_name='EMP';\n&nbsp;\n OBJECT_ID OBJECT_TYPE             DATA_OBJECT_ID\n---------- ----------------------- --------------\n    121515 TABLE                           121533\n<\/code><\/pre>\n<p>I get segment header from TAB$<\/p>\n<pre><code>\nSQL&gt; select ts#,file#,block# from sys.tab$ where obj#=121515;\n&nbsp;\n       TS#      FILE#     BLOCK#\n---------- ---------- ----------\n         4          6        458\n<\/code><\/pre>\n<p>The extents listed in the tablespace header can be displayed from X$KTFBUE fixed table (if it were a Dictionary Managed Tablespace this information would be in the dictionary table UET$)<\/p>\n<pre><code>\nSQL&gt; select ktfbuefno,ktfbuebno,ktfbueblks from x$ktfbue where ktfbuesegtsn=4 and ktfbuesegfno=6 and ktfbuesegbno=458;\n&nbsp;\n KTFBUEFNO  KTFBUEBNO KTFBUEBLKS\n---------- ---------- ----------\n         6        456          8\n<\/code><\/pre>\n<p>From there we know that SCOTT.EMP data is stored in 8 blocks starting from block number 456 in file 6. This file number is relative to the tablespace, which is the tablespace number 4 because all segment extents are in the same tablespace as the segment header.<\/p>\n<h3>BOOTSTRAP$<\/h3>\n<p>Ok, so you can get everything from the dictionary, starting from TAB$. But it&#8217;s a table. So if you want to read it you need to read blocks from it&#8217;s extents. Where are those extents?<\/p>\n<p>Easy, TAB$ itself has information in TAB$<\/p>\n<pre><code>\nSQL&gt; select obj# from obj$ where name='TAB$';\n&nbsp;\n      OBJ#\n----------\n         4\n&nbsp;\nSQL&gt; select ts#,file#,block# from sys.tab$ where obj#=4;\n&nbsp;\n       TS#      FILE#     BLOCK#\n---------- ---------- ----------\n         0          1        144\n<\/code><\/pre>\n<p>Information is there: segment header is in tablespace 0 (which is SYSTEM) file 1 and block 144. And we can get extents from x$ktfbue where ktfbuesegtsn=0 and ktfbuesegfno=1 and ktfbuesegbno=144<\/p>\n<p>But wait a minute&#8230; Am I saying that in order to get TAB$ data you need first to get TAB$ data? This is not possible. It&#8217;s a Catch 22 here. TAB$ metadata about itself must be available before being able to read the table. This core dictionary table information must be hardcoded and this is done by special bootstrapping code. The dcore.bsq above is not a normal SQL script, but a Bootstrap SQL which has a special syntax. When those core dictionary objects are created, by CREATE DATABASE, their extents go into an hardcoded location in the SYSTEM datafile.<\/p>\n<p>And when an instance opens a database, the metadata about them is hardcoded in order to have the minimal information to be able to find the other dictionary information. This is done by pre-filling the dictionary cache with some bootstrap code. And this code is visible:<\/p>\n<pre><code>\nSQL&gt; select * from bootstrap$ where sql_text like 'CREATE TABLE TAB$%';\n&nbsp;\n     LINE#       OBJ# SQL_TEXT                                                                                                                        \n---------- ---------- ---------------------------------------------------------------------------------------------------------------------------------\n         4          4 CREATE TABLE TAB$(\"OBJ#\" NUMBER NOT NULL,\"DATAOBJ#\" NUMBER,\"TS#\" NUMBER NOT NULL,\"FILE#\" NUMBER NOT NULL,\"BLOCK#\" NUMBER NOT NULL\n                      ,\"BOBJ#\" NUMBER,\"TAB#\" NUMBER,\"COLS\" NUMBER NOT NULL,\"CLUCOLS\" NUMBER,\"PCTFREE$\" NUMBER NOT NULL,\"PCTUSED$\" NUMBER NOT NULL,\"INIT\n                      RANS\" NUMBER NOT NULL,\"MAXTRANS\" NUMBER NOT NULL,\"FLAGS\" NUMBER NOT NULL,\"AUDIT$\" VARCHAR2(38) NOT NULL,\"ROWCNT\" NUMBER,\"BLKCNT\" \n                      NUMBER,\"EMPCNT\" NUMBER,\"AVGSPC\" NUMBER,\"CHNCNT\" NUMBER,\"AVGRLN\" NUMBER,\"AVGSPC_FLB\" NUMBER,\"FLBCNT\" NUMBER,\"ANALYZETIME\" DATE,\"SA\n                      MPLESIZE\" NUMBER,\"DEGREE\" NUMBER,\"INSTANCES\" NUMBER,\"INTCOLS\" NUMBER NOT NULL,\"KERNELCOLS\" NUMBER NOT NULL,\"PROPERTY\" NUMBER NOT \n                      NULL,\"TRIGFLAG\" NUMBER,\"SPARE1\" NUMBER,\"SPARE2\" NUMBER,\"SPARE3\" NUMBER,\"SPARE4\" VARCHAR2(1000),\"SPARE5\" VARCHAR2(1000),\"SPARE6\" D\n                      ATE) STORAGE (  OBJNO 4 TABNO 1) CLUSTER C_OBJ#(OBJ#)   \n<\/code><\/pre>\n<p>The code to create TAB$ is there with additional bootstrapping SQL syntax to hardcoded the OBJECT_ID. This table is actually stored in a CLUSTER segment, and its definition is also harcoded in bootstrapping code:<\/p>\n<pre><code>\nSQL&gt; select * from bootstrap$ where sql_text like 'CREATE CLUSTER C_OBJ#%';\n&nbsp;\n     LINE#       OBJ# SQL_TEXT                                                                       \n---------- ---------- --------------------------------------------------------------------------------\n         2          2 CREATE CLUSTER C_OBJ#(\"OBJ#\" NUMBER) PCTFREE 5 PCTUSED 40 INITRANS 2 MAXTRANS 25\n                      5 STORAGE (  INITIAL 136K NEXT 200K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREA\n                      SE 0 OBJNO 2 EXTENTS (FILE 1 BLOCK 144)) SIZE 800     \n<\/code><\/pre>\n<p>File 1 Block 144 this is exactly what we have seen when querying TAB$ but actually it&#8217;s an hardcoded value. You will find exactly the same in all Oracle Database since 8.0<\/p>\n<p>It seems that it was a different value in Oracle 7:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP.png\" alt=\"CaptureBOOTSTRAP\" width=\"632\" height=\"149\" class=\"alignnone size-full wp-image-8888\" \/><\/a><br \/>\nI don&#8217;t remember that upgrade to 8.0 had to update the first blocks of SYSTEM datafiles, but it was probably the case. If anyone has a database that has been upgraded since Oracle 7 then please tell me, but that should be rare nowadays. But for sure the code that warms up the dictionary cache must be consistent with how those segments are stored in the SYSTEM tablespace.<\/p>\n<h3>Controlfile<\/h3>\n<p>Let&#8217;s continue. We know how to read data as soon as the database is opened because all required information is in the SYSTEM datafile. <\/p>\n<p>But how do we know where is this datafile? The controlfile knows the location of all datafiles and this information is available since the database mount stage<\/p>\n<p>Here is an example after alter database backup controlfile to trace;<\/p>\n<pre><code>\nCREATE CONTROLFILE REUSE DATABASE \"RACDB\" NORESETLOGS  NOARCHIVELOG\n    MAXLOGFILES 192\n    MAXLOGMEMBERS 3\n    MAXDATAFILES 1024\n    MAXINSTANCES 32\n    MAXLOGHISTORY 292\nLOGFILE\n  GROUP 1 '+DATA\/RACDB\/ONLINELOG\/group_1.262.906247575'  SIZE 50M BLOCKSIZE 512,\n  GROUP 2 '+DATA\/RACDB\/ONLINELOG\/group_2.263.906247575'  SIZE 50M BLOCKSIZE 512,\n  GROUP 3 '+DATA\/RACDB\/ONLINELOG\/group_3.264.906247575'  SIZE 50M BLOCKSIZE 512,\n  GROUP 4 '+DATA\/RACDB\/ONLINELOG\/group_4.274.906299789'  SIZE 50M BLOCKSIZE 512,\n  GROUP 5 '+DATA\/RACDB\/ONLINELOG\/group_5.275.906299789'  SIZE 50M BLOCKSIZE 512,\n  GROUP 6 '+DATA\/RACDB\/ONLINELOG\/group_6.276.906299789'  SIZE 50M BLOCKSIZE 512\n-- STANDBY LOGFILE\nDATAFILE\n  '+DATA\/RACDB\/DATAFILE\/system.258.906247493',\n  '+DATA\/RACDB\/DATAFILE\/sysaux.257.906247463',\n  '+DATA\/RACDB\/DATAFILE\/undotbs1.260.906247529',\n<\/code><\/pre>\n<p>Now the question is:<br \/>\nWhere is the controlfile? This information is known from the instance parameter:<\/p>\n<pre><code>\nSQL&gt; show parameter control_files\n&nbsp;\nNAME                                 TYPE        VALUE\n------------------------------------ ----------- ---------------------------------------------\ncontrol_files                        string      +DATA\/RACDB\/CONTROLFILE\/current.261.906247573\n<\/code><\/pre>\n<p>Oh good. I&#8217;m in ASM so I can continue my path, with question such as: how do we find the controlfile?<\/p>\n<p>But before that, where this instance parameter comes from? SPFILE is read at instance startup.<\/p>\n<p>Where is the SPFILE?<\/p>\n<h3>Database SPFILE<\/h3>\n<pre><code>\nSQL&gt; show parameter spfile\n&nbsp;\nNAME                                 TYPE        VALUE\n------------------------------------ ----------- ----------------------------------------------\nspfile                               string      +DATA\/RACDB\/PARAMETERFILE\/spfile.269.906247759\n<\/code><\/pre>\n<p>In single instance, the SPFILE is found in $ORACLE_HOME\/dbs but here I&#8217;m in RAC and the database resource has this information:<\/p>\n<pre><code>\n[oracle@racp1vm1 ~]$ srvctl config database -db RACDB\nDatabase unique name: RACDB\nDatabase name: RACDB\nOracle home: \/u01\/app\/oracle\/product\/12.1.0\/dbhome_1\nOracle user: oracle\nSpfile: +DATA\/RACDB\/PARAMETERFILE\/spfile.269.906247759\n<\/code><\/pre>\n<h3>ASM<\/h3>\n<p>So in order to find the datafiles or the SPFILE you must have access to the +DATA diskgroup. The information about it is available from the ASM instance and this is easy to find because you have only one asm instance on the server.<\/p>\n<p>But now, let&#8217;s go to the ASM instance. It stores all metadata in the disks that are accessible once the instance has started. What does it need to start and to find those disks?<br \/>\nThe ASM instance has a SPFILE and information from the SPFILE is mandatory to access the diskgroups. So where is the SPFILE of the ASM instance?<\/p>\n<pre><code>\n[grid@racp1vm1 ~]$ asmcmd spget\n+CRS_DG\/ws-dbi-scan1\/ASMPARAMETERFILE\/registry.253.905527691\n<\/code><\/pre>\n<p>Okay&#8230; another Catch 22 here. the ASM SPFILE is stored in ASM and you need an ASM instance to access to it&#8230; but starting an ASM instance needs SPFILE information&#8230;<\/p>\n<h3>GPnP profile<\/h3>\n<p>I&#8217;ll not go into details which are very well explained by Anju Garg in her blog post <a href=\"http:\/\/oracleinaction.com\/asm-spfile-on-asm\/#trackback\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/oracleinaction.com\/asm-spfile-on-asm\/<\/a> and Robert Bialek one referenced at the end of it.<\/p>\n<pre><code>\n[grid@racp1vm1 ~]$ gpnptool get -o- | xmllint --format - | grep SPFile\n&nbsp;\nSuccess.\n  &lt;orcl:ASM-Profile id=\"asm\" DiscoveryString=\"\/dev\/mapper\/*\" SPFile=\"+CRS_DG\/ws-dbi-scan1\/ASMPARAMETERFILE\/registry.253.905527691\" Mode=\"remote\"\/&gt;\n<\/code><\/pre>\n<p>Everything is there. The GPnP profile has the ASM discovery string that lists the system disks. They are scanned at cluster start and all bootstrap information is found in the bootstrap header. <\/p>\n<p>When you change the asm_diskstring from the ASM instance, or when you change the SPFILE location from asmcmd, the GPnP profile is updated. And if it is corrupted, the cluster doesn&#8217;t start. <\/p>\n<p>I used &#8216;gnpnptool get&#8217; but that doesn&#8217;t tell us where is the GPnP profile stored.<\/p>\n<pre><code>\n[grid@racp1vm1 ~]$ ls $ORACLE_HOME\/gpnp\/$HOSTNAME\/profiles\/peer\/profile.xml\n\/u01\/app\/12.1.0\/grid\/gpnp\/racp1vm1\/profiles\/peer\/profile.xml\n<\/code><\/pre>\n<p>Here is the content, but you need gpnptool to change it because it is signed.<\/p>\n<pre><code>\n[grid@racp1vm1 ~]$ cat $ORACLE_HOME\/gpnp\/$HOSTNAME\/profiles\/peer\/profile.xml\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;&lt;gpnp:GPnP-Profile Version=\"1.0\"  xmlns_gpnp=\"http:\/\/www.grid-pnp.org\/2005\/11\/gpnp-profile\" xmlns_orcl=\"http:\/\/www.oracle.com\/gpnp\/2005\/11\/gpnp-profile\" xmlns_xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi_schemaLocation=\"http:\/\/www.grid-pnp.org\/2005\/11\/gpnp-profile gpnp-profile.xsd\" ProfileSequence=\"9\" ClusterUId=\"3db40dc75a3aef58bf2f0b71e011b137\" ClusterName=\"ws-dbi-scan1\" PALocation=\"\"&gt;&lt;gpnp:Network-Profile&gt;&lt;gpnp:HostNetwork id=\"gen\" HostName=\"*\"&gt;&lt;gpnp:Network id=\"net1\" IP=\"192.168.22.0\" Adapter=\"bond0\" Use=\"public\"\/&gt;&lt;gpnp:Network id=\"net2\" IP=\"10.1.1.0\" Adapter=\"enp0s10\" Use=\"cluster_interconnect,asm\"\/&gt;&lt;\/gpnp:HostNetwork&gt;&lt;\/gpnp:Network-Profile&gt;&lt;orcl:CSS-Profile id=\"css\" DiscoveryString=\"+asm\" LeaseDuration=\"400\"\/&gt;&lt;orcl:ASM-Profile id=\"asm\" DiscoveryString=\"\" SPFile=\"+CRS_DG\/ws-dbi-scan1\/ASMPARAMETERFILE\/registry.253.905527691\" Mode=\"remote\"\/&gt;&lt;ds:Signature xmlns_ds=\"http:\/\/www.w3.org\/2000\/09\/xmldsig#\"&gt;&lt;ds:SignedInfo&gt;&lt;ds:CanonicalizationMethod Algorithm=\"http:\/\/www.w3.org\/2001\/10\/xml-exc-c14n#\"\/&gt;&lt;ds:SignatureMethod Algorithm=\"http:\/\/www.w3.org\/2000\/09\/xmldsig#rsa-sha1\"\/&gt;&lt;ds:Reference URI=\"\"&gt;&lt;ds:Transforms&gt;&lt;ds:Transform Algorithm=\"http:\/\/www.w3.org\/2000\/09\/xmldsig#enveloped-signature\"\/&gt;&lt;ds:Transform Algorithm=\"http:\/\/www.w3.org\/2001\/10\/xml-exc-c14n#\"&gt; &lt;InclusiveNamespaces  PrefixList=\"gpnp orcl xsi\"\/&gt;&lt;\/ds:Transform&gt;&lt;\/ds:Transforms&gt;&lt;ds:DigestMethod Algorithm=\"http:\/\/www.w3.org\/2000\/09\/xmldsig#sha1\"\/&gt;&lt;ds:DigestValue&gt;3MkzWCCTRYJ1FDJ4h8G6PHrgfQQ=&lt;\/ds:DigestValue&gt;&lt;\/ds:Reference&gt;&lt;\/ds:SignedInfo&gt;&lt;ds:SignatureValue&gt;XQtNrjbazMkfCO1e52scpC8y3tdpVbyFxWPPXirbZOmZ+ajcnAOD85qMJUPBaXG8G2sLCWVX5ir+Reo5f0ewyHCtzpGud9IWoYhb01T2W0o4WYzFFcwncxHDWDBCdLiKdSBOEJytRMCufgfciA\/v6nzxWzDRS\/7svWzG7shVzpI=&lt;\/ds:SignatureValue&gt;&lt;\/ds:Signature&gt;&lt;\/gpnp:GPnP-Profile&gt;\n<\/code><\/pre>\n<h3>\/etc\/oratab<\/h3>\n<p>I used $ORACLE_HOME which is the Grid infrastructure home. If you&#8217;re not sure where it is, look at the +ASM entry in \/etc\/oratab:<\/p>\n<pre><code>\n[grid@racp1vm1 ~]$ grep +ASM \/etc\/oratab\n+ASM1:\/u01\/app\/12.1.0\/grid:N            # line added by Agent\n<\/code><\/pre>\n<p>So, with $HOSTNAME and \/etc\/oratab you can follow the path and understand how oracle can get any information from the system: configuration, metadata, data. Of course you can continue your questions at the system level: how the disks are opened and find your way with devices, multipathing,&#8230;<\/p>\n<h3>Conclusion<\/h3>\n<p>Even when a system is complex (and Grid Infrastructure \/ RAC is complex) you can follow the path and understand where information comes from. There&#8217;s no magic. There&#8217;s no black box. Everything can be understood. It may take time reading documentation, reading logs, testing, tracing,&#8230; But this is how you can understand exactly how it works and thus be prepared to troubleshoot any issue. As an example, in a lab (such as the <a href=\"https:\/\/en.wikibooks.org\/wiki\/RAC_Attack_-_Oracle_Cluster_Database_at_Home\" target=\"_blank\" rel=\"noopener noreferrer\">racattack<\/a> one) you can try to mess-up some ASM SPFILE parameters, for example change asm_diskstring to some random characters, and try to restart the cluster. If you don&#8217;t know how it works, you may spend a long time before fixing the issue, and the risk is that you break it even more. If you have read and understood the above then you will know exactly what has to be fixed: if the GPnP profile can&#8217;t find the disks then nothing can go further.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . You query a simple table to get its rows. Did you ever ask yourself how oracle knows which blocks to read from disk? Let&#8217;s question everything and follow the path to dictionary, bootstrapping, spfile,&#8230; up to GPnP profile.<\/p>\n","protected":false},"author":27,"featured_media":8085,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[841,96],"type_dbi":[],"class_list":["post-8083","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-bootstrap","tag-oracle"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Learning and troubleshooting: Follow the path - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Learning and troubleshooting: Follow the path\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . You query a simple table to get its rows. Did you ever ask yourself how oracle knows which blocks to read from disk? Let&#8217;s question everything and follow the path to dictionary, bootstrapping, spfile,&#8230; up to GPnP profile.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-28T18:13:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"632\" \/>\n\t<meta property=\"og:image:height\" content=\"149\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Oracle Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Learning and troubleshooting: Follow the path\",\"datePublished\":\"2016-05-28T18:13:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\"},\"wordCount\":1290,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png\",\"keywords\":[\"Bootstrap\",\"Oracle\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\",\"name\":\"Learning and troubleshooting: Follow the path - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png\",\"datePublished\":\"2016-05-28T18:13:33+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png\",\"width\":632,\"height\":149},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Learning and troubleshooting: Follow the path\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Learning and troubleshooting: Follow the path - dbi Blog","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:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/","og_locale":"en_US","og_type":"article","og_title":"Learning and troubleshooting: Follow the path","og_description":"By Franck Pachot . You query a simple table to get its rows. Did you ever ask yourself how oracle knows which blocks to read from disk? Let&#8217;s question everything and follow the path to dictionary, bootstrapping, spfile,&#8230; up to GPnP profile.","og_url":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/","og_site_name":"dbi Blog","article_published_time":"2016-05-28T18:13:33+00:00","og_image":[{"width":632,"height":149,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png","type":"image\/png"}],"author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Learning and troubleshooting: Follow the path","datePublished":"2016-05-28T18:13:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/"},"wordCount":1290,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png","keywords":["Bootstrap","Oracle"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/","url":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/","name":"Learning and troubleshooting: Follow the path - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png","datePublished":"2016-05-28T18:13:33+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureBOOTSTRAP-1.png","width":632,"height":149},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/learning-and-troubleshooting-follow-the-path\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Learning and troubleshooting: Follow the path"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/8083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=8083"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/8083\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/8085"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=8083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=8083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=8083"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=8083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}