Diff for /doc/build/Attic/loncapasqldatabase.html between versions 1.4 and 1.5

version 1.4, 2001/02/10 18:38:37 version 1.5, 2001/02/12 17:32:15
Line 8 Line 8
 Scott Harrison  Scott Harrison
 </P>  </P>
 <P>  <P>
 Last updated: 02/10/2001  Last updated: 02/12/2001
 </P>  </P>
 <P>  <P>
 This file describes issues associated with LON-CAPA  This file describes issues associated with LON-CAPA
 and a SQL database.  and a SQL database.
 </P>  </P>
 <H3>Latest HOWTO</H3>  <H2>Latest HOWTO</H2>
 <P>  <P>
 <UL>  <UL>
 <LI>Current status of documentation</LI>  <LI>Current status of documentation</LI>
Line 28  and a SQL database. Line 28  and a SQL database.
 <LI>Example sections of code relevant to LON-CAPA</LI>  <LI>Example sections of code relevant to LON-CAPA</LI>
 </UL>  </UL>
 </P>  </P>
 <H3>Current status of documentation</H3>  <H2>Current status of documentation</H2>
 <P>  <P>
 I am going to begin documentation by inserting what notes  I am going to begin documentation by inserting what notes
 I have into this file.  I will be subsequently rearranging  I have into this file.  I will be subsequently rearranging
Line 39  current status of everything is that it Line 39  current status of everything is that it
 been minimally tested, but things need to be cleaned up  been minimally tested, but things need to be cleaned up
 and checked again!  and checked again!
 </P>  </P>
 <H3>Current status of implementation</H3>  <H2>Current status of implementation</H2>
 <P>  <P>
 Right now, a lot of "feasibility" work has been done.  Right now, a lot of "feasibility" work has been done.
 Recipes for manual installation and configuration have  Recipes for manual installation and configuration have
Line 70  to the point of getting this SQL softwar Line 70  to the point of getting this SQL softwar
 however there may be more optimal approaches than currently  however there may be more optimal approaches than currently
 exist.  exist.
 </P>  </P>
 <H3>Purpose within LON-CAPA</H3>  <H2>Purpose within LON-CAPA</H2>
 <P>  <P>
 LON-CAPA is meant to distribute A LOT of educational content  LON-CAPA is meant to distribute A LOT of educational content
 to A LOT of people.  It is ineffective to directly rely on contents  to A LOT of people.  It is ineffective to directly rely on contents
Line 131  THE SOLUTION: Line 131  THE SOLUTION:
   processes (lonsql's) handle the MySQL database manipulations.    processes (lonsql's) handle the MySQL database manipulations.
 </PRE>  </PRE>
 </P>  </P>
 <H3>Installation</H3>  <H2>Installation</H2>
 <P>  <P>
 Installation of the LON-CAPA SQL database normally occurs  Installation of the LON-CAPA SQL database normally occurs
 by default when using the LON-CAPA installation CD  by default when using the LON-CAPA installation CD
Line 160  from source or pre-compiled file listing Line 160  from source or pre-compiled file listing
 actual MySQL functionality on the system</TD></TR>  actual MySQL functionality on the system</TD></TR>
 </TABLE>  </TABLE>
 </P>  </P>
 <H3>Installation from source</H3>  <H2>Installation from source</H2>
 <P>  <P>
 The following set of tarballs was found to work together  The following set of tarballs was found to work together
 properly on a LON-CAPA RedHat 6.2 system:  properly on a LON-CAPA RedHat 6.2 system:
Line 174  properly on a LON-CAPA RedHat 6.2 system Line 174  properly on a LON-CAPA RedHat 6.2 system
 Installation was simply a matter of following the instructions  Installation was simply a matter of following the instructions
 and typing the several "make" commands for each   and typing the several "make" commands for each 
 </P>  </P>
 <H3>Configuration (automated)</H3>  <H2>Configuration (automated)</H2>
 <P>  <P>
 Not yet developed.  This will be part of an interface  Not yet developed.  This will be part of an interface
 present on LON-CAPA systems that can be launched by  present on LON-CAPA systems that can be launched by
 entering the command <TT>/usr/sbin/loncapaconfig</TT>.  entering the command <TT>/usr/sbin/loncapaconfig</TT>.
 </P>  </P>
 <H3>Manual configuration</H3>  <H2>Manual configuration</H2>
 <P>  <P>
 This is not complete.  This is not complete.
 </P>  </P>
