manual.txt
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1762k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1.      This space is not needed if one does a repair with `--quick', as
  2.      in this case only the index file will be re-created.  This space
  3.      is needed on the same disk as the original record file!
  4.    * Space for the new index file that replaces the old one. The old
  5.      index file is truncated at start, so one usually ignore this space.
  6.      This space is needed on the same disk as the original index file!
  7.    * When using `--recover' or `--sort-recover' (but not when using
  8.      `--safe-recover', you will need space for a sort buffer for:
  9.      `(largest_key + row_pointer_length)*number_of_rows * 2'.  You can
  10.      check the length of the keys and the row_pointer_length with
  11.      `myisamchk -dv table'.  This space is allocated on the temporary
  12.      disk (specified by `TMPDIR' or `--tmpdir=#').
  13. If you have a problem with disk space during repair, you can try to use
  14. `--safe-recover' instead of `--recover'.
  15. Setting Up a Table Maintenance Regimen
  16. ======================================
  17. Starting with *MySQL* Version 3.23.13, you can check MyISAM tables with
  18. the `CHECK TABLE' command. *Note CHECK TABLE::.  You can repair tables
  19. with the `REPAIR TABLE' command. *Note REPAIR TABLE::.
  20. It is a good idea to perform table checks on a regular basis rather than
  21. waiting for problems to occur.  For maintenance purposes, you can use
  22. `myisamchk -s' to check tables.  The `-s' option (short for `--silent')
  23. causes `myisamchk' to run in silent mode, printing messages only when
  24. errors occur.
  25. It's also a good idea to check tables when the server starts up.  For
  26. example, whenever the machine has done a reboot in the middle of an
  27. update, you usually need to check all the tables that could have been
  28. affected. (This is an "expected crashed table".) You could add a test to
  29. `safe_mysqld' that runs `myisamchk' to check all tables that have been
  30. modified during the last 24 hours if there is an old `.pid' (process
  31. ID) file left after a reboot.  (The `.pid' file is created by `mysqld'
  32. when it starts up and removed when it terminates normally.  The
  33. presence of a `.pid' file at system startup time indicates that
  34. `mysqld' terminated abnormally.)
  35. An even better test would be to check any table whose last-modified time
  36. is more recent than that of the `.pid' file.
  37. You should also check your tables regularly during normal system
  38. operation.  At MySQL AB, we run a `cron' job to check all our important
  39. tables once a week, using a line like this in a `crontab' file:
  40.      35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
  41. This prints out information about crashed tables so we can examine and
  42. repair them when needed.
  43. As we haven't had any unexpectedly crashed tables (tables that become
  44. corrupted for reasons other than hardware trouble) for a couple of
  45. years now (this is really true), once a week is more than enough for us.
  46. We recommend that to start with, you execute `myisamchk -s' each night
  47. on all tables that have been updated during the last 24 hours, until
  48. you come to trust *MySQL* as much as we do.
  49. Normally you don't need to maintain MySQL tables that much.  If you are
  50. changing tables with dynamic size rows (tables with `VARCHAR', `BLOB'
  51. or `TEXT' columns) or have tables with many deleted rows you may want
  52. to from time to time (once a month?) defragment/reclaim space from the
  53. tables.
  54. You can do this by using `OPTIMIZE TABLE' on the tables in question or
  55. if you can take the `mysqld' server down for a while do:
  56.      isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM
  57.      myisamchk -r --silent --sort-index  -O sort_buffer_size=16M */*.MYI
  58. Getting Information About a Table
  59. =================================
  60. To get a description of a table or statistics about it, use the
  61. commands shown below. We explain some of the information in more detail
  62. later:
  63. `myisamchk -d tbl_name'
  64.      Runs `myisamchk' in "describe mode" to produce a description of
  65.      your table. If you start the *MySQL* server using the
  66.      `--skip-locking' option, `myisamchk' may report an error for a
  67.      table that is updated while it runs.  However, because `myisamchk'
  68.      doesn't change the table in describe mode, there isn't any risk of
  69.      destroying data.
  70. `myisamchk -d -v tbl_name'
  71.      To produce more information about what `myisamchk' is doing, add
  72.      `-v' to tell it to run in verbose mode.
  73. `myisamchk -eis tbl_name'
  74.      Shows only the most important information from a table. It is slow
  75.      because it must read the whole table.
  76. `myisamchk -eiv tbl_name'
  77.      This is like `-eis', but tells you what is being done.
  78. Example of `myisamchk -d' output:
  79.      MyISAM file:     company.MYI
  80.      Record format:   Fixed length
  81.      Data records:    1403698  Deleted blocks:         0
  82.      Recordlength:    226
  83.      
  84.      table description:
  85.      Key Start Len Index   Type
  86.      1   2     8   unique  double
  87.      2   15    10  multip. text packed stripped
  88.      3   219   8   multip. double
  89.      4   63    10  multip. text packed stripped
  90.      5   167   2   multip. unsigned short
  91.      6   177   4   multip. unsigned long
  92.      7   155   4   multip. text
  93.      8   138   4   multip. unsigned long
  94.      9   177   4   multip. unsigned long
  95.          193   1           text
  96. Example of `myisamchk -d -v' output:
  97.      MyISAM file:         company
  98.      Record format:       Fixed length
  99.      File-version:        1
  100.      Creation time:       1999-10-30 12:12:51
  101.      Recover time:        1999-10-31 19:13:01
  102.      Status:              checked
  103.      Data records:           1403698  Deleted blocks:              0
  104.      Datafile parts:         1403698  Deleted data:                0
  105.      Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
  106.      Max datafile length: 3791650815  Max keyfile length: 4294967294
  107.      Recordlength:               226
  108.      
  109.      table description:
  110.      Key Start Len Index   Type                  Rec/key     Root Blocksize
  111.      1   2     8   unique  double                      1 15845376      1024
  112.      2   15    10  multip. text packed stripped        2 25062400      1024
  113.      3   219   8   multip. double                     73 40907776      1024
  114.      4   63    10  multip. text packed stripped        5 48097280      1024
  115.      5   167   2   multip. unsigned short           4840 55200768      1024
  116.      6   177   4   multip. unsigned long            1346 65145856      1024
  117.      7   155   4   multip. text                     4995 75090944      1024
  118.      8   138   4   multip. unsigned long              87 85036032      1024
  119.      9   177   4   multip. unsigned long             178 96481280      1024
  120.          193   1           text
  121. Example of `myisamchk -eis' output:
  122.      Checking MyISAM file: company
  123.      Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  124.      Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
  125.      Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  126.      Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
  127.      Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  128.      Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  129.      Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  130.      Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  131.      Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
  132.      Total:    Keyblocks used:  98%  Packed:   17%
  133.      
  134.      Records:          1403698    M.recordlength:     226   Packed:             0%
  135.      Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
  136.      Record blocks:    1403698    Delete blocks:        0
  137.      Recorddata:     317235748    Deleted data:         0
  138.      Lost space:             0    Linkdata:             0
  139.      
  140.      User time 1626.51, System time 232.36
  141.      Maximum resident set size 0, Integral resident set size 0
  142.      Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
  143.      Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  144.      Voluntary context switches 639, Involuntary context switches 28966
  145. Example of `myisamchk -eiv' output:
  146.      Checking MyISAM file: company
  147.      Data records: 1403698   Deleted blocks:       0
  148.      - check file-size
  149.      - check delete-chain
  150.      block_size 1024:
  151.      index  1:
  152.      index  2:
  153.      index  3:
  154.      index  4:
  155.      index  5:
  156.      index  6:
  157.      index  7:
  158.      index  8:
  159.      index  9:
  160.      No recordlinks
  161.      - check index reference
  162.      - check data record references index: 1
  163.      Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  164.      - check data record references index: 2
  165.      Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
  166.      - check data record references index: 3
  167.      Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  168.      - check data record references index: 4
  169.      Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
  170.      - check data record references index: 5
  171.      Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  172.      - check data record references index: 6
  173.      Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  174.      - check data record references index: 7
  175.      Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  176.      - check data record references index: 8
  177.      Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  178.      - check data record references index: 9
  179.      Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
  180.      Total:    Keyblocks used:   9%  Packed:   17%
  181.      
  182.      - check records and index references
  183.      [LOTS OF ROW NUMBERS DELETED]
  184.      
  185.      Records:          1403698    M.recordlength:     226   Packed:             0%
  186.      Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
  187.      Record blocks:    1403698    Delete blocks:        0
  188.      Recorddata:     317235748    Deleted data:         0
  189.      Lost space:             0    Linkdata:             0
  190.      
  191.      User time 1639.63, System time 251.61
  192.      Maximum resident set size 0, Integral resident set size 0
  193.      Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
  194.      Blocks in 4 out 0, Messages in 0 out 0, Signals 0
  195.      Voluntary context switches 10604, Involuntary context switches 122798
  196. Here are the sizes of the data and index files for the table used in the
  197. preceding examples:
  198.      -rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 company.MYD
  199.      -rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 company.MYM
  200. Explanations for the types of information `myisamchk' produces are
  201. given below.  The "keyfile" is the index file.  "Record" and "row" are
  202. synonymous:
  203. `ISAM file'
  204.      Name of the ISAM (index) file.
  205. `Isam-version'
  206.      Version of ISAM format. Currently always 2.
  207. `Creation time'
  208.      When the data file was created.
  209. `Recover time'
  210.      When the index/data file was last reconstructed.
  211. `Data records'
  212.      How many records are in the table.
  213. `Deleted blocks'
  214.      How many deleted blocks still have reserved space.  You can
  215.      optimize your table to minimize this space.  *Note Optimization::.
  216. `Datafile: Parts'
  217.      For dynamic record format, this indicates how many data blocks
  218.      there are. For an optimized table without fragmented records, this
  219.      is the same as `Data records'.
  220. `Deleted data'
  221.      How many bytes of non-reclaimed deleted data there are.  You can
  222.      optimize your table to minimize this space.  *Note Optimization::.
  223. `Datafile pointer'
  224.      The size of the data file pointer, in bytes. It is usually 2, 3,
  225.      4, or 5 bytes. Most tables manage with 2 bytes, but this cannot be
  226.      controlled from *MySQL* yet. For fixed tables, this is a record
  227.      address. For dynamic tables, this is a byte address.
  228. `Keyfile pointer'
  229.      The size of the index file pointer, in bytes. It is usually 1, 2,
  230.      or 3 bytes. Most tables manage with 2 bytes, but this is calculated
  231.      automatically by *MySQL*. It is always a block address.
  232. `Max datafile length'
  233.      How long the table's data file (`.MYD' file) can become, in bytes.
  234. `Max keyfile length'
  235.      How long the table's key file (`.MYI' file) can become, in bytes.
  236. `Recordlength'
  237.      How much space each record takes, in bytes.
  238. `Record format'
  239.      The format used to store table rows.  The examples shown above use
  240.      `Fixed length'.  Other possible values are `Compressed' and
  241.      `Packed'.
  242. `table description'
  243.      A list of all keys in the table. For each key, some low-level
  244.      information is presented:
  245.     `Key'
  246.           This key's number.
  247.     `Start'
  248.           Where in the record this index part starts.
  249.     `Len'
  250.           How long this index part is. For packed numbers, this should
  251.           always be the full length of the column. For strings, it may
  252.           be shorter than the full length of the indexed column,
  253.           because you can index a prefix of a string column.
  254.     `Index'
  255.           `unique' or `multip.' (multiple). Indicates whether or not
  256.           one value can exist multiple times in this index.
  257.     `Type'
  258.           What data-type this index part has. This is an ISAM data-type
  259.           with the options `packed', `stripped' or `empty'.
  260.     `Root'
  261.           Address of the root index block.
  262.     `Blocksize'
  263.           The size of each index block. By default this is 1024, but
  264.           the value may be changed at compile time.
  265.     `Rec/key'
  266.           This is a statistical value used by the optimizer. It tells
  267.           how many records there are per value for this key. A unique
  268.           key always has a value of 1. This may be updated after a
  269.           table is loaded (or greatly changed) with `myisamchk -a'. If
  270.           this is not updated at all, a default value of 30 is given.
  271. `'
  272.      In the first example above, the 9th key is a multi-part key with
  273.      two parts.
  274. `Keyblocks used'
  275.      What percentage of the keyblocks are used. Because the table used
  276.      in the examples had just been reorganized with `myisamchk', the
  277.      values are very high (very near the theoretical maximum).
  278. `Packed'
  279.      *MySQL* tries to pack keys with a common suffix. This can only be
  280.      used for `CHAR'/`VARCHAR'/`DECIMAL' keys. For long strings like
  281.      names, this can significantly reduce the space used. In the third
  282.      example above, the 4th key is 10 characters long and a 60%
  283.      reduction in space is achieved.
  284. `Max levels'
  285.      How deep the B-tree for this key is. Large tables with long keys
  286.      get high values.
  287. `Records'
  288.      How many rows are in the table.
  289. `M.recordlength'
  290.      The average record length. For tables with fixed-length records,
  291.      this is the exact record length.
  292. `Packed'
  293.      *MySQL* strips spaces from the end of strings. The `Packed' value
  294.      indicates the percentage of savings achieved by doing this.
  295. `Recordspace used'
  296.      What percentage of the data file is used.
  297. `Empty space'
  298.      What percentage of the data file is unused.
  299. `Blocks/Record'
  300.      Average number of blocks per record (that is, how many links a
  301.      fragmented record is composed of). This is always 1 for
  302.      fixed-format tables. This value should stay as close to 1.0 as
  303.      possible. If it gets too big, you can reorganize the table with
  304.      `myisamchk'.  *Note Optimization::.
  305. `Recordblocks'
  306.      How many blocks (links) are used. For fixed format, this is the
  307.      same as the number of records.
  308. `Deleteblocks'
  309.      How many blocks (links) are deleted.
  310. `Recorddata'
  311.      How many bytes in the data file are used.
  312. `Deleted data'
  313.      How many bytes in the data file are deleted (unused).
  314. `Lost space'
  315.      If a record is updated to a shorter length, some space is lost.
  316.      This is the sum of all such losses, in bytes.
  317. `Linkdata'
  318.      When the dynamic table format is used, record fragments are linked
  319.      with pointers (4 to 7 bytes each). `Linkdata' is the sum of the
  320.      amount of storage used by all such pointers.
  321. If a table has been compressed with `myisampack', `myisamchk -d' prints
  322. additional information about each table column.  See *Note
  323. `myisampack': myisampack, for an example of this information and a
  324. description of what it means.
  325. Using `myisamchk' for Crash Recovery
  326. ====================================
  327. If you run `mysqld' with `--skip-locking' (which is the default on some
  328. systems, like Linux), you can't reliably use `myisamchk' to check a
  329. table when `mysqld' is using the same table.  If you can be sure that
  330. no one is accessing the tables through `mysqld' while you run
  331. `myisamchk', you only have to do `mysqladmin flush-tables' before you
  332. start checking the tables.  If you can't guarantee the above, then you
  333. must take down `mysqld' while you check the tables.  If you run
  334. `myisamchk' while `mysqld' is updating the tables, you may get a
  335. warning that a table is corrupt even if it isn't.
  336. If you are not using `--skip-locking', you can use `myisamchk' to check
  337. tables at any time.  While you do this, all clients that try to update
  338. the table will wait until `myisamchk' is ready before continuing.
  339. If you use `myisamchk' to repair or optimize tables, you *MUST* always
  340. ensure that the `mysqld' server is not using the table (this also
  341. applies if you are using `--skip-locking').  If you don't take down
  342. `mysqld' you should at least do a `mysqladmin flush-tables' before you
  343. run `myisamchk'.
  344. The file format that *MySQL* uses to store data has been extensively
  345. tested, but there are always external circumstances that may cause
  346. database tables to become corrupted:
  347.    * The `mysqld' process being killed in the middle of a write.
  348.    * Unexpected shutdown of the computer (for example, if the computer
  349.      is turned off).
  350.    * A hardware error.
  351. This chapter describes how to check for and deal with data corruption
  352. in *MySQL* databases.  If your tables get corrupted a lot you should
  353. try to find the reason for this! *Note Debugging server::.
  354. When performing crash recovery, it is important to understand that each
  355. table `tbl_name' in a database corresponds to three files in the
  356. database directory:
  357. *File*         *Purpose*
  358. `tbl_name.frm' Table definition (form) file
  359. `tbl_name.MYD' Data file
  360. `tbl_name.MYI' Index file
  361. Each of these three file types is subject to corruption in various
  362. ways, but problems occur most often in data files and index files.
  363. `myisamchk' works by creating a copy of the `.MYD' (data) file row by
  364. row. It ends the repair stage by removing the old `.MYD' file and
  365. renaming the new file to the original file name.  If you use `--quick',
  366. `myisamchk' does not create a temporary `.MYD' file, but instead
  367. assumes that the `.MYD' file is correct and only generates a new index
  368. file without touching the `.MYD' file. This is safe, because
  369. `myisamchk' automatically detects if the `.MYD' file is corrupt and
  370. aborts the repair in this case.  You can also give two `--quick'
  371. options to `myisamchk'.  In this case, `myisamchk' does not abort on
  372. some errors (like duplicate key) but instead tries to resolve them by
  373. modifying the `.MYD' file. Normally the use of two `--quick' options is
  374. useful only if you have too little free disk space to perform a normal
  375. repair.  In this case you should at least make a backup before running
  376. `myisamchk'.
  377. How to Check Tables for Errors
  378. ------------------------------
  379. To check a MyISAM table, use the following commands:
  380. `myisamchk tbl_name'
  381.      This finds 99.99% of all errors. What it can't find is corruption
  382.      that involves *ONLY* the data file (which is very unusual). If you
  383.      want to check a table, you should normally run `myisamchk' without
  384.      options or with either the `-s' or `--silent' option.
  385. `myisamchk -m tbl_name'
  386.      This finds 99.999% of all errors. It checks first all index
  387.      entries for errors and then it reads through all rows. It
  388.      calculates a checksum for all keys in the rows and verifies that
  389.      they checksum matches the checksum for the keys in the index tree.
  390. `myisamchk -e tbl_name'
  391.      This does a complete and thorough check of all data (`-e' means
  392.      "extended check"). It does a check-read of every key for each row
  393.      to verify that they indeed point to the correct row.  This may
  394.      take a LONG time on a big table with many keys.  `myisamchk' will
  395.      normally stop after the first error it finds. If you want to
  396.      obtain more information, you can add the `--verbose' (`-v')
  397.      option.  This causes `myisamchk' to keep going, up through a
  398.      maximum of 20 errors.  In normal usage, a simple `myisamchk' (with
  399.      no arguments other than the table name) is sufficient.
  400. `myisamchk -e -i tbl_name'
  401.      Like the previous command, but the `-i' option tells `myisamchk' to
  402.      print some informational statistics, too.
  403. How to Repair Tables
  404. --------------------
  405. In the following section we only talk about using `myisamchk' on
  406. `MyISAM' tables (extensions `.MYI' and `.MYD').  If you are using
  407. `ISAM' tables (extensions `.ISM' and `.ISD'), you should use `isamchk'
  408. instead.
  409. Starting with *MySQL* Version 3.23.14, you can repair MyISAM tables
  410. with the `REPAIR TABLE' command. *Note REPAIR TABLE::.
  411. The symptoms of a corrupted table include queries that abort
  412. unexpectedly and observable errors such as these:
  413.    * `tbl_name.frm' is locked against change
  414.    * Can't find file `tbl_name.MYI' (Errcode: ###)
  415.    * Unexpected end of file
  416.    * Record file is crashed
  417.    * Got error ### from table handler
  418.      To get more information about the error you can do `perror ###'.
  419.      Here is the most common errors that indicates a problem with the
  420.      table:
  421.           shell> perror 126 127 132 134 135 136 141 144 145
  422.           126 = Index file is crashed / Wrong file format
  423.           127 = Record-file is crashed
  424.           132 = Old database file
  425.           134 = Record was already deleted (or record file crashed)
  426.           135 = No more room in record file
  427.           136 = No more room in index file
  428.           141 = Duplicate unique key or constraint on write or update
  429.           144 = Table is crashed and last repair failed
  430.           145 = Table was marked as crashed and should be repaired
  431.      Note that error 135, no more room in record file, is not a error
  432.      that can be fixed by a simple repair. In this case you have to do:
  433.         * `CREATE TABLE ...' for the table with proper `MAX_ROWS' and
  434.           `AVG_ROW_LENGTH' values. *Note CREATE TABLE::.
  435.         * Copy the data over from the old table with `INSERT INTO
  436.           new_table SELECT * from old_table'.
  437.         * Rename the old table to the new table: `RENAME old_table to
  438.           tmp_table, new_table to old_table'
  439.         * Delete the old table: `DROP TABLE tmp_table'.
  440. In these cases, you must repair your tables. `myisamchk' can usually
  441. detect and fix most things that go wrong.
  442. The repair process involves up to four stages, described below. Before
  443. you begin, you should `cd' to the database directory and check the
  444. permissions of the table files. Make sure they are readable by the Unix
  445. user that `mysqld' runs as (and to you, because you need to access the
  446. files you are checking).  If it turns out you need to modify files,
  447. they must also be writable by you.
  448. If you are using *MySQL* Version 3.23.16 and above, you can (and
  449. should) use the `CHECK' and `REPAIR' commands to check and repair
  450. `MyISAM' tables. *Note CHECK TABLE::. *Note REPAIR TABLE::.
  451. The manual section about table maintenance includes the options to
  452. `isamchk'/`myisamchk'. *Note Table maintenance::.
  453. The following section is for the cases where the above command fails or
  454. if you want to use the extended features that `isamchk'/`myisamchk'
  455. provides.
  456. If you are going to repair a table from the command line, you must first
  457. take down the `mysqld' server. Note that when you do `mysqladmin
  458. shutdown' on a remote server, the `mysqld' server will still be alive
  459. for a while after `mysqladmin' returns, until all queries are stopped
  460. and all keys have been flushed to disk.
  461. *Stage 1: Checking your tables*
  462. Run `myisamchk *.MYI' or `myisamchk -e *.MYI' if you have more time.
  463. Use the `-s' (silent) option to suppress unnecessary information.
  464. If the mysqld server is done you should use the -update option to tell
  465. `myisamchk' to mark the table as 'checked'.
  466. You have to repair only those tables for which `myisamchk' announces an
  467. error.  For such tables, proceed to Stage 2.
  468. If you get weird errors when checking (such as `out of memory' errors),
  469. or if `myisamchk' crashes, go to Stage 3.
  470. *Stage 2: Easy safe repair*
  471. NOTE: If you want repairing to go much faster, you should add: `-O
  472. sort_buffer=# -O key_buffer=#' (where # is about 1/4 of the available
  473. memory) to all `isamchk/myisamchk' commands.
  474. First, try `myisamchk -r -q tbl_name' (`-r -q' means "quick recovery
  475. mode"). This will attempt to repair the index file without touching the
  476. data file.  If the data file contains everything that it should and the
  477. delete links point at the correct locations within the data file, this
  478. should work, and the table is fixed. Start repairing the next table.
  479. Otherwise, use the following procedure:
  480.   1. Make a backup of the data file before continuing.
  481.   2. Use `myisamchk -r tbl_name' (`-r' means "recovery mode"). This will
  482.      remove incorrect records and deleted records from the data file and
  483.      reconstruct the index file.
  484.   3. If the preceding step fails, use `myisamchk --safe-recover
  485.      tbl_name'.  Safe recovery mode uses an old recovery method that
  486.      handles a few cases that regular recovery mode doesn't (but is
  487.      slower).
  488. If you get weird errors when repairing (such as `out of memory'
  489. errors), or if `myisamchk' crashes, go to Stage 3.
  490. *Stage 3: Difficult repair*
  491. You should only reach this stage if the first 16K block in the index
  492. file is destroyed or contains incorrect information, or if the index
  493. file is missing.  In this case, it's necessary to create a new index
  494. file. Do so as follows:
  495.   1. Move the data file to some safe place.
  496.   2. Use the table description file to create new (empty) data and
  497.      index files:
  498.           shell> mysql db_name
  499.           mysql> SET AUTOCOMMIT=1;
  500.           mysql> TRUNCATE TABLE table_name;
  501.           mysql> quit
  502.      If your SQL version doesn't have `TRUNCATE TABLE', use `DELETE FROM
  503.      table_name' instead.
  504.   3. Copy the old data file back onto the newly created data file.
  505.      (Don't just move the old file back onto the new file; you want to
  506.      retain a copy in case something goes wrong.)
  507. Go back to Stage 2.  `myisamchk -r -q' should work now.  (This shouldn't
  508. be an endless loop.)
  509. *Stage 4: Very difficult repair*
  510. You should reach this stage only if the description file has also
  511. crashed. That should never happen, because the description file isn't
  512. changed after the table is created:
  513.   1. Restore the description file from a backup and go back to Stage 3.
  514.      You can also restore the index file and go back to Stage 2.  In
  515.      the latter case, you should start with `myisamchk -r'.
  516.   2. If you don't have a backup but know exactly how the table was
  517.      created, create a copy of the table in another database.  Remove
  518.      the new data file, then move the description and index files from
  519.      the other database to your crashed database.  This gives you new
  520.      description and index files, but leaves the data file alone.  Go
  521.      back to Stage 2 and attempt to reconstruct the index file.
  522. Table Optimization
  523. ------------------
  524. To coalesce fragmented records and eliminate wasted space resulting from
  525. deleting or updating records, run `myisamchk' in recovery mode:
  526.      shell> myisamchk -r tbl_name
  527. You can optimize a table in the same way using the SQL `OPTIMIZE TABLE'
  528. statement.  `OPTIMIZE TABLE' does a repair of the table, a key analyzes
  529. and also sorts the index tree to give faster key lookups.  There is
  530. also no possibility of unwanted interaction between a utility and the
  531. server, because the server does all the work when you use `OPTIMIZE
  532. TABLE'. *Note OPTIMIZE TABLE::.
  533. `myisamchk' also has a number of other options you can use to improve
  534. the performance of a table:
  535. `-S, --sort-index'
  536. `-R index_num, --sort-records=index_num'
  537. `-a, --analyze'
  538. For a full description of the option, see *Note myisamchk syntax::.
  539. Log file Maintenance
  540. ====================
  541. *MySQL* has a lot of log files which make it easy to see what is going.
  542. *Note Log files::. One must however from time to time clean up after
  543. `MysQL' to ensure that the logs doesn't take up too much disk space.
  544. When using *MySQL* with log files, you will, from time to time, want to
  545. remove/backup old log files and tell *MySQL* to start logging on new
  546. files.  *Note Backup::.
  547. On a Linux (`Redhat') installation, you can use the `mysql-log-rotate'
  548. script for this. If you installed *MySQL* from an RPM distribution, the
  549. script should have been installed automatically.  Note that you should
  550. be careful with this if you are using the log for replication!
  551. On other systems you must install a short script yourself that you
  552. start from `cron' to handle log files.
  553. You can force *MySQL* to start using new log files by using `mysqladmin
  554. flush-logs' or by using the SQL command `FLUSH LOGS'.  If you are using
  555. *MySQL* Version 3.21 you must use `mysqladmin refresh'.
  556. The above command does the following:
  557.    * If standard logging (`--log') or slow query logging
  558.      (`--log-slow-queries') is used, closes and reopens the log file.
  559.      (`mysql.log' and ``hostname`-slow.log' as default).
  560.    * If update logging (`--log-update') is used, closes the update log
  561.      and opens a new log file with a higher sequence number.
  562. If you are using only an update log, you only have to flush the logs
  563. and then move away the old update log files to a backup.  If you are
  564. using the normal logging, you can do something like:
  565.      shell> cd mysql-data-directory
  566.      shell> mv mysql.log mysql.old
  567.      shell> mysqladmin flush-logs
  568. and then take a backup and remove `mysql.old'.
  569. Adding New Functions to MySQL
  570. *****************************
  571. There are two ways to add new functions to *MySQL*:
  572.    * You can add the function through the user-definable function (UDF)
  573.      interface.  User-definable functions are added and removed
  574.      dynamically using the `CREATE FUNCTION' and `DROP FUNCTION'
  575.      statements.  *Note `CREATE FUNCTION': CREATE FUNCTION.
  576.    * You can add the function as a native (built in) *MySQL* function.
  577.      Native functions are compiled into the `mysqld' server and become
  578.      available on a permanent basis.
  579. Each method has advantages and disadvantages:
  580.    * If you write a user-definable function, you must install the
  581.      object file in addition to the server itself.  If you compile your
  582.      function into the server, you don't need to do that.
  583.    * You can add UDFs to a binary *MySQL* distribution.  Native
  584.      functions require you to modify a source distribution.
  585.    * If you upgrade your *MySQL* distribution, you can continue to use
  586.      your previously installed UDFs.  For native functions, you must
  587.      repeat your modifications each time you upgrade.
  588. Whichever method you use to add new functions, they may be used just
  589. like native functions such as `ABS()' or `SOUNDEX()'.
  590. Adding a New User-definable Function
  591. ====================================
  592. For the UDF mechanism to work, functions must be written in C or C++
  593. and your operating system must support dynamic loading.  The *MySQL*
  594. source distribution includes a file `sql/udf_example.cc' that defines 5
  595. new functions.  Consult this file to see how UDF calling conventions
  596. work.
  597. For mysqld to be able to use UDF functions, you should configure MySQL
  598. with `--with-mysqld-ldflags=-rdynamic' The reason is that to on many
  599. platforms you can load a dynamic library (with `dlopen()') from a
  600. static linked program, which you would get if you are using
  601. `--with-mysqld-ldflags=-all-static' If you want to use an UDF that
  602. needs to access symbols from mysqld (like the `methaphone' example in
  603. `sql/udf_example.cc' that uses `default_charset_info'), you must link
  604. the program with `-rdynamic'.  (see `man dlopen').
  605. For each function that you want to use in SQL statements, you should
  606. define corresponding C (or C++) functions.  In the discussion below,
  607. the name "xxx" is used for an example function name.  To distinquish
  608. between SQL and C/C++ usage, `XXX()' (uppercase) indicates a SQL
  609. function call, and `xxx()' (lowercase) indicates a C/C++ function call.
  610. The C/C++ functions that you write to implement the inferface for
  611. `XXX()' are:
  612. `xxx()' (required)
  613.      The main function.  This is where the function result is computed.
  614.      The correspondence between the SQL type and return type of your
  615.      C/C++ function is shown below:
  616.      *SQL type*    *C/C++ type*
  617.      `STRING'      `char *'
  618.      `INTEGER'     `long long'
  619.      `REAL'        `double'
  620. `xxx_init()' (optional)
  621.      The initialization function for `xxx()'.  It can be used to:
  622.         * Check the number of arguments to `XXX()'.
  623.         * Check that the arguments are of a required type or,
  624.           alternatively, tell *MySQL* to coerce arguments to the types
  625.           you want when the main function is called.
  626.         * Allocate any memory required by the main function.
  627.         * Specify the maximum length of the result.
  628.         * Specify (for `REAL' functions) the maximum number of decimals.
  629.         * Specify whether or not the result can be `NULL'.
  630. `xxx_deinit()' (optional)
  631.      The deinitialization function for `xxx()'.  It should deallocate
  632.      any memory allocated by the initialization function.
  633. When a SQL statement invokes `XXX()', *MySQL* calls the initialization
  634. function `xxx_init()' to let it perform any required setup, such as
  635. argument checking or memory allocation.  If `xxx_init()' returns an
  636. error, the SQL statement is aborted with an error message and the main
  637. and deinitialization functions are not called.  Otherwise, the main
  638. function `xxx()' is called once for each row.  After all rows have been
  639. processed, the deinitialization function `xxx_deinit()' is called so it
  640. can perform any required cleanup.
  641. All functions must be thread safe (not just the main function, but the
  642. initialization and deinitialization functions as well). This means that
  643. you are not allowed to allocate any global or static variables that
  644. change!  If you need memory, you should allocate it in `xxx_init()' and
  645. free it in `xxx_deinit()'.
  646. UDF Calling Sequences
  647. ---------------------
  648. The main function should be declared as shown below.  Note that the
  649. return type and parameters differ, depending on whether you will
  650. declare the SQL function `XXX()' to return `STRING', `INTEGER', or
  651. `REAL' in the `CREATE FUNCTION' statement:
  652. For `STRING' functions:
  653.      char *xxx(UDF_INIT *initid, UDF_ARGS *args,
  654.                    char *result, unsigned long *length,
  655.                    char *is_null, char *error);
  656. For `INTEGER' functions:
  657.      long long xxx(UDF_INIT *initid, UDF_ARGS *args,
  658.                    char *is_null, char *error);
  659. For `REAL' functions:
  660.      double xxx(UDF_INIT *initid, UDF_ARGS *args,
  661.                    char *is_null, char *error);
  662. The initialization and deinitialization functions are declared like
  663. this:
  664.      my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
  665.      
  666.      void xxx_deinit(UDF_INIT *initid);
  667. The `initid' parameter is passed to all three functions.  It points to a
  668. `UDF_INIT' structure that is used to communicate information between
  669. functions.  The `UDF_INIT' structure members are listed below.  The
  670. initialization function should fill in any members that it wishes to
  671. change.  (To use the default for a member, leave it unchanged.):
  672. `my_bool maybe_null'
  673.      `xxx_init()' should set `maybe_null' to `1' if `xxx()' can return
  674.      `NULL'.  The default value is `1' if any of the arguments are
  675.      declared `maybe_null'.
  676. `unsigned int decimals'
  677.      Number of decimals.  The default value is the maximum number of
  678.      decimals in the arguments passed to the main function.  (For
  679.      example, if the function is passed `1.34', `1.345', and `1.3', the
  680.      default would be 3, because `1.345' has 3 decimals.
  681. `unsigned int max_length'
  682.      The maximum length of the string result.  The default value
  683.      differs depending on the result type of the function.  For string
  684.      functions, the default is the length of the longest argument.  For
  685.      integer functions, the default is 21 digits.  For real functions,
  686.      the default is 13 plus the number of decimals indicated by
  687.      `initid->decimals'.  (For numeric functions, the length includes
  688.      any sign or decimal point characters.)
  689. `char *ptr'
  690.      A pointer that the function can use for its own purposes.  For
  691.      example, functions can use `initid->ptr' to communicate allocated
  692.      memory between functions.  In `xxx_init()', allocate the memory
  693.      and assign it to this pointer:
  694.           initid->ptr = allocated_memory;
  695.      In `xxx()' and `xxx_deinit()', refer to `initid->ptr' to use or
  696.      deallocate the memory.
  697. Argument Processing
  698. -------------------
  699. The `args' parameter points to a `UDF_ARGS' structure that thas the
  700. members listed below:
  701. `unsigned int arg_count'
  702.      The number of arguments.  Check this value in the initialization
  703.      function if you want your function to be called with a particular
  704.      number of arguments.  For example:
  705.           if (args->arg_count != 2)
  706.           {
  707.               strcpy(message,"XXX() requires two arguments");
  708.               return 1;
  709.           }
  710. `enum Item_result *arg_type'
  711.      The types for each argument.  The possible type values are
  712.      `STRING_RESULT', `INT_RESULT', and `REAL_RESULT'.
  713.      To make sure that arguments are of a given type and return an
  714.      error if they are not, check the `arg_type' array in the
  715.      initialization function.  For example:
  716.           if (args->arg_type[0] != STRING_RESULT ||
  717.               args->arg_type[1] != INT_RESULT)
  718.           {
  719.               strcpy(message,"XXX() requires a string and an integer");
  720.               return 1;
  721.           }
  722.      As an alternative to requiring your function's arguments to be of
  723.      particular types, you can use the initialization function to set
  724.      the `arg_type' elements to the types you want.  This causes
  725.      *MySQL* to coerce arguments to those types for each call to
  726.      `xxx()'.  For example, to specify coercion of the first two
  727.      arguments to string and integer, do this in `xxx_init()':
  728.           args->arg_type[0] = STRING_RESULT;
  729.           args->arg_type[1] = INT_RESULT;
  730. `char **args'
  731.      `args->args' communicates information to the initialization
  732.      function about the general nature of the arguments your function
  733.      was called with.  For a constant argument `i', `args->args[i]'
  734.      points to the argument value.  (See below for instructions on how
  735.      to access the value properly.)  For a non-constant argument,
  736.      `args->args[i]' is `0'.  A constant argument is an expression that
  737.      uses only constants, such as `3' or `4*7-2' or `SIN(3.14)'.  A
  738.      non-constant argument is an expression that refers to values that
  739.      may change from row to row, such as column names or functions that
  740.      are called with non-constant arguments.
  741.      For each invocation of the main function, `args->args' contains the
  742.      actual arguments that are passed for the row currently being
  743.      processed.
  744.      Functions can refer to an argument `i' as follows:
  745.         * An argument of type `STRING_RESULT' is given as a string
  746.           pointer plus a length, to allow handling of binary data or
  747.           data of arbitrary length.  The string contents are available
  748.           as `args->args[i]' and the string length is
  749.           `args->lengths[i]'.  You should not assume that strings are
  750.           null-terminated.
  751.         * For an argument of type `INT_RESULT', you must cast
  752.           `args->args[i]' to a `long long' value:
  753.                long long int_val;
  754.                int_val = *((long long*) args->args[i]);
  755.         * For an argument of type `REAL_RESULT', you must cast
  756.           `args->args[i]' to a `double' value:
  757.                double    real_val;
  758.                real_val = *((double*) args->args[i]);
  759. `unsigned long *lengths'
  760.      For the initialization function, the `lengths' array indicates the
  761.      maximum string length for each argument.  For each invocation of
  762.      the main function, `lengths' contains the actual lengths of any
  763.      string arguments that are passed for the row currently being
  764.      processed.  For arguments of types `INT_RESULT' or `REAL_RESULT',
  765.      `lengths' still contains the maximum length of the argument (as
  766.      for the initialization function).
  767. Return Values and Error Handling
  768. --------------------------------
  769. The initialization function should return `0' if no error occurred and
  770. `1' otherwise.  If an error occurs, `xxx_init()' should store a
  771. null-terminated error message in the `message' parameter.  The message
  772. will be returned to the client.  The message buffer is
  773. `MYSQL_ERRMSG_SIZE' characters long, but you should try to keep the
  774. message to less than 80 characters so that it fits the width of a
  775. standard terminal screen.
  776. The return value of the main function `xxx()' is the function value, for
  777. `long long' and `double' functions.  A string functions should return a
  778. pointer to the result and store the length of the string in the
  779. `length' arguments. `result' is a buffer at least 255 bytes long.  Set
  780. these to the contents and length of the return value.  For example:
  781.      memcpy(result, "result string", 13);
  782.      *length = 13;
  783. If your string functions that needs to return a string longer than 255
  784. bytes, you must allocate the space for it with `malloc()' in your
  785. `xxx_init()' function or your `xxx()' function and free it in your
  786. `xxx_deinit()' function.  You can store the allocated memory in the
  787. `ptr' slot in the `UDF_INIT' structure for reuse by future `xxx()'
  788. calls.  *Note UDF calling sequences::.
  789. To indicate a return value of `NULL' in the main function, set
  790. `is_null' to `1':
  791.      *is_null = 1;
  792. To indicate an error return in the main function, set the `error'
  793. parameter to `1':
  794.      *error = 1;
  795. If `xxx()' sets `*error' to `1' for any row, the function value is
  796. `NULL' for the current row and for any subsequent rows processed by the
  797. statement in which `XXX()' was invoked.  (`xxx()' will not even be
  798. called for subsequent rows.) *NOTE:* In *MySQL* versions prior to
  799. 3.22.10, you should set both `*error' and `*is_null':
  800.      *error = 1;
  801.      *is_null = 1;
  802. Compiling and Installing User-definable Functions
  803. -------------------------------------------------
  804. Files implementing UDFs must be compiled and installed on the host
  805. where the server runs.  This process is described below for the example
  806. UDF file `udf_example.cc' that is included in the *MySQL* source
  807. distribution.  This file contains the following functions:
  808.    * `metaphon()' returns a metaphon string of the string argument.
  809.      This is something like a soundex string, but it's more tuned for
  810.      English.
  811.    * `myfunc_double()' returns the sum of the ASCII values of the
  812.      characters in its arguments, divided by the sum of the length of
  813.      its arguments.
  814.    * `myfunc_int()' returns the sum of the length of its arguments.
  815.    * `sequence([const int])' returns an sequence starting from the given
  816.      number or 1 if no number has been given.
  817.    * `lookup()' returns the IP number for a hostname.
  818.    * `reverse_lookup()' returns the hostname for an IP number.  The
  819.      function may be called with a string `"xxx.xxx.xxx.xxx"' or four
  820.      numbers.
  821. A dynamically loadable file should be compiled as a sharable object
  822. file, using a command something like this:
  823.      shell> gcc -shared -o udf_example.so myfunc.cc
  824. You can easily find out the correct compiler options for your system by
  825. running this command in the `sql' directory of your *MySQL* source tree:
  826.      shell> make udf_example.o
  827. You should run a compile command similar to the one that `make'
  828. displays, except that you should remove the `-c' option near the end of
  829. the line and add `-o udf_example.so' to the end of the line.  (On some
  830. systems, you may need to leave  the `-c' on the command.)
  831. Once you compile a shared object containing UDFs, you must install it
  832. and tell *MySQL* about it.  Compiling a shared object from
  833. `udf_example.cc' produces a file named something like `udf_example.so'
  834. (the exact name may vary from platform to platform).  Copy this file to
  835. some directory searched by `ld', such as `/usr/lib'.  On many systems,
  836. you can set the `LD_LIBRARY' or `LD_LIBRARY_PATH' environment variable
  837. to point at the directory where you have your UDF function files. The
  838. `dlopen' manual page tells you which variable you should use on your
  839. system. You should set this in `mysql.server' or `safe_mysqld' and
  840. restart `mysqld'.
  841. After the library is installed, notify `mysqld' about the new functions
  842. with these commands:
  843.      mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
  844.      mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
  845.      mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
  846.      mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
  847.      mysql> CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so";
  848. Functions can be deleted using `DROP FUNCTION':
  849.      mysql> DROP FUNCTION metaphon;
  850.      mysql> DROP FUNCTION myfunc_double;
  851.      mysql> DROP FUNCTION myfunc_int;
  852.      mysql> DROP FUNCTION lookup;
  853.      mysql> DROP FUNCTION reverse_lookup;
  854. The `CREATE FUNCTION' and `DROP FUNCTION' statements update the system
  855. table `func' in the `mysql' database.  The function's name, type and
  856. shared library name are saved in the table.  You must have the *insert*
  857. and *delete* privileges for the `mysql' database to create and drop
  858. functions.
  859. You should not use `CREATE FUNCTION' to add a function that has already
  860. been created.  If you need to reinstall a function, you should remove
  861. it with `DROP FUNCTION' and then reinstall it with `CREATE FUNCTION'.
  862. You would need to do this, for example, if you recompile a new version
  863. of your function, so that `mysqld' gets the new version.  Otherwise the
  864. server will continue to use the old version.
  865. Active functions are reloaded each time the server starts, unless you
  866. start `mysqld' with the `--skip-grant-tables' option.  In this case, UDF
  867. initialization is skipped and UDFs are unavailable.  (An active
  868. function is one that has been loaded with `CREATE FUNCTION' and not
  869. removed with `DROP FUNCTION'.)
  870. Adding a New Native Function
  871. ============================
  872. The procedure for adding a new native function is described below.
  873. Note that you cannot add native functions to a binary distribution
  874. because the procedure involves modifying *MySQL* source code.  You must
  875. compile *MySQL* yourself from a source distribution.  Also note that if
  876. you migrate to another version of *MySQL* (for example, when a new
  877. version is released), you will need to repeat the procedure with the
  878. new version.
  879. To add a new native *MySQL* function, follow these steps:
  880.   1. Add one line to `lex.h' that defines the function name in the
  881.      `sql_functions[]' array.
  882.   2. Add two lines to `sql_yacc.yy'. One indicates the preprocessor
  883.      symbol that `yacc' should define (this should be added at the
  884.      beginning of the file). Then define the function parameters and
  885.      add an "item" with these parameters to the `simple_expr' parsing
  886.      rule.  For an example, check all occurrences of `SOUNDEX' in
  887.      `sql_yacc.yy' to see how this is done.
  888.   3. In `item_func.h', declare a class inheriting from `Item_num_func'
  889.      or `Item_str_func', depending on whether your function returns a
  890.      number or a string.
  891.   4. In `item_func.cc', add one of the following declarations, depending
  892.      on whether you are defining a numeric or string function:
  893.           double   Item_func_newname::val()
  894.           longlong Item_func_newname::val_int()
  895.           String  *Item_func_newname::Str(String *str)
  896.   5. You should probably also define the following function:
  897.           void Item_func_newname::fix_length_and_dec()
  898.      This function should at least calculate `max_length' based on the
  899.      given arguments. `max_length' is the maximum number of characters
  900.      the function may return.  This function should also set
  901.      `maybe_null = 0' if the main function can't return a `NULL' value.
  902.      The function can check if any of the function arguments can
  903.      return `NULL' by checking the arguments `maybe_null' variable.
  904. All functions must be thread safe.
  905. For string functions, there are some additional considerations to be
  906. aware of:
  907.    * The `String *str' argument provides a string buffer that may be
  908.      used to hold the result.
  909.    * The function should return the string that holds the result.
  910.    * All current string functions try to avoid allocating any memory
  911.      unless absolutely necessary!
  912. Adding New Procedures to MySQL
  913. ******************************
  914. In *MySQL*, you can define a procedure in C++ that can access and
  915. modify the data in a query before it is sent to the client.  The
  916. modification can be done on row-by-row or `GROUP BY' level.
  917. We have created an example procedure in *MySQL* Version 3.23 to show
  918. you what can be done.
  919. Additionally we recommend you to take a look at 'mylua', which you can
  920. find in the Contrib directory. *Note Contrib::.  Which this you can use
  921. the LUA language to load a procedure at runtime into `mysqld'.
  922. Procedure Analyse
  923. =================
  924. `analyse([max elements,[max memory]])'
  925. This procedure is defined in the `sql/sql_analyse.cc'.  This examines
  926. the result from your query and returns an analysis of the results:
  927.    * `max elements' (default 256) is the maximum number of distinct
  928.      values `analyse' will notice per column.  This is used by
  929.      `analyse' to check if the optimal column type should be of type
  930.      `ENUM'.
  931.    * `max memory' (default 8192) is the maximum memory `analyse' should
  932.      allocate per column while trying to find all distinct values.
  933.      SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])
  934. Writing a Procedure
  935. ===================
  936. For the moment, the only documentation for this is the source.
  937. You can find all information about procedures by examining the
  938. following files:
  939.    * `sql/sql_analyse.cc'
  940.    * `sql/procedure.h'
  941.    * `sql/procedure.cc'
  942.    * `sql/sql_select.cc'
  943. MySQL ODBC Support
  944. ******************
  945. *MySQL* provides support for ODBC by means of the *MyODBC* program.
  946. How To Install MyODBC
  947. =====================
  948. *MyODBC* is a 32-bit ODBC (2.50) level 0 (with level 1 and level 2
  949. features) driver for connecting an ODBC-aware application to *MySQL*.
  950. *MyODBC* works on Windows95, Windows98, NT, and on most Unix platforms.
  951. *MyODBC* is in public domain, and you can find the newest version at
  952. `http://www.mysql.com/downloads/api-myodbc.html'.
  953. If you have problem with *MyODBC* and your program also works with
  954. OLEDB, you should try the OLEDB driver that you can find in the Contrib
  955. section.  *Note Contrib::.
  956. Normally you only need to install *MyODBC* on Windows machines.  You
  957. only need *MyODBC* for Unix if you have a program like ColdFusion that
  958. is running on the Unix machine and uses ODBC to connect to the
  959. databases.
  960. If you want to install *MyODBC* on a Unix box, you will also need an
  961. *ODBC* manager.  *MyODBC* is known to work with most of the Unix ODBC
  962. managers.  You can find a list at these in the *ODBC*-related links
  963. section on the *MySQL* useful links page.  *Note Useful Links::.
  964. To install *MyODBC* on windows, you should download the appropriate
  965. *MyODBC* .zip file (for Windows or NT/Win2000), unpack it with
  966. `WINZIP', or some similar program, and execute the `SETUP.EXE' file.
  967. On Windows/NT you may get the following error when trying to install
  968. *MyODBC*:
  969.      An error occurred while copying C:WINDOWSSYSTEMMFC30.DLL. Restart
  970.      Windows and try installing again (before running any applications which
  971.      use ODBC)
  972. The problem in this case is that some other program is using ODBC and
  973. because of how Windows is designed, you may not in this case be able to
  974. install a new ODBC drivers with Microsoft's ODBC setup program. In most
  975. cases you can continue by just pressing `Ignore' to copy the rest of
  976. the MyODBC files and the final installation should still work.  If this
  977. doesn't work, the the solution is to reboot your computer in "safe
  978. mode" (Choose this by pressing F8 just before your machine starts
  979. Windows during rebooting), install *MyODBC*, and reboot to normal mode.
  980.    * To make a connection to a Unix box from a Windows box, with an ODBC
  981.      application (one that doesn't support *MySQL* natively), you must
  982.      first install *MyODBC* on the Windows machine.
  983.    * The user and Windows machine must have the access privileges to the
  984.      *MySQL* server on the Unix machine.  This is set up with the
  985.      `GRANT' command. *Note `GRANT': GRANT.
  986.    * You must create an ODBC DSN entry as follows:
  987.         - Open the Control Panel on the Windows machine.
  988.         - Double-click the ODBC Data Sources 32 bits icon.
  989.         - Click the tab User DSN.
  990.         - Click the button Add.
  991.         - Select *MySQL* in the screen Create New Data Source and click
  992.           the Finish button.
  993.         - The *MySQL* Driver default configuration screen is shown.
  994.           *Note ODBC administrator::.
  995.    * Now start your application and select the ODBC driver with the DSN
  996.      you specified in the ODBC administrator.
  997. Notice that there are other configuration options on the screen of
  998. *MySQL* (trace, don't prompt on connect, etc) that you can try if you
  999. run into problems.
  1000. How to Fill in the Various Fields in the ODBC Administrator Program
  1001. ===================================================================
  1002. There are three possibilities for specifying the server name on
  1003. Windows95:
  1004.    * Use the IP address of the server.
  1005.    * Add a file `windowslmhosts' with the following information:
  1006.           ip hostname
  1007.      For example:
  1008.           194.216.84.21 my_hostname
  1009.    * Configure the PC to use DNS.
  1010. Example of how to fill in the `ODBC setup':
  1011.      Windows DSN name:   test
  1012.      Description:        This is my test database
  1013.      MySql Database:     test
  1014.      Server:             194.216.84.21
  1015.      User:               monty
  1016.      Password:           my_password
  1017.      Port:
  1018. The value for the `Windows DSN name' field is any name that is unique
  1019. in your Windows ODBC setup.
  1020. You don't have to specify values for the `Server', `User', `Password',
  1021. or `Port' fields in the ODBC setup screen.  However, if you do, the
  1022. values will be used as the defaults later when you attempt to make a
  1023. connection.  You have the option of changing the values at that time.
  1024. If the port number is not given, the default port (3306) is used.
  1025. If you specify the option `Read options from C:my.cnf', the groups
  1026. `client' and `odbc' will be read from the `C:my.cnf' file.  You can
  1027. use all options that are usable by `mysql_options()'.  *Note
  1028. `mysql_options': mysql_options.
  1029. How to Report Problems with MyODBC
  1030. ==================================
  1031. *MyODBC* has been tested with Access, Admndemo.exe, C++-Builder,
  1032. Borland Builder 4, Centura Team Developer (formerly Gupta SQL/Windows),
  1033. ColdFusion (on Solaris and NT with svc pack 5), Crystal Reports,
  1034. DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes
  1035. 4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32
  1036. bit, VC++, and Visual Basic.
  1037. If you know of any other applications that work with *MyODBC*, please
  1038. send mail to <myodbc@lists.mysql.com> about this!
  1039. With some programs you may get an error like: `Another user has
  1040. modifies the record that you have modified'. In most cases this can be
  1041. solved by doing one of the following things:
  1042.    * Add a primary key for the table if there isn't one already.
  1043.    * Add a timestamp column if there isn't one already.
  1044.    * Only use double float fields. Some programs may fail when they
  1045.      compare single floats.
  1046. If the above doesn't help, you should do a `MyODBC' trace file and try
  1047. to figure out why things go wrong.
  1048. Programs Known to Work with MyODBC
  1049. ==================================
  1050. Most programs should work with *MyODBC*, but for each of those listed
  1051. below, we have tested it ourselves or received confirmation from some
  1052. user that it works:
  1053. *Program*
  1054.      *Comment*
  1055. Access
  1056.      To make Access work:
  1057.         * If you are using Access 2000, you should get and install the
  1058.           newest Microsoft MDAC (`Microsoft Data Access Components')
  1059.           from `http://www.microsoft.com/data'.  This will fix the
  1060.           following bug in Access: when you export data to *MySQL*, the
  1061.           table and column names aren't specified.  Another way to
  1062.           around this bug is to upgrade to MyODBC Version 2.50.33 and
  1063.           *MySQL* Version 3.23.x, which together provide a workaround
  1064.           for this bug!
  1065.           Note that if you are using *MySQL* Version 3.22, you must to
  1066.           apply the MDAC patch and use MyODBC 2.50.32 or 2.50.34 and
  1067.           above to go around this problem.
  1068.         * Set the "Return matching rows" MyODBC option field when
  1069.           connecting to *MySQL*.
  1070.         * You should have a primary key in the table. If not, new or
  1071.           updated rows may show up as `#Deleted#'.
  1072.         * You should have a timestamp in all tables you want to be able
  1073.           to update.  For maximum portability `TIMESTAMP(14)' or simple
  1074.           `TIMESTAMP' is recommended instead of other `TIMESTAMP(X)'
  1075.           variations.
  1076.         * Only use double float fields. Access fails when comparing
  1077.           with single floats.  The symptom usually is that new or
  1078.           updated rows may show up as `#Deleted#' or that you can't
  1079.           find or update rows.
  1080.         * If you still get the error `Another user has changed your
  1081.           data' after adding a `TIMESTAMP' column, the following trick
  1082.           may help you:
  1083.           Don't use `table' data sheet view. Create instead a form with
  1084.           the fields you want, and use that `form' data sheet view.
  1085.           You should set the `DefaultValue' property for the
  1086.           `TIMESTAMP' column to `NOW()'.  It may be a good idea to hide
  1087.           the `TIMESTAMP' column from view so your users are not
  1088.           confused.
  1089.         * Access on NT will report `BLOB' columns as `OLE OBJECTS'. If
  1090.           you want to have `MEMO' columns instead, you should change the
  1091.           column to `TEXT' with `ALTER TABLE'.
  1092.         * Access can't always handle `DATE' columns properly. If you
  1093.           have a problem with these, change the columns to `DATETIME'.
  1094.         * In some cases, Access may generate illegal SQL queries that
  1095.           *MySQL* can't understand. You can fix this by selecting
  1096.           `"Query|SQLSpecific|Pass-Through"' from the Access menu.
  1097.         * If you have in Access a column defined as BYTE, Access will
  1098.           try to export this as `TINYINT' instead of `TINYINT
  1099.           UNSIGNED'.  This will give you problems if you have values >
  1100.           127 in the column!
  1101. ADO
  1102.      When you are coding with the ADO API and *MyODBC* you need to put
  1103.      attention in some default properties that aren't supported by the
  1104.      *MySQL* server.  For example, using the `CursorLocation Property'
  1105.      as `adUseServer' will return for the `RecordCount Property' a
  1106.      result of -1. To have the right value, you need to set this
  1107.      property to `adUseClient', like is showing in the VB code below:
  1108.           Dim myconn As New ADODB.Connection
  1109.           Dim myrs As New Recordset
  1110.           Dim mySQL As String
  1111.           Dim myrows As Long
  1112.           
  1113.           myconn.Open "DSN=MyODBCsample"
  1114.           mySQL = "SELECT * from user"
  1115.           myrs.Source = mySQL
  1116.           Set myrs.ActiveConnection = myconn
  1117.           myrs.CursorLocation = adUseClient
  1118.           myrs.Open
  1119.           myrows = myrs.RecordCount
  1120.           
  1121.           myrs.Close
  1122.           myconn.Close
  1123.      Another workaround is to use a `SELECT COUNT(*)' statement for a
  1124.      similar query to get the correct row count.
  1125. Borland Builder 4
  1126.      When you start a query you can use the property `Active' or use the
  1127.      method `Open'.  Note that `Active' will start by automatically
  1128.      issuing a `SELECT * FROM ...' query that may not be a good thing if
  1129.      your tables are big!
  1130. ColdFusion (On Unix)
  1131.      The following information is taken from the ColdFusion
  1132.      documentation:
  1133.      Use the following information to configure ColdFusion Server for
  1134.      Linux to use the unixODBC driver with *MyODBC* for *MySQL* data
  1135.      sources.  Allaire has verified that *MyODBC* Version 2.50.26 works
  1136.      with *MySQL* Version 3.22.27 and ColdFusion for Linux. (Any newer
  1137.      version should also work.) You can download *MyODBC* at
  1138.      `http://www.mysql.com/downloads/api-myodbc.html'
  1139.      ColdFusion Version 4.5.1 allows you to us the ColdFusion
  1140.      Administrator to add the *MySQL* data source. However, the driver
  1141.      is not included with ColdFusion Version 4.5.1. Before the *MySQL*
  1142.      driver will appear in the ODBC datasources drop-down list, you
  1143.      must build and copy the *MyODBC* driver to
  1144.      `/opt/coldfusion/lib/libmyodbc.so'.
  1145.      The Contrib directory contains the program mydsn-xxx.zip which
  1146.      allows you to build and remove the DSN registry file for the
  1147.      MyODBC driver on Coldfusion applications.
  1148. DataJunction
  1149.      You have to change it to output `VARCHAR' rather than `ENUM', as
  1150.      it exports the latter in a manner that causes *MySQL* grief.
  1151. Excel
  1152.      Works. Some tips:
  1153.         * If you have problems with dates, try to select them as
  1154.           strings using the `CONCAT()' function. For example:
  1155.                select CONCAT(rise_time), CONCAT(set_time)
  1156.                    from sunrise_sunset;
  1157.           Values retrieved as strings this way should be correctly
  1158.           recognized as time values by Excel97.
  1159.           The purpose of `CONCAT()' in this example is to fool ODBC
  1160.           into thinking the column is of "string type". Without the
  1161.           `CONCAT()', ODBC knows the column is of time type, and Excel
  1162.           does not understand that.
  1163.           Note that this is a bug in Excel, because it automatically
  1164.           converts a string to a time. This would be great if the
  1165.           source was a text file, but is plain stupid when the source
  1166.           is an ODBC connection that reports exact types for each
  1167.           column.
  1168. Word
  1169.      To retrieve data from *MySQL* to Word/Excel documents, you need to
  1170.      use the `MyODBC' driver and the Add-in Microsoft Query help.
  1171.      For example, create a db with a table containing 2 columns of text:
  1172.         * Insert rows using the mysql client command-line tool.
  1173.         * Create a DSN file using the MyODBC driver, for example, my
  1174.           for the db above.
  1175.         * Open the Word application.
  1176.         * Create a blank new documentation.
  1177.         * Using the tool bar called Database, press the button insert
  1178.           database.
  1179.         * Press the button Get Data.
  1180.         * At the right hand of the screen Get Data, press the button Ms
  1181.           Query.
  1182.         * In the Ms Query create a New Data Source using the DSN file
  1183.           my.
  1184.         * Select the new query.
  1185.         * Select the columns that you want.
  1186.         * Make a filter if you want.
  1187.         * Make a Sort if you want.
  1188.         * Select Return Data to Microsoft Word.
  1189.         * Click Finish.
  1190.         * Click Insert data and select the records.
  1191.         * Click OK and you see the rows in your Word document.
  1192. odbcadmin
  1193.      Test program for ODBC.
  1194. Delphi
  1195.      You must use DBE Version 3.2 or newer.  Set the `Don't optimize
  1196.      column width' option field when connecting to *MySQL*.
  1197.      Also, here is some potentially useful Delphi code that sets up
  1198.      both an ODBC entry and a BDE entry for *MyODBC* (the BDE entry
  1199.      requires a BDE Alias Editor that is free at a Delphi Super Page
  1200.      near you. (Thanks to Bryan Brunton <bryan@flesherfab.com> for
  1201.      this):
  1202.           fReg:= TRegistry.Create;
  1203.             fReg.OpenKey('SoftwareODBCODBC.INIDocumentsFab', True);
  1204.             fReg.WriteString('Database', 'Documents');
  1205.             fReg.WriteString('Description', ' ');
  1206.             fReg.WriteString('Driver', 'C:WINNTSystem32myodbc.dll');
  1207.             fReg.WriteString('Flag', '1');
  1208.             fReg.WriteString('Password', '');
  1209.             fReg.WriteString('Port', ' ');
  1210.             fReg.WriteString('Server', 'xmark');
  1211.             fReg.WriteString('User', 'winuser');
  1212.             fReg.OpenKey('SoftwareODBCODBC.INIODBC Data Sources', True);
  1213.             fReg.WriteString('DocumentsFab', 'MySQL');
  1214.             fReg.CloseKey;
  1215.             fReg.Free;
  1216.           
  1217.             Memo1.Lines.Add('DATABASE NAME=');
  1218.             Memo1.Lines.Add('USER NAME=');
  1219.             Memo1.Lines.Add('ODBC DSN=DocumentsFab');
  1220.             Memo1.Lines.Add('OPEN MODE=READ/WRITE');
  1221.             Memo1.Lines.Add('BATCH COUNT=200');
  1222.             Memo1.Lines.Add('LANGDRIVER=');
  1223.             Memo1.Lines.Add('MAX ROWS=-1');
  1224.             Memo1.Lines.Add('SCHEMA CACHE DIR=');
  1225.             Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
  1226.             Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
  1227.             Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
  1228.             Memo1.Lines.Add('SQLQRYMODE=');
  1229.             Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
  1230.             Memo1.Lines.Add('ENABLE BCD=FALSE');
  1231.             Memo1.Lines.Add('ROWSET SIZE=20');
  1232.             Memo1.Lines.Add('BLOBS TO CACHE=64');
  1233.             Memo1.Lines.Add('BLOB SIZE=32');
  1234.           
  1235.             AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
  1236. C++Builder
  1237.      Tested with BDE Version 3.0. The only known problem is that when
  1238.      the table schema changes, query fields are not updated. BDE,
  1239.      however, does not seem to recognize primary keys, only the index
  1240.      PRIMARY, though this has not been a problem.
  1241. Visual Basic
  1242.      To be able to update a table, you must define a primary key for
  1243.      the table.
  1244.      Visual Basic with ADO can't handle big integers. This means that
  1245.      some queries like `SHOW PROCESSLIST' will not work properly.  The
  1246.      fix is to set add the option `OPTION=16834' in the ODBC connect
  1247.      string or set the `Change BIGINT columns to INT' option in the
  1248.      MyODBC connect screen.
  1249. VisualInterDev
  1250.      If you get the error `[Microsoft][ODBC Driver Manager] Driver does
  1251.      not support this parameter' the reason may be that you have a
  1252.      `BIGINT' in your result.  Try setting the `Change BIGINT columns
  1253.      to INT' option in the MyODBC connect screen.
  1254. How to Get the Value of an `AUTO_INCREMENT' Column in ODBC
  1255. ==========================================================
  1256. A common problem is how to get the value of an automatically generated
  1257. ID from an `INSERT'. With ODBC, you can do something like this (assuming
  1258. that `auto' is an `AUTO_INCREMENT' field):
  1259.      INSERT INTO foo (auto,text) VALUES(NULL,'text');
  1260.      SELECT LAST_INSERT_ID();
  1261. Or, if you are just going to insert the ID into another table, you can
  1262. do this:
  1263.      INSERT INTO foo (auto,text) VALUES(NULL,'text');
  1264.      INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
  1265. For the benefit of some ODBC applications (at least Delphi and Access),
  1266. the following query can be used to find a newly inserted row:
  1267.      SELECT * FROM tbl_name WHERE auto IS NULL;
  1268. Reporting Problems with MyODBC
  1269. ==============================
  1270. If you encounter difficulties with *MyODBC*, you should start by making
  1271. a log file from the ODBC manager (the log you get when requesting logs
  1272. from ODBCADMIN) and a *MyODBC* log.
  1273. To get a *MyODBC* log, you need to do the following:
  1274.   1. Ensure that you are using `myodbcd.dll' and not `myodbc.dll'.  The
  1275.      easiest way to do this is to get `myodbcd.dll' from the MyODBC
  1276.      distribution and copy it over the `myodbc.dll', which is probably
  1277.      in your `C:windowssystem32' or `C:winntsystem32' directory.
  1278.      Note that you probably want to restore the old myodbc.dll file
  1279.      when you have finished testing, as this is a lot faster than
  1280.      `myodbcd.dll'.
  1281.   2. Tag the `Trace MyODBC' option flag in the *MyODBC*
  1282.      connect/configure screen.  The log will be written to file
  1283.      `C:myodbc.log'.
  1284.      If the trace option is not remembered when you are going back to
  1285.      the above screen, it means that you are not using the `myodbcd.dll'
  1286.      driver (see above).
  1287.   3. Start your application and try to get it to fail.
  1288. Check the `MyODBC trace file', to find out what could be wrong.  You
  1289. should be able to find out the the issued queries by searching after
  1290. the string `>mysql_real_query' in the `myodbc.log' file.
  1291. You should also try duplicating the queries in the `mysql' monitor or
  1292. `admndemo' to find out if the error is MyODBC or *MySQL*.
  1293. If you find out something is wrong, please only send the relevant rows
  1294. (max 40 rows) to <myodbc@lists.mysql.com>.  Please never send the whole
  1295. MyODBC or ODBC log file!
  1296. If you are unable to find out what's wrong, the last option is to make
  1297. an archive (tar or zip) that contains a MyODBC trace file, the ODBC log
  1298. file, and a README file that explains the problem.  You can send this
  1299. to `ftp://support.mysql.com/pub/mysql/secret'.  Only we at MySQL AB
  1300. will have access to the files you upload, and we will be very discrete
  1301. with the data!
  1302. If you can create a program that also shows this problem, please upload
  1303. this too!
  1304. If the program works with some other SQL server, you should make an
  1305. ODBC log file where you do exactly the same thing in the other SQL
  1306. server.
  1307. Remember that the more information you can supply to us, the more
  1308. likely it is that we can fix the problem!
  1309. Using MySQL with Some Common Programs
  1310. *************************************
  1311. Using MySQL with Apache
  1312. =======================
  1313. The contrib section includes programs that let you authenticate your
  1314. users from a *MySQL* database and also let you log your log files into
  1315. a *MySQL* table. *Note Contrib::.
  1316. You can change the Apache logging format to be easily readable by
  1317. *MySQL* by putting the following into the Apache configuration file:
  1318.      LogFormat 
  1319.              ""%h",%{%Y%m%d%H%M%S}t,%>s,"%b","%{Content-Type}o",  
  1320.              "%U","%{Referer}i","%{User-Agent}i""
  1321. In *MySQL* you can do something like this:
  1322.      LOAD DATA INFILE '/local/access_log' INTO TABLE table_name
  1323.      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\'
  1324. Borland C++
  1325. ===========
  1326. You can compile the *MySQL* windows source with Borland C++ 5.02.  (The
  1327. windows source includes only projects for Microsoft VC++, for Borland
  1328. C++ you have to do the project files yourself).
  1329. One known problem with Borland C++ is that it uses a different structure
  1330. alignment than VC++.  This means that you will run into problems if you
  1331. try to use the default `libmysql.dll' libraries (that was compiled with
  1332. VC++) with Borland C++. You can do one of the following to avoid this
  1333. problem.
  1334.    * You can use the static *MySQL* libraries for Borland C++ that you
  1335.      can find on `http://www.mysql.net/downloads/os-win32.html'.
  1336.    * Only call `mysql_init()' with `NULL' as an argument, not a
  1337.      pre-allocated MYSQL struct.
  1338. Problems and Common Errors
  1339. **************************
  1340. How to Determine What Is Causing Problems
  1341. =========================================
  1342. When you run into problems, the first thing you should do is to find out
  1343. which program / piece of equipment is causing problems:
  1344.    * If you have one of the following symptoms, then it is probably a
  1345.      hardware (like memory, motherboard, CPU, or hard disk) or kernel
  1346.      problem:
  1347.         - The keyboard doesn't work.  This can normally be checked by
  1348.           pressing Caps Lock. If the Caps Lock light doesn't change you
  1349.           have to replace your keyboard.  (Before doing this, you
  1350.           should try to reboot your computer and check all cables to
  1351.           the keyboard.)
  1352.         - The mouse pointer doesn't move.
  1353.         - The machine doesn't answer to a remote machine's pings.
  1354.         - Different, unrelated programs don't behave correctly.
  1355.         - If your system rebooted unexpectedly (a faulty user level
  1356.           program should NEVER be able to take down your system).
  1357.      In this case you should start by checking all your cables and run
  1358.      some diagnostic tool to check your hardware!  You should also
  1359.      check if there are any patches, updates, or service packs for your
  1360.      operating system that could likely solve your problems.  Check
  1361.      also that all your libraries (like glibc) are up to date.
  1362.      It's always good to use a machine with ECC memory to discover
  1363.      memory problems early!
  1364.    * If your keyboard is locked up, you may be able to fix this by
  1365.      logging into your machine from another machine and execute
  1366.      `kbd_mode -a' on it.
  1367.    * Please examine your system log file (/var/log/messages or similar)
  1368.      for reasons for your problems.  If you think the problem is in
  1369.      *MySQL* then you should also examine *MySQL*'s log files. *Note
  1370.      Update log::.
  1371.    * If you don't think you have hardware problems, you should try to
  1372.      find out which program is causing problems.
  1373.      Try using `top', `ps', `taskmanager', or some similar program, to
  1374.      check which program is taking all CPU or is locking the machine.
  1375.    * Check with `top', `df', or a similar program if you are out of
  1376.      memory, disk space, open files, or some other critical resource.
  1377.    * If the problem is some runaway process, you can always try to kill
  1378.      it. If it doesn't want to die, there is probably a bug in the
  1379.      operating system.
  1380. If after you have examined all other possibilities and you have
  1381. concluded that it's the *MySQL* server or a *MySQL* client that is
  1382. causing the problem, it's time to do a bug report for our mailing list
  1383. or our support team.  In the bug report, try to give a very detailed
  1384. description of how the system is behaving and what you think is
  1385. happening. You should also state why you think it's *MySQL* that is
  1386. causing the problems.  Take into consideration all the situations in
  1387. this chapter. State any problems exactly how they appear when you
  1388. examine your system. Use the 'cut and paste' method for any output
  1389. and/or error messages from programs and/or log files!
  1390. Try to describe in detail which program is not working and all symptoms
  1391. you see!  We have in the past received many bug reports that just state
  1392. "the system doesn't work".  This doesn't provide us with any
  1393. information about what could be the problem.
  1394. If a program fails, it's always useful to know:
  1395.    * Has the program in question made a segmentation fault (core
  1396.      dumped)?
  1397.    * Is the program taking the whole CPU? Check with `top'. Let the
  1398.      program run for a while, it may be evaluating something heavy.
  1399.    * If it's the `mysqld' server that is causing problems, can you do
  1400.      `mysqladmin -u root ping' or `mysqladmin -u root processlist'?
  1401.    * What does a client program say (try with `mysql', for example)
  1402.      when you try to connect to the *MySQL* server?  Does the client
  1403.      jam?  Do you get any output from the program?
  1404. When sending a bug report, you should of follow the outlines described
  1405. in this manual. *Note Asking questions::.
  1406. What to Do if MySQL Keeps Crashing
  1407. ==================================
  1408. All *MySQL* versions are tested on many platforms before they are
  1409. released.  This doesn't mean that there aren't any bugs in *MySQL*, but
  1410. it means if there are bugs, they are very few and can be hard to find.
  1411. If you have a problem, it will always help if you try to find out
  1412. exactly what crashes your system, as you will have a much better chance
  1413. of getting this fixed quickly.
  1414. First, you should try to find out whether the problem is that the
  1415. `mysqld' daemon dies or whether your problem has to do with your
  1416. client.  You can check how long your `mysqld' server has been up by
  1417. executing `mysqladmin version'.  If `mysqld' has died, you may find the
  1418. reason for this in the file `mysql-data-directory/`hostname`.err'.
  1419. *Note Error log::.
  1420. Many crashes of *MySQL* are caused by corrupted index / data files.
  1421. *MySQL* will update the data on disk, with the `write()' system call,
  1422. after every SQL statement and before the client is notified about the
  1423. result. (This is not true if you are running with `delayed_key_writes',
  1424. in which case only the data is written.)  This means that the data is
  1425. safe even if mysqld crashes, as the OS will ensure that the not flushed
  1426. data is written to disk.  You can force *MySQL* to sync everything to
  1427. disk after every SQL command by starting `mysqld' with `--flush'.
  1428. The above means that normally you shouldn't get corrupted tables unless:
  1429.    * Someone/something killed `mysqld' or the machine in the middle of
  1430.      an update.
  1431.    * You have found a bug in `mysqld' that caused it to die in the
  1432.      middle of an update.
  1433.    * Someone is manipulating the data/index files outside of *mysqld*
  1434.      without locking the table properly.
  1435.    * If you are running many `mysqld' servers on the same data on a
  1436.      system that doesn't support good file system locks (normally
  1437.      handled by the `lockd' deamon ) or if you are running multiple
  1438.      servers with `--skip-locking'
  1439.    * You have a crashed index/data file that contains very wrong data
  1440.      that got mysqld confused.
  1441.    * You have found a bug in the data storage code. This isn't that
  1442.      likely, but it's at least possible.  In this case you can try to
  1443.      change the file type to another database handler by using `ALTER
  1444.      TABLE' on a repaired copy of the table!
  1445. Because it is very difficult to know why something is crashing, first
  1446. try to check whether or not things that work for others crash for you.
  1447. Please try the following things:
  1448.    * Take down the `mysqld' daemon with `mysqladmin shutdown', run
  1449.      `myisamchk --silent --force */*.MYI' on all tables, and restart the
  1450.      `mysqld' daemon.  This will ensure that you are running from a
  1451.      clean state.  *Note Maintenance::.
  1452.    * Use `mysqld --log' and try to determine from the information in
  1453.      the log whether or not some specific query kills the server. About
  1454.      95% of all bugs are related to a particular query!  Normally this
  1455.      is one of the last queries in the log file just before *MySQL*
  1456.      restarted. *Note Query log::.  If you can repeatadly kill *MySQL*
  1457.      with one of the queries, even when you have checked all tables
  1458.      just before doing the query, then you have been able to locate the
  1459.      bug and should do a bug report for this!  *Note Bug reports::.
  1460.    * Try to make a test case that we can use to reproduce the problem.
  1461.      *Note Reproducable test case::.
  1462.    * Try running the included mysql-test test and the *MySQL*
  1463.      benchmarks.  *Note MySQL test suite::.  They should test *MySQL*
  1464.      rather well.  You can also add code that to the benchmarks to
  1465.      simulates your application!  The benchmarks can be found in the
  1466.      `bench' directory in the source distribution or, for a binary
  1467.      distribution, in the `sql-bench' directory under your *MySQL*
  1468.      installation directory.
  1469.    * Try `fork_test.pl' and `fork2_test.pl'.
  1470.    * If you configure *MySQL* for debugging, it will be much easier to
  1471.      gather information about possible errors if something goes wrong.
  1472.      Reconfigure *MySQL* with the `--with-debug' option to `configure'
  1473.      and then recompile.  *Note Debugging server::.
  1474.    * Configuring *MySQL* for debugging causes a safe memory allocator
  1475.      to be included that can find some errors. It also provides a lot
  1476.      of output about what is happening.
  1477.    * Have you applied the latest patches for your operating system?
  1478.    * Use the `--skip-locking' option to `mysqld'.  On some systems, the
  1479.      `lockd' lock manager does not work properly; the `--skip-locking'
  1480.      option tells `mysqld' not to use external locking.  (This means
  1481.      that you cannot run 2 `mysqld' servers on the same data and that
  1482.      you must be careful if you use `myisamchk', but it may be
  1483.      instructive to try the option as a test.)
  1484.    * Have you tried `mysqladmin -u root processlist' when `mysqld'
  1485.      appears to be running but not responding?  Sometimes `mysqld' is
  1486.      not comatose even though you might think so.  The problem may be
  1487.      that all connections are in use, or there may be some internal
  1488.      lock problem.  `mysqladmin processlist' will usually be able to
  1489.      make a connection even in these cases, and can provide useful
  1490.      information about the current number of connections and their
  1491.      status.
  1492.    * Run the command `mysqladmin -i 5 status' or `mysqladmin -i 5 -r
  1493.      status' or in a separate window to produce statistics while you run
  1494.      your other queries.
  1495.    * Try the following:
  1496.        1. Start `mysqld' from `gdb' (or in another debugger).
  1497.        2. Run your test scripts.
  1498.        3. Print the backtrace and the local variables at the 3 lowest
  1499.           levels. In gdb you can do this with the following commands
  1500.           when `mysqld' has crashed inside gdb:
  1501.                backtrace
  1502.                info local
  1503.                up
  1504.                info local
  1505.                up
  1506.                info local
  1507.           With gdb you can also examine which threads exist with `info
  1508.           threads' and switch to a specific thread with `thread #',
  1509.           where `#' is the thread id.
  1510.    * Try to simulate your application with a Perl script to force
  1511.      *MySQL* to crash or misbehave.
  1512.    * Send a normal bug report. *Note Bug reports::. Be even more
  1513.      detailed than usual.  Because *MySQL* works for many people, it
  1514.      may be that the crash results from something that exists only on
  1515.      your computer (for example, an error that is related to your
  1516.      particular system libraries).
  1517.    * If you have a problem with tables with dynamic-length rows and you
  1518.      are not using `BLOB/TEXT' columns (but only `VARCHAR' columns), you
  1519.      can try to change all `VARCHAR' to `CHAR' with `ALTER TABLE'.
  1520.      This will force *MySQL* to use fixed-size rows.  Fixed-size rows
  1521.      take a little extra space, but are much more tolerant to
  1522.      corruption!
  1523.      The current dynamic row code has been in use at MySQL AB for at
  1524.      least 3 years without any problems, but by nature dynamic-length
  1525.      rows are more prone to errors, so it may be a good idea to try the
  1526.      above to see if it helps!
  1527. Problems When Linking with the MySQL Client Library
  1528. ===================================================
  1529. If you are linking your program and you get errors for unreferenced
  1530. symbols that start with `mysql_', like the following:
  1531.      /tmp/ccFKsdPa.o: In function `main':
  1532.      /tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init'
  1533.      /tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect'
  1534.      /tmp/ccFKsdPa.o(.text+0x57): undefined reference to `mysql_real_connect'
  1535.      /tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error'
  1536.      /tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
  1537. you should be able to solve this by adding `-Lpath-to-the-mysql-library
  1538. -lmysqlclient' *LAST* on your link line.
  1539. If you get `undefined reference' errors for the `uncompress' or
  1540. `compress' function, add `-lgz' *LAST* on your link line and try again!
  1541. If you get `undefined reference' errors for functions that should exist
  1542. on your system, like `connect', check the man page for the function in
  1543. question, for which libraries you should add to the link line!
  1544. If you get `undefined reference' errors for functions that don't exist
  1545. on your system, like the following:
  1546.      mf_format.o(.text+0x201): undefined reference to `__lxstat'
  1547. it usually means that your library is compiled on a system that is not
  1548. 100 % compatible with yours.  In this case you should download the
  1549. latest *MySQL* source distribution and compile this yourself.  *Note
  1550. Installing source::.
  1551. If you are trying to run a program and you then get errors for
  1552. unreferenced symbols that start with `mysql_' or that the `mysqlclient'
  1553. library can't be found, this means that your system can't find the
  1554. share `libmysqlclient.so' library.
  1555. The fix for this is to tell your system to search after shared
  1556. libraries where the library is located by one of the following methods:
  1557.    * Add the path to the directory where you have `libmysqlclient.so'
  1558.      the `LD_LIBRARY_PATH' environment variable.
  1559.    * Add the path to the directory where you have `libmysqlclient.so'
  1560.      the `LD_LIBRARY' environment variable.
  1561.    * Copy `libmysqlclient.so' to some place that is searched by your
  1562.      system, like `/lib', and update the shared library information by
  1563.      executing `ldconfig'.
  1564. Another way to solve this problem is to link your program statically,
  1565. with `-static', or by removing the dynamic *MySQL* libraries before
  1566. linking your code. In the second case you should be sure that no other
  1567. programs are using the dynamic libraries!
  1568. Some Common Errors When Using MySQL
  1569. ===================================
  1570. `Access denied' Error
  1571. ---------------------
  1572. *Note Privileges::, and especially see *Note Access denied::.
  1573. `MySQL server has gone away' Error
  1574. ----------------------------------
  1575. This section also covers the related `Lost connection to server during
  1576. query' error.
  1577. The most common reason for the `MySQL server has gone away' error is
  1578. that the server timed out and closed the connection. By default, the
  1579. server closes the connection after 8 hours if nothing has happened. You
  1580. can change the time limit by setting the `wait_timeout' variable when
  1581. you start mysqld.
  1582. You can check that the *MySQL* hasn't died by executing `mysqladmin
  1583. version' and examining the uptime.
  1584. If you have a script, you just have to issue the query again for the
  1585. client to do an automatic reconnection.
  1586. You normally can get the following error codes in this case (which one
  1587. you get is OS-dependent):
  1588. `CR_SERVER_GONE_ERROR' The client couldn't send a question to the server.
  1589. `CR_SERVER_LOST'       The client didn't get an error when writing to
  1590.                        the server, but it didn't get a full answer (or
  1591.                        any answer) to the question.
  1592. You can also get these errors if you send a query to the server that is
  1593. incorrect or too large. If `mysqld' gets a packet that is too large or
  1594. out of order, it assumes that something has gone wrong with the client
  1595. and closes the connection.  If you need big queries (for example, if
  1596. you are working with big `BLOB' columns), you can increase the query
  1597. limit by starting `mysqld' with the `-O max_allowed_packet=#' option
  1598. (default 1M). The extra memory is allocated on demand, so `mysqld' will
  1599. use more memory only when you issue a big query or when `mysqld' must
  1600. return a big result row!
  1601. `Can't connect to [local] MySQL server' error
  1602. ---------------------------------------------
  1603. A *MySQL* client on Unix can connect to the `mysqld' server in two
  1604. different ways: Unix sockets, which connect through a file in the file
  1605. system (default `/tmp/mysqld.sock') or TCP/IP, which connects through a
  1606. port number.  Unix sockets are faster than TCP/IP but can only be used
  1607. when connecting to a server on the same computer.  Unix sockets are
  1608. used if you don't specify a hostname or if you specify the special
  1609. hostname `localhost'.
  1610. On Windows you can connect only with TCP/IP if the `mysqld' server is
  1611. running on Win95/Win98. If it's running on NT, you can also connect
  1612. with named pipes.  The name of the named pipe is *MySQL*.  If you don't
  1613. give a hostname when connecting to `mysqld', a *MySQL* client will
  1614. first try to connect to the named pipe, and if this doesn't work it
  1615. will connect to the TCP/IP port.  You can force the use of named pipes
  1616. on Windows by using `.' as the hostname.
  1617. The error (2002) `Can't connect to ...' normally means that there isn't
  1618. a *MySQL* server running on the system or that you are using a wrong
  1619. socket file or TCP/IP port when trying to connect to the `mysqld'
  1620. server.
  1621. Start by checking (using `ps' or the task manager on Windows) that
  1622. there is a process running named `mysqld' on your server!  If there
  1623. isn't any `mysqld' process, you should start one. *Note Starting
  1624. server::.
  1625. If a `mysqld' process is running, you can check the server by trying
  1626. these different connections (the port number and socket pathname might
  1627. be different in your setup, of course):
  1628.      shell> mysqladmin version
  1629.      shell> mysqladmin variables
  1630.      shell> mysqladmin -h `hostname` version variables
  1631.      shell> mysqladmin -h `hostname` --port=3306 version
  1632.      shell> mysqladmin -h 'ip for your host' version
  1633.      shell> mysqladmin --socket=/tmp/mysql.sock version
  1634. Note the use of backquotes rather than forward quotes with the
  1635. `hostname' command; these cause the output of `hostname' (that is, the
  1636. current hostname) to be substituted into the `mysqladmin' command.
  1637. Here are some reasons the `Can't connect to local MySQL server' error
  1638. might occur:
  1639.    * `mysqld' is not running.
  1640.    * You are running on a system that uses MIT-pthreads.  If you are
  1641.      running on a system that doesn't have native threads, `mysqld'
  1642.      uses the MIT-pthreads package.  *Note Which OS::.  However, all
  1643.      MIT-pthreads versions doesn't support Unix sockets. On a system
  1644.      without sockets support you must always specify the hostname
  1645.      explicitly when connecting to the server. Try using this command
  1646.      to check the connection to the server:
  1647.           shell> mysqladmin -h `hostname` version
  1648.    * Someone has removed the Unix socket that `mysqld' uses (default
  1649.      `/tmp/mysqld.sock').  You might have a `cron' job that removes the
  1650.      *MySQL* socket (for example, a job that removes old files from the
  1651.      `/tmp' directory).  You can always run `mysqladmin version' and
  1652.      check that the socket `mysqladmin' is trying to use really exists.
  1653.      The fix in this case is to change the `cron' job to not remove
  1654.      `mysqld.sock' or to place the socket somewhere else. You can
  1655.      specify a different socket location at *MySQL* configuration time
  1656.      with this command:
  1657.           shell> ./configure --with-unix-socket-path=/path/to/socket
  1658.      You can also start `safe_mysqld' with the
  1659.      `--socket=/path/to/socket' option and set the environment variable
  1660.      `MYSQL_UNIX_PORT' to the socket pathname before starting your
  1661.      *MySQL* clients.
  1662.    * You have started the `mysqld' server with the
  1663.      `--socket=/path/to/socket' option.  If you change the socket
  1664.      pathname for the server, you must also notify the *MySQL* clients
  1665.      about the new path. You can do this by setting the environment
  1666.      variable `MYSQL_UNIX_PORT' to the socket pathname or by providing
  1667.      the socket path as an argument to the clients. You can test the
  1668.      socket with this command:
  1669.           shell> mysqladmin --socket=/path/to/socket version
  1670.    * You are using Linux and one thread has died (core dumped).  In
  1671.      this case you must kill the other `mysqld' threads (for example,
  1672.      with the `mysql_zap' script before you can start a new *MySQL*
  1673.      server.  *Note Crashing::.
  1674.    * You may not have read and write privilege to either the directory
  1675.      that holds the socket file or privilege to the socket file itself.
  1676.      In this case you have to either change the privilege for the
  1677.      directory / file or restart `mysqld' so that it uses a directory
  1678.      that you can access.
  1679. If you get the error message `Can't connect to MySQL server on
  1680. some_hostname', you can try the following things to find out what the
  1681. problem is :
  1682.    * Check if the server is up by doing `telnet your-host-name
  1683.      tcp-ip-port-number' and press `RETURN' a couple of times.  If there
  1684.      is a *MySQL* server running on this port you should get a
  1685.      responses that includes the version number of the running *MySQL*
  1686.      server.  If you get an error like `telnet: Unable to connect to
  1687.      remote host: Connection refused', then there is no server running
  1688.      on the given port.
  1689.    * Try connecting to the `mysqld' daemon on the local machine and
  1690.      check the TCP/IP port that mysqld it's configured to use (variable
  1691.      `port') with `mysqladmin variables'.
  1692.    * Check that your `mysqld' server is not started with the
  1693.      `--skip-networking' option.
  1694. `Host '...' is blocked' Error
  1695. -----------------------------
  1696. If you get an error like this:
  1697.      Host 'hostname' is blocked because of many connection errors.
  1698.      Unblock with 'mysqladmin flush-hosts'
  1699. this means that `mysqld' has gotten a lot (`max_connect_errors') of
  1700. connect requests from the host `'hostname'' that have been interrupted
  1701. in the middle. After `max_connect_errors' failed requests, `mysqld'
  1702. assumes that something is wrong (like an attack from a cracker), and
  1703. blocks the site from further connections until someone executes the
  1704. command `mysqladmin flush-hosts'.
  1705. By default, `mysqld' blocks a host after 10 connection errors.  You can
  1706. easily adjust this by starting the server like this:
  1707.      shell> safe_mysqld -O max_connect_errors=10000 &
  1708. Note that if you get this error message for a given host, you should
  1709. first check that there isn't anything wrong with TCP/IP connections
  1710. from that host.  If your TCP/IP connections aren't working, it won't do
  1711. you any good to increase the value of the `max_connect_errors' variable!
  1712. `Too many connections' Error
  1713. ----------------------------
  1714. If you get the error `Too many connections' when you try to connect to
  1715. *MySQL*, this means that there is already `max_connections' clients
  1716. connected to the `mysqld' server.
  1717. If you need more connections than the default (100), then you should
  1718. restart `mysqld' with a bigger value for the `max_connections' variable.
  1719. Note that `mysqld' actually allows (`max_connections'+1) clients to
  1720. connect.  The last connection is reserved for a user with the *process*
  1721. privilege.  By not giving this privilege to normal users (they
  1722. shouldn't need this), an administrator with this privilege can log in
  1723. and use `SHOW PROCESSLIST' to find out what could be wrong. *Note
  1724. SHOW::.
  1725. The maximum number of connects *MySQL* is depending on how good the
  1726. thread library is on a given platform. Linux or Solaris should be able
  1727. to support 500-1000 simultaneous connections, depending on how much RAM
  1728. you have and what your clients are doing.
  1729. `Some non-transactional changed tables couldn't be rolled back' Error
  1730. ---------------------------------------------------------------------
  1731. If you get the error/warning: `Warning: Some non-transactional changed
  1732. tables couldn't be rolled back' when trying to do a `ROLLBACK', this
  1733. means that some of the tables you used in the transaction didn't
  1734. support transactions.  These non-transactional tables will not be
  1735. affected by the `ROLLBACK' statement.
  1736. The most typical case when this happens is when you have tried to create
  1737. a table of a type that is not supported by your `mysqld' binary.  If
  1738. `mysqld' doesn't support a table type (or if the table type is disabled
  1739. by a startup option) , it will instead create the table type with the
  1740. table type that is most resembles to the one you requested, probably
  1741. `MyISAM'.
  1742. You can check the table type for a table by doing:
  1743. `SHOW TABLE STATUS LIKE 'table_name''. *Note SHOW TABLE STATUS::.
  1744. You can check the extensions your `mysqld' binary supports by doing:
  1745. `show variables like 'have_%''. *Note SHOW VARIABLES::.
  1746. `Out of memory' Error
  1747. ---------------------
  1748. If you issue a query and get something like the following error:
  1749.      mysql: Out of memory at line 42, 'malloc.c'
  1750.      mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
  1751.      ERROR 2008: MySQL client ran out of memory
  1752. note that the error refers to the *MySQL* client `mysql'. The reason
  1753. for this error is simply that the client does not have enough memory to
  1754. store the whole result.
  1755. To remedy the problem, first check that your query is correct. Is it
  1756. reasonable that it should return so many rows?  If so, you can use
  1757. `mysql --quick', which uses `mysql_use_result()' to retrieve the result
  1758. set.  This places less of a load on the client (but more on the server).
  1759. `Packet too large' Error
  1760. ------------------------
  1761. When a *MySQL* client or the `mysqld' server gets a packet bigger than
  1762. `max_allowed_packet' bytes, it issues a `Packet too large' error and
  1763. closes the connection.
  1764. If you are using the `mysql' client, you may specify a bigger buffer by
  1765. starting the client with `mysql --set-variable=max_allowed_packet=8M'.
  1766. If you are using other clients that do not allow you to specify the
  1767. maximum packet size (such as `DBI'), you need to set the packet size
  1768. when you start the server.  You cau use a command-line option to
  1769. `mysqld' to set `max_allowed_packet' to a larger size.  For example, if
  1770. you are expecting to store the full length of a `BLOB' into a table,
  1771. you'll need to start the server with the
  1772. `--set-variable=max_allowed_packet=16M' option.
  1773. Communication Errors / Aborted Connection
  1774. -----------------------------------------
  1775. If you find errors like the following in your error log.
  1776.      010301 14:38:23  Aborted connection 854 to db: 'users' user: 'josh'
  1777. *Note Error log::.
  1778. This means that something of the following has happened:
  1779.    * The client program did not call `mysql_close()' before exit.
  1780.    * The client had been sleeping more than `wait_timeout' or
  1781.      `interactive_timeout' without doing any requests. *Note SHOW
  1782.      VARIABLES::.
  1783.    * The client program ended abruptly in the middle of the transfer.
  1784. When the above happens, the server variable `Aborted_clients' is
  1785. incremented.
  1786. The server variable `Aborted_connects' is incremented when:
  1787.    * When a connection packet doesn't contain the right information.
  1788.    * When the user didn't have privileges to connect to a database.
  1789.    * When a user uses a wrong password.
  1790.    * When it takes more than `connect_timeout' seconds to get a connect
  1791.      package.
  1792. Note that the above could indicate that someone is trying to break into
  1793. your database!
  1794. *Note SHOW VARIABLES::.
  1795. Other reason for problems with Aborted clients / Aborted connections.
  1796.    * Usage of duplex Ethernet protocol, both half and full with Linux.
  1797.      Many Linux Ethernet drivers have this bug. You should test for
  1798.      this bug by transferring a huge file via ftp between these two
  1799.      machines. If a transfer goes in burst-pause-burst-pause ... mode
  1800.      then you are experiencing a Linux duplex syndrome. The only
  1801.      solution to this problem is switching of both half and full
  1802.      duplexing on hubs and switches.
  1803.    * Some problem with the thread library that causes interrupts on
  1804.      reads.
  1805.    * Badly configured TCP/IP.
  1806.    * Faulty Ethernets or hubs or switches, cables ... This can be
  1807.      diagnosed properly only by replacing hardware.
  1808. `The table is full' Error
  1809. -------------------------
  1810. This error occurs in older *MySQL* versions when an in-memory temporary
  1811. table becomes larger than `tmp_table_size' bytes. To avoid this
  1812. problem, you can use the `-O tmp_table_size=#' option to `mysqld' to
  1813. increase the temporary table size or use the SQL option
  1814. `SQL_BIG_TABLES' before you issue the problematic query. *Note `SET
  1815. OPTION': SET OPTION.
  1816. You can also start `mysqld' with the `--big-tables' option.  This is
  1817. exactly the same as using `SQL_BIG_TABLES' for all queries.
  1818. In *MySQL* Version 3.23, in-memory temporary tables will automatically
  1819. be converted to a disk-based `MyISAM' table after the table size gets
  1820. bigger than `tmp_table_size'.
  1821. `Can't create/write to file' Error
  1822. ----------------------------------
  1823. If you get an error for some queries of type:
  1824.      Can't create/write to file '\sqla3fe_0.ism'.
  1825. this means that *MySQL* can't create a temporary file for the result
  1826. set in the given temporary directory. (The above error is a typical
  1827. error message on Windows, and the Unix error message is similar.)  The
  1828. fix is to start mysqld with `--tmpdir=path' or to add to your option
  1829. file:
  1830.      [mysqld]
  1831.      tmpdir=C:/temp
  1832. assuming that the `c:\temp' directory exists. *Note Option files::.
  1833. Check also the error code that you get with `perror'. One reason may
  1834. also be a disk full error;
  1835.      shell> perror 28
  1836.      Error code  28:  No space left on device
  1837. `Commands out of sync' Error in Client
  1838. --------------------------------------
  1839. If you get `Commands out of sync; You can't run this command now' in
  1840. your client code, you are calling client functions in the wrong order!
  1841. This can happen, for example, if you are using `mysql_use_result()' and
  1842. try to execute a new query before you have called `mysql_free_result()'.
  1843. It can also happen if you try to execute two queries that return data
  1844. without a `mysql_use_result()' or `mysql_store_result()' in between.
  1845. `Ignoring user' Error
  1846. ---------------------
  1847. If you get the following error:
  1848. `Found wrong password for user: 'some_user@some_host'; Ignoring user'
  1849. this means that when `mysqld' was started or when it reloaded the
  1850. permissions tables, it found an entry in the `user' table with an
  1851. invalid password.  As a result, the entry is simply ignored by the
  1852. permission system.
  1853. Possible causes of and fixes for this problem:
  1854.    * You may be running a new version of `mysqld' with an old `user'
  1855.      table.  You can check this by executing `mysqlshow mysql user' to
  1856.      see if the password field is shorter than 16 characters. If so,
  1857.      you can correct this condition by running the
  1858.      `scripts/add_long_password' script.
  1859.    * The user has an old password (8 chararacters long) and you didn't
  1860.      start `mysqld' with the `--old-protocol' option.  Update the user
  1861.      in the `user' table with a new password or restart `mysqld' with
  1862.      `--old-protocol'.
  1863.    * You have specified a password in the `user' table without using the
  1864.      `PASSWORD()' function.  Use `mysql' to update the user in the
  1865.      `user' table with a new password. Make sure to use the `PASSWORD()'
  1866.      function:
  1867.           mysql> update user set password=PASSWORD('your password')
  1868.                      where user='XXX';
  1869. `Table 'xxx' doesn't exist' Error
  1870. ---------------------------------
  1871. If you get the error `Table 'xxx' doesn't exist' or `Can't find file:
  1872. 'xxx' (errno: 2)', this means that no table exists in the current
  1873. database with the name `xxx'.
  1874. Note that as *MySQL* uses directories and files to store databases and
  1875. tables, the database and table names are *case sensitive*!  (On Windows
  1876. the databases and tables names are not case sensitive, but all
  1877. references to a given table within a query must use the same case!)
  1878. You can check which tables you have in the current database with `SHOW
  1879. TABLES'. *Note `SHOW': SHOW.
  1880. `Cant' initialize character set xxx' error.
  1881. -------------------------------------------
  1882. If you get an error like:
  1883.      MySQL Connection Failed: Can't initialize character set xxx
  1884. This means one of the following things:
  1885.    * The character set is a multi-byte character set and you have not
  1886.      support for the character set in the client.
  1887.      In this case you need to recompile the client with
  1888.      `--with-charset=xxx' or with `--with-extra-charsets=xxx'.  *Note
  1889.      configure options::.
  1890.      All standard *MySQL* binaries are compiled with
  1891.      `--with-extra-character-sets=complex' which will enable support for
  1892.      all multi-byte character sets. *Note Character sets::.
  1893.    * The character set is a simple character set which is not compiled
  1894.      into `mysqld' and the character set definition files is not in the
  1895.      place where the client expect to find them.
  1896.      In this case you need to:
  1897.         * Recompile the client with support for the character set.
  1898.           *Note configure options::.
  1899.         * Specify to the client where the character set definition
  1900.           files are. For many client you can do this with the
  1901.           `--character-sets-dir=path-to-charset-dir' option.
  1902.         * Copy the character definition files to the path where the
  1903.           client expect them to be.
  1904. How MySQL Handles a Full Disk
  1905. =============================
  1906. When a disk-full condition occurs, *MySQL* does the following:
  1907.    * It checks once every minute to see whether or not there is enough
  1908.      space to write the current row. If there is enough space, it
  1909.      continues as if nothing had happened.
  1910.    * Every 6 minutes it writes an entry to the log file warning about
  1911.      the disk full condition.
  1912. To alleviate the problem, you can take the following actions:
  1913.    * To continue, you only have to free enough disk space to insert all
  1914.      records.
  1915.    * To abort the thread, you must send a `mysqladmin kill' to the
  1916.      thread.  The thread will be aborted the next time it checks the
  1917.      disk (in 1 minute).
  1918.    * Note that other threads may be waiting for the table that caused
  1919.      the disk full condition.  If you have several "locked" threads,
  1920.      killing the one thread that is waiting on the disk-full condition
  1921.      will allow the other threads to continue.
  1922. How to Run SQL Commands from a Text File
  1923. ========================================
  1924. The `mysql' client typically is used interactively, like this:
  1925.      shell> mysql database
  1926. However, it's also possible to put your SQL commands in a file and tell
  1927. `mysql' to read its input from that file.  To do so, create a text file
  1928. `text_file' that contains the commands you wish to execute.  Then
  1929. invoke `mysql' as shown below:
  1930.      shell> mysql database < text_file
  1931. You can also start your text file with a `USE db_name' statement.  In
  1932. this case, it is unnecessary to specify the database name on the command
  1933. line:
  1934.      shell> mysql < text_file
  1935. *Note Programs::.
  1936. Where MySQL Stores Temporary Files
  1937. ==================================
  1938. *MySQL* uses the value of the `TMPDIR' environment variable as the
  1939. pathname of the directory in which to store temporary files.  If you
  1940. don't have `TMPDIR' set, *MySQL* uses the system default, which is
  1941. normally `/tmp' or `/usr/tmp'.  If the file system containing your
  1942. temporary file directory is too small, you should edit `safe_mysqld' to
  1943. set `TMPDIR' to point to a directory in a file system where you have
  1944. enough space!  You can also set the temporary directory using the
  1945. `--tmpdir' option to `mysqld'.
  1946. *MySQL* creates all temporary files as hidden files. This ensures that
  1947. the temporary files will be removed if `mysqld' is terminated.  The
  1948. disadvantage of using hidden files is that you will not see a big
  1949. temporary file that fills up the file system in which the temporary
  1950. file directory is located.
  1951. When sorting (`ORDER BY' or `GROUP BY'), *MySQL* normally uses one or
  1952. two temporary files. The maximum disk-space needed is:
  1953.      (length of what is sorted + sizeof(database pointer))
  1954.      * number of matched rows
  1955.      * 2
  1956. `sizeof(database pointer)' is usually 4, but may grow in the future for
  1957. really big tables.
  1958. For some `SELECT' queries, *MySQL* also creates temporary SQL tables.
  1959. These are not hidden and have names of the form `SQL_*'.
  1960. `ALTER TABLE' creates a temporary table in the same directory as the
  1961. original table.
  1962. How to Protect `/tmp/mysql.sock' from Being Deleted
  1963. ===================================================
  1964. If you have problems with the fact that anyone can delete the *MySQL*
  1965. communication socket `/tmp/mysql.sock', you can, on most versions of
  1966. Unix, protect your `/tmp' file system by setting the `sticky' bit on
  1967. it.  Log in as `root' and do the following:
  1968.      shell> chmod +t /tmp
  1969. This will protect your `/tmp' file system so that files can be deleted
  1970. only by their owners or the superuser (`root').
  1971. You can check if the `sticky' bit is set by executing `ls -ld /tmp'.
  1972. If the last permission bit is `t', the bit is set.
  1973. How to Run MySQL As a Normal User
  1974. =================================
  1975. The *MySQL* server `mysqld' can be started and run by any user.  In
  1976. order to change `mysqld' to run as a Unix user `user_name', you must do
  1977. the following:
  1978.   1. Stop the server if it's running (use `mysqladmin shutdown').
  1979.   2. Change the database directories and files so that `user_name' has
  1980.      privileges to read and write files in them (you may need to do
  1981.      this as the Unix `root' user):
  1982.           shell> chown -R user_name /path/to/mysql/datadir
  1983.      If directories or files within the *MySQL* data directory are
  1984.      symlinks, you'll also need to follow those links and change the
  1985.      directories and files they point to.  `chown -R' may not follow
  1986.      symlinks for you.
  1987.   3. Start the server as user `user_name', or, if you are using *MySQL*
  1988.      Version 3.22 or later, start `mysqld' as the Unix `root' user and
  1989.      use the `--user=user_name' option.  `mysqld' will switch to run as
  1990.      the Unix user `user_name' before accepting any connections.
  1991.   4. If you are using the `mysql.server' script to start `mysqld' when
  1992.      the system is rebooted, you should edit `mysql.server' to use `su'
  1993.      to run `mysqld' as user `user_name', or to invoke `mysqld' with
  1994.      the `--user' option.  (No changes to `safe_mysqld' are necessary.)
  1995. At this point, your `mysqld' process should be running fine and dandy as
  1996. the Unix user `user_name'. One thing hasn't changed, though: the
  1997. contents of the permissions tables. By default (right after running the
  1998. permissions table install script `mysql_install_db'), the *MySQL* user
  1999. `root' is the only user with permission to access the `mysql' database
  2000. or to create or drop databases.  Unless you have changed those
  2001. permissions, they still hold. This shouldn't stop you from accessing
  2002. *MySQL* as the *MySQL* `root' user when you're logged in as a Unix user
  2003. other than `root'; just specify the `-u root' option to the client
  2004. program.
  2005. Note that accessing *MySQL* as `root', by supplying `-u root' on the
  2006. command line, has _nothing_ to do with *MySQL* running as the Unix
  2007. `root' user, or, indeed, as another Unix user. The access permissions
  2008. and user names of *MySQL* are completely separate from Unix user names.
  2009. The only connection with Unix user names is that if you don't provide a
  2010. `-u' option when you invoke a client program, the client will try to
  2011. connect using your Unix login name as your *MySQL* user name.
  2012. If your Unix box itself isn't secured, you should probably at least put
  2013. a password on the *MySQL* `root' users in the access tables.
  2014. Otherwise, any user with an account on that machine can run `mysql -u
  2015. root db_name' and do whatever he likes.
  2016. How to Reset a Forgotten Password
  2017. =================================
  2018. If you have forgotten the `root' user password for *MySQL*, you can
  2019. restore it with the following procedure:
  2020.   1. Take down the mysqld server by sending a `kill' (not `kill -9') to
  2021.      the `mysqld' server.  The pid is stored in a `.pid' file, which is
  2022.      normally in the *MySQL* database directory:
  2023.           kill `cat /mysql-data-directory/hostname.pid`
  2024.      You must be either the Unix `root' user or the same user the server
  2025.      runs as to do this.
  2026.   2. Restart `mysqld' with the `--skip-grant-tables' option.
  2027.   3. Connect to the mysqld server with `mysql -h hostname mysql' and
  2028.      change the password with a `GRANT' command. *Note `GRANT': GRANT.
  2029.      You can also do this with `mysqladmin -h hostname -u user password
  2030.      'new password''
  2031.   4. Load the privilege tables with: `mysqladmin -h hostname
  2032.      flush-privileges' or with the SQL command `FLUSH PRIVILEGES'.
  2033. Note that after you started `mysqld' with `--skip-grant-tables', any
  2034. usage of `GRANT' commands will give you an `Unknown command' error
  2035. until you have executed `FLUSH PRIVILEGES'.
  2036. Problems with File Permissions
  2037. ==============================
  2038. If you have problems with file permissions, for example, if `mysql'
  2039. issues the following error message when you create a table:
  2040.      ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
  2041. then the environment variable `UMASK' might be set incorrectly when
  2042. `mysqld' starts up.  The default umask value is `0660'. You can change
  2043. this behavior by starting `safe_mysqld' as follows:
  2044.      shell> UMASK=384  # = 600 in octal
  2045.      shell> export UMASK
  2046.      shell> /path/to/safe_mysqld &
  2047. By default *MySQL* will create database and `RAID' directories with
  2048. permission type 0700.  You can modify this behavior by setting the
  2049. `UMASK_DIR' variable. If you set this, new directories are created with
  2050. the combined `UMASK' and `UMASK_DIR'. For example, if you want to give
  2051. group access to all new directories, you can do:
  2052.      shell> UMASK_DIR=504  # = 770 in octal
  2053.      shell> export UMASK_DIR
  2054.      shell> /path/to/safe_mysqld &
  2055. In *MySQL* Version 3.23.25 and above, *MySQL* assumes that the value
  2056. for `UMASK' and `UMASK_DIR' is in octal if it starts with a zero.
  2057. *Note Environment variables::.
  2058. File Not Found
  2059. ==============
  2060. If you get `ERROR '...' not found (errno: 23)', `Can't open file: ...
  2061. (errno: 24)', or any other error with `errno 23' or `errno 24' from
  2062. *MySQL*, it means that you haven't allocated enough file descriptors
  2063. for *MySQL*.  You can use the `perror' utility to get a description of
  2064. what the error number means:
  2065.      shell> perror 23
  2066.      File table overflow
  2067.      shell> perror 24
  2068.      Too many open files
  2069. The problem here is that `mysqld' is trying to keep open too many files
  2070. simultaneously.  You can either tell `mysqld' not to open so many files
  2071. at once or increase the number of file descriptors available to
  2072. `mysqld'.
  2073. To tell `mysqld' to keep open fewer files at a time, you can make the
  2074. table cache smaller by using the `-O table_cache=32' option to
  2075. `safe_mysqld' (the default value is 64). Reducing the value of
  2076. `max_connections' will also reduce the number of open files (the
  2077. default value is 90).
  2078. To change the number of file descriptors available to `mysqld', you can
  2079. use the option `--open-files-limit=#' to `safe_mysqld' or `-O
  2080. open-files-limit=#' to `mysqld'. *Note SHOW VARIABLES::.  The easyest
  2081. way to do that is to add the option to your option file.  *Note Option
  2082. files::.  If you have an old `mysqld' version that doesn't support
  2083. this, you can edit the `safe_mysqld' script.  There is a commented-out
  2084. line `ulimit -n 256' in the script.  You can remove the `'#'' character
  2085. to uncomment this line, and change the number 256 to affect the number
  2086. of file descriptors available to `mysqld'.
  2087. `ulimit' (and `open-files-limit') can increase the number of file
  2088. descriptors, but only up to the limit imposed by the operating system.
  2089. There is also a 'hard' limit that can only be overrided if you start
  2090. `safe_mysqld' or `mysqld' as root (Just remember that you need to also
  2091. use the `--user=..' option in this case).  If you need to increase the
  2092. OS limit on the number of file descriptors available to each process,
  2093. consult the documentation for your operating system.
  2094. Note that if you run the `tcsh' shell, `ulimit' will not work!  `tcsh'
  2095. will also report incorrect values when you ask for the current limits!
  2096. In this case you should start `safe_mysqld' with `sh'!
  2097. Problems Using `DATE' Columns
  2098. =============================
  2099. The format of a `DATE' value is `'YYYY-MM-DD''. According to ANSI SQL,
  2100. no other format is allowed. You should use this format in `UPDATE'
  2101. expressions and in the WHERE clause of `SELECT' statements.  For
  2102. example:
  2103.      mysql> SELECT * FROM tbl_name WHERE date >= '1997-05-05';
  2104. As a convenience, *MySQL* automatically converts a date to a number if
  2105. the date is used in a numeric context (and vice versa). It is also smart
  2106. enough to allow a "relaxed" string form when updating and in a `WHERE'
  2107. clause that compares a date to a `TIMESTAMP', `DATE', or a `DATETIME'
  2108. column.  (Relaxed form means that any punctuation character may be used
  2109. as the separator between parts. For example, `'1998-08-15'' and
  2110. `'1998#08#15'' are equivalent.) *MySQL* can also convert a string
  2111. containing no separators (such as `'19980815''), provided it makes
  2112. sense as a date.
  2113. The special date `'0000-00-00'' can be stored and retrieved as
  2114. `'0000-00-00'.' When using a `'0000-00-00'' date through *MyODBC*, it
  2115. will automatically be converted to `NULL' in *MyODBC* Version 2.50.12
  2116. and above, because ODBC can't handle this kind of date.
  2117. Because *MySQL* performs the conversions described above, the following
  2118. statements work:
  2119.      mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
  2120.      mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
  2121.      mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
  2122.      mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
  2123.      mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
  2124.      mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');
  2125.      
  2126.      mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
  2127.      mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
  2128.      mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505;
  2129.      mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';
  2130. However, the following will not work:
  2131.      mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'19970505')=0;
  2132. `STRCMP()' is a string function, so it converts `idate' to a string and
  2133. performs a string comparison.  It does not convert `'19970505'' to a
  2134. date and perform a date comparison.
  2135. Note that *MySQL* does no checking whether or not the date is correct.
  2136. If you store an incorrect date, such as `'1998-2-31'', the wrong date
  2137. will be stored. If the date cannot be converted to any reasonable
  2138. value, a `0' is stored in the `DATE' field.  This is mainly a speed
  2139. issue and we think it is up to the application to check the dates, and
  2140. not the server.
  2141. Time Zone Problems
  2142. ==================
  2143. If you have a problem with `SELECT NOW()' returning values in GMT and
  2144. not your local time, you have to set the `TZ' environment variable to
  2145. your current time zone.  This should be done for the environment in
  2146. which the server runs, for example, in `safe_mysqld' or `mysql.server'.
  2147. *Note Environment variables::.
  2148. Case Sensitivity in Searches
  2149. ============================
  2150. By default, *MySQL* searches are case-insensitive (although there are
  2151. some character sets that are never case insensitive, such as `czech').
  2152. That means that if you search with `col_name LIKE 'a%'', you will get
  2153. all column values that start with `A' or `a'. If you want to make this
  2154. search case-sensitive, use something like `INDEX(col_name, "A")=0' to
  2155. check a prefix. Or use `STRCMP(col_name, "A") = 0' if the column value
  2156. must be exactly `"A"'.
  2157. Simple comparison operations (`>=, >, = , < , <=', sorting and
  2158. grouping) are based on each character's "sort value". Characters with
  2159. the same sort value (like E, e and