<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>expertDBA.com</title>
	<atom:link href="http://expertdba.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://expertdba.com/blog</link>
	<description>A Database Administration Blog</description>
	<lastBuildDate>Fri, 18 Dec 2009 06:15:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ASM Hands-On Training</title>
		<link>http://expertdba.com/blog/?p=84</link>
		<comments>http://expertdba.com/blog/?p=84#comments</comments>
		<pubDate>Wed, 16 Dec 2009 07:19:14 +0000</pubDate>
		<dc:creator>sanjay</dc:creator>
				<category><![CDATA[Oracle Knowledge Base]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=84</guid>
		<description><![CDATA[Here is a nice link for the hands on training of ASM:
http://www.expertDBA.com/oracle/articles/ASM_Hands_On_Training.pdf
Note: Above mentioned training document is copied/taken from the Oracle Blog http://blogs.oracle.com.
]]></description>
			<content:encoded><![CDATA[<p>Here is a nice link for the hands on training of ASM:</p>
<p><a href="http://www.expertDBA.com/oracle/articles/ASM_Hands_On_Training.pdf">http://www.expertDBA.com/oracle/articles/ASM_Hands_On_Training.pdf</a></p>
<p><span style="text-decoration: underline;">Note</span>: Above mentioned training document is copied/taken from the Oracle Blog <a href="http://blogs.oracle.com/AlejandroVargas/Lab5-Rman-Migrate-into-ASM.pdf">http://blogs.oracle.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring Oracle ASM on Linux (using ASMlib)</title>
		<link>http://expertdba.com/blog/?p=82</link>
		<comments>http://expertdba.com/blog/?p=82#comments</comments>
		<pubDate>Tue, 15 Dec 2009 16:21:27 +0000</pubDate>
		<dc:creator>sanjay</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Oracle Knowledge Base]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=82</guid>
		<description><![CDATA[Oracle Automatic Storage Management (ASM) on Red Hat Linux (using ASMlib)
As a first step we need to install support ASM libraries to configure the ASM. This library is provided to enable ASM I/O to Linux disks without the limitations of the standard Unix I/O API.
The ASMLib software is available from the Oracle Technology Network at [...]]]></description>
			<content:encoded><![CDATA[<p align="center"><strong><span style="text-decoration: underline;">Oracle Automatic Storage Management (ASM) on Red Hat Linux (using ASMlib)</span></strong><strong></strong></p>
<p>As a first step we need to install support ASM libraries to configure the ASM. This library is provided to enable ASM I/O to Linux disks without the limitations of the standard Unix I/O API.</p>
<p>The ASMLib software is available from the Oracle Technology Network at <a href="http://www.oracle.com/technology/tech/linux/asmlib/index.html"><strong>http://www.oracle.com/technology/tech/linux/asmlib/index.html</strong></a><strong></strong></p>
<p>The oracleasmlib package provides the actual ASM library. The oracleasm-support package provides the utilities used to get the ASM driver up and running. Both of these packages need to be installed.</p>
<p>The remaining packages provide the kernel driver for the ASM library. Each package provides the driver for a different kernel. You must install the appropriate package for the kernel you are running. Use the &#8220;<tt>uname -r</tt> command to determine the version of the kernel. The oracleasm kerel driver package will have that version string in its name. For example, if you were running Red Hat Enterprise Linux 4 AS, and the kernel you were using was the 2.6.9-5.0.5.ELsmp kernel, you would choose the oracleasm-2.6.9-5.0.5-ELsmp package. So, to install these packages on RHEL4 on an Intel x86 machine, you might use the command:</p>
<pre>[root@ssk ~]# rpm -Uvh oracleasm-support-2.1.3-1.el5.i386.rpm
[root@ssk ~]# rpm -Uvh oracleasm-2.6.18-53.el5PAE-2.0.4-1.el5.i686.rpm
[root@ssk ~]# rpm -Uvh oracleasmlib-2.0.4-1.el5.i386.rpm</pre>
<p> If you were on a different machine, the package names would be slightly different, replacing &#8216;i686&#8242; with the appropriate architecture. Use the package names relevant for your distribution.</p>
<p><strong>NOTE:</strong> Distributions with the Linux 2.4 kernel still use the 1.0 kernel driver, while distributions based on the Linux 2.6 kernel use the 2.0 kernel driver. All distributions use version 2.0 of the support and library packages. See the <a href="http://www.oracle.com/technology/tech/linux/asmlib/driver_matrix.html">driver matrix</a> for more information.</p>
<p>Once the above steps are completed, ASMLib is now installed on the system.</p>
<p><span style="text-decoration: underline;"> </span><span style="text-decoration: underline;">Next step is to Configure the Oracle ASM library driver:</span></p>
<p>Run the /etc/init.d/oracleasm script with the &#8216;configure&#8217; option. It will ask for the user and group that default to owning the ASM driver access point. If the database was running as the &#8216;oracle&#8217; user and the &#8216;dba&#8217; group, the output would look like this:</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm configure</p>
<p>Configuring the Oracle ASM library driver.<br />
This will configure the on-boot properties of the Oracle ASM library<br />
driver.  The following questions will determine whether the driver is<br />
loaded on boot and what permissions it will have.  The current values<br />
will be shown in brackets (&#8216;[]&#8216;).  Hitting &lt;ENTER&gt; without typing an<br />
answer will keep that current value.  Ctrl-C will abort. </p>
<p>Default user to own the driver interface [oracle]:<br />
Default group to own the driver interface [dba]:<br />
Start Oracle ASM library driver on boot (y/n) [y]:<br />
Scan for Oracle ASM disks on boot (y/n) [y]:<br />
Writing Oracle ASM library driver configuration: done<br />
Initializing the Oracle ASMLib driver:                               [  OK  ]<br />
Scanning the system for Oracle ASMLib disks:               [  OK  ]</p>
<p>[root@ssk ~]#</p>
<p>This should load the oracleasm.o driver module and mount the ASM driver filesystem. By selecting enabled = &#8216;y&#8217; during the configuration, the system will always load the module and mount the filesystem on boot.</p>
<p><strong><span style="text-decoration: underline;">NOTE: Reference</span></strong>: Oracle documentation: <a href="http://www.oracle.com/technology/tech/linux/asmlib/install.html"><strong>http://www.oracle.com/technology/tech/linux/asmlib/install.html</strong></a></p>
<p><strong></strong></p>
<p><strong>While configuring Oracle ASM if you are getting the following error:</p>
<p>Initializing the Oracle ASMLib driver:                                  [FAILED] </strong></p>
<p><strong>There could be two reasons:</strong></p>
<ol>
<li><strong>RPM installed for ASMLIB are not correct: Check and reinstall the correct version.</strong>
<ol>
<li><strong>a.      </strong><strong>Use the following links:<br />
</strong><a href="http://www.oracle.com/technology/tech/linux/asmlib/install.html"><strong>http://www.oracle.com/technology/tech/linux/asmlib/install.html</strong></a><strong><br />
</strong><a href="http://www.oracle.com/technology/tech/linux/asmlib/index.html"><strong><a href="http://www.oracle.com/technology/tech/linux/asmlib/index.html">http://www.oracle.com/technology/tech/linux/asmlib/index.html</a></strong></a><strong></strong></li>
</ol>
</li>
<li><strong>Other reason could be: &#8212; SELinux is turned on</strong></li>
</ol>
<p>SELinux would bring trouble for Oracle ASMLib, not only this, it played OCFS, OEM grid control, Oracle cluster service as well. Turn it off by disabling it. Oracle will not complain.</p>
<p><strong>Solution:<br />
</strong>Turn off SELinux or put it in permssive mode.<strong></p>
<p>How-to:<br />
</strong>1) Go to modify /etc/selinux/config in redhat or /boot/grub/grub.conf in other linux with GRUB boot loader.<strong> </strong>It looks like this:<strong></p>
<p></strong># SELINUX= can take one of these three values:<br />
#       enforcing &#8211; SELinux security policy is enforced.<br />
#       permissive &#8211; SELinux prints warnings instead of enforcing.<br />
#       disabled &#8211; SELinux is fully disabled.<strong><br />
SELINUX=enforcing &#8212;&gt; change it to SELINUX=disabled</strong><br />
2) Reboot server to take it effect</p>
<p>You can set up it into permissive mode right away without reboot.</p>
<p> <strong>Usage: setenforce</strong> <strong>[</strong> <strong>Enforcing</strong> <strong>|</strong> <strong>Permissive</strong> <strong>|</strong> <strong>1</strong> <strong>|</strong> <strong>0</strong> <strong>]</strong></p>
<p> The automatic start can be enabled or disabled with the &#8216;enable&#8217; and &#8216;disable&#8217; options to /etc/init.d/oracleasm:</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm disable</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm enable</p>
<p> </p>
<p>[root@ssk ~]# /etc/init.d/oracleasm disable<br />
Writing Oracle ASM library driver configuration: done<br />
Dropping Oracle ASMLib disks:                                                   [  OK  ]<br />
Shutting down the Oracle ASMLib driver:                              [  OK  ]</p>
<p> [root@ssk ~]# /etc/init.d/oracleasm enable<br />
Writing Oracle ASM library driver configuration: done<br />
Initializing the Oracle ASMLib driver:                                       [  OK  ]<br />
Scanning the system for Oracle ASMLib disks:                       [  OK  ]</p>
<p>[root@ssk ~]#</p>
<p> <strong>Next step is of making Disks Available to ASMLib<br />
</strong><br />
<strong><span style="text-decoration: underline;">To create a Disk Group</span></strong></p>
<p>[root@ssk ~]# /etc/init.d/oracleasm  <strong>createdisk VOL1 /dev/hdc11</strong><br />
Marking disk &#8220;/dev/hdc11&#8243; as an ASM disk: [ OK ]<br />
[root@ssk ~]# /etc/init.d/oracleasm  <strong>createdisk VOL1 /dev/hdc12</strong><br />
Marking disk &#8220;/dev/hdc12&#8243; as an ASM disk: [ OK ]<br />
[root@ssk ~]# /etc/init.d/oracleasm  <strong>createdisk VOL1 /dev/hdc13</strong><br />
Marking disk &#8220;/dev/hdc13&#8243; as an ASM disk: [ OK ]</p>
<p>Note: If above commands fails then please make sure the disk that you are specifying is not already being used or not already mounted:</p>
<p><strong><span style="text-decoration: underline;">To Delete a Disk Group</span></strong></p>
<p>[root@ssk ~]# /etc/init.d/oracleasm  <strong>deletedisk VOL1<br />
</strong>Deleting Oracle ASM disk &#8220;VOL1&#8243; [ OK ]</p>
<p><strong><span style="text-decoration: underline;">To query the disks</span></strong><span style="text-decoration: underline;"><br />
</span><br />
[root@ssk ~]# /etc/init.d/oracleasm querydisk /dev/hdc11<br />
Device &#8220;/dev/hdc11&#8243; is marked an ASM disk with the label &#8220;VOL1&#8243;</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm querydisk /dev/hdc12<br />
Device &#8220;/dev/hdc12&#8243; is marked an ASM disk with the label &#8220;VOL2&#8243;</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm querydisk /dev/hdc13<br />
Device &#8220;/dev/hdc13&#8243; is marked an ASM disk with the label &#8220;VOL3&#8243;</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm querydisk /dev/hdc10<br />
Device &#8220;/dev/hdc10&#8243; is not marked as an ASM disk</p>
<p> [root@ssk ~]# /etc/init.d/oracleasm querydisk VOL1<br />
Disk &#8220;VOL1&#8243; is a valid ASM disk</p>
<p>[root@ssk ~]# /etc/init.d/oracleasm querydisk VOL4<br />
Disk &#8220;VOL4&#8243; does not exist or is not instantiated</p>
<p>[root@ssk ~]#</p>
<p><strong><span style="text-decoration: underline;">To list and query the existing disks<br />
</span></strong><strong><br />
</strong>[root@ssk ~]# /etc/init.d/oracleasm listdisks<br />
VOL1<br />
VOL2<br />
VOL3</p>
<p># /etc/init.d/oracleasm querydisk VOL1<br />
Disk &#8220;VOL1&#8243; is a valid ASM disk on device [8, 2]</p>
<p> When a disk is added to a RAC setup, the other nodes need to be notified about it. Run the &#8216;createdisk&#8217; command on one node, and then run &#8217;scandisks&#8217; on every other node:</p>
<p>  [root@ca-test1 /]# /etc/init.d/oracleasm scandisks<br />
  Scanning system for ASM disks                              [  OK  ]<br />
We are now done with installation and configuration of ASMLib on Linux platform.</p>
<p style="text-align: center;"> <strong><span style="text-decoration: underline;">Creating New Oracle ASM Instance:</span></strong><strong></strong></p>
<p> <span style="text-decoration: underline;">Create the password file:</span></p>
<p>[oracle@ssk ~]$ orapwd file=$ORACLE_HOME/dbs/orapw+ASM password=changeIt entries=5</p>
<p><span style="text-decoration: underline;">Create required directories:</span></p>
<p>[oracle@ssk ~]$ mkdir -p $ORACLE_BASE/admin/+ASM<br />
[oracle@ssk ~]$ cd $ORACLE_BASE/admin/+ASM<br />
[oracle@ssk +ASM]$ mkdir bdump<br />
[oracle@ssk +ASM]$ mkdir udump<br />
[oracle@ssk +ASM]$ mkdir cdump<br />
[oracle@ssk +ASM]$ mkdir pfile<br />
 </p>
<p><span style="text-decoration: underline;">Create the init+ASM.ora file:</span></p>
<p>Using vi editor or any other editor you like, create the init+ASM.ora file under the $ORACLE_HOME/dbs<br />
directory and add the below lines into this file.</p>
<p>asm_diskgroups=&#8217;DATA_GRP&#8217;<br />
asm_diskstring=&#8217;ORCL:*&#8217;<br />
background_dump_dest=&#8217;/u01/app/admin/+ASM/bdump&#8217;<br />
core_dump_dest=&#8217;/u01/app/admin/+ASM/cdump&#8217;<br />
instance_type=&#8217;asm&#8217;<br />
large_pool_size=12M<br />
remote_login_passwordfile=&#8217;SHARED&#8217;<br />
user_dump_dest=&#8217;/u01/app/admin/+ASM/udump&#8217;</p>
<p>[oracle@ssk ~]$ cat $ORACLE_HOME/dbs/init+ASM.ora<br />
asm_diskgroups=&#8217;PROD_DB_GRP&#8217;<br />
asm_diskstring=&#8217;ORCL:*&#8217;<br />
background_dump_dest=&#8217;/u01/app/admin/+ASM/bdump&#8217;<br />
core_dump_dest=&#8217;/u01/app/admin/+ASM/cdump&#8217;<br />
instance_type=&#8217;asm&#8217;<br />
large_pool_size=12M<br />
remote_login_passwordfile=&#8217;SHARED&#8217;<br />
user_dump_dest=&#8217;/u01/app/admin/+ASM/udump&#8217;<br />
[oracle@ssk ~]$</p>
<p> </p>
<p><span style="text-decoration: underline;">Create spfile+ASM.ora and start the instance using that file:</span></p>
<p>[oracle@ssk ~]$ export ORACLE_SID=+ASM<br />
[oracle@ssk ~]$ sqlplus / as sysdba</p>
<p>SQL*Plus: Release 10.2.0.1.0 &#8211; Production on Sun Dec 4 21:17:35 2005</p>
<p>Copyright (c) 1982, 2005, Oracle. All rights reserved.</p>
<p>Connected to an idle instance.</p>
<p>SQL&gt; create spfile from pfile;</p>
<p>File created.</p>
<p>SQL&gt; startup mount</p>
<p>ASM instance started<br />
Total System Global Area 83886080 bytes<br />
Fixed Size 1217836 bytes<br />
Variable Size 57502420 bytes<br />
ASM Cache 25165824 bytes<br />
ORA-15032: not all alterations performed<br />
ORA-15063: ASM discovered an insufficient number of disks for diskgroup<br />
&#8220;DATA_GRP&#8221;</p>
<p> </p>
<p>SQL&gt; show parameter disk<br />
 NAME                                 TYPE        VALUE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
asm_diskgroups                     string      DATA_GRP<br />
asm_diskstring                       string      ORCL:*<br />
disk_asynch_io                       boolean     TRUE</p>
<p>                         </p>
<p>SQL&gt; create diskgroup data_grp<br />
failgroup f1 disk &#8216;ORCL:DSK1&#8242;<br />
failgroup f2 disk &#8216;ORCL:DSK2&#8242;;</p>
<p> Diskgroup created.   </p>
<p> </p>
<p>SQL&gt; set linesize 100<br />
SQL&gt; col name format a15<br />
SQL&gt; col path format a15<br />
SQL&gt; select name, path from v$asm_disk where name is not null;</p>
<p>NAME            PATH<br />
&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;<br />
DSK1            ORCL:DSK1<br />
DSK2            ORCL:DSK2</p>
<p> </p>
<p>SQL&gt; select name, type, total_mb, free_mb from v$asm_diskgroup;</p>
<p>    NAME            TYPE     TOTAL_MB   FREE_MB<br />
    &#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
    DATA_GRP        NORMAL      59999      59897</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=82</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL NDB Cluster Node status monitor</title>
		<link>http://expertdba.com/blog/?p=78</link>
		<comments>http://expertdba.com/blog/?p=78#comments</comments>
		<pubDate>Mon, 30 Nov 2009 05:28:06 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQL Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=78</guid>
		<description><![CDATA[# NDB CLUSTER MONITOR
# script for monitoring mysql-cluster status data/ndb/mgmnodes
NDB_MGM=&#8221;ndb_mgm&#8221;
ndb_ps=`ps -ef&#124;grep &#8220;ndb_mgmd&#8221;&#124;grep -v grep &#124;wc -l`
node_count=`$NDB_MGM -e &#8220;show&#8221; &#124;grep -w &#8220;id&#8221;&#124;wc -l`
echo ${Log}
&#62; ${Log}
if [ $ndb_ps -ne 1 ] ; then
echo &#8220;Looks like NDB_MGMD is not running&#8221;
echo &#8220;check MANAGEMENT Node status&#8221;
exit 1
### need to work on this condition.
else
echo &#8220;MANAGEMENT Node is up, proceed with next [...]]]></description>
			<content:encoded><![CDATA[<p># NDB CLUSTER MONITOR<br />
# script for monitoring mysql-cluster status data/ndb/mgmnodes</p>
<p>NDB_MGM=&#8221;ndb_mgm&#8221;<br />
ndb_ps=`ps -ef|grep &#8220;ndb_mgmd&#8221;|grep -v grep |wc -l`<br />
node_count=`$NDB_MGM -e &#8220;show&#8221; |grep -w &#8220;id&#8221;|wc -l`</p>
<p>echo ${Log}<br />
&gt; ${Log}</p>
<p>if [ $ndb_ps -ne 1 ] ; then<br />
echo &#8220;Looks like NDB_MGMD is not running&#8221;<br />
echo &#8220;check MANAGEMENT Node status&#8221;<br />
exit 1<br />
### need to work on this condition.<br />
else<br />
echo &#8220;MANAGEMENT Node is up, proceed with next step&#8221;<br />
echo &#8220;checking individual node status&#8221;<br />
$NDB_MGM -e &#8220;show&#8221;|grep -w &#8220;id&#8221;|awk &#8216;{print $1}&#8217;|cut -c 4- |while read node_id<br />
do<br />
# check to see ndbd_mgm daemon is running on $HOST and<br />
# node are running<br />
NODE_STATUS=`$NDB_MGM -e &#8220;$node_id status&#8221; | egrep -v &#8216;(Connected to Management Server|^$)&#8217;`<br />
case $NODE_STATUS in<br />
*started*)<br />
## echo &#8220;for datanode if status is started then ndbd is up&#8221;<br />
echo &#8220;OK &#8211; $NODE_STATUS&#8221; &gt;&gt;${Log}<br />
;;<br />
&#8220;Node $node_id: connected&#8221;*)<br />
## echo &#8220;for MGMD &amp; SQL if status is connected then things are fine&#8221;<br />
echo &#8220;OK &#8211; $NODE_STATUS&#8221; &gt;&gt;${Log}<br />
;;<br />
*starting*)<br />
echo &#8220;WARRING &#8211; $NODE_STATUS&#8221; &gt;&gt;${Log}<br />
;;<br />
*)<br />
echo &#8220;ERROR &#8211; $NODE_STATUS&#8221; &gt;&gt;${Log}<br />
;;<br />
esac<br />
# done with all nodes<br />
done<br />
fi ## closing if</p>
<p>cnt=`cat ${Log}|grep -vw &#8220;OK&#8221;|wc -l`<br />
if [ $cnt -eq 0 ] ; then<br />
echo &#8220;ALL NODE STATUS is FINE&#8221;<br />
cat ${Log}<br />
exit 0<br />
else<br />
echo &#8220;${Header.Start}&#8221;<br />
echo &#8220;CHECK MYSQL-CLUSTER NODE STATUS&#8221;<br />
$NDB_MGM -e &#8220;show&#8221;<br />
echo &#8220;${Header.Stop}&#8221;<br />
exit 1<br />
fi</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=78</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Individual object restore from the last backup.</title>
		<link>http://expertdba.com/blog/?p=74</link>
		<comments>http://expertdba.com/blog/?p=74#comments</comments>
		<pubDate>Mon, 30 Nov 2009 05:25:00 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQL Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=74</guid>
		<description><![CDATA[Pre-req: The backup dir (taken using the backup script earlier) should be accessible from the target server and untar the bzip2 backup file before starting with restore.
This script will restore all the objects of all the schema(including mysql schema) use filters for selective restore.
#!/bin/sh
#============================================================================
# File:         DV_MySQL_restore.sh
# Description:  restore individual table backup to each database.
# Usage:   [...]]]></description>
			<content:encoded><![CDATA[<p>Pre-req: The backup dir (taken using the backup script earlier) should be accessible from the target server and untar the bzip2 backup file before starting with restore.</p>
<p>This script will restore all the objects of all the schema(including mysql schema) use filters for selective restore.</p>
<p>#!/bin/sh<br />
#============================================================================<br />
# File:         DV_MySQL_restore.sh<br />
# Description:  restore individual table backup to each database.<br />
# Usage:        sh DV_MySQL_restore.sh &gt;DV_MySQL_restore.log 2&gt;DV_MySQL_restore.err<br />
#============================================================================</p>
<p>MYSQL=&#8221;/usr/local/mysql/bin/mysql&#8221;<br />
BKP_DATE=$(date &#8216;+%u&#8217;)  ## current format of backup day/time<br />
HOST=`hostname`<br />
DNAME=${HOST}-${BKP_DATE}* ## for latest backupdir based on day.<br />
MUSER=&#8221;xxxxxx&#8221;<br />
MPASS=&#8221;xxxxxx&#8221;<br />
SRC_BACKUP_DIR=&#8221;/mnt/backup/&#8221;$DNAME</p>
<p>##check if the backup dir exist or not..<br />
if [ ! -d $SRC_BACKUP_DIR ]; then<br />
echo Directory NOT found..<br />
echo manually unzip the .tar.bz2 file to make sure we use the correct backupfile.<br />
echo Plz check the target dir for backups.<br />
exit<br />
else<br />
echo Directory found continue with backup<br />
cd $SRC_BACKUP_DIR<br />
fi<br />
### directory found.Proceed with backup</p>
<p>cd $SRC_BACKUP_DIR<br />
### Get all databases name from source host,Assuming we have access to mysql on source from target###<br />
DATABASES=`dir |egrep -vw &#8220;information_schema|mysql&#8221;`<br />
for db in $DATABASES<br />
do<br />
cd ${SRC_BACKUP_DIR}/${db} ### ON the assumtion that /mnt/backup is a SHARED MOUNT POINT i.e accessible from the TEST SERVER too<br />
echo &#8220;starting restore of database &#8212; $db&#8221;<br />
$MYSQL -u$MUSER -p$MPASS -e &#8220;CREATE DATABASE IF NOT EXISTS ${db}&#8221;<br />
## database created proceed with each table restore.Get list of tables from source.<br />
TABLES=`ls |grep -v $db&#8221;_routines_triggers.sql.gz&#8221;`<br />
for table in $TABLES<br />
do<br />
cd $SRC_BACKUP_DIR/$db/<br />
FILE=$table  ##use .gz for compressed files.<br />
echo $table<br />
gunzip &lt; $FILE | $MYSQL -q -u$MUSER -p$MPASS -D ${db} #for .gz files. if compression is done.<br />
###$MYSQL -q -u$MUSER -p$MPASS -D ${db} &lt; $FILE  ## for each table with .sql file<br />
done<br />
## once table restore is done.proceed with routines_triggers restore in each database.<br />
echo &#8220;starting restore of routines/triggers to database &#8212; $db&#8221;<br />
cd ${SRC_BACKUP_DIR}/${db}/<br />
ROUTINE=${db}_routines_triggers.sql.gz #for .gz files. if compression is done.<br />
###$MYSQL -q -u$MUSER -p$MPASS -D ${db} &lt; $ROUTINE  ## for routines/triggers in each db.<br />
gunzip &lt; $ROUTINE | $MYSQL -u$MUSER -p$MPASS -D ${db}<br />
echo &#8220;completed restore of database &#8212; $db&#8221;<br />
done<br />
## restore of triggers/routines is done for each db.<br />
## all database restore is completed.</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=74</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Individual table/object backup of mysql database</title>
		<link>http://expertdba.com/blog/?p=70</link>
		<comments>http://expertdba.com/blog/?p=70#comments</comments>
		<pubDate>Mon, 30 Nov 2009 05:15:21 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQL Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=70</guid>
		<description><![CDATA[This script will backup tables separately and triggers/routines separately for each schema.]]></description>
			<content:encoded><![CDATA[<p>#!/bin/sh<br />
#============================================================================<br />
# File:         DV_MySQL_backup.sh<br />
# Description:  backup individual table backup from each database.<br />
# Usage:        sh DV_MySQL_backup.sh &gt;DV_MySQL_backup.log 2&gt;DV_MySQL_backup.err<br />
#============================================================================</p>
<p>### MySQL Setup ###<br />
##BKP_DATE=$(date &#8216;+%m%d%Y&#8217;)<br />
BKP_DATE=$(date &#8216;+%u%H&#8217;)  ## current format of backup day/time<br />
HOST=`hostname`<br />
MUSER=&#8221;xxxxx&#8221;<br />
MPASS=&#8221;xxxxx&#8221;<br />
BACKUP_DIR=&#8221;/mnt/backup/&#8221; #${HOST}-${BKP_DATE}<br />
DNAME=${HOST}-${BKP_DATE}<br />
MYSQLDUMP=&#8221;/usr/local/mysql/bin/mysqldump&#8221;<br />
MYSQL=&#8221;/usr/local/mysql/bin/mysql&#8221;</p>
<p>cd $BACKUP_DIR<br />
#mkdir ${HOST}-${BKP_DATE}<br />
echo &#8220;starting backup job at `date &#8216;+%m%d%Y %H:%M %Z&#8217;` &#8221;</p>
<p>### Get all databases name ###<br />
###$MYSQL -u$MUSER -p$MPASS &#8211;skip-column-names -e &#8220;show databases&#8221; |grep -v &#8220;information_schema&#8221; |while read db<br />
DATABASES=`$MYSQL -u$MUSER -p$MPASS &#8211;skip-column-names -e &#8220;show databases&#8221;`<br />
for db in $DATABASES<br />
do<br />
### Create dir for each databases(DUE TO FILESYSTEM BUGS), backup tables in individual files ###<br />
#echo ${BACKUP_DIR}<br />
#echo ${BACKUP_DIR}/${db}<br />
mkdir -p -m 777 ${BACKUP_DIR}/$DNAME<br />
cd ${BACKUP_DIR}/$DNAME<br />
mkdir -m 777 ${db}</p>
<p>#### directory creation is done.Proceed with backup<br />
echo &#8220;  &#8221;<br />
echo &#8220;starting backup of database &#8212; $db&#8221;<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#8221;<br />
###$MYSQL -u $MUSER -p$MPASS $db -e &#8220;show tables&#8221; |grep -v &#8220;Tables_in_&#8221;  |while read table<br />
TABLES=`$MYSQL -u $MUSER -p$MPASS $db -e &#8220;show tables&#8221; |grep -v &#8220;Tables_in_&#8221;`<br />
for table in $TABLES<br />
do<br />
FILE=$BACKUP_DIR/$DNAME/$db/$table.sql.gz<br />
echo $table;<br />
## for schema,data/routines  make sure we backup mysql database also.<br />
$MYSQLDUMP -q &#8211;skip-triggers &#8211;single-transaction -u $MUSER -p$MPASS $db $table | gzip &gt; $FILE  ##dump only table schema and table data<br />
done<br />
## to backup routines/triggers for each db.<br />
ROUTINE=$BACKUP_DIR/$DNAME/${db}/${db}_routines_triggers.sql.gz<br />
$MYSQLDUMP -t -d -q &#8211;allow-keywords -R -u $MUSER -p$MPASS $db $table | gzip &gt; $ROUTINE        ##triggers are enabled by default<br />
echo &#8220;completed the backup of database &#8212; $db&#8221;<br />
done</p>
<p>echo &#8220;##################################&#8221;<br />
echo &#8220;backup job completed at `date &#8216;+%m%d%Y %H:%M %Z&#8217;` &#8221;<br />
echo &#8220;All database backup complted&#8221;<br />
echo &#8221; &#8221;<br />
echo &#8220;Deleting old backups&#8221;<br />
rm -rf ${BACKUP_DIR}/${DNAME}.tar.bz2<br />
echo &#8220;Compressing the backupfiles&#8221;<br />
##create   bzipped   tar  archive  of  the  directory<br />
cd ${BACKUP_DIR}<br />
tar -cjf ${DNAME}.tar.bz2 ${DNAME}<br />
##tar -cvf &#8211; &lt;directory name&gt; | gzip -c &gt; &lt;directory name&gt;.tar.gz<br />
echo &#8220;backup archiving is done.plz verify the files&#8221;<br />
ls -lhtr ${BACKUP_DIR}/${DNAME}.tar.bz2<br />
rm -rf ${BACKUP_DIR}/${DNAME}<br />
## done with backup</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=70</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To find data discrepancy in table partitions using maatkit checksum</title>
		<link>http://expertdba.com/blog/?p=66</link>
		<comments>http://expertdba.com/blog/?p=66#comments</comments>
		<pubDate>Mon, 30 Nov 2009 05:07:45 +0000</pubDate>
		<dc:creator>Krishna</dc:creator>
				<category><![CDATA[MySQL Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=66</guid>
		<description><![CDATA[Script to find the datadiscrepancy across table partitions  b/w mysql servers(Master/slave) . The can also be used(with slight modifications) to find the data discrepancy across 2 standalone servers..
Pre-req: Need to have maatkit checksum tool installed on the server.
create tables checksum and checksum_results
CREATE TABLE checksum (
     db      [...]]]></description>
			<content:encoded><![CDATA[<p>Script to find the datadiscrepancy across table partitions  b/w mysql servers(Master/slave) . The can also be used(with slight modifications) to find the data discrepancy across 2 standalone servers..</p>
<p>Pre-req: Need to have maatkit checksum tool installed on the server.</p>
<p>create tables checksum and checksum_results</p>
<pre>CREATE TABLE checksum (
     db         char(64)     NOT NULL,
     tbl        char(64)     NOT NULL,
     chunk      int          NOT NULL,
     boundaries char(100)    NOT NULL,
     this_crc   char(40)     NOT NULL,
     this_cnt   int          NOT NULL,
     master_crc char(40)         NULL,
     master_cnt int              NULL,
     ts         timestamp    NOT NULL,
     PRIMARY KEY (db, tbl, chunk)
  );
</pre>
<pre>CREATE TABLE checksum_results (
     db         char(64)     NOT NULL,
     tbl        char(64)     NOT NULL,
     chunk      char(64)     NOT NULL,
     boundaries char(100)    NOT NULL,
     this_crc   char(40)     NOT NULL,
     this_cnt   int          NOT NULL,
     master_crc char(40)         NULL,
     master_cnt int              NULL,
     ts         timestamp    NOT NULL,
 );</pre>
<p>Usage : checksum_run.sh &lt;MastHost&gt; &lt;SlaveHost&gt;  &gt; checksum_run.log 2&gt;checksum_run.err<br />
#====================================================================================<br />
##### Verify if mysql deamon is running #####<br />
SRC=$1<br />
TRG=$2<br />
USER=&#8217;xxxxx&#8217;<br />
PWD=&#8217;xxxx&#8217;<br />
LogDir=/tmp<br />
Log=${LogDir}/Checksum_test.log<br />
MailList=&#8221;abc@xyz.com&#8221;<br />
Hostname=`hostname`</p>
<p>&gt; ${Log}</p>
<p>mysql_statuschk()<br />
{<br />
process=`ps -ef | egrep -iw &#8216;mysqld_safe&#8217; | egrep -v egrep | wc -l`<br />
myping=`mysqladmin -u$USER -p$PWD &#8220;ping&#8221;|egrep -iw &#8216;alive&#8217;|wc -l`<br />
if [ $process -eq 0 ] || [ $myping -eq 0 ] ; then<br />
echo &#8220;MySQL Process is Unavailable on ${Hostname}!&#8221; &gt; ${Log}<br />
echo &#8220;Verify if mysqld is running!&#8221; &gt;&gt; ${Log}<br />
echo &#8220;Hostname:&#8221; $Hostname &gt;&gt; ${Log}<br />
echo &#8220;Uptime:&#8221; `uptime` &gt;&gt; ${Log}<br />
echo  &gt;&gt; ${Log}<br />
ps -ef|egrep -iw &#8220;mysql&#8221; &gt;&gt; ${Log}<br />
##### Verify MYSQLADMIN Status #####<br />
echo &#8220;MySQL Admin status:&#8221; &gt;&gt; ${Log}<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#8221; &gt;&gt; ${Log}<br />
mysqladmin -u$USER -p$PWD &#8220;ping&#8221; &gt;&gt; ${Log}<br />
mysqladmin -u$USER -p$PWD &#8220;status&#8221; &gt;&gt; ${Log}<br />
echo &#8220;If mysqladmin status is not alive! then mysql seems to be down.&#8221; &gt;&gt; ${Log}<br />
mailx -s  &#8220;SEV1/${Hostname}/MySQL Process is Unavailable.&#8221; ${MailList} &lt; ${Log}<br />
return 1<br />
else<br />
## if mysql is up and running.<br />
echo &#8220;MySQL is up and running.&#8221;<br />
return 0<br />
fi<br />
}</p>
<p>maatkit_chksum()<br />
{<br />
###### MAATKIT RUNNING STATUS CHECK ######<br />
Hostname=`hostname`<br />
echo &#8220;Hostname:&#8221; $Hostname &gt;&gt; ${Log}<br />
echo &#8220;Starting checksum for partitions at `date &#8216;+%m%d%Y %H:%M %Z&#8217;` &#8221; &gt;&gt; ${Log}<br />
MK_STAT=`ps -ef | grep &#8220;mk-table-checksum&#8221; | grep -v &#8220;grep&#8221; | wc -l`<br />
seconds=`mysql -h$TRG -u$USER -p$PWD -e &#8220;show slave status\G&#8221;|egrep Seconds|awk {&#8216;print $2&#8242;}`<br />
if [ ${MK_STAT} -eq 0 ] || [ $seconds -eq 0 ]; then<br />
####### MAATKIT CHECKSUM RUN #########<br />
##make sure we truncate the table test.checksum before looping in for each partition.<br />
mysql -u$USER -p$PWD -D test -e &#8220;truncate table test.checksum&#8221;<br />
mysql -u$USER -p$PWD -D test -e &#8220;truncate table test.checksum_results&#8221;</p>
<p>## Now get the partition information to loop into.<br />
PLIST=`mysql -u$USER -p$PWD &#8211;skip-column-names -e &#8220;select partition_name from information_schema.partitions where table_schema=&#8217;&lt;dbname&gt;&#8217; and table_name=&#8217;&lt;tblname&gt; &#8216; &#8220;|tr -d &#8216;p&#8217;`<br />
for PART in $PLIST<br />
do<br />
### test for single partition without chunk<br />
echo &#8220;Starting for partition &#8212; $PART&#8221;<br />
echo<br />
mk-table-checksum &#8211;replicate=test.checksum &#8211;databases=&lt;dbname&gt; &#8211;tables=&lt;tblname&gt; h=$SRC &#8211;where=&#8221;&lt;colname&gt; &gt; date_format($PART,&#8217;%Y-%m-%d 00:00:00&#8242;) and &lt;colname&gt; &lt; date_format($PART,&#8217;%Y-%m-%d 23:59:59&#8242;)&#8221;<br />
##to insert partition cheksum result into new tables.<br />
mysql -u$USER -p$PWD -D test -e &#8220;set @par=&#8217;p$PART&#8217;; insert into test.checksum_results (db, tbl, chunk, boundaries, this_cnt, this_crc,master_crc,master_cnt,ts) select db, tbl, @par, boundaries, this_cnt, this_crc,master_crc,master_cnt,ts from test.checksum where tbl=&#8217;&lt;tblname&gt;&#8217;&#8221;<br />
done<br />
echo &#8220;Completed  checksum for table paritions at `date &#8216;+%m%d%Y %H:%M %Z&#8217;` &#8221; &gt;&gt; ${Log}<br />
######### done with individual partition checksum.Now proceed with reports..<br />
PRC=`ps -ef|grep &#8220;mk-table-checksum&#8221;|egrep -v &#8220;grep&#8221;|wc -l`<br />
seconds2=`mysql -h$TRG -u$USER -p$PWD -e &#8220;show slave status\G&#8221;|egrep Seconds|awk {&#8216;print $2&#8242;}`<br />
### To ensure that checksum is replicating to slave after finishing in master ###<br />
sleep 5<br />
### checking for mk-table-checksum running status ###<br />
while [ $PRC -gt 0 ] || [ ${seconds2} -gt 0 ] ;do<br />
echo &#8220;The checksum script is still running!&#8221;<br />
echo &#8220;(OR)&#8221;<br />
echo &#8220;The slave is still lagging behind the master/replicating the checksum to slave&#8221;<br />
echo &#8220;Lets wait until the process gets completed.&#8221;<br />
sleep ${seconds2} ## sleep 900<br />
seconds2=`mysql -h$TRG -u$USER -p$PWD -e &#8220;show slave status\G&#8221;|egrep Seconds|awk {&#8216;print $2&#8242;}`<br />
PRC=`ps -ef|grep &#8220;mk-table-checksum&#8221;|egrep -v &#8220;grep&#8221;|wc -l`<br />
echo `ps -ef|grep &#8220;mk-table-checksum&#8221;|egrep -v &#8220;grep&#8221;`<br />
done<br />
##verify checksum results on slave<br />
DIFFER=`mysql -t -h$TRG -u$USER -p$PWD -e &#8220;SELECT db, tbl, chunk, this_cnt-master_cnt AS cnt_diff,this_crc &lt;&gt; master_crc OR ISNULL(master_crc) &lt;&gt; ISNULL(this_crc) AS crc_diff FROM test.checksum_results WHERE master_cnt &lt;&gt; this_cnt OR master_crc &lt;&gt; this_crc OR ISNULL(master_crc) &lt;&gt; ISNULL(this_crc)&#8221;|wc -l`<br />
if [ $DIFFER -gt 0 ];then<br />
echo &#8220;data discrepancy found b/w master and slave.&#8221;  &gt;&gt; ${Log}<br />
mysql -t -h$TRG -u$USER -p$PWD -e &#8220;SELECT db, tbl, chunk, this_cnt-master_cnt AS cnt_diff,this_crc &lt;&gt; master_crc OR ISNULL(master_crc) &lt;&gt; ISNULL(this_crc) AS crc_diff FROM test.checksum_results WHERE master_cnt &lt;&gt; this_cnt OR master_crc &lt;&gt; this_crc OR ISNULL(master_crc) &lt;&gt; ISNULL(this_crc)&#8221; &gt;&gt; ${Log}<br />
echo &#8220;  &#8221; &gt;&gt; ${Log}<br />
echo &#8220;Checksum report&#8221; &gt;&gt; ${Log}<br />
mysql -t -h$TRG -u$USER -p$PWD -e &#8220;select * from test.checksum_results&#8221; &gt;&gt; ${Log}<br />
mailx -s &#8220;${Hostname}-Data discrepancy report b/w Master $SRC and slave $TRG.&#8221; ${MailList} &lt; ${Log}</p>
<p>### NEW condition to report errors -Kris ##<br />
else if [ $DIFFER -eq 0 ];then<br />
echo &#8220;Data is consistent and in sync b/w master and slave.&#8221;  &gt;&gt; ${Log}<br />
mysql -t -h$TRG -u$USER -p$PWD -e &#8220;select * from test.checksum_results&#8221; &gt;&gt; ${Log}<br />
mailx -s &#8220;${Hostname}-Data consistency report b/w Master $SRC and slave $TRG.&#8221; ${MailList} &lt; ${Log}<br />
else<br />
echo &#8220;Some issues with the checksum run&#8221; &gt;&gt; ${Log}<br />
echo &#8220;Please check the table test.checksum_results for details&#8221; &gt;&gt; ${Log}<br />
ps -ef |grep &#8220;checksum&#8221; &gt;&gt; ${Log}<br />
echo &#8220;Please invistigate the issues&#8221; &gt;&gt; ${Log}<br />
mailx -s &#8220;${Hostname} &#8211; Error!! found with checksum run.Plz Invistigate&#8221; ${MailList} &lt; ${Log}<br />
fi ##closing the else condition<br />
fi ## closing for checksum report.<br />
else<br />
echo &#8220;The mk-table-checsum is already running&#8221; &gt;&gt;  ${Log}<br />
echo &#8220;(OR)&#8221;  &gt;&gt; ${Log}<br />
echo &#8220;The slave is $TRG lagging behind the master $SRC &#8221; &gt;&gt;  ${Log}<br />
mailx -s &#8220;${Hostname}-Table checksum is already running.&#8221; ${MailList} &lt; ${Log}<br />
exit 2<br />
fi<br />
}</p>
<p>### MAIN PROGRAM STARTS HERE ###<br />
# If no parameters  passed then display script usage message<br />
if [ "$1" = '' ] || [ "$2" = '' ]; then<br />
echo &#8220;Usage: $0 &lt;MasterHost&gt; &lt;SlaveHost&gt;&#8221;<br />
exit 1<br />
fi</p>
<p>mysql_statuschk<br />
#if [ $? -nt 1 ]<br />
if [ $? -eq 0 ]<br />
then<br />
maatkit_chksum<br />
fi</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=66</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Schema Comparision Script</title>
		<link>http://expertdba.com/blog/?p=53</link>
		<comments>http://expertdba.com/blog/?p=53#comments</comments>
		<pubDate>Wed, 02 Sep 2009 11:43:06 +0000</pubDate>
		<dc:creator>Anuj Pandey</dc:creator>
				<category><![CDATA[Oracle Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=53</guid>
		<description><![CDATA[PROMPT Posted by Anuj Kumar Pandey
PROMPT Schema Comparison
PROMPT =================
PROMPT
PROMPT Run this script while connected to one Oracle schema. Enter the Oracle
PROMPT username, password, and SQL*Net / Net8 service name of a second schema.
PROMPT This script will compare the two schemas and generate a report of
PROMPT differences.
PROMPT
PROMPT A temporary database link and table will be created [...]]]></description>
			<content:encoded><![CDATA[<p>PROMPT Posted by Anuj Kumar Pandey<br />
PROMPT Schema Comparison<br />
PROMPT =================<br />
PROMPT<br />
PROMPT Run this script while connected to one Oracle schema. Enter the Oracle<br />
PROMPT username, password, and SQL*Net / Net8 service name of a second schema.<br />
PROMPT This script will compare the two schemas and generate a report of<br />
PROMPT differences.<br />
PROMPT<br />
PROMPT A temporary database link and table will be created and dropped by<br />
PROMPT this script.<br />
PROMPT</p>
<p>ACCEPT schema CHAR PROMPT &#8220;Enter username for remote schema: &#8221;<br />
ACCEPT passwd CHAR PROMPT &#8220;Enter password for remote schema: &#8221; HIDE<br />
ACCEPT tnssvc CHAR PROMPT &#8220;Enter SQL*Net / Net8 service for remote schema: &#8221;<br />
ACCEPT dblinkname CHAR PROMPT &#8220;Enter the dblink name to be created: &#8221;<br />
ACCEPT rem_schema CHAR PROMPT &#8220;Enter the dblink name: &#8221;</p>
<p>PROMPT</p>
<p>ACCEPT report CHAR PROMPT &#8220;Enter filename for report output: &#8221;</p>
<p>SET FEEDBACK OFF<br />
SET VERIFY   OFF</p>
<p>CREATE DATABASE LINK &amp;dblinkname CONNECT TO &amp;schema IDENTIFIED BY &amp;passwd USING &#8216;&amp;tnssvc&#8217;;</p>
<p>SET TRIMSPOOL ON</p>
<p>SPOOL &amp;report</p>
<p>SELECT SUBSTR (RPAD (TO_CHAR (SYSDATE, &#8216;mm/dd/yyyy hh24:mi:ss&#8217;), 25), 1, 25)<br />
       &#8220;REPORT DATE AND TIME&#8221;<br />
FROM   SYS.dual;</p>
<p>COL local_schema  FORMAT a35 TRUNC HEADING &#8220;LOCAL SCHEMA&#8221;<br />
COL remote_schema FORMAT a35 TRUNC HEADING &#8220;REMOTE SCHEMA&#8221;</p>
<p>SELECT USER || <a href="mailto:'@'">&#8216;@&#8217;</a> || C.global_name local_schema,<br />
       A.username || <a href="mailto:'@'">&#8216;@&#8217;</a> || B.global_name remote_schema<br />
FROM   <a href="mailto:user_users@&amp;rem_schema">user_users@&amp;rem_schema</a> A, <a href="mailto:global_name@&amp;rem_schema">global_name@&amp;rem_schema</a> B, global_name C<br />
WHERE  ROWNUM = 1;</p>
<p>SET PAGESIZE  9999<br />
SET LINESIZE  250<br />
SET FEEDBACK  1</p>
<p>SET TERMOUT OFF</p>
<p>PROMPT</p>
<p>REM Object differences<br />
REM ==================</p>
<p>COL object_name FORMAT a30</p>
<p>PROMPT SUMMARY OF OBJECTS MISSING FROM LOCAL SCHEMA</p>
<p>SELECT   object_type, COUNT (*)<br />
FROM<br />
(<br />
SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name)<br />
FROM     <a href="mailto:user_objects@&amp;rem_schema">user_objects@&amp;rem_schema</a><br />
MINUS<br />
SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name)<br />
FROM     user_objects<br />
)<br />
GROUP BY object_type<br />
ORDER BY object_type;</p>
<p>PROMPT SUMMARY OF EXTRANEOUS OBJECTS IN LOCAL SCHEMA</p>
<p>SELECT   object_type, COUNT (*)<br />
FROM<br />
(<br />
SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name)<br />
FROM     user_objects<br />
WHERE    object_type != &#8216;DATABASE LINK&#8217;<br />
OR       object_name NOT LIKE &#8216;&amp;rem_schema.%&#8217;<br />
MINUS<br />
SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name)<br />
FROM     <a href="mailto:user_objects@&amp;rem_schema">user_objects@&amp;rem_schema</a><br />
)<br />
GROUP BY object_type<br />
ORDER BY object_type;</p>
<p>PROMPT OBJECTS MISSING FROM LOCAL SCHEMA</p>
<p>SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name) object_name<br />
FROM     <a href="mailto:user_objects@&amp;rem_schema">user_objects@&amp;rem_schema</a><br />
MINUS<br />
SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name) object_name<br />
FROM     user_objects<br />
ORDER BY object_type, object_name;</p>
<p>PROMPT EXTRANEOUS OBJECTS IN LOCAL SCHEMA</p>
<p>SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name) object_name<br />
FROM     user_objects<br />
WHERE    object_type != &#8216;DATABASE LINK&#8217;<br />
OR       object_name NOT LIKE &#8216;&amp;rem_schema.%&#8217;<br />
MINUS<br />
SELECT   object_type,<br />
         DECODE (object_type,<br />
                 &#8216;INDEX&#8217;, DECODE (SUBSTR (object_name, 1, 5),<br />
                                  &#8216;SYS_C&#8217;, &#8216;SYS_C&#8217;, object_name),<br />
                 &#8216;LOB&#8217;,   DECODE (SUBSTR (object_name, 1, 7),<br />
                                  &#8216;SYS_LOB&#8217;, &#8216;SYS_LOB&#8217;, object_name),<br />
                 object_name) object_name<br />
FROM     <a href="mailto:user_objects@&amp;rem_schema">user_objects@&amp;rem_schema</a><br />
ORDER BY object_type, object_name;</p>
<p>PROMPT OBJECTS IN LOCAL SCHEMA THAT ARE NOT VALID</p>
<p>SELECT   object_name, object_type, status<br />
FROM     user_objects<br />
WHERE    status != &#8216;VALID&#8217;<br />
ORDER BY object_name, object_type;</p>
<p>REM Table differences<br />
REM =================</p>
<p>PROMPT TABLE COLUMNS MISSING FROM ONE SCHEMA<br />
PROMPT (NOTE THAT THIS REPORT DOES NOT LIST DISCREPENCIES IN COLUMN ORDER)</p>
<p>(<br />
SELECT   table_name, column_name, &#8216;Local&#8217; &#8220;MISSING IN SCHEMA&#8221;<br />
FROM     <a href="mailto:user_tab_columns@&amp;rem_schema">user_tab_columns@&amp;rem_schema</a><br />
WHERE    table_name IN<br />
         (<br />
         SELECT table_name<br />
         FROM   user_tables<br />
         )<br />
MINUS<br />
SELECT   table_name, column_name, &#8216;Local&#8217; &#8220;MISSING IN SCHEMA&#8221;<br />
FROM     user_tab_columns<br />
)<br />
UNION ALL<br />
(<br />
SELECT   table_name, column_name, &#8216;Remote&#8217; &#8220;MISSING IN SCHEMA&#8221;<br />
FROM     user_tab_columns<br />
WHERE    table_name IN<br />
         (<br />
         SELECT table_name<br />
         FROM   <a href="mailto:user_tables@&amp;rem_schema">user_tables@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   table_name, column_name, &#8216;Remote&#8217; &#8220;MISSING IN SCHEMA&#8221;<br />
FROM     <a href="mailto:user_tab_columns@&amp;rem_schema">user_tab_columns@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2;</p>
<p>COL schema         FORMAT a15<br />
COL nullable       FORMAT a8<br />
COL data_type      FORMAT a9<br />
COL data_length    FORMAT 9999 HEADING LENGTH<br />
COL data_precision FORMAT 9999 HEADING PRECISION<br />
COL data_scale     FORMAT 9999 HEADING SCALE<br />
COL default_length FORMAT 9999 HEADING LENGTH_OF_DEFAULT_VALUE</p>
<p>PROMPT DATATYPE DISCREPENCIES FOR TABLE COLUMNS THAT EXIST IN BOTH SCHEMAS</p>
<p>(<br />
SELECT   table_name, column_name, &#8216;Remote&#8217; schema,<br />
         nullable, data_type, data_length, data_precision, data_scale,<br />
         default_length<br />
FROM     <a href="mailto:user_tab_columns@&amp;rem_schema">user_tab_columns@&amp;rem_schema</a><br />
WHERE    (table_name, column_name) IN<br />
         (<br />
         SELECT table_name, column_name<br />
         FROM   user_tab_columns<br />
         )<br />
MINUS<br />
SELECT   table_name, column_name, &#8216;Remote&#8217; schema,<br />
         nullable, data_type, data_length, data_precision, data_scale,<br />
         default_length<br />
FROM     user_tab_columns<br />
)<br />
UNION ALL<br />
(<br />
SELECT   table_name, column_name, &#8216;Local&#8217; schema,<br />
         nullable, data_type, data_length, data_precision, data_scale,<br />
         default_length<br />
FROM     user_tab_columns<br />
WHERE    (table_name, column_name) IN<br />
         (<br />
         SELECT table_name, column_name<br />
         FROM   <a href="mailto:user_tab_columns@&amp;rem_schema">user_tab_columns@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   table_name, column_name, &#8216;Local&#8217; schema,<br />
         nullable, data_type, data_length, data_precision, data_scale,<br />
         default_length<br />
FROM     <a href="mailto:user_tab_columns@&amp;rem_schema">user_tab_columns@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2, 3;</p>
<p>REM Index differences<br />
REM =================</p>
<p>COL column_position FORMAT 999  HEADING ORDER</p>
<p>PROMPT INDEX DISCREPENCIES FOR INDEXES THAT EXIST IN BOTH SCHEMAS</p>
<p>(<br />
SELECT   A.index_name, &#8216;Remote&#8217; schema, A.uniqueness, A.table_name,<br />
         B.column_name, B.column_position<br />
FROM     <a href="mailto:user_indexes@&amp;rem_schema">user_indexes@&amp;rem_schema</a> A, <a href="mailto:user_ind_columns@&amp;rem_schema">user_ind_columns@&amp;rem_schema</a> B<br />
WHERE    A.index_name IN<br />
         (<br />
         SELECT index_name<br />
         FROM   user_indexes<br />
         )<br />
AND      B.index_name = A.index_name<br />
AND      B.table_name = A.table_name<br />
MINUS<br />
SELECT   A.index_name, &#8216;Remote&#8217; schema, A.uniqueness, A.table_name,<br />
         B.column_name, B.column_position<br />
FROM     user_indexes A, user_ind_columns B<br />
WHERE    B.index_name = A.index_name<br />
AND      B.table_name = A.table_name<br />
)<br />
UNION ALL<br />
(<br />
SELECT   A.index_name, &#8216;Local&#8217; schema, A.uniqueness, A.table_name,<br />
         B.column_name, B.column_position<br />
FROM     user_indexes A, user_ind_columns B<br />
WHERE    A.index_name IN<br />
         (<br />
         SELECT index_name<br />
         FROM   <a href="mailto:user_indexes@&amp;rem_schema">user_indexes@&amp;rem_schema</a><br />
         )<br />
AND      B.index_name = A.index_name<br />
AND      B.table_name = A.table_name<br />
MINUS<br />
SELECT   A.index_name, &#8216;Local&#8217; schema, A.uniqueness, A.table_name,<br />
         B.column_name, B.column_position<br />
FROM     <a href="mailto:user_indexes@&amp;rem_schema">user_indexes@&amp;rem_schema</a> A, <a href="mailto:user_ind_columns@&amp;rem_schema">user_ind_columns@&amp;rem_schema</a> B<br />
WHERE    B.index_name = A.index_name<br />
AND      B.table_name = A.table_name<br />
)<br />
ORDER BY 1, 2, 6;</p>
<p>REM Constraint differences<br />
REM ======================</p>
<p>PROMPT CONSTRAINT DISCREPENCIES FOR TABLES THAT EXIST IN BOTH SCHEMAS</p>
<p>SET FEEDBACK OFF</p>
<p>CREATE TABLE temp_schema_compare<br />
(<br />
database     NUMBER(1),<br />
object_name  VARCHAR2(30),<br />
object_text  VARCHAR2(2000),<br />
hash_value   NUMBER<br />
);</p>
<p>DECLARE<br />
  CURSOR c1 IS<br />
    SELECT constraint_name, search_condition<br />
    FROM   user_constraints<br />
    WHERE  search_condition IS NOT NULL;<br />
  CURSOR c2 IS<br />
    SELECT constraint_name, search_condition<br />
    FROM   <a href="mailto:user_constraints@&amp;rem_schema">user_constraints@&amp;rem_schema</a><br />
    WHERE  search_condition IS NOT NULL;<br />
  v_constraint_name  VARCHAR2(30);<br />
  v_search_condition VARCHAR2(32767);<br />
BEGIN<br />
  OPEN c1;<br />
  LOOP<br />
    FETCH c1 INTO v_constraint_name, v_search_condition;<br />
    EXIT WHEN c1%NOTFOUND;<br />
    v_search_condition := SUBSTR (v_search_condition, 1, 2000);<br />
    INSERT INTO temp_schema_compare<br />
    (<br />
    database, object_name, object_text<br />
    )<br />
    VALUES<br />
    (<br />
    1, v_constraint_name, v_search_condition<br />
    );<br />
  END LOOP;<br />
  CLOSE c1;<br />
  OPEN c2;<br />
  LOOP<br />
    FETCH c2 INTO v_constraint_name, v_search_condition;<br />
    EXIT WHEN c2%NOTFOUND;<br />
    v_search_condition := SUBSTR (v_search_condition, 1, 2000);<br />
    INSERT INTO temp_schema_compare<br />
    (<br />
    database, object_name, object_text<br />
    )<br />
    VALUES<br />
    (<br />
    2, v_constraint_name, v_search_condition<br />
    );<br />
  END LOOP;<br />
  CLOSE c2;<br />
  COMMIT;<br />
END;<br />
/</p>
<p>SET FEEDBACK 1</p>
<p>(<br />
SELECT   REPLACE (TRANSLATE (A.constraint_name,&#8217;012345678&#8242;,&#8217;999999999&#8242;),<br />
                  &#8216;9&#8242;, NULL) constraint_name,<br />
         &#8216;Remote&#8217; schema, A.constraint_type, A.table_name,<br />
         A.r_constraint_name, A.delete_rule, A.status, B.object_text<br />
FROM     <a href="mailto:user_constraints@&amp;rem_schema">user_constraints@&amp;rem_schema</a> A, temp_schema_compare B<br />
WHERE    A.table_name IN<br />
         (<br />
         SELECT table_name<br />
         FROM   user_tables<br />
         )<br />
AND      B.database (+) = 2<br />
AND      B.object_name (+) = A.constraint_name<br />
MINUS<br />
SELECT   REPLACE (TRANSLATE (A.constraint_name,&#8217;012345678&#8242;,&#8217;999999999&#8242;),<br />
                  &#8216;9&#8242;, NULL) constraint_name,<br />
         &#8216;Remote&#8217; schema, A.constraint_type, A.table_name,<br />
         A.r_constraint_name, A.delete_rule, A.status, B.object_text<br />
FROM     user_constraints A, temp_schema_compare B<br />
WHERE    B.database (+) = 1<br />
AND      B.object_name (+) = A.constraint_name<br />
)<br />
UNION ALL<br />
(<br />
SELECT   REPLACE (TRANSLATE (A.constraint_name,&#8217;012345678&#8242;,&#8217;999999999&#8242;),<br />
                  &#8216;9&#8242;, NULL) constraint_name,<br />
         &#8216;Local&#8217; schema, A.constraint_type, A.table_name,<br />
         A.r_constraint_name, A.delete_rule, A.status, B.object_text<br />
FROM     user_constraints A, temp_schema_compare B<br />
WHERE    A.table_name IN<br />
         (<br />
         SELECT table_name<br />
         FROM   <a href="mailto:user_tables@&amp;rem_schema">user_tables@&amp;rem_schema</a><br />
         )<br />
AND      B.database (+) = 1<br />
AND      B.object_name (+) = A.constraint_name<br />
MINUS<br />
SELECT   REPLACE (TRANSLATE (A.constraint_name,&#8217;012345678&#8242;,&#8217;999999999&#8242;),<br />
                  &#8216;9&#8242;, NULL) constraint_name,<br />
         &#8216;Local&#8217; schema, A.constraint_type, A.table_name,<br />
         A.r_constraint_name, A.delete_rule, A.status, B.object_text<br />
FROM     <a href="mailto:user_constraints@&amp;rem_schema">user_constraints@&amp;rem_schema</a> A, temp_schema_compare B<br />
WHERE    B.database (+) = 2<br />
AND      B.object_name (+) = A.constraint_name<br />
)<br />
ORDER BY 1, 4, 2;</p>
<p>REM Database link differences<br />
REM =========================</p>
<p>PROMPT DATABASE LINK DISCREPENCIES</p>
<p>COL db_link FORMAT a40</p>
<p>(<br />
SELECT   db_link, &#8216;Remote&#8217; schema, username, host<br />
FROM     <a href="mailto:user_db_links@&amp;rem_schema">user_db_links@&amp;rem_schema</a><br />
MINUS<br />
SELECT   db_link, &#8216;Remote&#8217; schema, username, host<br />
FROM     user_db_links<br />
)<br />
UNION ALL<br />
(<br />
SELECT   db_link, &#8216;Local&#8217; schema, username, host<br />
FROM     user_db_links<br />
WHERE    db_link NOT LIKE &#8216;&amp;rem_schema.%&#8217;<br />
MINUS<br />
SELECT   db_link, &#8216;Local&#8217; schema, username, host<br />
FROM     <a href="mailto:user_db_links@&amp;rem_schema">user_db_links@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2;</p>
<p>REM Sequence differences<br />
REM ====================</p>
<p>PROMPT SEQUENCE DISCREPENCIES</p>
<p>(<br />
SELECT   sequence_name, &#8216;Remote&#8217; schema, min_value, max_value,<br />
         increment_by, cycle_flag, order_flag, cache_size<br />
FROM     <a href="mailto:user_sequences@&amp;rem_schema">user_sequences@&amp;rem_schema</a><br />
MINUS<br />
SELECT   sequence_name, &#8216;Remote&#8217; schema, min_value, max_value,<br />
         increment_by, cycle_flag, order_flag, cache_size<br />
FROM     user_sequences<br />
)<br />
UNION ALL<br />
(<br />
SELECT   sequence_name, &#8216;Local&#8217; schema, min_value, max_value,<br />
         increment_by, cycle_flag, order_flag, cache_size<br />
FROM     user_sequences<br />
MINUS<br />
SELECT   sequence_name, &#8216;Local&#8217; schema, min_value, max_value,<br />
         increment_by, cycle_flag, order_flag, cache_size<br />
FROM     <a href="mailto:user_sequences@&amp;rem_schema">user_sequences@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2;</p>
<p>REM Private synonym differences<br />
REM ===========================</p>
<p>PROMPT PRIVATE SYNONYM DISCREPENCIES</p>
<p>(<br />
SELECT   synonym_name, &#8216;Remote&#8217; schema, table_owner, table_name, db_link<br />
FROM     <a href="mailto:user_synonyms@&amp;rem_schema">user_synonyms@&amp;rem_schema</a><br />
MINUS<br />
SELECT   synonym_name, &#8216;Remote&#8217; schema, table_owner, table_name, db_link<br />
FROM     user_synonyms<br />
)<br />
UNION ALL<br />
(<br />
SELECT   synonym_name, &#8216;Local&#8217; schema, table_owner, table_name, db_link<br />
FROM     user_synonyms<br />
MINUS<br />
SELECT   synonym_name, &#8216;Local&#8217; schema, table_owner, table_name, db_link<br />
FROM     <a href="mailto:user_synonyms@&amp;rem_schema">user_synonyms@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2;</p>
<p>REM PL/SQL differences<br />
REM ==================</p>
<p>PROMPT SOURCE CODE DISCREPENCIES FOR PACKAGES, PROCEDURES, AND FUNCTIONS<br />
PROMPT THAT EXIST IN BOTH SCHEMAS</p>
<p>SELECT   name, type, COUNT (*) discrepencies<br />
FROM<br />
(<br />
(<br />
SELECT   name, type, line, text<br />
FROM     <a href="mailto:user_source@&amp;rem_schema">user_source@&amp;rem_schema</a><br />
WHERE    (name, type) IN<br />
         (<br />
         SELECT object_name, object_type<br />
         FROM   user_objects<br />
         )<br />
MINUS<br />
SELECT   name, type, line, text<br />
FROM     user_source<br />
)<br />
UNION ALL<br />
(<br />
SELECT   name, type, line, text<br />
FROM     user_source<br />
WHERE    (name, type) IN<br />
         (<br />
         SELECT object_name, object_type<br />
         FROM   <a href="mailto:user_objects@&amp;rem_schema">user_objects@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   name, type, line, text<br />
FROM     <a href="mailto:user_source@&amp;rem_schema">user_source@&amp;rem_schema</a><br />
)<br />
)<br />
GROUP BY name, type<br />
ORDER BY name, type;</p>
<p>PROMPT SOURCE CODE DISCREPENCIES FOR PACKAGES, PROCEDURES, AND FUNCTIONS<br />
PROMPT THAT EXIST IN BOTH SCHEMAS (CASE INSENSITIVE COMPARISON)</p>
<p>SELECT   name, type, COUNT (*) discrepencies<br />
FROM<br />
(<br />
(<br />
SELECT   name, type, line, UPPER (text)<br />
FROM     <a href="mailto:user_source@&amp;rem_schema">user_source@&amp;rem_schema</a><br />
WHERE    (name, type) IN<br />
         (<br />
         SELECT object_name, object_type<br />
         FROM   user_objects<br />
         )<br />
MINUS<br />
SELECT   name, type, line, UPPER (text)<br />
FROM     user_source<br />
)<br />
UNION ALL<br />
(<br />
SELECT   name, type, line, UPPER (text)<br />
FROM     user_source<br />
WHERE    (name, type) IN<br />
         (<br />
         SELECT object_name, object_type<br />
         FROM   <a href="mailto:user_objects@&amp;rem_schema">user_objects@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   name, type, line, UPPER (text)<br />
FROM     <a href="mailto:user_source@&amp;rem_schema">user_source@&amp;rem_schema</a><br />
)<br />
)<br />
GROUP BY name, type<br />
ORDER BY name, type;</p>
<p>REM Trigger differences<br />
REM ===================</p>
<p>PROMPT TRIGGER DISCREPENCIES</p>
<p>SET FEEDBACK OFF</p>
<p>TRUNCATE TABLE temp_schema_compare;</p>
<p>DECLARE<br />
  CURSOR c1 IS<br />
    SELECT trigger_name, trigger_body<br />
    FROM   user_triggers;<br />
  CURSOR c2 IS<br />
    SELECT trigger_name, trigger_body<br />
    FROM   <a href="mailto:user_triggers@&amp;rem_schema">user_triggers@&amp;rem_schema</a>;<br />
  v_trigger_name VARCHAR2(30);<br />
  v_trigger_body VARCHAR2(32767);<br />
  v_hash_value   NUMBER;<br />
BEGIN<br />
  OPEN c1;<br />
  LOOP<br />
    FETCH c1 INTO v_trigger_name, v_trigger_body;<br />
    EXIT WHEN c1%NOTFOUND;<br />
    v_trigger_body := REPLACE (v_trigger_body, &#8216; &#8216;, NULL);<br />
    v_trigger_body := REPLACE (v_trigger_body, CHR(9), NULL);<br />
    v_trigger_body := REPLACE (v_trigger_body, CHR(10), NULL);<br />
    v_trigger_body := REPLACE (v_trigger_body, CHR(13), NULL);<br />
    v_trigger_body := UPPER (v_trigger_body);<br />
    v_hash_value := dbms_utility.get_hash_value (v_trigger_body, 1, 65536);<br />
    INSERT INTO temp_schema_compare (database, object_name, hash_value)<br />
    VALUES (1, v_trigger_name, v_hash_value);<br />
  END LOOP;<br />
  CLOSE c1;<br />
  OPEN c2;<br />
  LOOP<br />
    FETCH c2 INTO v_trigger_name, v_trigger_body;<br />
    EXIT WHEN c2%NOTFOUND;<br />
    v_trigger_body := REPLACE (v_trigger_body, &#8216; &#8216;, NULL);<br />
    v_trigger_body := REPLACE (v_trigger_body, CHR(9), NULL);<br />
    v_trigger_body := REPLACE (v_trigger_body, CHR(10), NULL);<br />
    v_trigger_body := REPLACE (v_trigger_body, CHR(13), NULL);<br />
    v_trigger_body := UPPER (v_trigger_body);<br />
    v_hash_value := dbms_utility.get_hash_value (v_trigger_body, 1, 65536);<br />
    INSERT INTO temp_schema_compare (database, object_name, hash_value)<br />
    VALUES (2, v_trigger_name, v_hash_value);<br />
  END LOOP;<br />
  CLOSE c2;<br />
END;<br />
/</p>
<p>SET FEEDBACK 1</p>
<p>(<br />
SELECT   A.trigger_name, &#8216;Local&#8217; schema, A.trigger_type,<br />
         A.triggering_event, A.table_name, SUBSTR (A.referencing_names, 1, 30)<br />
         referencing_names, SUBSTR (A.when_clause, 1, 30) when_clause,<br />
         A.status, B.hash_value<br />
FROM     user_triggers A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.trigger_name<br />
AND      B.database (+) = 1<br />
AND      A.table_name IN<br />
         (<br />
         SELECT table_name<br />
         FROM   <a href="mailto:user_tables@&amp;rem_schema">user_tables@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   A.trigger_name, &#8216;Local&#8217; schema, A.trigger_type,<br />
         A.triggering_event, A.table_name, SUBSTR (A.referencing_names, 1, 30)<br />
         referencing_names, SUBSTR (A.when_clause, 1, 30) when_clause,<br />
         A.status, B.hash_value<br />
FROM     <a href="mailto:user_triggers@&amp;rem_schema">user_triggers@&amp;rem_schema</a> A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.trigger_name<br />
AND      B.database (+) = 2<br />
)<br />
UNION ALL<br />
(<br />
SELECT   A.trigger_name, &#8216;Remote&#8217; schema, A.trigger_type,<br />
         A.triggering_event, A.table_name, SUBSTR (A.referencing_names, 1, 30)<br />
         referencing_names, SUBSTR (A.when_clause, 1, 30) when_clause,<br />
         A.status, B.hash_value<br />
FROM     <a href="mailto:user_triggers@&amp;rem_schema">user_triggers@&amp;rem_schema</a> A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.trigger_name<br />
AND      B.database (+) = 2<br />
AND      A.table_name IN<br />
         (<br />
         SELECT table_name<br />
         FROM   user_tables<br />
         )<br />
MINUS<br />
SELECT   A.trigger_name, &#8216;Remote&#8217; schema, A.trigger_type,<br />
         A.triggering_event, A.table_name, SUBSTR (A.referencing_names, 1, 30)<br />
         referencing_names, SUBSTR (A.when_clause, 1, 30) when_clause,<br />
         A.status, B.hash_value<br />
FROM     user_triggers A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.trigger_name<br />
AND      B.database (+) = 1<br />
)<br />
ORDER BY 1, 2, 5, 3;</p>
<p>REM View differences<br />
REM ================</p>
<p>PROMPT VIEW DISCREPENCIES</p>
<p>SET FEEDBACK OFF</p>
<p>TRUNCATE TABLE temp_schema_compare;</p>
<p>DECLARE<br />
  CURSOR c1 IS<br />
    SELECT view_name, text<br />
    FROM   user_views;<br />
  CURSOR c2 IS<br />
    SELECT view_name, text<br />
    FROM   <a href="mailto:user_views@&amp;rem_schema">user_views@&amp;rem_schema</a>;<br />
  v_view_name    VARCHAR2(30);<br />
  v_text         VARCHAR2(32767);<br />
  v_hash_value   NUMBER;<br />
BEGIN<br />
  OPEN c1;<br />
  LOOP<br />
    FETCH c1 INTO v_view_name, v_text;<br />
    EXIT WHEN c1%NOTFOUND;<br />
    v_text := REPLACE (v_text, &#8216; &#8216;, NULL);<br />
    v_text := REPLACE (v_text, CHR(9), NULL);<br />
    v_text := REPLACE (v_text, CHR(10), NULL);<br />
    v_text := REPLACE (v_text, CHR(13), NULL);<br />
    v_text := UPPER (v_text);<br />
    v_hash_value := dbms_utility.get_hash_value (v_text, 1, 65536);<br />
    INSERT INTO temp_schema_compare (database, object_name, hash_value)<br />
    VALUES (1, v_view_name, v_hash_value);<br />
  END LOOP;<br />
  CLOSE c1;<br />
  OPEN c2;<br />
  LOOP<br />
    FETCH c2 INTO v_view_name, v_text;<br />
    EXIT WHEN c2%NOTFOUND;<br />
    v_text := REPLACE (v_text, &#8216; &#8216;, NULL);<br />
    v_text := REPLACE (v_text, CHR(9), NULL);<br />
    v_text := REPLACE (v_text, CHR(10), NULL);<br />
    v_text := REPLACE (v_text, CHR(13), NULL);<br />
    v_text := UPPER (v_text);<br />
    v_hash_value := dbms_utility.get_hash_value (v_text, 1, 65536);<br />
    INSERT INTO temp_schema_compare (database, object_name, hash_value)<br />
    VALUES (2, v_view_name, v_hash_value);<br />
  END LOOP;<br />
  CLOSE c2;<br />
END;<br />
/</p>
<p>SET FEEDBACK 1</p>
<p>(<br />
SELECT   A.view_name, &#8216;Local&#8217; schema, B.hash_value<br />
FROM     user_views A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.view_name<br />
AND      B.database (+) = 1<br />
AND      A.view_name IN<br />
         (<br />
         SELECT view_name<br />
         FROM   <a href="mailto:user_views@&amp;rem_schema">user_views@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   A.view_name, &#8216;Local&#8217; schema, B.hash_value<br />
FROM     <a href="mailto:user_views@&amp;rem_schema">user_views@&amp;rem_schema</a> A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.view_name<br />
AND      B.database (+) = 2<br />
)<br />
UNION ALL<br />
(<br />
SELECT   A.view_name, &#8216;Remote&#8217; schema, B.hash_value<br />
FROM     <a href="mailto:user_views@&amp;rem_schema">user_views@&amp;rem_schema</a> A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.view_name<br />
AND      B.database (+) = 2<br />
AND      A.view_name IN<br />
         (<br />
         SELECT view_name<br />
         FROM   user_views<br />
         )<br />
MINUS<br />
SELECT   A.view_name, &#8216;Remote&#8217; schema, B.hash_value<br />
FROM     user_views A, temp_schema_compare B<br />
WHERE    B.object_name (+) = A.view_name<br />
AND      B.database (+) = 1<br />
)<br />
ORDER BY 1, 2;</p>
<p>REM Job queue differences<br />
REM =====================</p>
<p>COL what     FORMAT a30<br />
COL interval FORMAT a30</p>
<p>PROMPT JOB QUEUE DISCREPENCIES</p>
<p>(<br />
SELECT   what, interval, &#8216;Remote&#8217; schema<br />
FROM     <a href="mailto:user_jobs@&amp;rem_schema">user_jobs@&amp;rem_schema</a><br />
MINUS<br />
SELECT   what, interval, &#8216;Remote&#8217; schema<br />
FROM     user_jobs<br />
)<br />
UNION ALL<br />
(<br />
SELECT   what, interval, &#8216;Local&#8217; schema<br />
FROM     user_jobs<br />
MINUS<br />
SELECT   what, interval, &#8216;Local&#8217; schema<br />
FROM     <a href="mailto:user_jobs@&amp;rem_schema">user_jobs@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2, 3;</p>
<p>REM Privilege differences<br />
REM =====================</p>
<p>PROMPT OBJECT-LEVEL GRANT DISCREPENCIES</p>
<p>(<br />
SELECT   owner, table_name, &#8216;Remote&#8217; schema, grantee, privilege, grantable<br />
FROM     <a href="mailto:user_tab_privs@&amp;rem_schema">user_tab_privs@&amp;rem_schema</a><br />
WHERE    (owner, table_name) IN<br />
         (<br />
         SELECT owner, object_name<br />
         FROM   all_objects<br />
         )<br />
MINUS<br />
SELECT   owner, table_name, &#8216;Remote&#8217; schema, grantee, privilege, grantable<br />
FROM     user_tab_privs<br />
)<br />
UNION ALL<br />
(<br />
SELECT   owner, table_name, &#8216;Local&#8217; schema, grantee, privilege, grantable<br />
FROM     user_tab_privs<br />
WHERE    (owner, table_name) IN<br />
         (<br />
         SELECT owner, object_name<br />
         FROM   <a href="mailto:all_objects@&amp;rem_schema">all_objects@&amp;rem_schema</a><br />
         )<br />
MINUS<br />
SELECT   owner, table_name, &#8216;Local&#8217; schema, grantee, privilege, grantable<br />
FROM     <a href="mailto:user_tab_privs@&amp;rem_schema">user_tab_privs@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2, 3;</p>
<p>PROMPT SYSTEM PRIVILEGE DISCREPENCIES</p>
<p>(<br />
SELECT   privilege, &#8216;Remote&#8217; schema, admin_option<br />
FROM     <a href="mailto:user_sys_privs@&amp;rem_schema">user_sys_privs@&amp;rem_schema</a><br />
MINUS<br />
SELECT   privilege, &#8216;Remote&#8217; schema, admin_option<br />
FROM     user_sys_privs<br />
)<br />
UNION ALL<br />
(<br />
SELECT   privilege, &#8216;Local&#8217; schema, admin_option<br />
FROM     user_sys_privs<br />
MINUS<br />
SELECT   privilege, &#8216;Local&#8217; schema, admin_option<br />
FROM     <a href="mailto:user_sys_privs@&amp;rem_schema">user_sys_privs@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2;</p>
<p>PROMPT ROLE PRIVILEGE DISCREPENCIES</p>
<p>(<br />
SELECT   granted_role, &#8216;Remote&#8217; schema, admin_option, default_role, os_granted<br />
FROM     <a href="mailto:user_role_privs@&amp;rem_schema">user_role_privs@&amp;rem_schema</a><br />
MINUS<br />
SELECT   granted_role, &#8216;Remote&#8217; schema, admin_option, default_role, os_granted<br />
FROM     user_role_privs<br />
)<br />
UNION ALL<br />
(<br />
SELECT   granted_role, &#8216;Local&#8217; schema, admin_option, default_role, os_granted<br />
FROM     user_role_privs<br />
MINUS<br />
SELECT   granted_role, &#8216;Local&#8217; schema, admin_option, default_role, os_granted<br />
FROM     <a href="mailto:user_role_privs@&amp;rem_schema">user_role_privs@&amp;rem_schema</a><br />
)<br />
ORDER BY 1, 2;</p>
<p>SPOOL OFF</p>
<p>SET TERMOUT ON</p>
<p>PROMPT<br />
PROMPT Report output written to &amp;report</p>
<p>SET FEEDBACK OFF</p>
<p>DROP TABLE temp_schema_compare;<br />
DROP DATABASE LINK &amp;rem_schema;</p>
<p>SET FEEDBACK 6<br />
SET PAGESIZE 20<br />
SET LINESIZE 80</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=53</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tablespace free space check</title>
		<link>http://expertdba.com/blog/?p=51</link>
		<comments>http://expertdba.com/blog/?p=51#comments</comments>
		<pubDate>Mon, 31 Aug 2009 10:04:04 +0000</pubDate>
		<dc:creator>Anuj Pandey</dc:creator>
				<category><![CDATA[Oracle Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=51</guid>
		<description><![CDATA[Select substr(b.tablespace_name,1,20) TableSpace, Total_Max_MB, NVL(Total_Used_MB,0) Total_Used_MB,
       ROUND((Total_Max_MB &#8211; NVL(Total_Used_MB,0)),0) &#8220;Free_MB&#8221;,
       ROUND((Total_Max_MB &#8211; NVL(Total_Used_MB,0))/1024,2) &#8220;Free_GB&#8221;,
       ROUND((Total_Max_MB &#8211; NVL(Total_Used_MB,0))/Total_Max_MB * 100,2) &#8220;Free%&#8221;
from (select tablespace_name, round(sum(bytes/1024/1024),2) Total_Used_MB
      from dba_segments
      group [...]]]></description>
			<content:encoded><![CDATA[<p>Select substr(b.tablespace_name,1,20) TableSpace, Total_Max_MB, NVL(Total_Used_MB,0) Total_Used_MB,<br />
       ROUND((Total_Max_MB &#8211; NVL(Total_Used_MB,0)),0) &#8220;Free_MB&#8221;,<br />
       ROUND((Total_Max_MB &#8211; NVL(Total_Used_MB,0))/1024,2) &#8220;Free_GB&#8221;,<br />
       ROUND((Total_Max_MB &#8211; NVL(Total_Used_MB,0))/Total_Max_MB * 100,2) &#8220;Free%&#8221;<br />
from (select tablespace_name, round(sum(bytes/1024/1024),2) Total_Used_MB<br />
      from dba_segments<br />
      group by tablespace_name) a,<br />
     (select tablespace_name,<br />
             round(sum(decode(maxbytes,0,bytes/1024/1024,maxbytes/1024/1024)),0) Total_Max_MB,<br />
             round(sum(user_bytes/1024/1024),0) Total_User_MB<br />
      from dba_data_files<br />
      group by tablespace_name) b<br />
where b.tablespace_name = a.tablespace_name (+)<br />
  and ROUND((Total_Max_MB &#8211; Total_Used_MB)/Total_Max_MB * 100,2) &lt;=100<br />
order by &#8220;Free%&#8221; desc;</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=51</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buffers used by objects</title>
		<link>http://expertdba.com/blog/?p=48</link>
		<comments>http://expertdba.com/blog/?p=48#comments</comments>
		<pubDate>Mon, 31 Aug 2009 10:01:03 +0000</pubDate>
		<dc:creator>Anuj Pandey</dc:creator>
				<category><![CDATA[Oracle Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=48</guid>
		<description><![CDATA[TTITLE &#8220;Total buffers used by individual objects.&#8221;
COL OWNER FOR A8
COL OBJECT_NAME FOR A30
COL OBJECT_TYPE FOR A10
select obj.owner &#8220;OWNER&#8221;, obj.object_name &#8220;OBJECT_NAME&#8221;,
       obj.object_type &#8220;OBJECT_TYPE&#8221;, COUNT(distinct bh.block#) &#8220;# Buffers&#8221;
from dba_objects obj, v$bh bh
where obj.object_id = bh.objd and
      obj.owner != &#8216;SYS&#8217;
group by obj.owner, obj.object_name, obj.object_type
having COUNT(distinct bh.block#) >= [...]]]></description>
			<content:encoded><![CDATA[<p>TTITLE &#8220;Total buffers used by individual objects.&#8221;<br />
COL OWNER FOR A8<br />
COL OBJECT_NAME FOR A30<br />
COL OBJECT_TYPE FOR A10<br />
select obj.owner &#8220;OWNER&#8221;, obj.object_name &#8220;OBJECT_NAME&#8221;,<br />
       obj.object_type &#8220;OBJECT_TYPE&#8221;, COUNT(distinct bh.block#) &#8220;# Buffers&#8221;<br />
from dba_objects obj, v$bh bh<br />
where obj.object_id = bh.objd and<br />
      obj.owner != &#8216;SYS&#8217;<br />
group by obj.owner, obj.object_name, obj.object_type<br />
having COUNT(distinct bh.block#) >= 2<br />
order by 4;</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=48</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to check datafile space utilization</title>
		<link>http://expertdba.com/blog/?p=40</link>
		<comments>http://expertdba.com/blog/?p=40#comments</comments>
		<pubDate>Tue, 28 Jul 2009 07:08:36 +0000</pubDate>
		<dc:creator>Anuj Pandey</dc:creator>
				<category><![CDATA[Oracle Scripts & Commands]]></category>

		<guid isPermaLink="false">http://expertdba.com/blog/?p=40</guid>
		<description><![CDATA[1)
set linesize 200
SELECT SUBSTR (df.NAME, 1, 65) file_name, df.bytes / 1024 / 1024 allocated_mb,
((df.bytes / 1024 / 1024) &#8211; NVL (SUM (dfs.bytes) / 1024 / 1024, 0))
used_mb,
NVL (SUM (dfs.bytes) / 1024 / 1024, 0) free_space_mb
FROM v$datafile df, dba_free_space dfs
WHERE df.file# = dfs.file_id(+)
GROUP BY dfs.file_id, df.NAME, df.file#, df.bytes
ORDER BY file_name;
2)
select d.tablespace_name, d.file_id, d.file_name, d.bytes allocated, nvl(f.bytes,0) [...]]]></description>
			<content:encoded><![CDATA[<p>1)</p>
<p>set linesize 200<br />
SELECT SUBSTR (df.NAME, 1, 65) file_name, df.bytes / 1024 / 1024 allocated_mb,<br />
((df.bytes / 1024 / 1024) &#8211; NVL (SUM (dfs.bytes) / 1024 / 1024, 0))<br />
used_mb,<br />
NVL (SUM (dfs.bytes) / 1024 / 1024, 0) free_space_mb<br />
FROM v$datafile df, dba_free_space dfs<br />
WHERE df.file# = dfs.file_id(+)<br />
GROUP BY dfs.file_id, df.NAME, df.file#, df.bytes<br />
ORDER BY file_name;</p>
<p>2)</p>
<p>select d.tablespace_name, d.file_id, d.file_name, d.bytes allocated, nvl(f.bytes,0) free<br />
from (select tablespace_name, file_id, file_name, sum(bytes) bytes from dba_data_files<br />
group by tablespace_name, file_id, file_name) d,<br />
(select tablespace_name, file_id, sum(bytes) bytes from dba_free_space<br />
group by tablespace_name, file_id) f<br />
where d.tablespace_name in (&#8216;SYSTEM&#8217;,'SYSAUX&#8217;)<br />
and d.tablespace_name = f.tablespace_name(+)<br />
and d.file_id = f.file_id(+)<br />
order by tablespace_name, file_id;</p>
]]></content:encoded>
			<wfw:commentRss>http://expertdba.com/blog/?feed=rss2&amp;p=40</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
