Search

Wednesday, August 3, 2016

Troubleshooting - Using LOGDUMP

LOGDUMP is a great utility and a real bonus to the Oracle GoldenGate software bundle. Without LOGDUMP, we could not read a Trail file which would make us blind to troubleshooting data related issues.
LOGDUMP has a command line interface that allows you to open files, format the display, and navigate through a file including filtering data. To invoke the utility, go to the GoldenGate home directory and type ”logdump”, as shown in the following example.
[oracle@dbserver1 ggs]$ ./logdump

Oracle GoldenGate Log File Dump Utility
Version 10.4.0.19 Build 002

Copyright (C) 1995, 2009, Oracle and/or its affiliates.  All rights reserved.


Logdump 1 >ENV
Version             : Linux, x86, 32bit (optimized) on Sep 29 2009 08:53:18

Current Directory   : /u01/app/oracle/product/ggs
LogTrail            : *Not Open*
Display RecLen      : 140
Logtrail Filter     : On
Trans History       : 0 Transactions, Records 100, Bytes 100000
LargeBlock I/O      : On, Blocksize 57344
Local System        : LittleEndian
Logtrail Data       : BigEndian/ASCII
Logtrail Headers    : ASCII
Dump                : ASCII
Timeoffset          : LOCAL
Scan Notify Interval: 10000 records, Scrolling On

Logdump 2 >

As with the GGSCI utility, LOGDUMP increments the number at its command prompt for each command entered. Even if you exit LOGDUMP, the number will increment when you return. This is because LOGDUMP maintains a history of commands used.
The preceding example shows the output of the ENV command, which is one of many commands required to be productive with LOGDUMP. Firstly we must tell LOGDUMP to open a file, and then specify how much detail you require before scanning or filtering data. However, should you get stuck there is always the HELP command to get you back on track, which incidentally shows many undocumented commands.

Opening Files

Let’s start with the OPEN command. Before opening a file, we must choose one. Execute the following Linux command from the GoldenGate home directory to list the available files.
[oracle@dbserver1 ggs]$ ls -l dirdat
-rw-rw-rw- 1 oracle oinstall  3859 Jun 19 17:10 INITLOAD01.DAT
-rw-rw-rw- 1 oracle oinstall 68929 Nov  9 13:28 sa000004
-rw-rw-rw- 1 oracle oinstall 68929 Nov  9 13:32 sa000005
-rw-rw-rw- 1 oracle oinstall 68929 Nov  9 13:35 sa000006

Let’s open local Trail file sa000024 from LOGDUMP.
Logdump 2 >open dirdat/sa000004
Current LogTrail is /u01/app/oracle/product/ggs/dirdat/sa000004