Line 215  FLUSH PRIVILEGES; Line 215  FLUSH PRIVILEGES;
 Copy support-files/mysql.server to the right place on the system  Copy support-files/mysql.server to the right place on the system
 (/etc/rc.d/...).  (/etc/rc.d/...).
 </P>  </P>
 <H3>Testing</H3>  
 <P>  
 Not yet documented or formalized.  
 </P>  
 <H3>Example sections of code relevant to LON-CAPA</H3>  
 <P>  
 </P>  
   
 <H1>Old notes</H1>  
   
 <H3>How to add a user to the SQL database</H3>  
 <P>  
 <PRE>  
 start the mysql daemon as /usr/local/bin/safe_mysqld &  
 Login as root: mysql -u root -p mysql  
 enter the password as newmysql  
 add the user www: grant all priveleges on *.* to www@localhost identified by 'newmysql' with grant option;  
   
 INSERT INTO user (Host, User, Password)  
 VALUES ('localhost','www',password('newmysql'));  
   
 GRANT ALL PRIVILEGES ON *.* TO www@localhost;  
   
 FLUSH PRIVILEGES;  
   
 Here the user www has the right to grant privileges to other users.  
 This can be changed if required with a simple update command on the grant tables  
   
   
 /home/httpd/perl/perlsql/lonsql  
 /usr/local/mysql/fakeclient  
 </PRE>  
 </P>  
 <H3>To do</H3>  
 <P>  
 <PRE>  
 This is the output from scripts/mysql_install_db...  
 still some todo things (like support-files/mysql.server)  
   
 Creating db table  
 Creating host table  
 Creating user table  
 Creating func table  
 Creating tables_priv table  
 Creating columns_priv table  
   
 To start mysqld at boot time you have to copy support-files/mysql.server  
 to the right place for your system  
   
 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !  
 This is done with:  
 /usr/local/bin/mysqladmin -u root password 'new-password'  
 See the manual for more instructions.  
   
 Please report any problems with the /usr/local/bin/mysqlbug script!  
   
 The latest information about MySQL is available on the web at http://www.mysql.com  
 Support MySQL by buying support/licenses at http://www.tcx.se/license.htmy.  
 </PRE>  
 </P>  
 <H3>Source Installation and Manual Configuration</H3>  
 <P>  <P>
   <STRONG>The Perl API</STRONG>
 <PRE>  <PRE>
 August, 29 2000; Scott Harrison; LON-CAPA  
   
 These are notes related to a Perl interface and MySQL server installation  
 on Redhat 6.1 and 6.2 boxes.  (Guy Albertelli and Harsha Jagasia  
 contributed significantly to this.)  
   
 ********************  
 * MySQL COMPONENTS *  
 ********************  
   
 There are three components to an effective MySQL installation for the  
 LON-CAPA system.  
   
 Perl::DBI module- the API "front-end"...  
                   database interface module for organizing generic  
                   database commands which are independent of specific  
                   database implementation (such as MySQL, mSQL, Postgres, etc).  
   
 Perl::MySQL module- the API "mid-section"...  
                     the module to directly interface with the actual  
                     MySQL database engine  
   
 MySQL database engine- the "back-end"...  
                        the binary installation (compiled either from source  
                        or pre-compiled file listings) which provides the  
                        actual MySQL functionality on the system  
   
 RedHat Installation-  
   
 Initially done from source:  
 DBI-1.13.tar.gz  Msql-Mysql-modules-1.2209.tar.gz  mysql-3.22.32.tar.gz  
   
 I am now using pre-compiled file listings.  
   
 There were problems with using the RedHat packages since the three  
 different RedHat packages were somewhat noncompatible with each other  
 in terms of expected file locations. (The Debian linux distribution,  
 on the other hand, has a working set of these packages).  
   
 Regardless of how we install these three components, there still remain  
 certain things which need to happen for the configuration.  
   
 *****************  
 * CONFIGURATION *  
 *****************  
   
 (Note: SOMEPASSWORD is actually set to another text string on the current  
 LON-CAPA systems.)  
   
 Configuration is needed to generate the necessary functionality for the  
 MySQL system with LON-CAPA.  
   
 The functionality needed can be understood from this example line  
 of perl code from "lonsql".  
   
    $dbh = DBI->connect( "DBI:mysql:loncapa",     $dbh = DBI->connect( "DBI:mysql:loncapa",
  "www",   "www",
  "SOMEPASSWORD",   "SOMEPASSWORD",
Line 395  FLUSH PRIVILEGES; Line 280  FLUSH PRIVILEGES;
 ** ABILITY for LON-CAPA machines to communicate with SQL databases on  ** ABILITY for LON-CAPA machines to communicate with SQL databases on
    other LON-CAPA machines     other LON-CAPA machines
   
 This is a little more intricate than might first be expected (and I probably  An up-to-date lond and lonsql.
 won't do a perfect job reciting everything in this short synopsis).  Because  </PRE>
 LON-CAPA machines will likely be handling many SQL requests at a time,  </P>
 there were some problems with current MySQL capabilities.  <H2>Testing</H2>
   <P>
 PROBLEM SITUATION:  <PRE>
   <STRONG>** TEST the database connection with my current tester.pl code
   If Server A wants data from Server B, Server A uses a lonc process to  which mimics what command will eventually be sent through lonc.</STRONG>
   send a database command to a Server B lond process.  
     lonc= loncapa client process    A-lonc= a lonc process on Server A  
     lond= loncapa daemon process  
   
                  database command  
     A-lonc  --------TCP/IP----------------> B-lond  
   
   The problem emerges that A-lonc and B-lond are kept waiting for the  
   MySQL server to "do its stuff", or in other words, perform the conceivably  
   sophisticated, data-intensive, time-sucking database transaction.  By tying  
   up a lonc and lond process, this significantly cripples the capabilities  
   of LON-CAPA servers.   
   
   While commercial databases have a variety of features that ATTEMPT to  
   deal with this, freeware databases are still experimenting and exploring  
   with different schemes with varying degrees of performance stability.  
   
 THE SOLUTION:  
   
   A separate daemon process was created that B-lond works with to  
   handle database requests.  This daemon process is called "lonsql".  
   
   So,  
                 database command  
   A-lonc  ---------TCP/IP-----------------> B-lond =====> B-lonsql  
          <---------------------------------/                |  
            "ok, I'll get back to you..."                    |  
                                                             |  
                                                             /  
   A-lond  <-------------------------------  B-lonc   <======  
            "Guess what? I have the result!"  
   
   Of course, depending on success or failure, the messages may vary,  
   but the principle remains the same where a separate pool of children  
   processes (lonsql's) handle the MySQL database manipulations.  
   
   $reply=reply(
       "querysend:SELECT * FROM general_information WHERE Id='AAAAA'",$lonID);
   </PRE>
   </P>
   <H2>Example sections of code relevant to LON-CAPA</H2>
   <P>
 Here are excerpts of code which implement the above handling:  Here are excerpts of code which implement the above handling:
   </P>
 **LONSQL  <P>
   <PRE>
   <STRONG>**LONSQL
 A subroutine from "lonsql" which establishes a child process for handling  A subroutine from "lonsql" which establishes a child process for handling
 database interactions.  database interactions.</STRONG>
   
 sub make_new_child {  sub make_new_child {
     my $pid;      my $pid;
Line 536  sub make_new_child { Line 393  sub make_new_child {
         exit;          exit;
     }      }
 }  }
   </P>
 ** LOND enabling of MySQL requestsw  <P>
   <STRONG>** LOND enabling of MySQL requests</STRONG>
   This code is part of every lond child process in the way that it parses command request syntax  <BR />
   sent to it from lonc processes.  querysend corresponds to B-lonc sending the result of the query.  This code is part of every lond child process in the
   queryreply corresponds to B-lond indicating that it has received the request and will start the  way that it parses command request syntax sent to it
   database transaction (it returns "ok" to A-lonc ($client)).  from lonc processes.  Based on the diagram above, querysend
   corresponds to B-lonc sending the result of the query.
   queryreply corresponds to B-lond indicating that it has
   received the request and will start the database transaction
   (it returns "ok" to
   A-lonc ($client)).
   <PRE>
 # ------------------------------------------------------------------- querysend  # ------------------------------------------------------------------- querysend
                    } elsif ($userinput =~ /^querysend/) {                     } elsif ($userinput =~ /^querysend/) {
                        my ($cmd,$query)=split(/:/,$userinput);                         my ($cmd,$query)=split(/:/,$userinput);
Line 563  sub make_new_child { Line 425  sub make_new_child {
    print $client "error:$!\n";     print $client "error:$!\n";
        }         }
   
   
   
 ** TEST the database connection with my current tester.pl code which mimics what command will eventually be  
    sent through lonc.  
   
 $reply=reply(  
     "querysend:SELECT * FROM general_information WHERE Id='AAAAA'",$lonID);  
 </PRE>  </PRE>
   
 </P>  </P>
 </BODY>  </BODY>
 </HTML>  </HTML>

Removed from v.1.4  
changed lines
  Added in v.1.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>