Re: Perl script excessively executing statement
[email protected] (Christopher Jones) Fri, 14 Feb 2020 13:03:56 +1100
| Newsgroups | perl.dbi.users |
|---|---|
| Message-ID | <[email protected]> |
On 13/2/20 5:58 pm, JohnD Blackburn wrote: > > The DBA pulled info from some cache that showed the SQL statement from the script was executed 12610 times. > > So if I were to add an “or die $!” statement after the fetchrow_array(), that might fix things? (or prevent it from trying to continue if there are > errors?) > > Or catch errors after the execute statement? > Error checking after each call is a good idea. The prepare() (if my implementation refreshing skills are accurate) maps to an Oracle call that does a lightweight parse to check things like bind variables and quotes. Most errors will come from the execute() - bogus syntax, wrong columns, DB space errors etc. Chris > *From:* Christopher Jones <[email protected]> > *Sent:* Thursday, 13 February 2020 12:56 PM > *To:* [email protected]; JohnD Blackburn <[email protected]> > *Subject:* Re: Perl script excessively executing statement > > *CAUTION:*This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know > the content is safe. > > On 13/2/20 11:13 am, JohnD Blackburn wrote: > > Is that a behavior of DBI or DBD::Oracle? > > Maybe your script, if you are blindly looping when it gets an error? Overall, I don't think there is enough information to point directly at a > cause. Presumably the DBA meant that a SQL statement (of some kind) was e > > xecuted 12610 times; not that your script was invoked that number of times. > > My script says prepare or die, so any retries would have had to come directly from the DBD::Oracle module > > Script basically says: > > use DBD::Oracle; > > my $dbh = DBI->connect("dbi:Oracle:$dbSID", $user, $passwd, {AutoCommit => 0 }); > > my $statement = <<END; > > 20 line select statement > > END > > Somewhere you might want to tune ora_prefetch_rows or RowCacheSize, depending how many rows you expect the query to return. This is unrelated to > your question. > > my $arraySelect = $dbh->prepare($statement) or die $!; > > $arraySelect->execute(); > > while ( my ($var1, $var2, $var3, $var4) = $arraySelect->fetchrow_array() ) { > > <perl code to process row of data which includes a couple of “if next” statement blocks with no reference to arraySelect inside the while loop> > > } > > $arraySelect->finish(); > > $dbh->disconnect(); > > I don’t work much with the DBD::Oracle module or perl and what I have is just reworked from scripts others have written. > > Is there parameters for the DBD::Oracle functions that can affect their behavior? If this is behavior of the execute function, I really need to > be able to reign it in to limit its impact if it ever does it again. Not knowing why the issue triggered in the 1^st place, I don’t know how to > reproduce it to test if any mitigations are sufficient. > > You can set sqlnet.ora parameters to bound the time taken for connection and statement execution. Refer to > https://cx-oracle.readthedocs.io/en/latest/user_guide/ha.html#network-configuration > <https://urldefense.com/v3/__https://eur03.safelinks.protection.outlook.com/?url=https*3A*2F*2Fcx-oracle.readthedocs.io*2Fen*2Flatest*2Fuser_guide*2Fha.html*23network-configuration&data=02*7C01*7Cjohnd.blackburn*40au.abb.com*7C75ee9e961c994c802fe708d7b030497c*7C372ee9e09ce04033a64ac07073a91ecd*7C0*7C0*7C637171593755922211&sdata=wVBUPnUXOnie2z9yYwGPwC4J*2FtiDtMUXl1DXAjKZtyo*3D&reserved=0__;JSUlJSUlJSUlJSUlJSUlJSUl!!GqivPVa7Brio!P9p6l_vepYYnGyu45_vqxFEUnEd_tpXLUZ8DxElcAZGs05cgs-IJxDx4g8H-qje3S1gj1g$> > and https://oracle.github.io/node-oracledb/doc/api.html#connectionha > <https://urldefense.com/v3/__https://eur03.safelinks.protection.outlook.com/?url=https*3A*2F*2Foracle.github.io*2Fnode-oracledb*2Fdoc*2Fapi.html*23connectionha&data=02*7C01*7Cjohnd.blackburn*40au.abb.com*7C75ee9e961c994c802fe708d7b030497c*7C372ee9e09ce04033a64ac07073a91ecd*7C0*7C0*7C637171593755932204&sdata=iZPYDmpjTj*2FPw*2FShQqdiSQIccucpjLqO1chp*2BQq9I4Q*3D&reserved=0__;JSUlJSUlJSUlJSUlJSUlJSUlJQ!!GqivPVa7Brio!P9p6l_vepYYnGyu45_vqxFEUnEd_tpXLUZ8DxElcAZGs05cgs-IJxDx4g8H-qjdP4_-wrg$> > since the sqlnet.ora settings will be the same for DBD::Oracle - the network layer is common across all the C-based drivers. Depending on your > requirements, you may want to sleep between retries. > > Chris > > Cheers, > > John > > *From:* Geoffrey Rommel <[email protected]> <mailto:[email protected]> > *Sent:* Thursday, 13 February 2020 2:56 AM > *To:* JohnD Blackburn <[email protected]> <mailto:[email protected]> > *Cc:* [email protected] <mailto:[email protected]> > *Subject:* Re: Perl script excessively executing statement > > *CAUTION:*This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and > know the content is safe. > > I don't work with Oracle, but here's a guess. Maybe the database was unresponsive before your script started running, not as a result of it. If > so, maybe your script tried to prepare the statement, failed, and retried 12000 times. Eventually the DBA noticed the problem and restarted the > database, at which time your script was terminated along with everything else. > > On Tue, Feb 11, 2020 at 11:56 PM JohnD Blackburn <[email protected] <mailto:[email protected]>> wrote: > > Hi all, > > I have a perl script in my monitoring system that has been working for months without an issue. > > Basically, it connects to an Oracle 12c database, prepares a statement, then it executes the statement, then it has a while loop to process > the returned rows. > > So under normal conditions the statement is executed once every 5 minutes. > > Now on Friday last week, it did something really strange which I cannot account for the behaviour. > > According to the DBA, the statement in the script was executed 12610 times over a 50 minute period causing the database to become > non-responsive. The DBAs also stated that the script only connected to the database once at the beginning of the 50 minute period. Average > execution time of the statement was 0.26 seconds. > > According to the log for my script, the script only executed once at the beginning of the 50 minute period, and then after that, returned to > executing every 5 minutes. > > Since that incident, the statememt in question has only executed the expected 12 times per hour. > > I have yet to find a satisfactory reason the SQL statement from this perl script executed so many times in the 50 minute period. > > Script is running on an Oracle Linux 7.7 server with; > > * oracle 12c client installed > * perl 5.16.3 > * perl-DBI 1.627-4 ( from Oracle Linix Latest yum repository) > * perl-DBD-ODBC 1.50.-3 (from EPEL) > * DBD::Oracle 1.80 (from CPAN) > > Oracle 12 database is on a remote server. > > Anyone have any ideas why the SQL statement would have been executed 12000+ times in a 50minute period, when the script and its schedule > should not have executed the SQL any more frequiently than 12 times an hour? > > Regards, > > John > > -- > https://twitter.com/ghrd <https://urldefense.com/v3/__https://eur03.safelinks.protection.outlook.com/?url=https*3A*2F*2Ftwitter.com*2Fghrd&data=02*7C01*7Cjohnd.blackburn*40au.abb.com*7C75ee9e961c994c802fe708d7b030497c*7C372ee9e09ce04033a64ac07073a91ecd*7C0*7C0*7C637171593755932204&sdata=Abyo5RrMO4nqfXYOSiOkqPhP573KSnTL9qqgeXuNYYI*3D&reserved=0__;JSUlJSUlJSUlJSUlJQ!!GqivPVa7Brio!P9p6l_vepYYnGyu45_vqxFEUnEd_tpXLUZ8DxElcAZGs05cgs-IJxDx4g8H-qjexS_7R-A$> -- https://twitter.com/ghrd