pg_options.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:8k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1.  <Chapter Id="pg-options-dev">
  2.   <DocInfo>
  3.    <AuthorGroup>
  4.     <Author>
  5.      <FirstName>Massimo</FirstName>
  6.      <Surname>Dal Zotto</Surname>
  7.     </Author>
  8.    </AuthorGroup>
  9.    <Date>Transcribed 1998-10-16</Date>
  10.   </DocInfo>
  11.   <Title>pg_options</Title>
  12.   <Para>
  13.    <Note>
  14.     <Para>
  15.      Contributed by <ULink url="mailto:dz@cs.unitn.it">Massimo Dal Zotto</ULink>
  16.     </Para>
  17.    </Note>
  18.   </para>
  19.   <Para>
  20.    The optional file <filename>data/pg_options</filename> contains runtime
  21.    options used by the backend to control trace messages and other backend
  22.    tunable parameters.
  23.    What makes this file interesting is the fact that it is re-read by a backend
  24.    when it receives a SIGHUP signal, making thus possible to change run-time
  25.    options on the fly without needing to restart 
  26.    <productname>Postgres</productname>.
  27.    The options specified in this file may be debugging flags used by the trace
  28.    package (<filename>backend/utils/misc/trace.c</filename>) or numeric
  29.    parameters which can be used by the backend to control its behaviour.
  30.    New options and parameters must be defined in
  31.    <filename>backend/utils/misc/trace.c</filename> and
  32.    <filename>backend/include/utils/trace.h</filename>.
  33.   </para>
  34.   <Para>
  35.    For example suppose we want to add conditional trace messages and a tunable
  36.    numeric parameter to the code in file <filename>foo.c</filename>.
  37.    All we need to do is to add the constant TRACE_FOO and OPT_FOO_PARAM into
  38.    <filename>backend/include/utils/trace.h</filename>:
  39.    <programlisting>
  40. /* file trace.h */
  41. enum pg_option_enum {
  42.     ...
  43.     TRACE_FOO, /* trace foo functions */
  44.     OPT_FOO_PARAM, /* foo tunable parameter */
  45.     NUM_PG_OPTIONS              /* must be the last item of enum */
  46. };
  47.    </programlisting>
  48.    and a corresponding line in <filename>backend/utils/misc/trace.c</filename>:
  49.    <programlisting>
  50. /* file trace.c */
  51. static char *opt_names[] = {
  52.     ...
  53.     "foo",             /* trace foo functions */
  54.     "fooparam"          /* foo tunable parameter */
  55. };
  56.    </programlisting>
  57.    Options in the two files must be specified in exactly the same order.
  58.    In the foo source files we can now reference the new flags with:
  59.    <programlisting>
  60. /* file foo.c */
  61. #include "trace.h"
  62. #define foo_param pg_options[OPT_FOO_PARAM]
  63. int
  64. foo_function(int x, int y)
  65. {
  66.     TPRINTF(TRACE_FOO, "entering foo_function, foo_param=%d", foo_param);
  67.     if (foo_param > 10) {
  68.         do_more_foo(x, y);
  69.     }
  70. }
  71.    </programlisting>
  72.   </para>
  73.   <para>
  74.    Existing files using private trace flags can be changed by simply adding
  75.    the following code:
  76.    <programlisting>
  77. #include "trace.h"
  78. /* int my_own_flag = 0; -- removed */
  79. #define my_own_flag pg_options[OPT_MY_OWN_FLAG]
  80.    </programlisting>
  81.   </para>
  82.   <para>
  83.    All pg_options are initialized to zero at backend startup. If we need a
  84.    different default value we must add some initialization code at the beginning
  85.    of <function>PostgresMain</function>.
  86.    Now we can set the foo_param and enable foo trace by writing values into the
  87.    <filename>data/pg_options</filename> file:
  88.    <programlisting>
  89. # file pg_options
  90. ...
  91. foo=1
  92. fooparam=17
  93.    </programlisting>
  94.   </para>
  95.   <para>
  96.    The new options will be read by all new backends when they are started.
  97.    To make effective the changes for all running backends we need to send a
  98.    SIGHUP to the postmaster. The signal will be automatically sent to all the
  99.    backends. We can also activate the changes only for a specific backend by
  100.    sending the SIGHUP directly to it.
  101.   </para>
  102.   <para>
  103.    pg_options can also be specified with the <option>-T</option> switch of 
  104.    <productname>Postgres</productname>:
  105.    <programlisting>
  106. postgres <replaceable>options</replaceable> -T "verbose=2,query,hostlookup-"
  107.    </programlisting>
  108.   </para>
  109.   <Para>
  110.    The functions used for printing errors and debug messages can now make use
  111.    of the <citetitle>syslog(2)</citetitle> facility. Message printed to stdout
  112.    or stderr are prefixed by a timestamp containing also the backend pid:
  113.    
  114.    <programlisting>
  115. #timestamp          #pid    #message
  116. 980127.17:52:14.173 [29271] StartTransactionCommand
  117. 980127.17:52:14.174 [29271] ProcessUtility: drop table t;
  118. 980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full
  119. 980127.17:52:14.186 [29286] Async_NotifyHandler
  120. 980127.17:52:14.186 [29286] Waking up sleeping backend process
  121. 980127.19:52:14.292 [29286] Async_NotifyFrontEnd
  122. 980127.19:52:14.413 [29286] Async_NotifyFrontEnd done
  123. 980127.19:52:14.466 [29286] Async_NotifyHandler done
  124.    </programlisting>
  125.   </para>
  126.   <para>
  127.    This format improves readability of the logs and allows people to understand
  128.    exactly which backend is doing what and at which time. It also makes
  129.    easier to write simple awk or perl scripts which monitor the log to
  130.    detect database errors or problem, or to compute transaction time statistics.
  131.   </para>
  132.   <para>
  133.    Messages printed to syslog use the log facility LOG_LOCAL0.
  134.    The use of syslog can be controlled with the syslog pg_option.
  135.    Unfortunately many functions call directly <function>printf()</function>
  136.    to print their messages to stdout or stderr and this output can't be
  137.    redirected to syslog or have timestamps in it. 
  138.    It would be advisable that all calls to printf would be replaced with the
  139.    PRINTF macro and output to stderr be changed to use EPRINTF instead so that
  140.    we can control all output in a uniform way.
  141.   </Para>
  142.   <Para>
  143.    The new pg_options mechanism is more convenient than defining new backend
  144.    option switches because:
  145.    <ItemizedList Mark="bullet" Spacing="compact">
  146.     <ListItem>
  147.      <Para>
  148.       we don't have to define a different switch for each thing we want to control.
  149.       All options are defined as keywords in an external file stored in the data
  150.       directory.
  151.      </Para>
  152.     </ListItem>
  153.     <ListItem>
  154.      <Para>
  155.       we don't have to restart <productname>Postgres</productname> to change
  156.       the setting of some option.
  157.       Normally backend options are specified to the postmaster and passed to each
  158.       backend when it is started. Now they are read from a file.
  159.      </Para>
  160.     </ListItem>
  161.     <ListItem>
  162.      <Para>
  163.       we can change options on the fly while a backend is running. We can thus
  164.       investigate some problem by activating debug messages only when the problem
  165.       appears. We can also try different values for tunable parameters.
  166.      </Para>
  167.     </ListItem>
  168.    </ItemizedList>
  169.    The format of the <filename>pg_options</filename> file is as follows:
  170.    <programlisting>
  171. # <replaceable>comment</replaceable>
  172. <replaceable>option</replaceable>=<replaceable class="parameter">integer_value</replaceable>  # set value for <replaceable>option</replaceable>
  173. <replaceable>option</replaceable>                # set <replaceable>option</replaceable> = 1
  174. <replaceable>option</replaceable>+               # set <replaceable>option</replaceable> = 1
  175. <replaceable>option</replaceable>-               # set <replaceable>option</replaceable> = 0
  176.    </programlisting>
  177.    Note that <replaceable class="parameter">keyword</replaceable> can also be
  178.    an abbreviation of the option name defined in
  179.    <filename>backend/utils/misc/trace.c</filename>.
  180.   </Para>
  181.   <para>
  182.    Refer to <citetitle>The Administrator's Guide</citetitle> chapter
  183.    on runtime options for a complete list of currently supported
  184.    options.
  185.   </para>
  186.   <Para>
  187.    Some of the existing code using private variables and option switches has
  188.    been changed to make use of the pg_options feature, mainly in
  189.    <filename>postgres.c</filename>. It would be advisable to modify
  190.    all existing code
  191.    in this way, so that we can get rid of many of the switches on
  192.    the <productname>Postgres</productname> command line 
  193.    and can have more tunable options 
  194.    with a unique place to put option values.
  195.   </Para>
  196.  </Chapter>
  197. <!-- Keep this comment at the end of the file
  198. Local variables:
  199. mode: sgml
  200. sgml-omittag:nil
  201. sgml-shorttag:t
  202. sgml-minimize-attributes:nil
  203. sgml-always-quote-attributes:t
  204. sgml-indent-step:1
  205. sgml-indent-data:t
  206. sgml-parent-document:nil
  207. sgml-default-dtd-file:"./reference.ced"
  208. sgml-exposed-tags:nil
  209. sgml-local-catalogs:"/usr/lib/sgml/CATALOG"
  210. sgml-local-ecat-files:nil
  211. End:
  212. -->