Before we can see the contents of the file, we must setup a view in LOGDUMP. The following table of commands will provide the necessary detail depending on your requirements:
Command
Description
FILEHEADER [on | off | detail]
Controls whether or not the trail file header is displayed and how much detail.
GHDR [on | off]
Controls whether or not the record header is displayed with each record.
DETAIL [on | off | data]
Displays a list of columns that includes the column ID, length, plus values in hex and ASCII. DATA adds hex and ASCII data values to the column list.
USERTOKEN [detail]
Displays the actual token data.
RECLEN [<# of bytes>]
Controls how much of the record data is displayed in characters
So, working through the list, enable the file header detail, GDHR, user token detail and record length options.
Logdump 3 >fileheader detail
Logdump 4 >ghdr on
Logdump 6 >detail on
Logdump 7 >usertoken detail
Logdump 8 >reclen 128
Reclen set to 128

Viewing the Header Record

Now it’s time to navigate our way through the file starting at position 0, the first record in the file. This is the beginning of the header record.
Logdump 9 >pos 0
Reading forward from RBA 0

To view the header record we must step to the next Relative Byte Address (RBA). This is easy using LOGDUMP, just type next or n.
2010/11/09 12:56:49.942.356 FileHeader           Len   928 RBA 0
Name: *FileHeader*
 3000 01a2 3000 0008 4747 0d0a 544c 0a0d 3100 0002 | 0...0...GG..TL..1...
 0002 3200 0004 ffff fffd 3300 0008 02f1 bad1 bae9 | ..2.......3.........

Included in the header record is a wealth of information, given that we have enabled a detailed view. The information is grouped by type with a list of related tokens, shown in the following example output.
GroupID x30 '0' TrailInfo        Info x00  Length  418
TokenID x30 '0' Signature        Info x00  Length    8
TokenID x31 '1' Compatibility    Info x00  Length    2
TokenID x32 '2' Charset          Info x00  Length    4
TokenID x33 '3' CreationTime     Info x00  Length    8
TokenID x34 '4' URI              Info x00  Length   38
TokenID x36 '6' Filename         Info x00  Length   19
TokenID x37 '7' MultiPart        Info x00  Length    1
TokenID x38 '8' Seqno            Info x00  Length    4
TokenID x39 '9' FileSize         Info xff  Length    8
TokenID x3a ':' FirstCSN         Info x00  Length  129
TokenID x3b ';' LastCSN          Info xff  Length  129
TokenID x3c '<' FirstIOTime      Info x00  Length    8
TokenID x3d '=' LastIOTime       Info xff  Length    8

GroupID x31 '1' MachineInfo      Info x00  Length  100
TokenID x30 '0' Sysname          Info x00  Length    7
TokenID x31 '1' Nodename         Info x00  Length   17
TokenID x32 '2' Release          Info x00  Length   14
TokenID x33 '3' Version          Info x00  Length   36
TokenID x34 '4' Hardware         Info x00  Length    6

GroupID x32 '2' DatabaseInfo     Info x00  Length  299
TokenID x30 '0' Vendor           Info x00  Length    2
TokenID x31 '1' Name             Info x00  Length    6
TokenID x32 '2' Instance         Info x00  Length    6
TokenID x33 '3' Charset          Info x00  Length    4
TokenID x34 '4' MajorVersion     Info x00  Length    2
TokenID x35 '5' MinorVersion     Info x00  Length    2
TokenID x36 '6' VerString        Info x00  Length  225
TokenID x37 '7' ClientCharset    Info x00  Length    4
TokenID x38 '8' ClientVerString  Info x00  Length   12

GroupID x33 '3' ProducerInfo     Info x00  Length   83
TokenID x30 '0' Name             Info x00  Length   10
TokenID x31 '1' DataSource       Info x00  Length    2
TokenID x32 '2' MajorVersion     Info x00  Length    2
TokenID x33 '3' MinorVersion     Info x00  Length    2
TokenID x34 '4' MaintLevel       Info x00  Length    2
TokenID x35 '5' BugFixLevel      Info x00  Length    2
TokenID x36 '6' BuildNumber      Info x00  Length    2
TokenID x37 '7' VerString        Info x00  Length   29

GroupID x34 '4' ContinunityInfo  Info x00  Length    8
TokenID x30 '0' RecoveryMode     Info x00  Length    4

Viewing the Transaction Record

Typing next or n again steps through each record in the file. The following example shows details of an INSERT operation against the SRC.USERS table, including the actual data and record count. You could argue that each record would always have a record count of 1. This is not true for LOBs which are split into 2KB chunks when written to a Trail file.
Logdump 19 >n
___________________________________________________________________
Hdr-Ind    :     E  (x45)     Partition  :     .  (x04)
UndoFlag   :     .  (x00)     BeforeAfter:     A  (x41)
RecLength  :    29  (x001d)   IO Time    : 2010/11/09 13:25:14.000.000
IOType     :     5  (x05)     OrigNode   :   255  (xff)
TransInd   :     .  (x00)     FormatType :     R  (x52)
SyskeyLen  :     0  (x00)     Incomplete :     .  (x00)
AuditRBA   :        138       AuditPos   : 38737936
Continued  :     N  (x00)     RecCount   :     1  (x01)

2010/11/09 13:25:14.000.000 Insert               Len    29 RBA 999
Name: SRC.USERS
After  Image:                                             Partition 4   G  b
 0000 0007 0000 0003 5352 4300 0100 0500 0000 0159 | ........TEST.......Y
 0002 0005 0000 0001 4e                            | ........N
Column     0 (x0000), Len     7 (x0007)
Column     1 (x0001), Len     5 (x0005)
Column     2 (x0002), Len     5 (x0005)

The equivalent transaction record in the remote Trail file is identical to that found in the local Trail file, and is identifiable by the same Audit Position number.
Let’s query the USERS table in the SRC schema to see the actual record that we are viewing in LOGDUMP.
SQL> select * from SRC.USERS
  2  where USER_ID = 'TEST';

USER_ID  REGISTERED  ASSIGNED
-------- ----------- ---------
TEST     Y           N


Each record in the Trail file contains the following information:
·         The operation type, such as an insert, update, or delete
·         The transaction indicator (TransInd): 00 beginning, 01 middle, 02 end or 03 whole of transaction
·         The before or after indicator (BeforeAfter) for update operations
·         The commit timestamp
·         The time that the change was written to the GoldenGate file
·         The type of database operation
·         The length of the record
·         The Relative Byte Address (RBA) within the GoldenGate file
·         The schema and table name

Miscellaneous Commands

The miscellaneous commands are useful for displaying additional information, and are listed in the following table.
Command
Description
HISTORY
List previous commands
RECORD
Display audit record
SKIP [<count>]
Skip down <count> records
SFH
Scans for the file header record
ENV
Displays GoldenGate environment details
COUNT [detail]
Count the records in the file
EXIT
Exits LOGDUMP
This example highlights the power of the COUNT command:
Logdump 34 >count
LogTrail u01/app/oracle/product/ggs/dirdat/sa000004 has 602 records
Total Data Bytes             15703
  Avg Bytes/Record              26
Delete                         280
Insert                         320
RestartOK                        1
Others                           1
Before Images                  280
After Images                   321

Average of 17 Transactions
    Bytes/Trans .....       2623
    Records/Trans ...         35
    Files/Trans .....          1


                                                   Partition 0
RestartOK                        1
After Images                     1

*FileHeader*                                       Partition 0
Total Data Bytes               928
  Avg Bytes/Record             928
Others                           1

SRC.USERS                                          Partition 4
Total Data Bytes             14775
  Avg Bytes/Record              24
Delete                         280
Insert                         320
Before Images                  280
After Images                   320

Filtering Records

You can do some pretty fancy stuff with LOGDUMP filtering. A whole suite of commands are set aside for this. We can filter on just about anything that exists in the Trail file, such as process name, RBA, record length, record type, even a string!
The following example shows the required syntax to filter on DELETE operations. Note that LOGDUMP reports how many records have been excluded by the filter.
Logdump 52 >filter include iotype delete
Logdump 53 >n

2010/11/09 13:31:40.000.000 Delete               Len    17 RBA 5863
Name: SRC.USERS
Before Image:                                             Partition 4   G  b
 0000 000d 0000 0009 414e 4f4e 594d 4f55 53        | ........ANONYMOUS


Filtering suppressed     42 records