On 26/06/2013 20:29, Dan Bent wrote:
I have strace, but don't know how to use it.

Usually something like:

strace -o out.log isql -v mydsn username password

then after it hangs hit ctrl/c and look at (paste here) the last 100 lines of out.log

Martin


On Wed, Jun 26, 2013 at 2:01 PM, Martin J. Evans <boh...@ntlworld.com
<mailto:boh...@ntlworld.com>> wrote:

    On 26/06/2013 19:35, Dan Bent wrote:

        Big thanks!

        I did this:
        ldd
        
/opt/perl_32/lib/site_perl/5.__8.8/PA-RISC1.1-thread-multi/__auto/DBD/ODBC/ODBC.sl

        and got:

           /usr/local/liant/lib/libodbc.__sl.1 =>
          /usr/local/liant/lib/libodbc.__sl.1
                  /usr/lib/libc.2 =>      /usr/lib/libc.2
                  /usr/lib/libdld.2 =>    /usr/lib/libdld.2
                  /usr/lib/libc.2 =>      /usr/lib/libc.2
                  /usr/lib/libpthread.1 =>        /usr/lib/libpthread.1


    hmm - never heard of "liant". It looks like the unixODBC driver
    manager but I've never seen it installed in that location. Also, I
    see you've got isql and that comes with unixODBC. Have you also got
    a binary called odbcinst and if you have output from odbcinst -j
    would be useful.


        I tried isql -v prod1 username password

        and it just hung like other attempts to access the database. No
        error
        messages.


    OK, so we've ruled out a change in Perl and DBI and DBD::ODBC as it
    is still going wrong without them. If this really is unixODBC you
    should have an odbc.ini and odbcinst.ini file probably in
    /usr/local/liant/etc or /usr/local/etc of /etc. What is in those
    files? There may also be a .odbc.ini in the users home dir.

    When we see the contents of those files we'll have a better idea of
    what driver you are using and the shared library used so you can
    check that too to see if it has been updated.

    You could enable unixODBC tracing but it rarely outputs much before
    connection is complete. I think you need to find the equivalent of
    strace on HPUX and run it on the isql command to see what system
    calls are being made.

    Did you say everything is on one box, so networking off that box
    cannot be the issue?

    Martin




        On Wed, Jun 26, 2013 at 12:11 PM, Martin J. Evans
        <boh...@ntlworld.com <mailto:boh...@ntlworld.com>
        <mailto:boh...@ntlworld.com <mailto:boh...@ntlworld.com>>> wrote:

             On 26/06/2013 17:28, Dan Bent wrote:

                 I suddenly lost the ability to connect to my ODBC database
                 yesterday,
                 after years of using the same function to establish a
        connection:

                 sub dbaseconnect {
                       if (defined($testing)) {
                           if ($testing eq "YES") {
                               $dsn =  'dbi:ODBC:test1' ;
                               print "Using test database\n" ;
                           } elsif ($testing eq "TRAIN") {
                               $dsn =  'dbi:ODBC:train1' ;
                               print "Using train1 database\n" ;
                           } else {
                               $dsn =  'dbi:ODBC:prod1' ;
                           }
                       } else {
                           $dsn =  'dbi:ODBC:prod1' ;
                       }
                       $user =  'USER' ;
                       $passwd =  'PASSWORD' ;
                       my %adrivers = DBI->available_drivers();
                       print join(", ", %adrivers), "\n" ;

                       print "connecting to DATABASE $dsn  $user
        $passwd\n" ;
                       $dbh = DBI->connect($dsn, $user, $passwd,
                                   {RaiseError => 1, AutoCommit => 0})
                           or die "Could not connect to database: " .
        DBI->errstr ;
                       print "connected to DATABASE $dsn \n" ;
                 }

                 So, to gather information about where the failure is, I
        ran the
                 following program:

                 #! /usr/bin/perl

                 use DBI ;
                 use DBD::ODBC ;
                 use strict ;
                 use warnings ;

                 print "Available Drivers: " ;
                 my @adrivers = DBI->available_drivers();
                 print join(", ", @adrivers), "\n" ;

                 print "Data Sources: " ;
                 foreach my $driver ( @adrivers ) {
                       print "Driver: $driver\n";
                       my @dataSources = DBI->data_sources( $driver );
                       foreach my $dataSource ( @dataSources ) {
                           print "\tData Source is $dataSource\n";
                       }
                       print "\n";
                 }

                 and the output I got was:

                 Available Drivers: DBM, ExampleP, File, ODBC, Proxy, Sponge
                 Installed Drivers:
                 Data Sources: Driver: DBM
                           Data Source is DBI:DBM:f_dir=.
                           Data Source is DBI:DBM:f_dir=CIGNA
                           Data Source is DBI:DBM:f_dir=Logs
                           Data Source is DBI:DBM:f_dir=ONCOURSE
                           Data Source is DBI:DBM:f_dir=autemp
                           Data Source is DBI:DBM:f_dir=config
                           Data Source is DBI:DBM:f_dir=fh.cob
                           Data Source is DBI:DBM:f_dir=perlscripts
                           Data Source is DBI:DBM:f_dir=pndspndwk
                           Data Source is DBI:DBM:f_dir=prgrun_dir
                           Data Source is DBI:DBM:f_dir=scripts

                 Driver: ExampleP
                           Data Source is dbi:ExampleP:dir=.

                 Driver: File
                           Data Source is DBI:File:f_dir=.
                           Data Source is DBI:File:f_dir=CIGNA
                           Data Source is DBI:File:f_dir=Logs
                           Data Source is DBI:File:f_dir=ONCOURSE
                           Data Source is DBI:File:f_dir=autemp
                           Data Source is DBI:File:f_dir=config
                           Data Source is DBI:File:f_dir=fh.cob
                           Data Source is DBI:File:f_dir=perlscripts
                           Data Source is DBI:File:f_dir=pndspndwk
                           Data Source is DBI:File:f_dir=prgrun_dir
                           Data Source is DBI:File:f_dir=scripts

                 Driver: ODBC

                 and the program just hangs when it looks for data
        sources using
                 the ODBC
                 driver. So, I suspect that there are issues with the ODBC
                 driver. Here
                 are the versions of the various DBI module components:

                    perl -MDBI -e 'DBI->installed_versions'
                     Perl            : 5.008008    (PA-RISC1.1-thread-multi)
                     OS              : hpux        (11.00)
                     DBI             : 1.50
                     DBD::Sponge     : 11.10
                     DBD::Proxy      : install_driver(Proxy) failed:
        Can't locate
                 RPC/PlClient.pm in @INC
                     DBD::ODBC       : 1.14
                     DBD::File       : 0.33
                     DBD::ExampleP   : 11.12
                     DBD::DBM        : 0.03

                 I imagine that I may not have the latest versions of
        everything, and
                 updates are probably in order, but, while updates are
        desirable, I'd
                 like to be sure that I'm addressing the root cause of the
                 problem, so I
                 get it resolved. This issue affects a lot of programs,
        and is
                 critical
                 to our business.
                 Any help or suggestions will be greatly appreciated.


             You are in deed running VERY old versions - especially of
        DBD::ODBC.

             You first need to think about what Jonathan said - he's
        probably
             right that working out what changed yesterday is probably
        going to
             give the quickest result.

             Assuming you cannot find anything here are some suggestions.

             DBD::ODBC is usually linked to an ODBC driver manager but
        back in
             the days of 1.14 people still linked directly to an ODBC driver
             sometimes - ODBC drivers did not support enumerating DSNs -
        only the
             driver manager does that. So first thing is hwo was
        DBD::ODBC built?
             If you don't know that look for ODBC.so in your perl tree
        and run
             the HPUX equivalent of Linux's ldd command on it to find what
             libraries it depends on (right now I cannot remember what the
             command is).

             Once you've done that if the answer is libodbc.so.something
        then you
             are probably using the unixODBC driver manager. In that
        case you
             should hopefully have an isql binary and you should have an
        odbc.ini
             and odbcinst.ini defining your drivers and DSNs. What is in
        those
             files. Can you run:

             isql -v TEST1 username password
             isql -v TRAIN1 username password
             isql -v PROD1 username password

             as you didn't say which one you are using?

             If you get back with this info I'll help more.

             Martin
             --
             Martin J. Evans
             Wetherby, UK







--
Martin J. Evans
Wetherby, UK

Reply via email to